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("&", "&");
+ text = text.replaceAll("<", "<");
+ text = text.replaceAll(">", ">");
+ 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