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