From e8b108bd133a2a3a2d9aef0cccf0353d2bd73c7e Mon Sep 17 00:00:00 2001
From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期一, 17 七月 2017 15:22:52 +0800
Subject: [PATCH] 

---
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/exception/IdNotFoundException.java                                 |   24 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/pojo/Person.java                                                   |   44 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/ObjectTree.java                              |   22 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/XMLReaderDriver.java                                |    7 
 VisitFace/DemoForBsk/app/src/main/AndroidManifest.xml                                                                       |    2 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/alias/ClassMapper.java                                  |   20 
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/discern/common/CommonVariables.java                                |    8 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/MapConverter.java                |   50 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/AbstractBasicConverter.java            |   27 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/SqlNode.java                                      |   52 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/ShortConverter.java                    |   13 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/Converter.java                               |   25 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/StringBufferConverter.java             |   12 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/StringConverter.java                   |   13 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/AbstractCollectionConverter.java |   57 
 VisitFace/DemoForBsk/app/src/main/res/layout/fragment_attender_register.xml                                                 |   70 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/DateConverter.java                     |   40 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/reflect/FieldUtils.java                                            |  228 +++
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java                                             |  217 +++
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/XStream.java                                            |  131 ++
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/io/XmlLoader.java                                                  |   80 +
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/text/CompactXMLWriter.java                          |   19 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/lookup/DefaultConverterLookup.java           |   33 
 VisitFace/DemoForBsk/app/src/main/assets/config/aibatis-test.xml                                                            |   44 
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/Config.java                                                   |   20 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/client/SqlMapClientBuilder.java                                    |   37 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/NullConverter.java                     |   23 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/DoubleConverter.java                   |   13 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/log/AibatisLog.java                                                |   47 
 VisitFace/DemoForBsk/app/src/main/assets/db/face.db                                                                         |    0 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/alias/DefaultClassMapper.java                           |   89 +
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/CharConverter.java                     |   13 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/ObjectAccessException.java                   |    7 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/dom/DomXMLReaderDriver.java                         |   37 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/IntConverter.java                      |   13 
 VisitFace/DemoForBsk/app/src/main/assets/config/SqlMapConfig.xml                                                            |   11 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/composite/ObjectWithFieldsConverter.java     |   85 +
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/SqlMapConfig.java                                 |   45 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/text/PrettyPrintXMLWriter.java                      |  102 +
 VisitFace/DemoForBsk/app/src/main/assets/db/aibatis_test_db                                                                 |    0 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/reflection/MyObjectFactory.java              |   18 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/XMLWriter.java                                      |   13 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Select.java                                       |   12 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/BooleanConverter.java                  |   13 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/reflection/ReflectionObjectGraph.java        |  150 ++
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/alias/CannotResolveClassException.java                  |   18 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/utils/XmlSqlMapConfig.java                                     |   80 +
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/ArrayConverter.java              |   42 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/ByteConverter.java                     |   13 
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sqlite/AttendanceDao.java                                  |   53 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Delete.java                                       |   12 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/client/SqlMapClient.java                                           |   50 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/CannotParseXMLException.java                        |   12 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/CollectionConverter.java         |   40 
 VisitFace/DemoForBsk/app/src/main/assets/config/company.xml                                                                 |   44 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/LongConverter.java                     |   13 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/parser/SqlMapConfigParser.java                                     |  111 +
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Update.java                                       |   12 
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/BaseApplication.java                                          |   13 
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java                                             |    2 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/FloatConverter.java                    |   13 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Insert.java                                       |   12 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/DataSource.java                                   |   29 
 VisitFace/DemoForBsk/app/src/main/res/layout/fragment_visitor_register.xml                                                  |   48 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/reflect/ObjectUtils.java                                           |   57 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/XMLReader.java                                      |   23 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/client/SqlMapClientImpl.java                                       |  340 +++++
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/SqlMap.java                                       |   64 +
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/JavaClassConverter.java                |   33 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/ConverterLookup.java                         |   18 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/sql/DynamicSql.java                                                |  123 ++
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/ConversionException.java                     |   22 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/parser/SqlMapParser.java                                           |   35 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/dom/DomXMLReader.java                               |   81 +
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/extended/SqlTimestampConverter.java          |   17 
 VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/reflection/ObjectFactory.java                |    5 
 76 files changed, 3,372 insertions(+), 49 deletions(-)

diff --git a/VisitFace/DemoForBsk/app/src/main/AndroidManifest.xml b/VisitFace/DemoForBsk/app/src/main/AndroidManifest.xml
index a4c6964..11fab83 100644
--- a/VisitFace/DemoForBsk/app/src/main/AndroidManifest.xml
+++ b/VisitFace/DemoForBsk/app/src/main/AndroidManifest.xml
@@ -16,7 +16,7 @@
     <uses-permission android:name="android.permission.BROADCAST_STICKY" />
     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
-
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
     <uses-permission android:name="android.permission.CAMERA" />
     <uses-feature android:name="android.hardware.camera" />
diff --git a/VisitFace/DemoForBsk/app/src/main/assets/config/SqlMapConfig.xml b/VisitFace/DemoForBsk/app/src/main/assets/config/SqlMapConfig.xml
new file mode 100644
index 0000000..3bc0015
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/assets/config/SqlMapConfig.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<sqlMapConfig>
+    <!-- 閰嶇疆鏁版嵁婧� -->
+	<dataSource>
+		<dbName>aibatis_test_db</dbName>
+		<dbVersion>1</dbVersion>
+	</dataSource>
+	<includes>
+	    <include>/assets/config/aibatis-test.xml</include>
+	</includes>
+</sqlMapConfig>
\ No newline at end of file
diff --git a/VisitFace/DemoForBsk/app/src/main/assets/config/aibatis-test.xml b/VisitFace/DemoForBsk/app/src/main/assets/config/aibatis-test.xml
new file mode 100644
index 0000000..5c5930f
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/assets/config/aibatis-test.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<sqlMap>
+	<!-- 鍛藉悕绌洪棿 -->
+	<namespace>test</namespace>
+	<!-- 鏌ヨ鎿嶄綔 -->
+	<selects>
+		<select>
+			<id>selectPersonByName</id>
+			<parameterClass>String</parameterClass>
+			<resultClass>java.util.HashMap</resultClass>
+			<sql>select *  from tbl_person t where t.name = #name#</sql>
+		</select>
+		<select>
+			<id>selectPersons</id>
+			<parameterClass>String</parameterClass>
+			<resultClass>com.awsle.aibatis.pojo.Person</resultClass>
+			<sql>select *  from tbl_person t </sql>
+		</select>
+	</selects>
+	<!-- 鏇存柊鎿嶄綔 -->
+	<updates>
+	    <update>
+	        <id>updatePersonPhoneByName</id>
+	        <parameterClass>String</parameterClass>
+			<sql>UPDATE "tbl_person" SET "phone"=#phone# WHERE name = #name#</sql>
+	    </update>
+	</updates>
+	<!-- 鎻掑叆鎿嶄綔 -->
+	<inserts>
+	    <insert>
+	        <id>insertPerson</id>
+	        <parameterClass>com.awsle.aibatis.pojo.Person</parameterClass>
+	        <sql>INSERT INTO "tbl_person" ("name", "phone", "address", "email") VALUES (#name#, #phone#, #address#, #email#)</sql>
+	    </insert>
+	</inserts>
+	<!-- 鍒犻櫎鎿嶄綔 -->
+	<deletes>
+	    <delete>
+	        <id>deletePeronByName</id>
+	        <parameterClass>String</parameterClass>
+	        <sql>DELETE FROM "tbl_person" WHERE name = #name#</sql>
+	    </delete>
+	</deletes>
+</sqlMap>
\ No newline at end of file
diff --git a/VisitFace/DemoForBsk/app/src/main/assets/config/company.xml b/VisitFace/DemoForBsk/app/src/main/assets/config/company.xml
new file mode 100644
index 0000000..ff92f70
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/assets/config/company.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<sqlMap>
+	<!-- 鍛藉悕绌洪棿 -->
+	<namespace>company</namespace>
+	<!-- 鏌ヨ鎿嶄綔 -->
+	<selects>
+		<select>
+			<id>selectPersonByName</id>
+			<parameterClass>String</parameterClass>
+			<resultClass>java.util.HashMap</resultClass>
+			<sql>select *  from tbl_person t where t.name = #name#</sql>
+		</select>
+		<select>
+			<id>selectPersons</id>
+			<parameterClass>String</parameterClass>
+			<resultClass>com.awsle.aibatis.pojo.Person</resultClass>
+			<sql>select *  from tbl_person t </sql>
+		</select>
+	</selects>
+	<!-- 鏇存柊鎿嶄綔 -->
+	<updates>
+	    <update>
+	        <id>updatePersonPhoneByName</id>
+	        <parameterClass>String</parameterClass>
+			<sql>UPDATE "tbl_person" SET "phone"=#phone# WHERE name = #name#</sql>
+	    </update>
+	</updates>
+	<!-- 鎻掑叆鎿嶄綔 -->
+	<inserts>
+	    <insert>
+	        <id>insertPerson</id>
+	        <parameterClass>com.awsle.aibatis.pojo.Person</parameterClass>
+	        <sql>INSERT INTO "tbl_person" ("name", "phone", "address", "email") VALUES (#name#, #phone#, #address#, #email#)</sql>
+	    </insert>
+	</inserts>
+	<!-- 鍒犻櫎鎿嶄綔 -->
+	<deletes>
+	    <delete>
+	        <id>deletePeronByName</id>
+	        <parameterClass>String</parameterClass>
+	        <sql>DELETE FROM "tbl_person" WHERE name = #name#</sql>
+	    </delete>
+	</deletes>
+</sqlMap>
\ No newline at end of file
diff --git a/VisitFace/DemoForBsk/app/src/main/assets/db/aibatis_test_db b/VisitFace/DemoForBsk/app/src/main/assets/db/aibatis_test_db
new file mode 100644
index 0000000..171d6b9
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/assets/db/aibatis_test_db
Binary files differ
diff --git a/VisitFace/DemoForBsk/app/src/main/assets/db/face.db b/VisitFace/DemoForBsk/app/src/main/assets/db/face.db
new file mode 100644
index 0000000..9a49df5
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/assets/db/face.db
Binary files differ
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/BaseApplication.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/BaseApplication.java
index 6b81919..b98c611 100644
--- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/BaseApplication.java
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/BaseApplication.java
@@ -5,6 +5,8 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
 import android.os.IBinder;
 
 import cn.com.basic.face.discern.entity.Device;
@@ -86,4 +88,15 @@
     }
 
 
+    public boolean networkAvailable() {
+        boolean connected = false;
+        ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
+        if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED ||
+                connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
+            connected = true;
+        }
+        return connected;
+    }
+
+
 }
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/Config.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/Config.java
new file mode 100644
index 0000000..50e1843
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/Config.java
@@ -0,0 +1,20 @@
+package cn.com.basic.face.base;
+
+import com.awsle.aibatis.client.SqlMapClient;
+
+public class Config {
+	
+	//鏁版嵁搴撴搷浣�
+	public static SqlMapClient sqlMap;
+	//鏁版嵁搴�
+	public final static String DB_NAME = "aibatis_test_db";
+	// 搴旂敤鏍囪瘑
+	public final static String APPTAG = "AIBATIS";
+	// 鍒濆鍖栨暟鎹簱
+	public final static String DB = "/assets/db/" + DB_NAME;
+	// 鏁版嵁鐩綍
+	public final static String APPDBPATH = "/data/data/com.bsk.zhangbo.demoforbsk/databases/";
+	// 鏁版嵁搴撹矾寰�
+	public final static String APPDB = "/data/data/com.bsk.zhangbo.demoforbsk/databases/"+ DB_NAME;
+	
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java
index 6bfe263..0629e5e 100644
--- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java
@@ -11,7 +11,10 @@
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.ImageFormat;
 import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.SurfaceTexture;
 import android.hardware.Camera;
 import android.os.Handler;
 import android.support.design.widget.TabLayout;
@@ -26,6 +29,7 @@
 import android.view.MotionEvent;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
+import android.view.TextureView;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
@@ -35,6 +39,7 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.awsle.aibatis.client.SqlMapClientBuilder;
 import com.bsk.zhangbo.demoforbsk.R;
 import com.luxand.FSDK;
 
@@ -54,7 +59,9 @@
 import cn.com.basic.face.fragment.VisitFragment;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -67,7 +74,7 @@
     private static MainActivity instance;
 
     private static TabLayout mTabLayout;
-    private static ViewPager mViewPager;
+    public static ViewPager mViewPager;
 
     public static void selectPage(int pageNum) {
         mTabLayout.getTabAt(pageNum).select();
@@ -86,14 +93,17 @@
         instance = this;
     }
 
+    public MyFragmentPagerAdapter myFragmentPagerAdapter;
+
     @Override
     public void initData() {
         List<String> tabNamesList = Arrays.asList(TabNameUtil.tabNames);
         int[] tabIcons = TabNameUtil.tabIcons;
-        MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),MainActivity.this);
+        myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),MainActivity.this);
         myFragmentPagerAdapter.addFragment(SurveillanceFragment.getInstance(), tabNamesList.get(0),tabIcons[0]);
-//        myFragmentPagerAdapter.addFragment(VisitorRegisterFragment.getInstance(), tabNamesList.get(1),tabIcons[1]);
-        myFragmentPagerAdapter.addFragment(AttenderRegisterFragment.getInstance(), tabNamesList.get(1),tabIcons[1]);
+        myFragmentPagerAdapter.addFragment(VisitorRegisterFragment.getInstance(), tabNamesList.get(1),tabIcons[1]);
+//        myFragmentPagerAdapter.addFragment(AttenderRegisterFragment.getInstance(), tabNamesList.get(1),tabIcons[1]);
+//        myFragmentPagerAdapter.addFragment(RegisterFragment.getInstance(), tabNamesList.get(1),tabIcons[1]);
         myFragmentPagerAdapter.addFragment(CheckInFragment.getInstance(), tabNamesList.get(2),tabIcons[2]);
         myFragmentPagerAdapter.addFragment(PhoneCallFragment.getInstance(), tabNamesList.get(3),tabIcons[3]);
         myFragmentPagerAdapter.addFragment(VisitFragment.getInstance(), tabNamesList.get(4),tabIcons[4]);
@@ -115,6 +125,8 @@
             myThread = new MyThread();
             myThread.start();
         }
+        initDb();
+        initSqlMap();
     }
 
     public static MainActivity getInstance() {
@@ -136,6 +148,12 @@
             mFragments.add(fragment);
             mFragmentTitles.add(title);
             mFragmentIcons.add(drawable);
+        }
+
+        public void setFragment(int index, Fragment fragment) {
+            mFragments.remove(index);
+            mFragments.add(index, fragment);
+            notifyDataSetChanged();
         }
 
         @Override
@@ -253,7 +271,58 @@
         }
         return true;
     }
+/////////////////////////////
 
+    /**
+     * 鍒濆鍖杝qlMap
+     */
+    private void initSqlMap() {
+        Config.sqlMap = SqlMapClientBuilder.buildSqlMapClient(this.getClass().getResourceAsStream("/assets/config/SqlMapConfig.xml")).init(this);
+    }
+    /**
+     * 鍒濆鍖栨暟鎹�
+     */
+    private void initDb() {
+        InputStream dbIn = getClass().getResourceAsStream(Config.DB);
+        FileOutputStream out = null;
+        File z = null;
+        try {
+            byte[] bytes = new byte[1024];
+            z = new File(Config.APPDBPATH);
+            if(!z.exists()){
+                z.mkdirs();
+            }
+            //鍒ゆ柇鏁版嵁搴撴槸鍚﹀瓨鍦�
+            z = new File(Config.APPDB);
+            if (!z.exists()) {
+                out = new FileOutputStream(z);
+                int len = 0;
+                while((len = dbIn.read(bytes))!= -1){
+                    out.write(bytes,0,len);
+                }
+            }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (out != null)
+                    out.close();
+                if (dbIn != null)
+                    dbIn.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        try {
+            //瀵规暟鎹簱鏂囦欢鏉冮檺
+            Runtime.getRuntime().exec("chmod 7755 " + z.toString());
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        //Log.d(Config.APPTAG, "鍒濆鍖栨暟鎹畬鎴愶紒");
+    }
 
     ////////////////////////////////////////////////////////
     private boolean mIsFailed = false;
@@ -395,6 +464,7 @@
         mDraw.mStopped = 0;
         mDraw.mStopping = 0;
     }
+
 }
 
 
@@ -481,8 +551,7 @@
         first_frame_saved = false;
     }
 
-    @Override
-    protected void onDraw(Canvas canvas) {
+    public void onDraw(Canvas canvas) {
         if (mStopping == 1) {
             mStopped = 1;
             super.onDraw(canvas);
@@ -516,6 +585,11 @@
 
 //        FSDK.TFacePosition fp11 = new FSDK.TFacePosition();
 //        FSDK.DetectFace(RotatedImage, fp11);
+        FSDK.FSDK_FaceTemplate face = new FSDK.FSDK_FaceTemplate();
+        int result = FSDK.GetFaceTemplate(RotatedImage, face);
+        if (result == FSDK.FSDKE_OK) {
+
+        }
 
         String surveillancePhotoName11 = "/storage/sdcard1/"+System.currentTimeMillis()+".jpg";
         FSDK.SaveImageToFile(Image, surveillancePhotoName11);
@@ -530,7 +604,7 @@
 
         FSDK.FeedFrame(mTracker, 0, RotatedImage, face_count, IDs);
 
-        System.out.println("face_count="+face_count[0]);
+        System.out.println("face_count="+face_count[0]+", mImageWidth="+mImageWidth+", mImageHeight="+mImageHeight);
 
         faceLock.lock();
 
@@ -708,6 +782,119 @@
             }
         }
     }
+
+    public void startFaceDetection() {
+        if (mStopping == 1) {
+            mStopped = 1;
+            return;
+        }
+
+        if (mYUVData == null || mTouchedIndex != -1) {
+            return;
+        }
+
+
+        decodeYUV420SP(mRGBData, mYUVData, mImageWidth, mImageHeight);
+
+        FSDK.HImage Image = new FSDK.HImage();
+        FSDK.FSDK_IMAGEMODE imagemode = new FSDK.FSDK_IMAGEMODE();
+        imagemode.mode = FSDK.FSDK_IMAGEMODE.FSDK_IMAGE_COLOR_24BIT;
+        FSDK.LoadImageFromBuffer(Image, mRGBData, mImageWidth, mImageHeight, mImageWidth*3, imagemode);
+        FSDK.MirrorImage(Image, false);
+        FSDK.HImage RotatedImage = new FSDK.HImage();
+        FSDK.CreateEmptyImage(RotatedImage);
+
+        int ImageWidth = mImageWidth;
+        if (rotated) {
+            ImageWidth = mImageHeight;
+            FSDK.RotateImage90(Image, -1, RotatedImage);
+        } else {
+            FSDK.CopyImage(Image, RotatedImage);
+        }
+
+        //String surveillancePhotoName11 = "/storage/sdcard1/"+System.currentTimeMillis()+".jpg";
+        //FSDK.SaveImageToFile(Image, surveillancePhotoName11);
+
+
+        FSDK.FreeImage(Image);
+
+        long IDs[] = new long[MAX_FACES];
+        long face_count[] = new long[1];
+
+
+
+        FSDK.FeedFrame(mTracker, 0, RotatedImage, face_count, IDs);
+
+        System.out.println("face_count="+face_count[0]+", mImageWidth="+mImageWidth+", mImageHeight="+mImageHeight);
+
+        faceLock.lock();
+
+        for (int i=0; i<MAX_FACES; ++i) {
+            mFacePositions[i] = new FaceRectangle();
+            mFacePositions[i].x1 = 0;
+            mFacePositions[i].y1 = 0;
+            mFacePositions[i].x2 = 0;
+            mFacePositions[i].y2 = 0;
+            mIDs[i] = IDs[i];
+        }
+
+
+        for (int i = 0; i < (int)face_count[0]; ++i) {
+            FSDK.FSDK_Features Eyes = new FSDK.FSDK_Features();
+            FSDK.GetTrackerEyes(mTracker, 0, mIDs[i], Eyes);
+
+            GetFaceFrame(Eyes, mFacePositions[i]);
+        }
+        if ((int)face_count[0] > 0) {
+
+            FSDK.HImage img2 = new FSDK.HImage();
+            FSDK.CreateEmptyImage(img2);
+            FSDK.TFacePosition fp = new FSDK.TFacePosition();
+            FSDK.DetectFace(RotatedImage, fp);
+
+            int x1 = (int)(fp.xc - 1.2*fp.w/2);
+            int y1 = (int)(fp.yc - 1.4*fp.w/2);
+            int x2 = (int)(fp.xc + 1.2*fp.w/2);
+            int y2 = (int)(fp.yc + 1.4*fp.w/2);
+
+            FSDK.CopyRect(RotatedImage, x1, y1, x2, y2, img2);
+
+
+            System.out.println("face_count="+face_count[0]);
+            String surveillancePhotoName = MainActivity.getInstance().getFilesDir().getAbsolutePath()+System.currentTimeMillis()+".jpg";
+            FSDK.SaveImageToFile(img2, surveillancePhotoName);
+
+            List bitmapList = new ArrayList();
+            for (int i = 0; i < 1; i++) {
+                NativeImg nativeImg = new NativeImg();
+                nativeImg.image = FileUtil.readFile(new File(surveillancePhotoName));
+                nativeImg.size = nativeImg.image.length;
+                SurveillanceQueryItem surveillanceQueryItem = new SurveillanceQueryItem();
+                surveillanceQueryItem.setNativeImg(nativeImg);
+                nativeImg.st_track_id = 1;
+                surveillanceQueryItem.setStTrackId(nativeImg.st_track_id);
+                BitmapFactory.Options options = new BitmapFactory.Options();
+                options.inMutable = true;
+                Bitmap bmp = BitmapFactory.decodeByteArray(nativeImg.image, 0, nativeImg.image.length, options);
+                Canvas canvas1 = new Canvas(bmp);
+
+                surveillanceQueryItem.setBitmap(bmp);
+                surveillanceQueryItem.setWidth("100");
+                surveillanceQueryItem.setHeight("100");
+                bitmapList.add(surveillanceQueryItem);
+
+
+                SurveillanceMng.getInstance().addBitmap(bitmapList, nativeImg.image, 0, CommonVariables.Camera.IN+"", nativeImg.image);
+            }
+
+
+
+
+        }
+        FSDK.FreeImage(RotatedImage);
+        faceLock.unlock();
+
+    }
 }
 
 class Preview extends SurfaceView implements SurfaceHolder.Callback {
@@ -725,8 +912,11 @@
         mHolder = getHolder();
         mHolder.addCallback(this);
         mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+
+        //new MyThread1().start();
     }
 
+    int count = 0;
     public void surfaceCreated(SurfaceHolder holder) {
         mFinished = false;
 
@@ -744,22 +934,22 @@
         if (ContextCompat.checkSelfPermission(MainActivity.getInstance(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
             //ask for authorisation
             ActivityCompat.requestPermissions(MainActivity.getInstance(), new String[]{Manifest.permission.CAMERA}, 50);
-
         if (frontCameraFound) {
             mCamera = Camera.open(cameraId);
         } else {
             mCamera = Camera.open();
         }
-
-
         try {
             mCamera.setPreviewDisplay(holder);
 
-            mCamera.setPreviewCallback(new Camera.PreviewCallback() {
-                public void onPreviewFrame(byte[] data, Camera camera) {
+            mCamera.addCallbackBuffer(new byte[((640 * 480) * ImageFormat.getBitsPerPixel(ImageFormat.NV21)) / 8]);
+
+            //mCamera.setPreviewCallback
+            mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
+                public void onPreviewFrame(final byte[] data, final Camera camera) {
+                    mCamera.addCallbackBuffer(data);
                     if ( (mDraw == null) || mFinished )
                         return;
-
                     if (mDraw.mYUVData == null) {
                         Camera.Parameters params = camera.getParameters();
                         mDraw.mImageWidth = params.getPreviewSize().width;
@@ -852,5 +1042,6 @@
             this.invalidate();
         }
     }
+
 }
 
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/discern/common/CommonVariables.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/discern/common/CommonVariables.java
index c56c30c..c53644b 100644
--- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/discern/common/CommonVariables.java
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/discern/common/CommonVariables.java
@@ -110,9 +110,13 @@
         public static final String CAMERA2 = "camera2";
     }
 
-    public static boolean FACE_SERVER = true;
+    public static boolean FACE_SERVER = false;
     public static boolean ID_CARD = false;
-    public static boolean EMULATOR = false;
+    public static boolean EMULATOR = true;
+
+    public static boolean androidOffline() {
+        return true;
+    }
 
     public static class Register {
         public static boolean VISITOR_REGISTER_SELECTED = true;
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java
index 8141823..980b121 100644
--- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java
@@ -8,6 +8,7 @@
 import cn.com.basic.face.base.MainActivity;
 import cn.com.basic.face.discern.common.CommonVariables;
 import cn.com.basic.face.fragment.DeviceFragment;
+import cn.com.basic.face.service.sqlite.AttendanceDao;
 import cn.com.basic.face.util.AppApi;
 
 import org.xutils.http.RequestParams;
@@ -35,6 +36,7 @@
             public void run() {
                 try {
                     while (true) {
+                        AttendanceDao.getInstance().reloadLeftList(null, 0, false);
                         if (!BaseApplication.getInstance().deviceAvailable) {
                             load ();
                         } else {
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sqlite/AttendanceDao.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sqlite/AttendanceDao.java
new file mode 100644
index 0000000..40b9b3b
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sqlite/AttendanceDao.java
@@ -0,0 +1,53 @@
+package cn.com.basic.face.service.sqlite;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+import com.awsle.aibatis.client.SqlMapClient;
+import com.awsle.aibatis.client.SqlMapClientBuilder;
+import com.awsle.aibatis.exception.IdNotFoundException;
+import com.lidroid.xutils.DbUtils;
+
+import org.xutils.http.RequestParams;
+import org.xutils.x;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import cn.com.basic.face.base.BaseApplication;
+import cn.com.basic.face.base.Config;
+import cn.com.basic.face.base.MainActivity;
+import cn.com.basic.face.discern.common.BaseCommonCallBack;
+import cn.com.basic.face.discern.common.CommonVariables;
+import cn.com.basic.face.discern.query.condition.AttendanceQueryCondition;
+import cn.com.basic.face.discern.query.item.AttendanceQueryItem;
+import cn.com.basic.face.fragment.AttendanceFragment;
+import cn.com.basic.face.util.AppApi;
+import cn.com.basic.face.util.DateUtil;
+
+public class AttendanceDao {
+
+    public static AttendanceDao instance = new AttendanceDao();
+
+    public static AttendanceDao getInstance() {
+        return instance;
+    }
+
+    public List reloadLeftList(String searchText, final int pageNum, final boolean append) {
+        try {
+            try {
+                List list = Config.sqlMap.queryForList("selectPersons");
+                System.out.println(list.size());
+            } catch (IdNotFoundException e) {
+                e.printStackTrace();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/client/SqlMapClient.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/client/SqlMapClient.java
new file mode 100644
index 0000000..5adb1c4
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/client/SqlMapClient.java
@@ -0,0 +1,50 @@
+
+package com.awsle.aibatis.client;
+
+import java.util.List;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+
+import com.awsle.aibatis.client.SqlMapClientImpl.DbUpdateListener;
+import com.awsle.aibatis.exception.IdNotFoundException;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://code.awsle.com/index.php/p/aibatis/
+ * @mail 951868171@qq.com
+ * @version 1.0
+ * @since aibatis-Alpha1.0.zip
+ */
+public interface SqlMapClient {
+	  //android涓婁笅鏂�
+	  SqlMapClient init(Context context);
+	  //鍒濆鍖�
+	  SqlMapClient init(Context context,DbUpdateListener dbUpdateListener);
+	  //鏌ヨ鍒板璞�
+	  Object queryForObject(String id, Object parameterObject) throws IdNotFoundException;
+	  //鏌ヨ鍒癓ist
+	  List queryForList(String id, Object parameterObject) throws IdNotFoundException;
+	  //鏌ヨ鍒板璞�
+	  Object queryForObject(String id) throws IdNotFoundException;
+	  //鏌ヨ鍒癓ist
+	  List queryForList(String id) throws IdNotFoundException;
+	  //鏇存柊鎿嶄綔
+	  int update(String id, Object parameterObject)  throws IdNotFoundException;
+	  //鏇存柊鎿嶄綔
+	  int delete(String id, Object parameterObject)  throws IdNotFoundException;
+	  //鎻掑叆鎿嶄綔
+	  int insert(String id, Object parameterObject)  throws IdNotFoundException;
+	  //鏇存柊鎿嶄綔
+	  int update(String id)  throws IdNotFoundException;
+	  //鏇存柊鎿嶄綔
+	  int delete(String id)  throws IdNotFoundException;
+	  int insert(String id)  throws IdNotFoundException;
+	  //寮�濮嬩簨鍔�
+	  void beginTransaction();
+	  //缁撴潫浜嬪姟
+	  void endTransaction();
+	  //鑾峰彇鍒版暟鎹簱鍙ユ焺
+	  SQLiteDatabase getDb();
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/client/SqlMapClientBuilder.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/client/SqlMapClientBuilder.java
new file mode 100644
index 0000000..52a294d
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/client/SqlMapClientBuilder.java
@@ -0,0 +1,37 @@
+
+package com.awsle.aibatis.client;
+
+import java.io.InputStream;
+
+import com.awsle.aibatis.io.XmlLoader;
+import com.awsle.aibatis.parser.SqlMapConfigParser;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://code.awsle.com/index.php/p/aibatis/
+ * @mail 951868171@qq.com
+ * @version 1.0
+ * @since aibatis-Alpha1.0.zip
+ */
+public class SqlMapClientBuilder {
+
+	/**
+	 * 
+	 * @param path
+	 * @return
+	 */
+	public static SqlMapClient buildSqlMapClient(String path){
+		
+		return buildSqlMapClient(XmlLoader.loadXmlInputStreamByPath(path));
+	}
+	
+	/**
+	 * 
+	 * @param stream
+	 * @return
+	 */
+	public static SqlMapClient buildSqlMapClient(InputStream stream){
+		return new SqlMapConfigParser().parser(XmlLoader.loadXmlByStream(stream));
+	}
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/client/SqlMapClientImpl.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/client/SqlMapClientImpl.java
new file mode 100644
index 0000000..164c4e7
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/client/SqlMapClientImpl.java
@@ -0,0 +1,340 @@
+
+package com.awsle.aibatis.client;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+import com.awsle.aibatis.exception.IdNotFoundException;
+import com.awsle.aibatis.log.AibatisLog;
+import com.awsle.aibatis.reflect.ObjectUtils;
+import com.awsle.aibatis.sql.DynamicSql;
+import com.awsle.aibatis.xml.aibatis.node.DataSource;
+import com.awsle.aibatis.xml.aibatis.node.SqlNode;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://code.awsle.com/index.php/p/aibatis/
+ * @mail 951868171@qq.com
+ * @version 1.0
+ * @since aibatis-Alpha1.0.zip
+ */
+public class SqlMapClientImpl implements SqlMapClient {
+	// SQL鑺傜偣
+	private Map<String, SqlNode> sqlNodeMap;
+	// 鏁版嵁婧�
+	private DataSource dataSource;
+	// SQLite鏁版嵁搴�
+	private SQLiteDatabase db;
+
+	public void setSqlNodeMap(Map<String, SqlNode> sqlNodeMap) {
+		this.sqlNodeMap = sqlNodeMap;
+	}
+
+	public Map<String, SqlNode> getSqlNodeMap() {
+		return sqlNodeMap;
+	}
+
+
+
+	/**
+	 * 鍒濆鍖�
+	 */
+	public SqlMapClient init(Context context) {
+		return init(context,null);
+	}
+	
+	/**
+	 * 鍒濆鍖�
+	 */
+	public SqlMapClient init(Context context,DbUpdateListener dbUpdateListener) {
+		DaoConfig config = new DaoConfig();
+		config.setContext(context);
+		config.setDbName(dataSource.getDbName());
+		config.setDbVersion(Integer.parseInt(dataSource.getDbVersion()));
+		config.setDbUpdateListener(dbUpdateListener);
+		if (config.getContext() == null)
+			throw new RuntimeException("android context is null");
+		this.setDb(new SqliteDbHelper(config.getContext(), config.getDbName(),
+				config.getDbVersion(), config.getDbUpdateListener())
+				.getWritableDatabase());
+		return this;
+	}
+
+	public DataSource getDataSource() {
+		return dataSource;
+	}
+
+	public void setDataSource(DataSource dataSource) {
+		this.dataSource = dataSource;
+	}
+
+	public SQLiteDatabase getDb() {
+		return db;
+	}
+
+	public void setDb(SQLiteDatabase db) {
+		this.db = db;
+	}
+
+	// 鏁版嵁搴撻厤缃�
+	public static class DaoConfig {
+
+		private Context context = null;// android涓婁笅鏂�
+		private String dbName = "abatis.db";// 鏁版嵁搴撳悕瀛�
+		private int dbVersion = 1;// 鏁版嵁搴撶増鏈�
+		private boolean debug = true;
+		private DbUpdateListener dbUpdateListener;
+
+		public Context getContext() {
+			return context;
+		}
+
+		public void setContext(Context context) {
+			this.context = context;
+		}
+
+		public String getDbName() {
+			return dbName;
+		}
+
+		public void setDbName(String dbName) {
+			this.dbName = dbName;
+		}
+
+		public int getDbVersion() {
+			return dbVersion;
+		}
+
+		public void setDbVersion(int dbVersion) {
+			this.dbVersion = dbVersion;
+		}
+
+		public boolean isDebug() {
+			return debug;
+		}
+
+		public void setDebug(boolean debug) {
+			this.debug = debug;
+		}
+
+		public DbUpdateListener getDbUpdateListener() {
+			return dbUpdateListener;
+		}
+
+		public void setDbUpdateListener(DbUpdateListener dbUpdateListener) {
+			this.dbUpdateListener = dbUpdateListener;
+		}
+
+	}
+
+	class SqliteDbHelper extends SQLiteOpenHelper {
+
+		private DbUpdateListener mDbUpdateListener;
+
+		public SqliteDbHelper(Context context, String name, int version,
+				DbUpdateListener dbUpdateListener) {
+			super(context, name, null, version);
+			this.mDbUpdateListener = dbUpdateListener;
+		}
+
+		public void onCreate(SQLiteDatabase db) {
+		}
+
+		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+			if (mDbUpdateListener != null) {
+				mDbUpdateListener.onUpgrade(db, oldVersion, newVersion);
+			} else { // 娓呯┖鎵�鏈夌殑鏁版嵁淇℃伅
+				/*
+				Cursor cursor = db.rawQuery(
+						"SELECT name FROM sqlite_master WHERE type ='table'",
+						null);
+				if (cursor != null) {
+					while (cursor.moveToNext()) {
+						db.execSQL("DROP TABLE " + cursor.getString(0));
+					}
+				}
+				if (cursor != null) {
+					cursor.close();
+					cursor = null;
+				}
+				*/
+			}
+		}
+
+	}
+
+	public interface DbUpdateListener {
+		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);
+	}
+
+	
+	
+	/**
+	 * 閫氳繃ID鏌ヨObject
+	 */
+	public Object queryForObject(String id, Object parameterObject)
+			throws IdNotFoundException {
+		SqlNode sqlNode = sqlNodeMap.get(id);
+		if (sqlNode == null) {
+			try {
+				throw new IdNotFoundException("Id:" + id + ",NotFound!");
+			} catch (IdNotFoundException e) {
+				e.printStackTrace();
+			}
+		}
+		DynamicSql dynamicSql = DynamicSql.parser(sqlNode.getSql());
+		dynamicSql.buildBindArgs(parameterObject);
+		AibatisLog.d(dynamicSql);
+		String resultClass = sqlNode.getResultClass();
+		Cursor cursor = db.rawQuery(dynamicSql.getSql(),dynamicSql.getBindArgs());
+		Map map = new HashMap();
+		try {
+			while (cursor.moveToNext()) {
+				int count = cursor.getColumnCount();
+				for (int i = 0; i < count; i++) {
+					map.put(cursor.getColumnName(i), cursor.getString(i));
+				}
+				break;
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if (cursor != null)
+				cursor.close();
+			cursor = null;
+		}
+		if("java.util.HashMap".equals(resultClass)){
+			return map;
+		}
+		else{
+			return ObjectUtils.mapToObject(map, resultClass);
+		}
+		
+	}
+
+	public List queryForList(String id, Object parameterObject)
+			throws IdNotFoundException {
+		SqlNode sqlNode = sqlNodeMap.get(id);
+		if (sqlNode == null) {
+			throw new IdNotFoundException("Id:" + id + ",NotFound!");
+		}
+		DynamicSql dynamicSql = DynamicSql.parser(sqlNode.getSql());
+		dynamicSql.buildBindArgs(parameterObject);
+		AibatisLog.d(dynamicSql);
+		String resultClass = sqlNode.getResultClass();
+		String[] bindArgs = dynamicSql.getBindArgs();
+		if(bindArgs == null||bindArgs.length == 0){
+			bindArgs = null;
+		}
+		Cursor cursor = db.rawQuery(dynamicSql.getSql(),bindArgs);
+		List<Object> maps = new ArrayList<Object>();
+		try {
+			while (cursor.moveToNext()) {
+				Map map = new HashMap();
+				int count = cursor.getColumnCount();
+				for (int i = 0; i < count; i++) {
+					map.put(cursor.getColumnName(i), cursor.getString(i));
+				}
+				if("java.util.HashMap".equals(resultClass)){
+					maps.add(map);			
+				}else{
+					maps.add(ObjectUtils.mapToObject(map, resultClass));
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if (cursor != null)
+				cursor.close();
+			cursor = null;
+		}
+		return maps;
+	}
+	
+	public Object queryForObject(String id) throws IdNotFoundException {
+		return queryForObject(id, null);
+	}
+	
+	public List queryForList(String id) throws IdNotFoundException {
+		return queryForList(id, null);
+	}
+
+	/**
+	 * 鏇存柊鎿嶄綔
+	 */
+	public int update(String id, Object parameterObject) throws IdNotFoundException {
+		SqlNode sqlNode = sqlNodeMap.get(id);
+		if (sqlNode == null) {
+			throw new IdNotFoundException("Id:" + id + ",NotFound!");
+		}
+		DynamicSql dynamicSql = DynamicSql.parser(sqlNode.getSql());
+		dynamicSql.buildBindArgs(parameterObject);
+		try {
+			AibatisLog.d(dynamicSql);
+			String[] bindArgs = dynamicSql.getBindArgs();
+			if(bindArgs == null||bindArgs.length == 0){
+				db.execSQL(dynamicSql.getSql());
+			}else{
+				db.execSQL(dynamicSql.getSql(),bindArgs);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			return -1;
+		}
+		
+		return 1;
+	}
+	/**
+	 * 
+	 */
+	public int delete(String id, Object parameterObject)throws IdNotFoundException {
+		return update(id, parameterObject);
+	}
+	/**
+	 * 
+	 */
+	public int insert(String id, Object parameterObject) throws IdNotFoundException {
+		return update(id, parameterObject);
+	}
+	/**
+	 * 鏇存柊
+	 */
+	public int update(String id) throws IdNotFoundException {
+		return update(id, null);
+	}
+
+	/**
+	 * 鍒犻櫎
+	 */
+	public int delete(String id) throws IdNotFoundException {
+		return delete(id, null);
+	}
+	/**
+	 * 
+	 */
+	public int insert(String id) throws IdNotFoundException {
+		return insert(id,null);
+	}
+	/**
+	 * 
+	 */
+	public void beginTransaction(){
+		
+		db.beginTransaction();
+	}
+	/**
+	 * 
+	 */
+	public void endTransaction(){
+		db.endTransaction();
+	}
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/exception/IdNotFoundException.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/exception/IdNotFoundException.java
new file mode 100644
index 0000000..df562a5
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/exception/IdNotFoundException.java
@@ -0,0 +1,24 @@
+package com.awsle.aibatis.exception;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://code.awsle.com/index.php/p/aibatis/
+ * @mail 951868171@qq.com
+ * @version 1.0
+ * @since aibatis-Alpha1.0.zip
+ */
+public class IdNotFoundException extends Exception{
+	
+
+	public IdNotFoundException(String msg) {
+		super(msg);
+	}
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -8640443385842943880L;
+
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/io/XmlLoader.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/io/XmlLoader.java
new file mode 100644
index 0000000..e06ebda
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/io/XmlLoader.java
@@ -0,0 +1,80 @@
+package com.awsle.aibatis.io;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://code.awsle.com/index.php/p/aibatis/
+ * @mail 951868171@qq.com
+ * @version 1.0
+ * @since aibatis-Alpha1.0.zip
+ */
+public class XmlLoader {
+
+	
+	/**
+	 * 鑾峰彇妯℃澘鍐呭
+	 * @param tplPath
+	 * 			鑾峰彇妯℃澘鍐呭
+	 * @return
+	 */
+	public static String loadXml(String filePath){
+		return loadXmlByStream(loadXmlInputStreamByPath(filePath));
+	}
+	
+	/**
+	 * 
+	 * @param filePath
+	 * @return
+	 */
+	public static InputStream loadXmlInputStreamByPath(String filePath){
+		InputStream inputStream = null;
+		ClassLoader classLoader = new XmlLoader().getClass().getClassLoader();
+		inputStream = classLoader.getResourceAsStream(filePath);
+		return inputStream;
+	}
+	
+	/**
+	 * 
+	 * @param is
+	 * @return
+	 */
+	public static String loadXmlByStream(InputStream is){
+		InputStream inputStream = null;
+		InputStreamReader inputStreamReader = null;
+		BufferedReader bufferedReader = null;
+		inputStreamReader = new InputStreamReader(is);
+		bufferedReader = new BufferedReader(inputStreamReader);
+		String line = "";
+		StringBuffer sb = new StringBuffer();
+		try {
+			while ((line = bufferedReader.readLine()) != null) {
+				sb.append(line);
+				sb.append("\n");
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}finally{
+			try {
+				if(null != inputStream){
+					inputStream.close();
+				}
+				if(null != inputStreamReader){
+					inputStreamReader.close();
+				}
+				if(null != bufferedReader){
+					bufferedReader.close();
+				}
+			} catch (IOException e) {
+					e.printStackTrace();
+			}
+			
+		}
+		return sb.toString();
+	}
+	
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/log/AibatisLog.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/log/AibatisLog.java
new file mode 100644
index 0000000..6f93821
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/log/AibatisLog.java
@@ -0,0 +1,47 @@
+package com.awsle.aibatis.log;
+
+import java.util.List;
+
+import android.util.Log;
+
+import com.awsle.aibatis.sql.DynamicSql;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://code.awsle.com/index.php/p/aibatis/
+ * @mail 951868171@qq.com
+ * @version 1.0
+ * @since aibatis-Alpha1.0.zip
+ */
+public class AibatisLog {
+
+	/**
+	 * 鏃ュ織
+	 * */
+	public static void d(DynamicSql dynamicSql) {
+		String[] bindArgs = dynamicSql.getBindArgs();
+		StringBuffer sb = new StringBuffer();
+		if(null != bindArgs){
+			List params = dynamicSql.getParams();
+			sb = new StringBuffer();
+			sb.append("{");
+			for (Object arg : params) {
+				sb.append(arg.toString() + ",");
+			}
+			sb.append("}");
+			// 鍙傛暟
+			Log.d("Aibatis", "params:" + sb.toString());
+			sb = new StringBuffer();
+			sb.append("{");
+			for (String arg : bindArgs) {
+				sb.append(arg + ",");
+			}
+			sb.append("}");
+			// 鍊�
+			Log.d("Aibatis", "bindArgs:" + sb.toString());
+		}
+		Log.d("Aibatis", "Sql:" + dynamicSql.getSql());
+	}
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/parser/SqlMapConfigParser.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/parser/SqlMapConfigParser.java
new file mode 100644
index 0000000..62bbee6
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/parser/SqlMapConfigParser.java
@@ -0,0 +1,111 @@
+package com.awsle.aibatis.parser;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.awsle.aibatis.client.SqlMapClient;
+import com.awsle.aibatis.client.SqlMapClientImpl;
+import com.awsle.aibatis.xml.aibatis.node.Delete;
+import com.awsle.aibatis.xml.aibatis.node.Insert;
+import com.awsle.aibatis.xml.aibatis.node.Select;
+import com.awsle.aibatis.xml.aibatis.node.SqlMap;
+import com.awsle.aibatis.xml.aibatis.node.SqlMapConfig;
+import com.awsle.aibatis.xml.aibatis.node.SqlNode;
+import com.awsle.aibatis.xml.aibatis.node.Update;
+import com.awsle.aibatis.xml.utils.XmlSqlMapConfig;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://code.awsle.com/index.php/p/aibatis/
+ * @mail 951868171@qq.com
+ * @version 1.0
+ * @since aibatis-Alpha1.0.zip
+ */
+public class SqlMapConfigParser {
+
+	/**
+	 * 瑙f瀽Xml
+	 * @param xml
+	 * @return
+	 */
+	public SqlMapClient parser(String xml) {
+		SqlMapClientImpl sqlMap = new SqlMapClientImpl();
+		SqlMapConfig config = XmlSqlMapConfig.xmlToConfig(xml);
+		sqlMap.setSqlNodeMap(parserSqlNode(config));
+		sqlMap.setDataSource(config.getDataSource());
+		return sqlMap;
+	}
+	
+	/**
+	 * 瑙f瀽Sql璇彞鐨勮妭鐐�
+	 * @param config
+	 * @return
+	 */
+	private Map<String, SqlNode> parserSqlNode(SqlMapConfig config){
+		Map<String, SqlNode> map = new HashMap<String, SqlNode>();
+		List<SqlMap> sqlMaps = config.getSqlMaps();
+		//濡傛灉涓虹┖
+		if(sqlMaps == null){
+			sqlMaps = new ArrayList<SqlMap>();
+		}
+		//寮曞叆鐨勫閮�
+		List<String> includes = config.getIncludes();
+		if(includes != null){
+			for (String include : includes) {
+				SqlMapParser sqlMapParser = new SqlMapParser();
+				sqlMaps.add(sqlMapParser.parser(this.getClass().getResourceAsStream(include)));
+			}
+		}
+		//閬嶅巻sqlMap
+		for (SqlMap sqlMap : sqlMaps) {
+			String namespace = sqlMap.getNamespace();
+			//閬嶅巻鎻掑叆璇彞
+			List<Insert> inserts = sqlMap.getInserts();
+			if(inserts != null){
+				for (Insert insert : inserts) {
+					map.put(insert.getId(), insert);
+					if(namespace != null){
+						map.put(namespace+"."+insert.getId(), insert);
+					}
+				}
+			}
+			//閬嶅巻鍒犻櫎璇彞
+			List<Delete> deletes = sqlMap.getDeletes();
+			if(deletes != null){
+				for (Delete delete : deletes) {
+					map.put(delete.getId(), delete);
+					if(namespace != null){
+						map.put(namespace+"."+delete.getId(), delete);
+					}
+				}
+			}
+			//閬嶅巻鏇存柊璇彞
+			List<Update> updates = sqlMap.getUpdates();
+			if(updates != null){
+				for (Update update : updates) {
+					map.put(update.getId(), update);
+					if(namespace != null){
+						map.put(namespace+"."+update.getId(), update);
+					}
+				}
+			}
+			//閬嶅巻鏌ヨ璇彞
+			List<Select> selects = sqlMap.getSelects();
+			if(selects != null){
+				for (Select select : selects) {
+					map.put(select.getId(), select);
+					if(namespace != null){
+						map.put(namespace+"."+select.getId(), select);
+					}
+				}
+			}
+		}
+		return map;
+	}
+	
+	
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/parser/SqlMapParser.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/parser/SqlMapParser.java
new file mode 100644
index 0000000..4c5e886
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/parser/SqlMapParser.java
@@ -0,0 +1,35 @@
+package com.awsle.aibatis.parser;
+
+import java.io.InputStream;
+
+import com.awsle.aibatis.io.XmlLoader;
+import com.awsle.aibatis.xml.aibatis.node.SqlMap;
+import com.awsle.aibatis.xml.utils.XmlSqlMapConfig;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://code.awsle.com/index.php/p/aibatis/
+ * @mail 951868171@qq.com
+ * @version 1.0
+ * @since aibatis-Alpha1.0.zip
+ */
+public class SqlMapParser {
+
+	/**
+	 * 瑙f瀽Xml
+	 * @param xml
+	 * @return
+	 */
+	public SqlMap parser(String path) {
+		String xml = XmlLoader.loadXml(path);
+		SqlMap sqlMap = XmlSqlMapConfig.xmlToSqlMap(xml);
+		return sqlMap;
+	}
+	public SqlMap parser(InputStream in) {
+		String xml = XmlLoader.loadXmlByStream(in);
+		SqlMap sqlMap = XmlSqlMapConfig.xmlToSqlMap(xml);
+		return sqlMap;
+	}
+	
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/pojo/Person.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/pojo/Person.java
new file mode 100644
index 0000000..261d55c
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/pojo/Person.java
@@ -0,0 +1,44 @@
+package com.awsle.aibatis.pojo;
+
+public class Person {
+
+    private String name;
+
+    private String phone;
+
+    private String address;
+
+    private String email;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+}
\ No newline at end of file
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/reflect/FieldUtils.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/reflect/FieldUtils.java
new file mode 100644
index 0000000..1f0af1d
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/reflect/FieldUtils.java
@@ -0,0 +1,228 @@
+
+package com.awsle.aibatis.reflect;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://code.awsle.com/index.php/p/aibatis/
+ * @mail 951868171@qq.com
+ * @version 1.0
+ * @since aibatis-Alpha1.0.zip
+ */
+public class FieldUtils {
+	
+	public static Method getFieldGetMethod(Class<?> clazz, Field f) {
+		String fn = f.getName();
+		Method m = getFieldGetMethod(clazz, fn);
+		if(m == null && f.getType() == boolean.class){
+			m = getBooleanFieldGetMethod(clazz, fn);
+		}
+		return m;
+	}
+	
+	public static Method getBooleanFieldGetMethod(Class<?> clazz, String fieldName) {
+		String mn = "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
+		if(isISStart(fieldName)){
+			mn = fieldName;
+		}
+		try {
+			return clazz.getDeclaredMethod(mn);
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+	
+	
+	public static Method getBooleanFieldSetMethod(Class<?> clazz, Field f) {
+		String fn = f.getName();
+		String mn = "set" + fn.substring(0, 1).toUpperCase() + fn.substring(1);
+		if(isISStart(f.getName())){
+			mn = "set" + fn.substring(2, 3).toUpperCase() + fn.substring(3);
+		}
+		try {
+			return clazz.getDeclaredMethod(mn, f.getType());
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+	
+	
+	private static boolean isISStart(String fieldName){
+		if(fieldName==null || fieldName.trim().length()==0)
+			return false;
+		//is寮�澶达紝骞朵笖is涔嬪悗绗竴涓瓧姣嶆槸澶у啓 姣斿 isAdmin
+		return fieldName.startsWith("is") && !Character.isLowerCase(fieldName.charAt(2));
+	}
+	
+	
+	
+	
+	public static Method getFieldGetMethod(Class<?> clazz, String fieldName) {
+		String mn = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
+		try {
+			return clazz.getDeclaredMethod(mn);
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	public static Method getFieldSetMethod(Class<?> clazz, Field f) {
+		String fn = f.getName();
+		String mn = "set" + fn.substring(0, 1).toUpperCase() + fn.substring(1);
+		try {
+			return clazz.getDeclaredMethod(mn, f.getType());
+		} catch (NoSuchMethodException e) {
+			if(f.getType() == boolean.class){
+				return getBooleanFieldSetMethod(clazz, f);
+			}
+		}
+		return null;
+	}
+	
+	public static Method getFieldSetMethod(Class<?> clazz, String fieldName) {
+		try {
+			return getFieldSetMethod(clazz, clazz.getDeclaredField(fieldName));
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (NoSuchFieldException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	/**
+	 * 鑾峰彇鏌愪釜瀛楁鐨勫��
+	 * @param entity
+	 * @param fieldName
+	 * @return
+	 */
+	public static Object getFieldValue(Object entity,Field field){
+		Method method = getFieldGetMethod(entity.getClass(), field);
+		return invoke(entity, method);
+	}
+	
+	/**
+	 * 鑾峰彇鏌愪釜瀛楁鐨勫��
+	 * @param entity
+	 * @param fieldName
+	 * @return
+	 */
+	public static Object getFieldValue(Object entity,String fieldName){
+		Method method = getFieldGetMethod(entity.getClass(), fieldName);
+		return invoke(entity, method);
+	}
+	
+	/**
+	 * 璁剧疆鏌愪釜瀛楁鐨勫��
+	 * @param entity
+	 * @param fieldName
+	 * @return
+	 */
+	public static void setFieldValue(Object entity,Field field,Object value){
+		try {
+			Method set = getFieldSetMethod(entity.getClass(), field);
+			if (set != null && value != null) {
+				set.setAccessible(true);
+				Class<?> type = field.getType();
+				if (type == String.class) {
+					set.invoke(entity, value.toString());
+				} else if (type == int.class || type == Integer.class) {
+					set.invoke(entity, value == null ? (Integer) null : Integer.parseInt(value.toString()));
+				} else if (type == float.class || type == Float.class) {
+					set.invoke(entity, value == null ? (Float) null: Float.parseFloat(value.toString()));
+				} else if (type == long.class || type == Long.class) {
+					set.invoke(entity, value == null ? (Long) null: Long.parseLong(value.toString()));
+				} else if (type == Date.class) {
+					set.invoke(entity, value == null ? (Date) null: stringToDateTime(value.toString()));
+				} else {
+					set.invoke(entity, value);
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+
+	
+	/**
+	 * 鑾峰彇鏌愪釜瀛楁鐨勫��
+	 * @param entity
+	 * @param fieldName
+	 * @return
+	 */
+	public static Field getFieldByName(Class<?> clazz,String fieldName){
+		Field field = null;
+		if(fieldName!=null){
+			try {
+				field = clazz.getDeclaredField(fieldName);
+			} catch (SecurityException e) {
+				e.printStackTrace();
+			} catch (NoSuchFieldException e) {
+				e.printStackTrace();
+			}
+		}
+		return field;
+	}
+	
+
+
+	/**
+	 * 鑾峰彇鏌愪釜瀹炰綋鎵ц鏌愪釜鏂规硶鐨勭粨鏋�
+	 * @param obj
+	 * @param method
+	 * @return
+	 */
+	private static Object invoke(Object obj , Method method){
+		if(obj == null || method == null) return null;
+		try {
+			return method.invoke(obj);
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	
+	public static boolean isBaseDateType(Field field){
+		Class<?> clazz = field.getType();
+		return   clazz.equals(String.class) ||  
+		         clazz.equals(Integer.class)||  
+		         clazz.equals(Byte.class) ||  
+		         clazz.equals(Long.class) ||  
+		         clazz.equals(Double.class) ||  
+		         clazz.equals(Float.class) ||  
+		         clazz.equals(Character.class) ||  
+		         clazz.equals(Short.class) ||  
+		         clazz.equals(Boolean.class) ||  
+		         clazz.equals(Date.class) ||  
+		         clazz.equals(java.util.Date.class) ||
+		         clazz.equals(java.sql.Date.class) ||
+		         clazz.isPrimitive();
+	}
+	
+	private static Date stringToDateTime(String strDate) {
+		if (strDate != null) {
+			try {
+				return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(strDate);
+			} catch (ParseException e) {
+				e.printStackTrace();
+			}
+		}
+		return null;
+	}
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/reflect/ObjectUtils.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/reflect/ObjectUtils.java
new file mode 100644
index 0000000..4c4e184
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/reflect/ObjectUtils.java
@@ -0,0 +1,57 @@
+package com.awsle.aibatis.reflect;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://code.awsle.com/index.php/p/aibatis/
+ * @mail 951868171@qq.com
+ * @version 1.0
+ * @since aibatis-Alpha1.0.zip
+ */
+public class ObjectUtils{
+	
+	/**
+	 * 
+	 * @param object
+	 * @return
+	 */
+	public static Map objectToMap(Object object){
+		Map map = new HashMap();
+		Field[] fields = object.getClass().getDeclaredFields();
+		for (Field field : fields) {
+			map.put(field.getName(),FieldUtils.getFieldValue(object, field));
+		}
+		return map;
+	}
+	
+	
+	/**
+	 * 灏哅ap杞崲鎴恇ean瀵硅薄
+	 * @param map
+	 * @param clazz
+	 * @return
+	 */
+	public static Object mapToObject(Map map,String clazz){
+		Object obj = null;
+		try {
+			obj = Class.forName(clazz).newInstance();
+			Field[] fields = obj.getClass().getDeclaredFields();
+			for (Field field : fields) {
+				FieldUtils.setFieldValue(obj, field, map.get(field.getName()));
+			}
+		} catch (InstantiationException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		}
+		return obj;
+	}
+	
+	
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/sql/DynamicSql.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/sql/DynamicSql.java
new file mode 100644
index 0000000..e229e11
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/sql/DynamicSql.java
@@ -0,0 +1,123 @@
+package com.awsle.aibatis.sql;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import com.awsle.aibatis.reflect.ObjectUtils;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://code.awsle.com/index.php/p/aibatis/
+ * @mail 951868171@qq.com
+ * @version 1.0
+ * @since aibatis-Alpha1.0.zip
+ */
+public class DynamicSql {
+
+	private String sql;
+	
+	private List params;
+	
+	private String[] bindArgs;
+	
+	private DynamicSql(){
+		setParams(new ArrayList());
+	}
+	
+	/**
+	 * 瑙f瀽鍔ㄦ�丼QL
+	 * @param abatisSql
+	 * @return
+	 */
+	public static DynamicSql parser(String abatisSql){
+		DynamicSql dynamicSql = new DynamicSql();
+		StringBuffer bodyContent = new StringBuffer(abatisSql);
+		iteratePropertyReplace(bodyContent,dynamicSql.getParams());
+		dynamicSql.setSql(bodyContent.toString());
+		return dynamicSql;
+	}
+	
+	/**
+	 * 
+	 * @param bodyContent
+	 * @param list
+	 */
+	private static void iteratePropertyReplace(StringBuffer bodyContent,List list) {
+
+		int startIndex = 0;
+		int endIndex = -1;
+		while (startIndex > -1 && startIndex < bodyContent.length()) {
+			startIndex = bodyContent.indexOf("#");
+			endIndex = bodyContent.indexOf("#", startIndex + 1);
+			if (startIndex > -1 && endIndex > -1) {
+				list.add(bodyContent.subSequence(startIndex+1, endIndex));
+				bodyContent.replace(startIndex, endIndex+1, "?");
+				
+			}
+
+		}
+
+	}
+
+	public String getSql() {
+		return sql;
+	}
+
+	public void setSql(String sql) {
+		this.sql = sql;
+	}
+
+	public List getParams() {
+		return params;
+	}
+
+	public void setParams(List params) {
+		this.params = params;
+	}
+
+	public String[] getBindArgs() {
+		return bindArgs;
+	}
+
+	public void setBindArgs(String[] bindArgs) {
+		this.bindArgs = bindArgs;
+	}
+	
+	public void buildBindArgs(Object parameterObject) {
+		if(parameterObject == null){
+			return ;
+		}
+		int size = params.size();
+		bindArgs = new String[size];
+		if(parameterObject instanceof Map){
+			Map<String, String> map = (Map<String, String>) parameterObject;
+			for (int i =0 ; i< size ; i++){
+				bindArgs[i] = map.get(params.get(i));
+			}
+		}
+		
+		else if(parameterObject instanceof String){
+			for (int i =0 ; i< size ; i++){
+				bindArgs[i] = parameterObject.toString();
+			}
+		}
+		//鏅�歫ava bean
+		else {
+			Map map = ObjectUtils.objectToMap(parameterObject);
+			for (int i =0 ; i< size ; i++){
+				Object value = map.get(params.get(i));
+				if(value instanceof Integer){
+					bindArgs[i] = String.valueOf(value);
+				}
+				else{
+					bindArgs[i] = value.toString();
+				}
+				
+			}
+		}
+
+	}
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/DataSource.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/DataSource.java
new file mode 100644
index 0000000..3cd22c2
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/DataSource.java
@@ -0,0 +1,29 @@
+package com.awsle.aibatis.xml.aibatis.node;
+
+/**
+ * @author 甯湁鑺�
+ * @url http://www.awsle.com
+ * @mail 951868171@qq.com
+ * @version 1.0
+ */
+public class DataSource {
+	
+	//鏁版嵁搴撳悕绉�
+	private String dbName;
+	//鏁版嵁搴撶増鏈�
+	private String dbVersion;
+	
+	public String getDbName() {
+		return dbName;
+	}
+	public void setDbName(String dbName) {
+		this.dbName = dbName;
+	}
+	public String getDbVersion() {
+		return dbVersion;
+	}
+	public void setDbVersion(String dbVersion) {
+		this.dbVersion = dbVersion;
+	}	
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Delete.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Delete.java
new file mode 100644
index 0000000..b157377
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Delete.java
@@ -0,0 +1,12 @@
+package com.awsle.aibatis.xml.aibatis.node;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://www.awsle.com
+ * @mail 951868171@qq.com
+ * @version 1.0
+ */
+public class Delete extends SqlNode{
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Insert.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Insert.java
new file mode 100644
index 0000000..7dfd65e
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Insert.java
@@ -0,0 +1,12 @@
+package com.awsle.aibatis.xml.aibatis.node;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://www.awsle.com
+ * @mail 951868171@qq.com
+ * @version 1.0
+ */
+public class Insert extends SqlNode{
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Select.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Select.java
new file mode 100644
index 0000000..7c6038c
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Select.java
@@ -0,0 +1,12 @@
+package com.awsle.aibatis.xml.aibatis.node;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://www.awsle.com
+ * @mail 951868171@qq.com
+ * @version 1.0
+ */
+public class Select extends SqlNode{
+	
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/SqlMap.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/SqlMap.java
new file mode 100644
index 0000000..7ebb7cb
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/SqlMap.java
@@ -0,0 +1,64 @@
+package com.awsle.aibatis.xml.aibatis.node;
+
+import java.util.List;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://www.awsle.com
+ * @mail 951868171@qq.com
+ * @version 1.0
+ */
+public class SqlMap {
+	
+	private String namespace;
+
+	private List<Insert> inserts;
+	
+	private List<Delete> deletes;
+	
+	private List<Select> selects;
+	
+	private List<Update> updates;
+	
+	public void setSelects(List<Select> selects) {
+		this.selects = selects;
+	}
+
+	public List<Select> getSelects() {
+		return selects;
+	}
+
+	public void setNamespace(String namespace) {
+		this.namespace = namespace;
+	}
+
+	public String getNamespace() {
+		return namespace;
+	}
+
+	public void setInserts(List<Insert> inserts) {
+		this.inserts = inserts;
+	}
+
+	public List<Insert> getInserts() {
+		return inserts;
+	}
+
+	public void setDeletes(List<Delete> deletes) {
+		this.deletes = deletes;
+	}
+
+	public List<Delete> getDeletes() {
+		return deletes;
+	}
+
+	public void setUpdates(List<Update> updates) {
+		this.updates = updates;
+	}
+
+	public List<Update> getUpdates() {
+		return updates;
+	}
+	
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/SqlMapConfig.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/SqlMapConfig.java
new file mode 100644
index 0000000..a0df0e5
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/SqlMapConfig.java
@@ -0,0 +1,45 @@
+package com.awsle.aibatis.xml.aibatis.node;
+
+import java.util.List;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://www.awsle.com
+ * @mail 951868171@qq.com
+ * @version 1.0
+ */
+public class SqlMapConfig {
+
+	private List<SqlMap> sqlMaps ;
+	
+	private DataSource dataSource;
+	
+	private List<String> includes;
+	
+	public void setSqlMaps(List<SqlMap> sqlMaps) {
+		this.sqlMaps = sqlMaps;
+	}
+
+	public List<SqlMap> getSqlMaps() {
+		return sqlMaps;
+	}
+
+	public DataSource getDataSource() {
+		return dataSource;
+	}
+
+	public void setDataSource(DataSource dataSource) {
+		this.dataSource = dataSource;
+	}
+
+	public void setIncludes(List<String> includes) {
+		this.includes = includes;
+	}
+
+	public List<String> getIncludes() {
+		return includes;
+	}
+
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/SqlNode.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/SqlNode.java
new file mode 100644
index 0000000..5a03355
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/SqlNode.java
@@ -0,0 +1,52 @@
+package com.awsle.aibatis.xml.aibatis.node;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://www.awsle.com
+ * @mail 951868171@qq.com
+ * @version 1.0
+ */
+public class SqlNode {
+	
+	private  String id;
+	
+	private String parameterClass;
+	
+	private String resultClass;
+	
+	private String sql;
+	
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getParameterClass() {
+		return parameterClass;
+	}
+
+	public void setParameterClass(String parameterClass) {
+		this.parameterClass = parameterClass;
+	}
+
+	public String getResultClass() {
+		return resultClass;
+	}
+
+	public void setResultClass(String resultClass) {
+		this.resultClass = resultClass;
+	}
+
+	public String getSql() {
+		return sql;
+	}
+
+	public void setSql(String sql) {
+		this.sql = sql;
+	}
+	
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Update.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Update.java
new file mode 100644
index 0000000..9add5c7
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/aibatis/node/Update.java
@@ -0,0 +1,12 @@
+package com.awsle.aibatis.xml.aibatis.node;
+
+/**
+ * 
+ * @author 甯湁鑺�
+ * @url http://www.awsle.com
+ * @mail 951868171@qq.com
+ * @version 1.0
+ */
+public class Update extends SqlNode{
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/XStream.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/XStream.java
new file mode 100644
index 0000000..e97b8e1
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/XStream.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2003, 2004, 2005, 2006 Joe Walnes.
+ * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 XStream Committers.
+ * All rights reserved.
+ *
+ * The software in this package is published under the terms of the BSD
+ * style license a copy of which has been included with this distribution in
+ * the LICENSE.txt file.
+ * 
+ * Created on 26. September 2003 by Joe Walnes
+ */
+package com.awsle.aibatis.xml.engine;
+
+import com.awsle.aibatis.xml.engine.alias.DefaultClassMapper;
+import com.awsle.aibatis.xml.engine.converters.Converter;
+import com.awsle.aibatis.xml.engine.converters.ConverterLookup;
+import com.awsle.aibatis.xml.engine.converters.basic.*;
+import com.awsle.aibatis.xml.engine.converters.collections.ArrayConverter;
+import com.awsle.aibatis.xml.engine.converters.collections.CollectionConverter;
+import com.awsle.aibatis.xml.engine.converters.collections.MapConverter;
+import com.awsle.aibatis.xml.engine.converters.composite.ObjectWithFieldsConverter;
+import com.awsle.aibatis.xml.engine.converters.lookup.DefaultConverterLookup;
+import com.awsle.aibatis.xml.engine.objecttree.ObjectTree;
+import com.awsle.aibatis.xml.engine.objecttree.reflection.MyObjectFactory;
+import com.awsle.aibatis.xml.engine.objecttree.reflection.ObjectFactory;
+import com.awsle.aibatis.xml.engine.objecttree.reflection.ReflectionObjectGraph;
+import com.awsle.aibatis.xml.engine.xml.XMLReader;
+import com.awsle.aibatis.xml.engine.xml.XMLReaderDriver;
+import com.awsle.aibatis.xml.engine.xml.XMLWriter;
+import com.awsle.aibatis.xml.engine.xml.dom.DomXMLReaderDriver;
+import com.awsle.aibatis.xml.engine.xml.text.PrettyPrintXMLWriter;
+
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.*;
+
+public class XStream {
+
+    private DefaultClassMapper classMapper = new DefaultClassMapper();
+    private ConverterLookup converterLookup = new DefaultConverterLookup();
+    private XMLReaderDriver xmlReaderDriver = new DomXMLReaderDriver();
+
+    public XStream() {
+        alias("int", Integer.class);
+        alias("float", Float.class);
+        alias("double", Double.class);
+        alias("long", Long.class);
+        alias("short", Short.class);
+        alias("char", Character.class);
+        alias("byte", Byte.class);
+        alias("boolean", Boolean.class);
+        alias("number", Number.class);
+        alias("object", Object.class);
+
+        alias("string-buffer", StringBuffer.class);
+        alias("string", String.class);
+        alias("java-class", Class.class);
+        alias("date", Date.class);
+
+        alias("map", Map.class, HashMap.class);
+        alias("list", List.class, ArrayList.class);
+        alias("set", Set.class, HashSet.class);
+
+        alias("linked-list", LinkedList.class);
+        alias("tree-map", TreeMap.class);
+        alias("tree-set", TreeSet.class);
+
+        registerConverter(new ObjectWithFieldsConverter(classMapper));
+
+        registerConverter(new IntConverter());
+        registerConverter(new FloatConverter());
+        registerConverter(new DoubleConverter());
+        registerConverter(new LongConverter());
+        registerConverter(new ShortConverter());
+        registerConverter(new CharConverter());
+        registerConverter(new BooleanConverter());
+        registerConverter(new ByteConverter());
+
+        registerConverter(new StringConverter());
+        registerConverter(new StringBufferConverter());
+        registerConverter(new DateConverter());
+        registerConverter(new JavaClassConverter());
+
+        registerConverter(new ArrayConverter(classMapper));
+        registerConverter(new CollectionConverter(classMapper));
+        registerConverter(new MapConverter(classMapper));
+
+    }
+
+    public void alias(String elementName, Class type, Class defaultImplementation) {
+        classMapper.alias(elementName, type, defaultImplementation);
+    }
+
+    public void alias(String elementName, Class type) {
+        alias(elementName, type, type);
+    }
+
+    public String toXML(Object obj) {
+        Writer stringWriter = new StringWriter();
+        XMLWriter xmlWriter = new PrettyPrintXMLWriter(stringWriter);
+        toXML(obj, xmlWriter);
+        return stringWriter.toString();
+    }
+
+    public void toXML(Object obj, XMLWriter xmlWriter) {
+        ObjectFactory objectFactory = new MyObjectFactory();
+        ObjectTree objectGraph = new ReflectionObjectGraph(obj, objectFactory);
+        Converter rootConverter = converterLookup.lookupConverterForType(obj.getClass());
+        xmlWriter.startElement(classMapper.lookupName(obj.getClass()));
+        rootConverter.toXML(objectGraph, xmlWriter, converterLookup);
+        xmlWriter.endElement();
+    }
+
+    public Object fromXML(String xml) {
+        return fromXML(xmlReaderDriver.createReader(xml));
+    }
+
+    public Object fromXML(XMLReader xmlReader) {
+        Class type = classMapper.lookupType(xmlReader.name());
+        ObjectFactory objectFactory = new MyObjectFactory();
+        ObjectTree objectGraph = new ReflectionObjectGraph(type, objectFactory);
+        Converter rootConverter = converterLookup.lookupConverterForType(type);
+        rootConverter.fromXML(objectGraph, xmlReader, converterLookup, type);
+        return objectGraph.get();
+    }
+
+    public void registerConverter(Converter converter) {
+        converterLookup.registerConverter(converter);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/alias/CannotResolveClassException.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/alias/CannotResolveClassException.java
new file mode 100644
index 0000000..2671844
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/alias/CannotResolveClassException.java
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2003, 2004, 2005, 2006 Joe Walnes.
+ * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 XStream Committers.
+ * All rights reserved.
+ *
+ * The software in this package is published under the terms of the BSD
+ * style license a copy of which has been included with this distribution in
+ * the LICENSE.txt file.
+ * 
+ * Created on 26. September 2003 by Joe Walnes
+ */
+package com.awsle.aibatis.xml.engine.alias;
+
+public class CannotResolveClassException extends RuntimeException {
+    public CannotResolveClassException(String className) {
+        super(className);
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/alias/ClassMapper.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/alias/ClassMapper.java
new file mode 100644
index 0000000..c02f553
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/alias/ClassMapper.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2003, 2004, 2005, 2006 Joe Walnes.
+ * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 XStream Committers.
+ * All rights reserved.
+ *
+ * The software in this package is published under the terms of the BSD
+ * style license a copy of which has been included with this distribution in
+ * the LICENSE.txt file.
+ * 
+ * Created on 26. September 2003 by Joe Walnes
+ */
+package com.awsle.aibatis.xml.engine.alias;
+
+public interface ClassMapper {
+    String lookupName(Class type);
+
+    Class lookupType(String elementName);
+
+    Class lookupDefaultType(Class baseType);
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/alias/DefaultClassMapper.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/alias/DefaultClassMapper.java
new file mode 100644
index 0000000..c0bc081
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/alias/DefaultClassMapper.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2003, 2004, 2005, 2006 Joe Walnes.
+ * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 XStream Committers.
+ * All rights reserved.
+ *
+ * The software in this package is published under the terms of the BSD
+ * style license a copy of which has been included with this distribution in
+ * the LICENSE.txt file.
+ * 
+ * Created on 26. September 2003 by Joe Walnes
+ */
+package com.awsle.aibatis.xml.engine.alias;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class DefaultClassMapper implements ClassMapper {
+
+    private Map typeToNameMap = new HashMap();
+    private Map nameToTypeMap = new HashMap();
+    private Map baseTypeToDefaultTypeMap = new HashMap();
+
+    public DefaultClassMapper() {
+        // register primitive types
+        baseTypeToDefaultTypeMap.put(boolean.class, Boolean.class);
+        baseTypeToDefaultTypeMap.put(char.class, Character.class);
+        baseTypeToDefaultTypeMap.put(int.class, Integer.class);
+        baseTypeToDefaultTypeMap.put(float.class, Float.class);
+        baseTypeToDefaultTypeMap.put(double.class, Double.class);
+        baseTypeToDefaultTypeMap.put(short.class, Short.class);
+        baseTypeToDefaultTypeMap.put(byte.class, Byte.class);
+        baseTypeToDefaultTypeMap.put(long.class, Long.class);
+    }
+
+    public void alias(String elementName, Class type, Class defaultImplementation) {
+        nameToTypeMap.put(elementName, type.getName());
+        typeToNameMap.put(type, elementName);
+        if (!type.equals(defaultImplementation)) {
+            typeToNameMap.put(defaultImplementation, elementName);
+        }
+        baseTypeToDefaultTypeMap.put(type, defaultImplementation);
+    }
+
+    public String lookupName(Class type) {
+        boolean isArray = type.isArray();
+        if (type.isArray()) {
+            type = type.getComponentType();
+        }
+        String result = (String) typeToNameMap.get(type);
+        if (result == null) {
+            // the $ used in inner class names is illegal as an xml element name
+            result = type.getName().replaceAll("\\$", "-");
+        }
+        if (isArray) {
+            result += "-array";
+        }
+        return result;
+    }
+
+    public Class lookupType(String elementName) {
+        if (elementName.equals("null")) {
+            return null;
+        }
+        boolean isArray = elementName.endsWith("-array");
+        if (isArray) {
+            elementName = elementName.substring(0, elementName.length() - 6); // cut off -array
+        }
+        String mappedName = (String) nameToTypeMap.get(elementName);
+        if (mappedName != null) {
+            elementName = mappedName;
+        }
+        // the $ used in inner class names is illegal as an xml element name
+        elementName = elementName.replaceAll("\\-", "\\$");
+        try {
+            if (isArray) {
+                return Class.forName("[L" + elementName + ";");
+            } else {
+                return Class.forName(elementName);
+            }
+        } catch (ClassNotFoundException e) {
+            throw new CannotResolveClassException(elementName);
+        }
+    }
+
+    public Class lookupDefaultType(Class baseType) {
+        return (Class) baseTypeToDefaultTypeMap.get(baseType);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/ConversionException.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/ConversionException.java
new file mode 100644
index 0000000..dc09e92
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/ConversionException.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2003, 2004, 2005, 2006 Joe Walnes.
+ * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 XStream Committers.
+ * All rights reserved.
+ *
+ * The software in this package is published under the terms of the BSD
+ * style license a copy of which has been included with this distribution in
+ * the LICENSE.txt file.
+ * 
+ * Created on 26. September 2003 by Joe Walnes
+ */
+package com.awsle.aibatis.xml.engine.converters;
+
+public class ConversionException extends RuntimeException {
+    public ConversionException(String msg, Exception cause) {
+        super(msg, cause);
+    }
+
+    public ConversionException(String msg) {
+        super(msg);
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/Converter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/Converter.java
new file mode 100644
index 0000000..c6c0118
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/Converter.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2003, 2004, 2005, 2006 Joe Walnes.
+ * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 XStream Committers.
+ * All rights reserved.
+ *
+ * The software in this package is published under the terms of the BSD
+ * style license a copy of which has been included with this distribution in
+ * the LICENSE.txt file.
+ * 
+ * Created on 26. September 2003 by Joe Walnes
+ */
+package com.awsle.aibatis.xml.engine.converters;
+
+import com.awsle.aibatis.xml.engine.objecttree.ObjectTree;
+import com.awsle.aibatis.xml.engine.xml.XMLReader;
+import com.awsle.aibatis.xml.engine.xml.XMLWriter;
+
+public interface Converter {
+
+    boolean canConvert(Class type);
+
+    void toXML(ObjectTree objectGraph, XMLWriter xmlWriter, ConverterLookup converterLookup);
+
+    void fromXML(ObjectTree objectGraph, XMLReader xmlReader, ConverterLookup converterLookup, Class requiredType);
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/ConverterLookup.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/ConverterLookup.java
new file mode 100644
index 0000000..3879688
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/ConverterLookup.java
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2003, 2004, 2005, 2006 Joe Walnes.
+ * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 XStream Committers.
+ * All rights reserved.
+ *
+ * The software in this package is published under the terms of the BSD
+ * style license a copy of which has been included with this distribution in
+ * the LICENSE.txt file.
+ * 
+ * Created on 26. September 2003 by Joe Walnes
+ */
+package com.awsle.aibatis.xml.engine.converters;
+
+public interface ConverterLookup {
+    void registerConverter(Converter converter);
+
+    Converter lookupConverterForType(Class type);
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/AbstractBasicConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/AbstractBasicConverter.java
new file mode 100644
index 0000000..ffde067
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/AbstractBasicConverter.java
@@ -0,0 +1,27 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+import com.awsle.aibatis.xml.engine.converters.Converter;
+import com.awsle.aibatis.xml.engine.converters.ConverterLookup;
+import com.awsle.aibatis.xml.engine.objecttree.ObjectTree;
+import com.awsle.aibatis.xml.engine.xml.XMLReader;
+import com.awsle.aibatis.xml.engine.xml.XMLWriter;
+
+public abstract class AbstractBasicConverter implements Converter {
+
+    protected abstract Object fromString(String str);
+
+    public abstract boolean canConvert(Class type);
+
+    protected String toString(Object obj) {
+        return obj.toString();
+    }
+
+    public void toXML(ObjectTree objectGraph, XMLWriter xmlWriter, ConverterLookup converterLookup) {
+        xmlWriter.writeText(toString(objectGraph.get()));
+    }
+
+    public void fromXML(ObjectTree objectGraph, XMLReader xmlReader, ConverterLookup converterLookup, Class requiredType) {
+        objectGraph.set(fromString(xmlReader.text()));
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/BooleanConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/BooleanConverter.java
new file mode 100644
index 0000000..a9e04ca
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/BooleanConverter.java
@@ -0,0 +1,13 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+public class BooleanConverter extends AbstractBasicConverter {
+
+    public boolean canConvert(Class type) {
+        return type.equals(boolean.class) || type.equals(Boolean.class);
+    }
+
+    protected Object fromString(String str) {
+        return str.equals("true") ? Boolean.TRUE : Boolean.FALSE;
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/ByteConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/ByteConverter.java
new file mode 100644
index 0000000..fd2c384
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/ByteConverter.java
@@ -0,0 +1,13 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+public class ByteConverter extends AbstractBasicConverter {
+
+    public boolean canConvert(Class type) {
+        return type.equals(byte.class) || type.equals(Byte.class);
+    }
+
+    protected Object fromString(String str) {
+        return new Byte((byte) Integer.parseInt(str));
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/CharConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/CharConverter.java
new file mode 100644
index 0000000..fdb5ec3
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/CharConverter.java
@@ -0,0 +1,13 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+public class CharConverter extends AbstractBasicConverter {
+
+    public boolean canConvert(Class type) {
+        return type.equals(char.class) || type.equals(Character.class);
+    }
+
+    protected Object fromString(String str) {
+        return new Character(str.charAt(0));
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/DateConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/DateConverter.java
new file mode 100644
index 0000000..8efb752
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/DateConverter.java
@@ -0,0 +1,40 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+import com.awsle.aibatis.xml.engine.converters.ConversionException;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+public class DateConverter extends AbstractBasicConverter {
+
+    private DateFormat dateFormat;
+
+    public boolean canConvert(Class type) {
+        return type.equals(Date.class);
+    }
+
+    public DateConverter(DateFormat dateFormat) {
+        this.dateFormat = dateFormat;
+    }
+
+    public DateConverter() {
+        this(new SimpleDateFormat("yyyy-MM-dd HH:mm:ssa"));
+    }
+
+    protected Object fromString(String str) {
+        try {
+            return dateFormat.parse(str);
+        } catch (ParseException e) {
+            throw new ConversionException("Cannot parse date " + str, e);
+        }
+    }
+
+    protected String toString(Object obj) {
+        Date date = (Date) obj;
+        return dateFormat.format(date);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/DoubleConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/DoubleConverter.java
new file mode 100644
index 0000000..fa955c3
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/DoubleConverter.java
@@ -0,0 +1,13 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+public class DoubleConverter extends AbstractBasicConverter {
+
+    public boolean canConvert(Class type) {
+        return type.equals(double.class) || type.equals(Double.class);
+    }
+
+    protected Object fromString(String str) {
+        return Double.valueOf(str);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/FloatConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/FloatConverter.java
new file mode 100644
index 0000000..3976a56
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/FloatConverter.java
@@ -0,0 +1,13 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+public class FloatConverter extends AbstractBasicConverter {
+
+    public boolean canConvert(Class type) {
+        return type.equals(float.class) || type.equals(Float.class);
+    }
+
+    protected Object fromString(String str) {
+        return Float.valueOf(str);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/IntConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/IntConverter.java
new file mode 100644
index 0000000..0d19a97
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/IntConverter.java
@@ -0,0 +1,13 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+public class IntConverter extends AbstractBasicConverter {
+
+    public boolean canConvert(Class type) {
+        return type.equals(int.class) || type.equals(Integer.class);
+    }
+
+    protected Object fromString(String str) {
+        return Integer.valueOf(str);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/JavaClassConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/JavaClassConverter.java
new file mode 100644
index 0000000..49f31a1
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/JavaClassConverter.java
@@ -0,0 +1,33 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+import com.awsle.aibatis.xml.engine.converters.ConversionException;
+
+public class JavaClassConverter extends AbstractBasicConverter {
+
+    private ClassLoader classLoader;
+
+    public JavaClassConverter() {
+        this(Thread.currentThread().getContextClassLoader());
+    }
+
+    public JavaClassConverter(ClassLoader classLoader) {
+        this.classLoader = classLoader;
+    }
+
+    public boolean canConvert(Class clazz) {
+        return Class.class.equals(clazz); // :)
+    }
+
+    protected String toString(Object obj) {
+        return ((Class) obj).getName();
+    }
+
+    protected Object fromString(String str) {
+        try {
+            return classLoader.loadClass(str);
+        } catch (ClassNotFoundException e) {
+            throw new ConversionException("Cannot load java class " + str, e);
+        }
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/LongConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/LongConverter.java
new file mode 100644
index 0000000..9e653e5
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/LongConverter.java
@@ -0,0 +1,13 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+public class LongConverter extends AbstractBasicConverter {
+
+    public boolean canConvert(Class type) {
+        return type.equals(long.class) || type.equals(Long.class);
+    }
+
+    protected Object fromString(String str) {
+        return Long.valueOf(str);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/NullConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/NullConverter.java
new file mode 100644
index 0000000..942bb6e
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/NullConverter.java
@@ -0,0 +1,23 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+import com.awsle.aibatis.xml.engine.converters.Converter;
+import com.awsle.aibatis.xml.engine.converters.ConverterLookup;
+import com.awsle.aibatis.xml.engine.objecttree.ObjectTree;
+import com.awsle.aibatis.xml.engine.xml.XMLReader;
+import com.awsle.aibatis.xml.engine.xml.XMLWriter;
+
+public class NullConverter implements Converter {
+
+    public boolean canConvert(Class type) {
+        return type == null;
+    }
+
+    public void toXML(ObjectTree objectGraph, XMLWriter xmlWriter, ConverterLookup converterLookup) {
+        xmlWriter.startElement("null");
+        xmlWriter.endElement();
+    }
+
+    public void fromXML(ObjectTree objectGraph, XMLReader xmlReader, ConverterLookup converterLookup, Class requiredType) {
+        // no need to do anything
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/ShortConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/ShortConverter.java
new file mode 100644
index 0000000..b743fd2
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/ShortConverter.java
@@ -0,0 +1,13 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+public class ShortConverter extends AbstractBasicConverter {
+
+    public boolean canConvert(Class type) {
+        return type.equals(short.class) || type.equals(Short.class);
+    }
+
+    protected Object fromString(String str) {
+        return Short.valueOf(str);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/StringBufferConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/StringBufferConverter.java
new file mode 100644
index 0000000..abc04e4
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/StringBufferConverter.java
@@ -0,0 +1,12 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+public class StringBufferConverter extends AbstractBasicConverter {
+
+    protected Object fromString(String str) {
+        return new StringBuffer(str);
+    }
+
+    public boolean canConvert(Class type) {
+        return type.equals(StringBuffer.class);
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/StringConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/StringConverter.java
new file mode 100644
index 0000000..87ffb2b
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/basic/StringConverter.java
@@ -0,0 +1,13 @@
+package com.awsle.aibatis.xml.engine.converters.basic;
+
+public class StringConverter extends AbstractBasicConverter {
+
+    public boolean canConvert(Class type) {
+        return type.equals(String.class);
+    }
+
+    protected Object fromString(String str) {
+        return str;
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/AbstractCollectionConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/AbstractCollectionConverter.java
new file mode 100644
index 0000000..4ff91bc
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/AbstractCollectionConverter.java
@@ -0,0 +1,57 @@
+package com.awsle.aibatis.xml.engine.converters.collections;
+
+import com.awsle.aibatis.xml.engine.alias.ClassMapper;
+import com.awsle.aibatis.xml.engine.converters.ConversionException;
+import com.awsle.aibatis.xml.engine.converters.Converter;
+import com.awsle.aibatis.xml.engine.converters.ConverterLookup;
+import com.awsle.aibatis.xml.engine.objecttree.ObjectTree;
+import com.awsle.aibatis.xml.engine.xml.XMLReader;
+import com.awsle.aibatis.xml.engine.xml.XMLWriter;
+
+public abstract class AbstractCollectionConverter implements Converter {
+    protected ClassMapper classMapper;
+
+    public abstract boolean canConvert(Class type);
+
+    public AbstractCollectionConverter(ClassMapper classMapper) {
+        this.classMapper = classMapper;
+    }
+
+    public abstract void toXML(ObjectTree objectGraph, XMLWriter xmlWriter, ConverterLookup converterLookup);
+
+    public abstract void fromXML(ObjectTree objectGraph, XMLReader xmlReader, ConverterLookup converterLookup, Class requiredType);
+
+    protected void writeItem(Object item, XMLWriter xmlWriter, ConverterLookup converterLookup, ObjectTree objectGraph) {
+        if (item == null) {
+            xmlWriter.startElement("null");
+            xmlWriter.endElement();
+        } else {
+            Class type = item.getClass();
+            xmlWriter.startElement(classMapper.lookupName(type));
+            Converter converter = converterLookup.lookupConverterForType(type);
+            converter.toXML(objectGraph.newStack(item), xmlWriter, converterLookup);
+            xmlWriter.endElement();
+        }
+    }
+
+    protected Object readItem(XMLReader xmlReader, int childIndex, ObjectTree objectGraph, ConverterLookup converterLookup) {
+        xmlReader.child(childIndex);
+        Class type = classMapper.lookupType(xmlReader.name());
+        ObjectTree itemWriter = objectGraph.newStack(type);
+        Converter converter = converterLookup.lookupConverterForType(type);
+        converter.fromXML(itemWriter, xmlReader, converterLookup, type);
+        xmlReader.pop();
+        return itemWriter.get();
+    }
+
+    protected Object createCollection(Class type) {
+        Class defaultType = classMapper.lookupDefaultType(type);
+        try {
+            return defaultType.newInstance();
+        } catch (InstantiationException e) {
+            throw new ConversionException("Cannot instantiate " + defaultType.getName(), e);
+        } catch (IllegalAccessException e) {
+            throw new ConversionException("Cannot instantiate " + defaultType.getName(), e);
+        }
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/ArrayConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/ArrayConverter.java
new file mode 100644
index 0000000..c5ddb39
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/ArrayConverter.java
@@ -0,0 +1,42 @@
+package com.awsle.aibatis.xml.engine.converters.collections;
+
+import com.awsle.aibatis.xml.engine.alias.ClassMapper;
+import com.awsle.aibatis.xml.engine.converters.ConverterLookup;
+import com.awsle.aibatis.xml.engine.objecttree.ObjectTree;
+import com.awsle.aibatis.xml.engine.xml.XMLReader;
+import com.awsle.aibatis.xml.engine.xml.XMLWriter;
+
+import java.lang.reflect.Array;
+
+public class ArrayConverter extends AbstractCollectionConverter {
+
+    public ArrayConverter(ClassMapper classMapper) {
+        super(classMapper);
+    }
+
+    public boolean canConvert(Class type) {
+        return type.isArray();
+    }
+
+    public void toXML(ObjectTree objectGraph, XMLWriter xmlWriter, ConverterLookup converterLookup) {
+        Object array = objectGraph.get();
+        int length = Array.getLength(array);
+        for (int i = 0; i < length; i++) {
+            Object item = Array.get(array, i);
+            writeItem(item, xmlWriter, converterLookup, objectGraph);
+        }
+    }
+
+    public void fromXML(ObjectTree objectGraph, XMLReader xmlReader, ConverterLookup converterLookup, Class requiredType) {
+        int size = xmlReader.childCount();
+        Class type = classMapper.lookupType(xmlReader.name());
+        Object array = Array.newInstance(type.getComponentType(), size);
+        for (int i = 0; i < size; i++) {
+            Object item = readItem(xmlReader, i, objectGraph, converterLookup);
+            Array.set(array, i, item);
+        }
+        objectGraph.set(array);
+    }
+
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/CollectionConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/CollectionConverter.java
new file mode 100644
index 0000000..650f092
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/CollectionConverter.java
@@ -0,0 +1,40 @@
+package com.awsle.aibatis.xml.engine.converters.collections;
+
+import com.awsle.aibatis.xml.engine.alias.ClassMapper;
+import com.awsle.aibatis.xml.engine.converters.ConverterLookup;
+import com.awsle.aibatis.xml.engine.objecttree.ObjectTree;
+import com.awsle.aibatis.xml.engine.xml.XMLReader;
+import com.awsle.aibatis.xml.engine.xml.XMLWriter;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+public class CollectionConverter extends AbstractCollectionConverter {
+
+    public CollectionConverter(ClassMapper classMapper) {
+        super(classMapper);
+    }
+
+    public boolean canConvert(Class type) {
+        return Collection.class.isAssignableFrom(type);
+    }
+
+    public void toXML(ObjectTree objectGraph, XMLWriter xmlWriter, ConverterLookup converterLookup) {
+        Collection collection = (Collection) objectGraph.get();
+        for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
+            Object item = iterator.next();
+            writeItem(item, xmlWriter, converterLookup, objectGraph);
+        }
+    }
+
+    public void fromXML(ObjectTree objectGraph, XMLReader xmlReader, ConverterLookup converterLookup, Class requiredType) {
+        Collection collection = (Collection) createCollection(requiredType);
+        int childCount = xmlReader.childCount();
+        for (int i = 0; i < childCount; i++) {
+            Object item = readItem(xmlReader, i, objectGraph, converterLookup);
+            collection.add(item);
+        }
+        objectGraph.set(collection);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/MapConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/MapConverter.java
new file mode 100644
index 0000000..266f4cc
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/collections/MapConverter.java
@@ -0,0 +1,50 @@
+package com.awsle.aibatis.xml.engine.converters.collections;
+
+import com.awsle.aibatis.xml.engine.alias.ClassMapper;
+import com.awsle.aibatis.xml.engine.converters.ConverterLookup;
+import com.awsle.aibatis.xml.engine.objecttree.ObjectTree;
+import com.awsle.aibatis.xml.engine.xml.XMLReader;
+import com.awsle.aibatis.xml.engine.xml.XMLWriter;
+
+import java.util.Iterator;
+import java.util.Map;
+
+public class MapConverter extends AbstractCollectionConverter {
+
+    public MapConverter(ClassMapper classMapper) {
+        super(classMapper);
+    }
+
+    public boolean canConvert(Class type) {
+        return Map.class.isAssignableFrom(type);
+    }
+
+    public void toXML(ObjectTree objectGraph, XMLWriter xmlWriter, ConverterLookup converterLookup) {
+        Map map = (Map) objectGraph.get();
+        for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            xmlWriter.startElement("entry");
+
+            writeItem(entry.getKey(), xmlWriter, converterLookup, objectGraph);
+            writeItem(entry.getValue(), xmlWriter, converterLookup, objectGraph);
+
+            xmlWriter.endElement();
+        }
+    }
+
+    public void fromXML(ObjectTree objectGraph, XMLReader xmlReader, ConverterLookup converterLookup, Class requiredType) {
+        int childCount = xmlReader.childCount();
+        Map map = (Map) createCollection(requiredType);
+        for (int i = 0; i < childCount; i++) {
+            xmlReader.child(i);
+
+            Object key = readItem(xmlReader, 0, objectGraph, converterLookup);
+            Object value = readItem(xmlReader, 1, objectGraph, converterLookup);
+            map.put(key, value);
+
+            xmlReader.pop();
+        }
+        objectGraph.set(map);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/composite/ObjectWithFieldsConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/composite/ObjectWithFieldsConverter.java
new file mode 100644
index 0000000..eab5da7
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/composite/ObjectWithFieldsConverter.java
@@ -0,0 +1,85 @@
+package com.awsle.aibatis.xml.engine.converters.composite;
+
+import com.awsle.aibatis.xml.engine.alias.ClassMapper;
+import com.awsle.aibatis.xml.engine.converters.Converter;
+import com.awsle.aibatis.xml.engine.converters.ConverterLookup;
+import com.awsle.aibatis.xml.engine.objecttree.ObjectTree;
+import com.awsle.aibatis.xml.engine.xml.XMLReader;
+import com.awsle.aibatis.xml.engine.xml.XMLWriter;
+
+public class ObjectWithFieldsConverter implements Converter {
+
+    private ClassMapper classMapper;
+
+    public ObjectWithFieldsConverter(ClassMapper classMapper) {
+        this.classMapper = classMapper;
+    }
+
+    public boolean canConvert(Class type) {
+        return true;
+    }
+
+    public void toXML(ObjectTree objectGraph, XMLWriter xmlWriter, ConverterLookup converterLookup) {
+        String[] fieldNames = objectGraph.fieldNames();
+        for (int i = 0; i < fieldNames.length; i++) {
+            String fieldName = fieldNames[i];
+
+            objectGraph.push(fieldName);
+
+            if (objectGraph.get() != null) {
+                writeFieldAsXML(xmlWriter, fieldName, objectGraph, converterLookup);
+            }
+
+            objectGraph.pop();
+        }
+    }
+
+    private void writeFieldAsXML(XMLWriter xmlWriter, String fieldName, ObjectTree objectGraph, ConverterLookup converterLookup) {
+        xmlWriter.startElement(fieldName);
+
+        writeClassAttributeInXMLIfNotDefaultImplementation(objectGraph, xmlWriter);
+        Converter converter = converterLookup.lookupConverterForType(objectGraph.type());
+        converter.toXML(objectGraph, xmlWriter, converterLookup);
+
+        xmlWriter.endElement();
+    }
+
+    protected void writeClassAttributeInXMLIfNotDefaultImplementation(ObjectTree objectGraph, XMLWriter xmlWriter) {
+        Class actualType = objectGraph.get().getClass();
+        Class defaultType = classMapper.lookupDefaultType(objectGraph.type());
+        if (!actualType.equals(defaultType)) {
+            xmlWriter.addAttribute("class", classMapper.lookupName(actualType));
+        }
+    }
+
+    public void fromXML(final ObjectTree objectGraph, XMLReader xmlReader, ConverterLookup converterLookup, Class requiredType) {
+        objectGraph.create(requiredType);
+        String[] fieldNames = objectGraph.fieldNames();
+        for (int i = 0; i < fieldNames.length; i++) {
+            String fieldName = fieldNames[i];
+            if (xmlReader.childExists(fieldName)) {
+                objectGraph.push(fieldName);
+                xmlReader.child(fieldName);
+
+                Class type = determineWhichImplementationToUse(xmlReader, objectGraph);
+                Converter converter = converterLookup.lookupConverterForType(type);
+                converter.fromXML(objectGraph, xmlReader, converterLookup, type);
+
+                xmlReader.pop();
+                objectGraph.pop();
+            }
+        }
+    }
+
+    private Class determineWhichImplementationToUse(XMLReader xmlReader, final ObjectTree objectGraph) {
+        String classAttribute = xmlReader.attribute("class");
+        Class type;
+        if (classAttribute == null) {
+            type = objectGraph.type();
+        } else {
+            type = classMapper.lookupType(classAttribute);
+        }
+        return type;
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/extended/SqlTimestampConverter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/extended/SqlTimestampConverter.java
new file mode 100644
index 0000000..5bf240f
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/extended/SqlTimestampConverter.java
@@ -0,0 +1,17 @@
+package com.awsle.aibatis.xml.engine.converters.extended;
+
+import com.awsle.aibatis.xml.engine.converters.basic.AbstractBasicConverter;
+
+import java.sql.Timestamp;
+
+public class SqlTimestampConverter extends AbstractBasicConverter {
+
+    protected Object fromString(String str) {
+        return Timestamp.valueOf(str);
+    }
+
+    public boolean canConvert(Class type) {
+        return type.equals(Timestamp.class);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/lookup/DefaultConverterLookup.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/lookup/DefaultConverterLookup.java
new file mode 100644
index 0000000..4f13bdc
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/converters/lookup/DefaultConverterLookup.java
@@ -0,0 +1,33 @@
+package com.awsle.aibatis.xml.engine.converters.lookup;
+
+import com.awsle.aibatis.xml.engine.converters.ConversionException;
+import com.awsle.aibatis.xml.engine.converters.Converter;
+import com.awsle.aibatis.xml.engine.converters.ConverterLookup;
+import com.awsle.aibatis.xml.engine.converters.basic.NullConverter;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+
+public class DefaultConverterLookup implements ConverterLookup {
+
+    private LinkedList converters = new LinkedList();
+    private Converter nullConverter = new NullConverter();
+
+    public Converter lookupConverterForType(Class type) {
+        if (type == null) {
+            return nullConverter;
+        }
+        for (Iterator iterator = converters.iterator(); iterator.hasNext();) {
+            Converter converter = (Converter) iterator.next();
+            if (converter.canConvert(type)) {
+                return converter;
+            }
+        }
+        throw new ConversionException("No converter specified for " + type);
+    }
+
+    public void registerConverter(Converter converter) {
+        converters.addFirst(converter);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/ObjectAccessException.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/ObjectAccessException.java
new file mode 100644
index 0000000..aa1ef5a
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/ObjectAccessException.java
@@ -0,0 +1,7 @@
+package com.awsle.aibatis.xml.engine.objecttree;
+
+public class ObjectAccessException extends RuntimeException {
+    public ObjectAccessException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/ObjectTree.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/ObjectTree.java
new file mode 100644
index 0000000..6a1901d
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/ObjectTree.java
@@ -0,0 +1,22 @@
+package com.awsle.aibatis.xml.engine.objecttree;
+
+public interface ObjectTree {
+
+    void push(String fieldName);
+
+    void pop();
+
+    Object get();
+
+    Class type();
+
+    void set(Object value);
+
+    void create(Class type);
+
+    String[] fieldNames();
+
+    ObjectTree newStack(Object instance);
+
+    ObjectTree newStack(Class type);
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/reflection/MyObjectFactory.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/reflection/MyObjectFactory.java
new file mode 100644
index 0000000..924db1b
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/reflection/MyObjectFactory.java
@@ -0,0 +1,18 @@
+package com.awsle.aibatis.xml.engine.objecttree.reflection;
+
+import com.awsle.aibatis.xml.engine.objecttree.ObjectAccessException;
+
+
+public class MyObjectFactory implements ObjectFactory {
+
+    public Object create(Class type) {
+        try {
+            return type.newInstance();
+        } catch (InstantiationException e) {
+            throw new ObjectAccessException("Cannot construct " + type.getName(), e);
+        } catch (IllegalAccessException e) {
+            throw new ObjectAccessException("Cannot construct " + type.getName(), e);
+        } 
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/reflection/ObjectFactory.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/reflection/ObjectFactory.java
new file mode 100644
index 0000000..f8e4728
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/reflection/ObjectFactory.java
@@ -0,0 +1,5 @@
+package com.awsle.aibatis.xml.engine.objecttree.reflection;
+
+public interface ObjectFactory {
+    Object create(Class type);
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/reflection/ReflectionObjectGraph.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/reflection/ReflectionObjectGraph.java
new file mode 100644
index 0000000..899d649
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/objecttree/reflection/ReflectionObjectGraph.java
@@ -0,0 +1,150 @@
+//020 8330 0577 bob
+package com.awsle.aibatis.xml.engine.objecttree.reflection;
+
+import com.awsle.aibatis.xml.engine.objecttree.ObjectAccessException;
+import com.awsle.aibatis.xml.engine.objecttree.ObjectTree;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.LinkedList;
+import java.util.List;
+
+public class ReflectionObjectGraph implements ObjectTree {
+
+    private LinkedList fieldStack = new LinkedList();
+    private LinkedList instanceStack = new LinkedList();
+    private Class rootType;
+    private ObjectFactory objectFactory;
+
+    public ReflectionObjectGraph(Object root, ObjectFactory objectFactory) {
+        this.objectFactory = objectFactory;
+        init(root);
+    }
+
+    public ReflectionObjectGraph(Class rootType, ObjectFactory objectFactory) {
+        this.rootType = rootType;
+        this.objectFactory = objectFactory;
+        init(null);
+    }
+
+    private static class RootHolder {
+        Object value;
+    }
+
+    private void init(Object root) {
+        RootHolder holder = new RootHolder();
+        holder.value = root;
+        instanceStack.addLast(holder);
+        push("value");
+    }
+
+    public void push(String fieldName) {
+        Object top = instanceStack.getLast();
+
+        Field field = null;
+        Class currentClass = top.getClass();
+        try {
+
+            while (field == null) {
+                try {
+                    field = currentClass.getDeclaredField(fieldName);
+                } catch (NoSuchFieldException e) {
+                    if (Object.class.equals(currentClass)) {
+                        throw new ObjectAccessException("Cannot access field " + fieldName, e);
+                    }
+                    currentClass = currentClass.getSuperclass();
+                }
+            }
+
+        } catch (SecurityException e) {
+            throw new ObjectAccessException("Cannot access field " + fieldName, e);
+        }
+        field.setAccessible(true);
+        fieldStack.addLast(field);
+
+        try {
+            instanceStack.addLast(field.get(top));
+        } catch (IllegalArgumentException e) {
+            throw new ObjectAccessException("Cannot access field " + fieldName, e);
+        } catch (IllegalAccessException e) {
+            throw new ObjectAccessException("Cannot access field " + fieldName, e);
+        }
+
+    }
+
+    public void pop() {
+        fieldStack.removeLast();
+        instanceStack.removeLast();
+    }
+
+    public Class type() {
+        if (fieldStack.size() == 1) {
+            return rootType;
+        } else {
+            Field field = (Field) fieldStack.getLast();
+            Class type = field.getType();
+            return type;
+        }
+    }
+
+    public Object get() {
+        return instanceStack.getLast();
+    }
+
+    public void set(Object value) {
+        try {
+            instanceStack.removeLast();
+            Field field = (Field) fieldStack.getLast();
+            Object top = instanceStack.getLast();
+            field.set(top, value);
+            instanceStack.addLast(value);
+        } catch (IllegalAccessException e) {
+            throw new ObjectAccessException("Cannot set field", e);
+        }
+    }
+
+    public void create(Class type) {
+        set(objectFactory.create(type));
+    }
+
+    public String[] fieldNames() {
+        List fieldNames = new LinkedList();
+        Class theClass = get().getClass();
+        Class currentClass = theClass;
+
+        while (!Object.class.equals(currentClass)) {
+            getFields(fieldNames, currentClass);
+            currentClass = currentClass.getSuperclass();
+        }
+
+        String[] result = new String[fieldNames.size()];
+        fieldNames.toArray(result);
+        return result;
+    }
+
+    private void getFields(List fieldNames, Class theClass) {
+        Field[] fields = theClass.getDeclaredFields();
+        for (int i = 0; i < fields.length; i++) {
+            Field field = fields[i];
+            int modifiers = field.getModifiers();
+            if (field.getName().startsWith("this$")) {
+                continue;
+            }
+            if (Modifier.isFinal(modifiers) ||
+                    Modifier.isStatic(modifiers) ||
+                    Modifier.isTransient(modifiers)) {
+                continue;
+            }
+            fieldNames.add(field.getName());
+        }
+    }
+
+    public ObjectTree newStack(Class type) {
+        return new ReflectionObjectGraph(type, objectFactory);
+    }
+
+    public ObjectTree newStack(Object instance) {
+        return new ReflectionObjectGraph(instance, objectFactory);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/CannotParseXMLException.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/CannotParseXMLException.java
new file mode 100644
index 0000000..393cea8
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/CannotParseXMLException.java
@@ -0,0 +1,12 @@
+package com.awsle.aibatis.xml.engine.xml;
+
+public class CannotParseXMLException extends RuntimeException {
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = -7262048752775799211L;
+
+	public CannotParseXMLException(Throwable e) {
+        super(e);
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/XMLReader.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/XMLReader.java
new file mode 100644
index 0000000..4a09bf7
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/XMLReader.java
@@ -0,0 +1,23 @@
+package com.awsle.aibatis.xml.engine.xml;
+
+//@TODO: Alter API to be pull-parser friendly.
+
+public interface XMLReader {
+
+    String name();
+
+    String text();
+
+    String attribute(String name);
+
+    int childCount();
+
+    boolean childExists(String elementName);
+
+    void child(int index);
+
+    void child(String elementName);
+
+    void pop();
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/XMLReaderDriver.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/XMLReaderDriver.java
new file mode 100644
index 0000000..dddf4d1
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/XMLReaderDriver.java
@@ -0,0 +1,7 @@
+package com.awsle.aibatis.xml.engine.xml;
+
+public interface XMLReaderDriver {
+
+    XMLReader createReader(String xml);
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/XMLWriter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/XMLWriter.java
new file mode 100644
index 0000000..8a616b4
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/XMLWriter.java
@@ -0,0 +1,13 @@
+package com.awsle.aibatis.xml.engine.xml;
+
+public interface XMLWriter {
+
+    void startElement(String name);
+
+    void addAttribute(String key, String value);
+
+    void writeText(String text);
+
+    void endElement();
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/dom/DomXMLReader.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/dom/DomXMLReader.java
new file mode 100644
index 0000000..b4299d7
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/dom/DomXMLReader.java
@@ -0,0 +1,81 @@
+package com.awsle.aibatis.xml.engine.xml.dom;
+
+import com.awsle.aibatis.xml.engine.xml.XMLReader;
+
+import org.w3c.dom.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DomXMLReader implements XMLReader {
+
+    private Element currentElement;
+    private List childElementsByIndex;
+    private Map childElementsByName;
+    private StringBuffer textBuffer;
+
+    public DomXMLReader(Element rootElement) {
+        setCurrent(rootElement);
+    }
+
+    public DomXMLReader(Document document) {
+        setCurrent(document.getDocumentElement());
+    }
+
+    public String name() {
+        return currentElement.getTagName();
+    }
+
+    public String text() {
+        //return currentElement.getText();
+        return textBuffer.toString();
+    }
+
+    public String attribute(String name) {
+        Attr attribute = currentElement.getAttributeNode(name);
+        return attribute == null ? null : attribute.getValue();
+    }
+
+    public int childCount() {
+        return childElementsByIndex.size();
+    }
+
+    public void child(int index) {
+        setCurrent(childElementsByIndex.get(index));
+    }
+
+    public void child(String elementName) {
+        setCurrent(childElementsByName.get(elementName));
+    }
+
+    public void pop() {
+        setCurrent(currentElement.getParentNode());
+    }
+
+    private void setCurrent(Object currentElementObj) {
+        this.currentElement = (Element) currentElementObj;
+        childElementsByIndex = new ArrayList();
+        childElementsByName = new HashMap();
+        textBuffer = new StringBuffer();
+        NodeList childNodes = currentElement.getChildNodes();
+        int length = childNodes.getLength();
+        for (int i = 0; i < length; i++) {
+            Node childNode = childNodes.item(i);
+            if (childNode instanceof Element) {
+                Element element = (Element) childNode;
+                childElementsByIndex.add(element);
+                childElementsByName.put(element.getTagName(), element);
+            } else if (childNode instanceof Text) {
+                Text text = (Text) childNode;
+                textBuffer.append(text.getData());
+            }
+        }
+    }
+
+    public boolean childExists(String elementName) {
+        return childElementsByName.containsKey(elementName);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/dom/DomXMLReaderDriver.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/dom/DomXMLReaderDriver.java
new file mode 100644
index 0000000..880b2bc
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/dom/DomXMLReaderDriver.java
@@ -0,0 +1,37 @@
+package com.awsle.aibatis.xml.engine.xml.dom;
+
+import com.awsle.aibatis.xml.engine.xml.CannotParseXMLException;
+import com.awsle.aibatis.xml.engine.xml.XMLReader;
+import com.awsle.aibatis.xml.engine.xml.XMLReaderDriver;
+
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.FactoryConfigurationError;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+public class DomXMLReaderDriver implements XMLReaderDriver {
+
+    public XMLReader createReader(String xml) {
+        try {
+            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+            ByteArrayInputStream inputStream = new ByteArrayInputStream(xml.getBytes());
+            Document document = documentBuilder.parse(inputStream);
+            return new DomXMLReader(document);
+        } catch (FactoryConfigurationError e) {
+            throw new CannotParseXMLException(e);
+        } catch (ParserConfigurationException e) {
+            throw new CannotParseXMLException(e);
+        } catch (SAXException e) {
+            throw new CannotParseXMLException(e);
+        } catch (IOException e) {
+            throw new CannotParseXMLException(e);
+        }
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/text/CompactXMLWriter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/text/CompactXMLWriter.java
new file mode 100644
index 0000000..46dfd2b
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/text/CompactXMLWriter.java
@@ -0,0 +1,19 @@
+package com.awsle.aibatis.xml.engine.xml.text;
+
+import java.io.PrintWriter;
+import java.io.Writer;
+
+public class CompactXMLWriter extends PrettyPrintXMLWriter {
+
+    public CompactXMLWriter(PrintWriter writer) {
+        super(writer);
+    }
+
+    public CompactXMLWriter(Writer writer) {
+        super(writer);
+    }
+
+    protected void endOfLine() {
+    	
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/text/PrettyPrintXMLWriter.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/text/PrettyPrintXMLWriter.java
new file mode 100644
index 0000000..bbadf87
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/engine/xml/text/PrettyPrintXMLWriter.java
@@ -0,0 +1,102 @@
+package com.awsle.aibatis.xml.engine.xml.text;
+
+import com.awsle.aibatis.xml.engine.xml.XMLWriter;
+
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.util.LinkedList;
+
+public class PrettyPrintXMLWriter implements XMLWriter {
+
+    private PrintWriter writer;
+    private LinkedList elementStack = new LinkedList();
+    private boolean tagInProgress;
+    private int depth;
+    private String lineIndenter;
+    private boolean readyForNewLine;
+    private boolean tagIsEmpty;
+
+    public PrettyPrintXMLWriter(PrintWriter writer, String lineIndenter) {
+        this.writer = writer;
+        this.lineIndenter = lineIndenter;
+    }
+
+    public PrettyPrintXMLWriter(Writer writer, String lineIndenter) {
+        this(new PrintWriter(writer), lineIndenter);
+    }
+
+    public PrettyPrintXMLWriter(PrintWriter writer) {
+        this(writer, "  ");
+    }
+
+    public PrettyPrintXMLWriter(Writer writer) {
+        this(new PrintWriter(writer));
+    }
+
+    public void startElement(String name) {
+        tagIsEmpty = false;
+        finishTag();
+        write("<");
+        write(name);
+        elementStack.addLast(name);
+        tagInProgress = true;
+        depth++;
+        readyForNewLine = true;
+        tagIsEmpty = true;
+    }
+
+    public void writeText(String text) {
+        readyForNewLine = false;
+        tagIsEmpty = false;
+        finishTag();
+        text = text.replaceAll("&", "&amp;");
+        text = text.replaceAll("<", "&lt;");
+        text = text.replaceAll(">", "&gt;");
+        write(text);
+    }
+
+    public void addAttribute(String key, String value) {
+        write(" ");
+        write(key);
+        write("=\"");
+        write(value);
+        write("\"");
+    }
+
+    public void endElement() {
+        depth--;
+        if (tagIsEmpty) {
+            write("/");
+            readyForNewLine = false;
+            finishTag();
+            elementStack.removeLast();
+        } else {
+            finishTag();
+            write("</" + elementStack.removeLast() + ">");
+        }
+        readyForNewLine = true;
+    }
+
+    private void write(String str) {
+        writer.write(str);
+    }
+
+    private void finishTag() {
+        if (tagInProgress) {
+            write(">");
+        }
+        tagInProgress = false;
+        if (readyForNewLine) {
+            endOfLine();
+        }
+        readyForNewLine = false;
+        tagIsEmpty = false;
+    }
+
+    protected void endOfLine() {
+        write("\n");
+        for (int i = 0; i < depth; i++) {
+            write(lineIndenter);
+        }
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/utils/XmlSqlMapConfig.java b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/utils/XmlSqlMapConfig.java
new file mode 100644
index 0000000..43f2767
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/com/awsle/aibatis/xml/utils/XmlSqlMapConfig.java
@@ -0,0 +1,80 @@
+package com.awsle.aibatis.xml.utils;
+
+import com.awsle.aibatis.xml.aibatis.node.Delete;
+import com.awsle.aibatis.xml.aibatis.node.Insert;
+import com.awsle.aibatis.xml.aibatis.node.Select;
+import com.awsle.aibatis.xml.aibatis.node.SqlMap;
+import com.awsle.aibatis.xml.aibatis.node.SqlMapConfig;
+import com.awsle.aibatis.xml.aibatis.node.Update;
+import com.awsle.aibatis.xml.engine.XStream;
+
+public class XmlSqlMapConfig {
+	
+	/**
+	 * 浠嶺ML鍒癝qlMapConfig
+	 * @param xml
+	 * @return
+	 */
+	public static SqlMapConfig xmlToConfig(String xml){
+		XStream xStream = new XStream();
+		xStream.alias("sqlMapConfig", SqlMapConfig.class);
+		xStream.alias("sqlMap", SqlMap.class);
+		xStream.alias("insert", Insert.class);
+		xStream.alias("delete", Delete.class);
+		xStream.alias("update", Update.class);
+		xStream.alias("select", Select.class);
+		xStream.alias("include", String.class);
+		SqlMapConfig sqlMapConfig = (SqlMapConfig)xStream.fromXML(xml);
+		return sqlMapConfig;
+	}
+	
+	/**
+	 * 浠嶴qlMapConfig鍒癤ML
+	 * @param sqlMapConfig
+	 * @return
+	 */
+	public static String configToXml(SqlMapConfig sqlMapConfig){
+		XStream xStream = new XStream();
+		xStream.alias("sqlMapConfig", SqlMapConfig.class);
+		xStream.alias("sqlMap", SqlMap.class);
+		xStream.alias("insert", Insert.class);
+		xStream.alias("delete", Delete.class);
+		xStream.alias("update", Update.class);
+		xStream.alias("select", Select.class);
+		xStream.alias("include", String.class);
+		String xml = xStream.toXML(sqlMapConfig);
+		return xml;
+	}
+	
+	/**
+	 * 浠嶺ML鍒癝qlMapConfig
+	 * @param xml
+	 * @return
+	 */
+	public static SqlMap xmlToSqlMap(String xml){
+		XStream xStream = new XStream();
+		xStream.alias("sqlMap", SqlMap.class);
+		xStream.alias("insert", Insert.class);
+		xStream.alias("delete", Delete.class);
+		xStream.alias("update", Update.class);
+		xStream.alias("select", Select.class);
+		SqlMap sqlMap = (SqlMap)xStream.fromXML(xml);
+		return sqlMap;
+	}
+	
+	/**
+	 * 浠嶴qlMapConfig鍒癤ML
+	 * @param sqlMapConfig
+	 * @return
+	 */
+	public static String sqlMapToXml(SqlMap sqlMap){
+		XStream xStream = new XStream();
+		xStream.alias("sqlMap", SqlMap.class);
+		xStream.alias("insert", Insert.class);
+		xStream.alias("delete", Delete.class);
+		xStream.alias("update", Update.class);
+		xStream.alias("select", Select.class);
+		String xml = xStream.toXML(sqlMap);
+		return xml;
+	}
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/res/layout/fragment_attender_register.xml b/VisitFace/DemoForBsk/app/src/main/res/layout/fragment_attender_register.xml
index 152c4ee..3e1f52d 100644
--- a/VisitFace/DemoForBsk/app/src/main/res/layout/fragment_attender_register.xml
+++ b/VisitFace/DemoForBsk/app/src/main/res/layout/fragment_attender_register.xml
@@ -56,6 +56,45 @@
                         android:text=""/>
                 </LinearLayout>
             </RelativeLayout>
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingLeft="@dimen/w50dp"
+                android:paddingRight="@dimen/w50dp"
+                >
+                <TextView
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    />
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="璁垮娉ㄥ唽"
+                    android:textSize="@dimen/w16dp"
+                    android:gravity="center"
+                    android:layout_gravity="right"
+                    android:paddingLeft="@dimen/w20dp"
+                    android:paddingRight="@dimen/w20dp"
+                    android:id="@+id/fragment_visitor_register_to_visitor_register"
+                    />
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="鑰冨嫟娉ㄥ唽"
+                    android:background="#ffd700"
+                    android:gravity="center"
+                    android:textSize="@dimen/w16dp"
+                    android:layout_gravity="right"
+                    android:paddingLeft="@dimen/w20dp"
+                    android:paddingRight="@dimen/w20dp"
+                    />
+                <TextView
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    />
+            </LinearLayout>
             <RelativeLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
@@ -95,33 +134,6 @@
                         android:background="#07000000"
                         android:padding="0dp"
                         android:adjustViewBounds="true"
-                        />
-                </LinearLayout>
-                <LinearLayout
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:paddingLeft="@dimen/w50dp"
-                    android:paddingRight="@dimen/w50dp"
-                    android:layout_marginTop="@dimen/h15dp"
-                    android:layout_marginBottom="@dimen/h15dp"
-                    >
-                    <TextView
-                        android:layout_width="0dp"
-                        android:layout_height="wrap_content"
-                        android:layout_weight="1"
-                        android:text="璁垮娉ㄥ唽"
-                        android:gravity="center"
-                        android:textSize="@dimen/w16dp"
-                        android:id="@+id/fragment_visitor_register_to_visitor_register"
-                        />
-                    <TextView
-                        android:layout_width="0dp"
-                        android:layout_height="wrap_content"
-                        android:layout_weight="1"
-                        android:text="鑰冨嫟娉ㄥ唽"
-                        android:background="#ffd700"
-                        android:textSize="@dimen/w16dp"
-                        android:gravity="center"
                         />
                 </LinearLayout>
                 <LinearLayout
@@ -243,13 +255,13 @@
                     android:layout_height="wrap_content"
                     android:layout_marginLeft="@dimen/w122dp"
                     android:orientation="vertical">
-                    <cn.com.basic.face.widget.register.RegisterRightFieldTextView
+                    <cn.com.basic.face.widget.register.RegisterRightFieldLabelView
                         android:id="@+id/fragment_attender_register_post"
                         android:layout_height="wrap_content"
                         android:layout_width="@dimen/w311dp"
                         register:label="@string/title_post"
                         />
-                    <cn.com.basic.face.widget.register.RegisterRightFieldTextView
+                    <cn.com.basic.face.widget.register.RegisterRightFieldLabelView
                         android:id="@+id/fragment_attender_register_department"
                         android:layout_height="wrap_content"
                         android:layout_width="@dimen/w311dp"
diff --git a/VisitFace/DemoForBsk/app/src/main/res/layout/fragment_visitor_register.xml b/VisitFace/DemoForBsk/app/src/main/res/layout/fragment_visitor_register.xml
index fb0f669..30da3dd 100644
--- a/VisitFace/DemoForBsk/app/src/main/res/layout/fragment_visitor_register.xml
+++ b/VisitFace/DemoForBsk/app/src/main/res/layout/fragment_visitor_register.xml
@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     xmlns:register="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/fragment_visitor_register_linear_layout"
+    android:id="@+id/fragment_register_frame_layout"
     android:orientation="vertical" android:layout_width="match_parent"
     android:background="@android:color/white"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    >
 
     <ScrollView
         android:layout_width="match_parent"
@@ -56,6 +57,45 @@
                         android:text=""/>
                 </LinearLayout>
             </RelativeLayout>
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingLeft="@dimen/w50dp"
+                android:paddingRight="@dimen/w50dp"
+                >
+                <TextView
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    />
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="璁垮娉ㄥ唽"
+                    android:background="#ffd700"
+                    android:textSize="@dimen/w16dp"
+                    android:gravity="center"
+                    android:layout_gravity="right"
+                    android:paddingLeft="@dimen/w20dp"
+                    android:paddingRight="@dimen/w20dp"
+                    />
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="鑰冨嫟娉ㄥ唽"
+                    android:gravity="center"
+                    android:textSize="@dimen/w16dp"
+                    android:id="@+id/fragment_visitor_register_to_attender_register"
+                    android:layout_gravity="right"
+                    android:paddingLeft="@dimen/w20dp"
+                    android:paddingRight="@dimen/w20dp"
+                    />
+                <TextView
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    />
+            </LinearLayout>
             <RelativeLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
@@ -256,4 +296,4 @@
             </LinearLayout>
         </LinearLayout>
     </ScrollView>
-</LinearLayout>
\ No newline at end of file
+</FrameLayout>
\ No newline at end of file

--
Gitblit v1.8.0