roo00 6 лет назад
Родитель
Сommit
1ff2978dee
100 измененных файлов с 1864 добавлено и 829 удалено
  1. 0 3
      o2server/commons/ext/commons-lang3-3.4.jar
  2. 0 3
      o2server/commons/ext/druid-1.1.12.jar
  3. 0 3
      o2server/commons/ext/h2-1.4.197.jar
  4. 0 3
      o2server/commons/ext/jetty-all-9.4.10.v20180503-uber.jar
  5. 0 3
      o2server/commons/ext/openjpa-3.0.1-SNAPSHOT.jar
  6. 0 3
      o2server/commons/ext/xbean-asm5-shaded-3.17.jar
  7. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceAdminFactory.java
  8. 9 8
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceAppealInfoFactory.java
  9. 16 15
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceDetailFactory.java
  10. 12 10
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceDetailMobileFactory.java
  11. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceEmployeeConfigFactory.java
  12. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceImportFileInfoFactory.java
  13. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceScheduleSettingFactory.java
  14. 3 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceSelfHolidayFactory.java
  15. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceSettingFactory.java
  16. 14 11
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceStatisticRequireLogFactory.java
  17. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceStatisticalCycleFactory.java
  18. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceWorkDayConfigFactory.java
  19. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceWorkPlaceFactory.java
  20. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/StatisticPersonForMonthFactory.java
  21. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/StatisticTopUnitForDayFactory.java
  22. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/StatisticTopUnitForMonthFactory.java
  23. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/StatisticUnitForDayFactory.java
  24. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/StatisticUnitForMonthFactory.java
  25. 2 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attachment/ActionExportHolidayDetail.java
  26. 0 3
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceadmin/ActionGet.java
  27. 2 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceadmin/ActionListAll.java
  28. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceadmin/ActionSave.java
  29. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/ActionAppealArchive.java
  30. 5 3
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/ActionAppealCreate.java
  31. 4 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/ActionAttendanceDetailAppeal.java
  32. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/ActionAttendanceDetailArchive.java
  33. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionArchiveAttendanceDetail.java
  34. 9 7
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListMobileWithFilter.java
  35. 2 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListNextWithFilter.java
  36. 2 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListPrevWithFilter.java
  37. 4 3
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListWithEmployee.java
  38. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListWithTopUnit.java
  39. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListWithUnit.java
  40. 4 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionReciveAttendanceMobile.java
  41. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceemployeeconfig/ActionSave.java
  42. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceimportfileinfo/ActionDelete.java
  43. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceimportfileinfo/ActionListAll.java
  44. 1 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceschedulesetting/ActionSave.java
  45. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancesetting/ActionDelete.java
  46. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancesetting/ActionSave.java
  47. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancestatistic/ActionShowStdForUnitInTopUnitWithDate.java
  48. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancestatistic/ActionShowStdForUnitWithDate.java
  49. 4 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancestatistic/BaseAction.java
  50. 0 3
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancestatisticalcycle/ActionGet.java
  51. 6 4
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceworkdayconfig/ActionListWithFilter.java
  52. 0 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceworkdayconfig/ActionSave.java
  53. 2 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionListNextWithFilter.java
  54. 2 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionListPrevWithFilter.java
  55. 0 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionSave.java
  56. 0 3
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/workplace/ActionGet.java
  57. 3 4
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/workplace/ActionSave.java
  58. 0 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/processor/thread/OperatorDataSaver.java
  59. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceAppealInfoService.java
  60. 6 4
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceAppealInfoServiceAdv.java
  61. 6 4
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailAnalyseService.java
  62. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailMobileAnalyseServiceAdv.java
  63. 5 3
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceEmployeeConfigServiceAdv.java
  64. 14 14
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceNoticeService.java
  65. 3 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceScheduleSettingService.java
  66. 6 5
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/UserManagerService.java
  67. 110 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java
  68. 6 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/EntityManagerContainerFactory.java
  69. 58 10
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/PersistenceXmlHelper.java
  70. 4 195
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/SliceEntityManagerContainerFactory.java
  71. 0 260
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/SlicePropertiesBuilder.java
  72. 18 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/entity/JpaObject.java
  73. 32 32
      o2server/x_base_core_project/src/main/java/com/x/base/core/entity/dynamic/DynamicEntity.java
  74. 0 8
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/Context.java
  75. 18 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/build/CheckCore.java
  76. 30 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java
  77. 3 3
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/DataServers.java
  78. 3 3
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ExternalDataSources.java
  79. 37 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/LogLevel.java
  80. 2 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Node.java
  81. 44 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Slice.java
  82. 3 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/exception/ExceptionEntityFieldEmpty.java
  83. 20 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/ActionResult.java
  84. 30 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/EffectivePerson.java
  85. 23 2
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/HttpToken.java
  86. 74 132
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/jaxrs/StandardJaxrsAction.java
  87. 46 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/logger/Audit.java
  88. 6 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/logger/Logger.java
  89. 12 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/message/MessageConnector.java
  90. 5 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/queue/AbstractQueue.java
  91. 8 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/DateTools.java
  92. 927 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/DomainTools.java
  93. 83 7
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/ListTools.java
  94. 42 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/SortTools.java
  95. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/StringTools.java
  96. 2 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_cms_assemble_control.java
  97. 2 2
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_processplatform_assemble_designer.java
  98. 4 3
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_processplatform_assemble_surface.java
  99. 3 2
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_processplatform_service_processing.java
  100. 4 2
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_teamwork_assemble_control.java

+ 0 - 3
o2server/commons/ext/commons-lang3-3.4.jar

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:734c8356420cc8e30c795d64fd1fcd5d44ea9d90342a2cc3262c5158fbc6d98b
-size 434678

+ 0 - 3
o2server/commons/ext/druid-1.1.12.jar

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3f7a4ec6be8b470cd312a65c6687a576c71baf5afb5418677a3700abac996e71
-size 2764868

+ 0 - 3
o2server/commons/ext/h2-1.4.197.jar

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9bd87a65417a6078aadd4d982549752eff5a01ec2dbcf65362e986d727e33189
-size 1916539

+ 0 - 3
o2server/commons/ext/jetty-all-9.4.10.v20180503-uber.jar

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:afdd4a71fd32efca4d2564d4810a5bb3627e90e2fd124ddc999f8a3c67afb7df
-size 3451553

+ 0 - 3
o2server/commons/ext/openjpa-3.0.1-SNAPSHOT.jar

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:25436c2ed582046406b2dbe030402a13d9c0a08ca5ddb26291696668baecfa9e
-size 4574360

+ 0 - 3
o2server/commons/ext/xbean-asm5-shaded-3.17.jar

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6624984449c0a2c990ed88e933d73a40325a82eec73dbc9e8e635290d694c293
-size 144380

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceAdminFactory.java

@@ -30,6 +30,7 @@ public class AttendanceAdminFactory extends AbstractFactory {
 	}
 	
 	//@MethodDescribe("列示全部的AttendanceAdmin应用信息列表")
+	@SuppressWarnings("unused")
 	public List<AttendanceAdmin> listAll() throws Exception {
 		EntityManager em = this.entityManagerContainer().get(AttendanceAdmin.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();

+ 9 - 8
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceAppealInfoFactory.java

@@ -132,10 +132,10 @@ public class AttendanceAppealInfoFactory extends AbstractFactory {
 		cq.select( root.get(AttendanceAppealInfo_.id ));
 		//一般始终为true, id is not null
 		Predicate p = cb.equal( root.get(AttendanceAppealInfo_.empName), user );
-		if( year != null && !year.isEmpty() ){
+		if( StringUtils.isNotEmpty( year  ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceAppealInfo_.yearString), year ));
 		}
-		if( month != null && !month.isEmpty() ){
+		if( StringUtils.isNotEmpty( month ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceAppealInfo_.monthString), month ));
 		}
 		
@@ -151,10 +151,10 @@ public class AttendanceAppealInfoFactory extends AbstractFactory {
 		cq.select( root.get(AttendanceAppealInfo_.id ));
 		//一般始终为true, id is not null
 		Predicate p = cb.equal( root.get(AttendanceAppealInfo_.unitName), unitName );
-		if( year != null && !year.isEmpty() ){
+		if( StringUtils.isNotEmpty( year ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceAppealInfo_.yearString), year ));
 		}
-		if( month != null && !month.isEmpty() ){
+		if( StringUtils.isNotEmpty( month ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceAppealInfo_.monthString), month ));
 		}
 		
@@ -170,10 +170,10 @@ public class AttendanceAppealInfoFactory extends AbstractFactory {
 		cq.select( root.get(AttendanceAppealInfo_.id ));
 		//一般始终为true, id is not null
 		Predicate p = cb.equal( root.get(AttendanceAppealInfo_.topUnitName), topUnitName );
-		if( year != null && !year.isEmpty() ){
+		if( StringUtils.isNotEmpty( year ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceAppealInfo_.yearString), year ));
 		}
-		if( month != null && !month.isEmpty() ){
+		if( StringUtils.isNotEmpty( month ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceAppealInfo_.monthString), month ));
 		}
 		
@@ -201,6 +201,7 @@ public class AttendanceAppealInfoFactory extends AbstractFactory {
 	 * @return
 	 * @throws Exception
 	 */
+	@SuppressWarnings("unchecked")
 	public List<AttendanceAppealInfo> listIdsNextWithFilter( String id, Integer count, Object sequence, WrapInFilterAppeal wrapIn ) throws Exception {
 		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
 		EntityManager em = this.entityManagerContainer().get( AttendanceAppealInfo.class );
@@ -289,7 +290,7 @@ public class AttendanceAppealInfoFactory extends AbstractFactory {
 			sql_stringBuffer.append(" )");
 		}
 		
-		if( wrapIn.getKey() != null && !wrapIn.getKey().isEmpty()){
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
 			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
 		}else{
 			sql_stringBuffer.append(" order by o.sequence " + order );
@@ -399,7 +400,7 @@ public class AttendanceAppealInfoFactory extends AbstractFactory {
 			sql_stringBuffer.append(" )" );
 		}
 		
-		if( wrapIn.getKey() != null && !wrapIn.getKey().isEmpty()){
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
 			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
 		}else{
 			sql_stringBuffer.append(" order by o.sequence " + order );

+ 16 - 15
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceDetailFactory.java

@@ -22,6 +22,7 @@ import com.x.attendance.assemble.control.jaxrs.attendancedetail.WrapInFilter;
 import com.x.attendance.entity.AttendanceDetail;
 import com.x.attendance.entity.AttendanceDetail_;
 import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.base.core.project.tools.ListTools;
 /**
  * 系统配置信息表基础功能服务类
  * @author liyi
@@ -116,7 +117,7 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		//一般始终为true, id is not null
 		Predicate p = root.get( AttendanceDetail_.id ).isNotNull();
 		p = cb.and( p, root.get( AttendanceDetail_.archiveTime ).isNull()); //要未归档的,才再次进行分析
-		if( personName != null && !personName.isEmpty() ) {
+		if( StringUtils.isNotEmpty( personName ) ) {
 			p = cb.and( p, cb.equal( root.get(AttendanceDetail_.empName ), personName)); //匹配员工姓名
 		}
 		Date startDate = null;
@@ -459,16 +460,15 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		cq.select( root.get(AttendanceDetail_.id ));
 		//一般始终为true, id is not null
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
-		if( user != null && !user.isEmpty() ){
+		if( StringUtils.isNotEmpty( user ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.empName), user ));
 		}
-		if( year != null && !year.isEmpty() ){
+		if( StringUtils.isNotEmpty( year ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.yearString), year ));
 		}
-		if( month != null && !month.isEmpty() ){
+		if( StringUtils.isNotEmpty( month ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month ));
 		}
-		System.out.println("SQL:" + em.createQuery(cq.where(p)).toString() );
 		return em.createQuery(cq.where(p)).getResultList();
 	}
 	
@@ -484,13 +484,13 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		cq.select( root.get(AttendanceDetail_.id ));
 		//一般始终为true, id is not null
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
-		if( user != null && !user.isEmpty() ){
+		if( StringUtils.isNotEmpty( user ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.empName), user ));
 		}
-		if( year != null && !year.isEmpty() ){
+		if( StringUtils.isNotEmpty( year ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), year ));
 		}
-		if( month != null && !month.isEmpty() ){
+		if( StringUtils.isNotEmpty( month ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), month ));
 		}
 		
@@ -509,10 +509,10 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		if( unitNames != null && unitNames.size() > 0 ){
 			p = cb.and(p, root.get(AttendanceDetail_.unitName).in(unitNames));
 		}
-		if( year != null && !year.isEmpty() ){
+		if( StringUtils.isNotEmpty( year ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.yearString), year ));
 		}
-		if( month != null && !month.isEmpty() ){
+		if( StringUtils.isNotEmpty( month ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month ));
 		}
 		
@@ -528,13 +528,13 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		cq.select( root.get(AttendanceDetail_.id ));
 		//一般始终为true, id is not null
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
-		if( topUnitNames != null && topUnitNames.size() > 0 ){
+		if( ListTools.isNotEmpty(  topUnitNames ) ){
 			p = cb.and(p, root.get(AttendanceDetail_.topUnitName).in( topUnitNames ));
 		}
-		if( year != null && !year.isEmpty() ){
+		if( StringUtils.isNotEmpty( year ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.yearString), year ));
 		}
-		if( month != null && !month.isEmpty() ){
+		if( StringUtils.isNotEmpty( month ) ){
 			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month ));
 		}
 		return em.createQuery(cq.where(p)).getResultList();
@@ -550,6 +550,7 @@ public class AttendanceDetailFactory extends AbstractFactory {
 	 * @return
 	 * @throws Exception
 	 */
+	@SuppressWarnings("unchecked")
 	public List<AttendanceDetail> listIdsNextWithFilter( String id, Integer count, Object sequence, WrapInFilter wrapIn ) throws Exception {
 		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
 		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
@@ -640,7 +641,7 @@ public class AttendanceDetailFactory extends AbstractFactory {
 			index++;
 		}
 		
-		if( wrapIn.getKey() != null && !wrapIn.getKey().isEmpty()){
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
 			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
 		}else{
 			sql_stringBuffer.append(" order by o.sequence " + order );
@@ -753,7 +754,7 @@ public class AttendanceDetailFactory extends AbstractFactory {
 			index++;
 		}
 		
-		if( wrapIn.getKey() != null && !wrapIn.getKey().isEmpty()){
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
 			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
 		}else{
 			sql_stringBuffer.append(" order by o.sequence " + order );

+ 12 - 10
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceDetailMobileFactory.java

@@ -8,6 +8,8 @@ import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.control.AbstractFactory;
 import com.x.attendance.assemble.control.Business;
 import com.x.attendance.entity.AttendanceDetailMobile;
@@ -65,17 +67,17 @@ public class AttendanceDetailMobileFactory extends AbstractFactory {
 		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
 		Root<AttendanceDetailMobile> root = cq.from(AttendanceDetailMobile.class);
 		Predicate p = cb.isNotNull( root.get( AttendanceDetailMobile_.id ) );
-		if( empNo != null && !empNo.isEmpty() ){
+		if( StringUtils.isNotEmpty( empNo ) ){
 			p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.empNo ), empNo ) );
 		}
-		if( empName != null && !empName.isEmpty() ){
+		if( StringUtils.isNotEmpty( empName ) ){
 			p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.empName ), empName ) );
 		}
-		if( signDescription != null && !signDescription.isEmpty() ){
+		if( StringUtils.isNotEmpty( signDescription ) ){
 			p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.signDescription ), signDescription ) );
 		}
-		if( startDate != null && !startDate.isEmpty() ){
-			if( endDate != null && !endDate.isEmpty() && !endDate.equals( startDate ) ){//查询日期区间
+		if( StringUtils.isNotEmpty( startDate ) ){
+			if( StringUtils.isNotEmpty( endDate ) && !endDate.equals( startDate ) ){//查询日期区间
 				p = cb.between( root.get( AttendanceDetailMobile_.recordDateString ), startDate, endDate );
 			}else{
 				//查询startDate当天
@@ -96,17 +98,17 @@ public class AttendanceDetailMobileFactory extends AbstractFactory {
 		CriteriaQuery<AttendanceDetailMobile> cq = cb.createQuery(AttendanceDetailMobile.class);
 		Root<AttendanceDetailMobile> root = cq.from(AttendanceDetailMobile.class);
 		Predicate p = cb.isNotNull( root.get( AttendanceDetailMobile_.id ) );
-		if( empNo != null && !empNo.isEmpty() ){
+		if( StringUtils.isNotEmpty( empNo ) ){
 			p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.empNo ), empNo ) );
 		}
-		if( empName != null && !empName.isEmpty() ){
+		if( StringUtils.isNotEmpty( empName ) ){
 			p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.empName ), empName ) );
 		}
-		if( signDescription != null && !signDescription.isEmpty() ){
+		if( StringUtils.isNotEmpty( signDescription ) ){
 			p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.signDescription ), signDescription ) );
 		}
-		if( startDate != null && !startDate.isEmpty() ){
-			if( endDate != null && !endDate.isEmpty() && !endDate.equals( startDate ) ){//查询日期区间
+		if( StringUtils.isNotEmpty( startDate ) ){
+			if( StringUtils.isNotEmpty( endDate ) && !endDate.equals( startDate ) ){//查询日期区间
 				p = cb.between( root.get( AttendanceDetailMobile_.recordDateString ), startDate, endDate );
 			}else{
 				//查询startDate当天

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceEmployeeConfigFactory.java

@@ -30,6 +30,7 @@ public class AttendanceEmployeeConfigFactory extends AbstractFactory {
 	}
 	
 	//@MethodDescribe("列示全部的AttendanceEmployeeConfig信息列表")
+	@SuppressWarnings("unused")
 	public List<AttendanceEmployeeConfig> listAll() throws Exception {
 		EntityManager em = this.entityManagerContainer().get(AttendanceEmployeeConfig.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceImportFileInfoFactory.java

@@ -30,6 +30,7 @@ public class AttendanceImportFileInfoFactory extends AbstractFactory {
 	}
 	
 	//@MethodDescribe("列示全部的AttendanceImportFileInfo应用信息列表")
+	@SuppressWarnings("unused")
 	public List<AttendanceImportFileInfo> listAll() throws Exception {
 		EntityManager em = this.entityManagerContainer().get(AttendanceImportFileInfo.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceScheduleSettingFactory.java

@@ -30,6 +30,7 @@ public class AttendanceScheduleSettingFactory extends AbstractFactory {
 	}
 	
 //	@MethodDescribe("列示全部的AttendanceScheduleSetting应用信息列表")
+	@SuppressWarnings("unused")
 	public List<AttendanceScheduleSetting> listAll() throws Exception {
 		EntityManager em = this.entityManagerContainer().get(AttendanceScheduleSetting.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();

+ 3 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceSelfHolidayFactory.java

@@ -99,6 +99,7 @@ public class AttendanceSelfHolidayFactory extends AbstractFactory {
 	 * @return
 	 * @throws Exception
 	 */
+	@SuppressWarnings("unchecked")
 	public List<AttendanceSelfHoliday> listIdsNextWithFilter( String id, Integer count, Object sequence, WrapInFilter wrapIn ) throws Exception {
 		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
 		EntityManager em = this.entityManagerContainer().get( AttendanceSelfHoliday.class );
@@ -134,7 +135,7 @@ public class AttendanceSelfHolidayFactory extends AbstractFactory {
 			index++;
 		}
 		
-		if( wrapIn.getKey() != null && !wrapIn.getKey().isEmpty()){
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
 			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
 		}else{
 			sql_stringBuffer.append(" order by o.sequence " + order );
@@ -192,7 +193,7 @@ public class AttendanceSelfHolidayFactory extends AbstractFactory {
 			index++;
 		}
 		
-		if( wrapIn.getKey() != null && !wrapIn.getKey().isEmpty()){
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
 			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
 		}else{
 			sql_stringBuffer.append(" order by o.sequence " + order );

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceSettingFactory.java

@@ -30,6 +30,7 @@ public class AttendanceSettingFactory extends AbstractFactory {
 	}
 	
 	//@MethodDescribe("列示全部的AttendanceSetting应用信息列表")
+	@SuppressWarnings("unused")
 	public List<AttendanceSetting> listAll() throws Exception {
 		EntityManager em = this.entityManagerContainer().get(AttendanceSetting.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();

+ 14 - 11
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceStatisticRequireLogFactory.java

@@ -9,6 +9,8 @@ import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.control.AbstractFactory;
 import com.x.attendance.assemble.control.Business;
 import com.x.attendance.entity.AttendanceStatisticRequireLog;
@@ -30,6 +32,7 @@ public class AttendanceStatisticRequireLogFactory extends AbstractFactory {
 	}
 	
 //	@MethodDescribe("列示全部的AttendanceStatisticRequireLog信息列表")
+	@SuppressWarnings("unused")
 	public List<AttendanceStatisticRequireLog> listAll() throws Exception {
 		EntityManager em = this.entityManagerContainer().get(AttendanceStatisticRequireLog.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
@@ -58,13 +61,13 @@ public class AttendanceStatisticRequireLogFactory extends AbstractFactory {
 		CriteriaQuery<AttendanceStatisticRequireLog> cq = cb.createQuery(AttendanceStatisticRequireLog.class);
 		Root<AttendanceStatisticRequireLog> root = cq.from(AttendanceStatisticRequireLog.class);
 		Predicate p = root.get(AttendanceStatisticRequireLog_.id).isNotNull();
-		if( name != null && !name.isEmpty() ){
+		if( StringUtils.isNotEmpty( name ) ){
 			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticName), name));
 		}
-		if( key != null && !key.isEmpty() ){
+		if( StringUtils.isNotEmpty( key ) ){
 			p = cb.and(p,  cb.equal(root.get(AttendanceStatisticRequireLog_.statisticKey), key));
 		}
-		if( stauts != null && !stauts.isEmpty() ){
+		if( StringUtils.isNotEmpty( stauts ) ){
 			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.processStatus), stauts));
 		}
 		return em.createQuery( cq.where(p) ).getResultList();
@@ -76,22 +79,22 @@ public class AttendanceStatisticRequireLogFactory extends AbstractFactory {
 		CriteriaQuery<AttendanceStatisticRequireLog> cq = cb.createQuery(AttendanceStatisticRequireLog.class);
 		Root<AttendanceStatisticRequireLog> root = cq.from(AttendanceStatisticRequireLog.class);
 		Predicate p = root.get(AttendanceStatisticRequireLog_.id).isNotNull();
-		if( statisticType != null && !statisticType.isEmpty() ){
+		if( StringUtils.isNotEmpty( statisticType ) ){
 			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticType), statisticType));
 		}
-		if( key != null && !key.isEmpty() ){
+		if( StringUtils.isNotEmpty( key ) ){
 			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticKey), key));
 		}
-		if( statisticYear != null && !statisticYear.isEmpty() ){
+		if( StringUtils.isNotEmpty( statisticYear ) ){
 			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticYear), statisticYear));
 		}
-		if( statisticMonth != null && !statisticMonth.isEmpty() ){
+		if( StringUtils.isNotEmpty( statisticMonth ) ){
 			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticMonth), statisticMonth));
 		}
-		if( statisticDate != null && !statisticDate.isEmpty() ){
+		if( StringUtils.isNotEmpty( statisticDate ) ){
 			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticDay), statisticDate));
 		}
-		if( status != null && !status.isEmpty() ){
+		if( StringUtils.isNotEmpty( status ) ){
 			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.processStatus), status));
 		}
 		return em.createQuery( cq.where(p) ).getResultList();
@@ -111,10 +114,10 @@ public class AttendanceStatisticRequireLogFactory extends AbstractFactory {
 		CriteriaQuery<AttendanceStatisticRequireLog> cq = cb.createQuery(AttendanceStatisticRequireLog.class);
 		Root<AttendanceStatisticRequireLog> root = cq.from(AttendanceStatisticRequireLog.class);
 		Predicate p = root.get(AttendanceStatisticRequireLog_.id).isNotNull();
-		if( statisticType != null && !statisticType.isEmpty() ){
+		if( StringUtils.isNotEmpty( statisticType ) ){
 			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticType), statisticType));
 		}
-		if( processStatus != null && !processStatus.isEmpty() ){
+		if( StringUtils.isNotEmpty( processStatus ) ){
 			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.processStatus), processStatus));
 		}
 		return em.createQuery( cq.where(p) ).getResultList();

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceStatisticalCycleFactory.java

@@ -30,6 +30,7 @@ public class AttendanceStatisticalCycleFactory extends AbstractFactory {
 	}
 	
 	//@MethodDescribe("列示全部的AttendanceStatisticalCycle信息列表")
+	@SuppressWarnings("unused")
 	public List<AttendanceStatisticalCycle> listAll() throws Exception {
 		EntityManager em = this.entityManagerContainer().get(AttendanceStatisticalCycle.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceWorkDayConfigFactory.java

@@ -35,6 +35,7 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
 	}
 	
 //	@MethodDescribe("列示全部的AttendanceWorkDayConfig信息列表")
+	@SuppressWarnings("unused")
 	public List<AttendanceWorkDayConfig> listAll() throws Exception {
 		EntityManager em = this.entityManagerContainer().get(AttendanceWorkDayConfig.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceWorkPlaceFactory.java

@@ -30,6 +30,7 @@ public class AttendanceWorkPlaceFactory extends AbstractFactory {
 	}
 	
 //	@MethodDescribe("列示全部的AttendanceWorkPlace应用信息列表")
+	@SuppressWarnings("unused")
 	public List<AttendanceWorkPlace> listAll() throws Exception {
 		EntityManager em = this.entityManagerContainer().get(AttendanceWorkPlace.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/StatisticPersonForMonthFactory.java

@@ -118,6 +118,7 @@ public class StatisticPersonForMonthFactory extends AbstractFactory {
 	 * @return
 	 * @throws Exception
 	 */
+	@SuppressWarnings("unchecked")
 	public List<StatisticPersonForMonth> listIdsNextWithFilter( String id, Integer count, Object sequence, WrapInFilterStatisticPersonForMonth wrapIn ) throws Exception {
 		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
 		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class );

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/StatisticTopUnitForDayFactory.java

@@ -110,6 +110,7 @@ public class StatisticTopUnitForDayFactory extends AbstractFactory {
 	 * @return
 	 * @throws Exception
 	 */
+	@SuppressWarnings("unchecked")
 	public List<StatisticTopUnitForDay> listIdsNextWithFilter( String id, Integer count, Object sequence, WrapInFilterStatisticTopUnitForDay wrapIn ) throws Exception {
 		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
 		EntityManager em = this.entityManagerContainer().get( StatisticTopUnitForDay.class );

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/StatisticTopUnitForMonthFactory.java

@@ -90,6 +90,7 @@ public class StatisticTopUnitForMonthFactory extends AbstractFactory {
 	 * @return
 	 * @throws Exception
 	 */
+	@SuppressWarnings("unchecked")
 	public List<StatisticTopUnitForMonth> listIdsNextWithFilter( String id, Integer count, Object sequence, WrapInFilterStatisticTopUnitForMonth wrapIn ) throws Exception {
 		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
 		EntityManager em = this.entityManagerContainer().get( StatisticTopUnitForMonth.class );

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/StatisticUnitForDayFactory.java

@@ -172,6 +172,7 @@ public class StatisticUnitForDayFactory extends AbstractFactory {
 	 * @return
 	 * @throws Exception
 	 */
+	@SuppressWarnings("unchecked")
 	public List<StatisticUnitForDay> listIdsNextWithFilter(String id, Integer count, Object sequence,
 			WrapInFilterStatisticUnitForDay wrapIn) throws Exception {
 		// 先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/StatisticUnitForMonthFactory.java

@@ -117,6 +117,7 @@ public class StatisticUnitForMonthFactory extends AbstractFactory {
 	 * @return
 	 * @throws Exception
 	 */
+	@SuppressWarnings("unchecked")
 	public List<StatisticUnitForMonth> listIdsNextWithFilter( String id, Integer count, Object sequence, WrapInFilterStatisticUnitForMonth wrapIn ) throws Exception {
 		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
 		EntityManager em = this.entityManagerContainer().get( StatisticUnitForMonth.class );

+ 2 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attachment/ActionExportHolidayDetail.java

@@ -20,6 +20,7 @@ import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WoFile;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
 
 /**
  * 导入的文件没有用到文件存储器,是直接放在数据库中的BLOB列
@@ -69,7 +70,7 @@ public class ActionExportHolidayDetail extends BaseAction {
 				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 					Business business = new Business(emc);
 					ids = business.getAttendanceSelfHolidayFactory().listByStartDateAndEndDate( startDate, endDate );					
-					if( ids != null && !ids.isEmpty() ){
+					if( ListTools.isNotEmpty( ids ) ){
 						holidayList = business.getAttendanceSelfHolidayFactory().list(ids);
 					}
 				} catch (Exception e) {

+ 0 - 3
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceadmin/ActionGet.java

@@ -1,8 +1,5 @@
 package com.x.attendance.assemble.control.jaxrs.attendanceadmin;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.servlet.http.HttpServletRequest;
 
 import com.x.attendance.assemble.control.jaxrs.attendanceadmin.exception.ExceptionAttendanceAdminProcess;

+ 2 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceadmin/ActionListAll.java

@@ -14,6 +14,7 @@ import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
 
 public class ActionListAll extends BaseAction {
 
@@ -38,7 +39,7 @@ public class ActionListAll extends BaseAction {
 		}
 
 		if (check) {
-			if (attendanceAdminList != null && !attendanceAdminList.isEmpty()) {
+			if ( ListTools.isNotEmpty( attendanceAdminList )) {
 				try {
 					wraps = Wo.copier.copy(attendanceAdminList);
 				} catch (Exception e) {

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceadmin/ActionSave.java

@@ -5,6 +5,8 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
 import com.x.attendance.assemble.control.jaxrs.attendanceadmin.exception.ExceptionAttendanceAdminProcess;
@@ -53,7 +55,7 @@ public class ActionSave extends BaseAction {
 			try {
 				attendanceAdmin = new AttendanceAdmin();
 				wrapIn.copyTo( attendanceAdmin, JpaObject.FieldsUnmodify );
-				if (wrapIn.getId() != null && !wrapIn.getId().isEmpty()) {
+				if ( StringUtils.isNotEmpty( wrapIn.getId() )) {
 					attendanceAdmin.setId(wrapIn.getId());
 				}
 			} catch (Exception e) {

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/ActionAppealArchive.java

@@ -2,6 +2,8 @@ package com.x.attendance.assemble.control.jaxrs.attendanceappealinfo;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.control.jaxrs.attendanceappealinfo.exception.ExceptionAttendanceAppealProcess;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
@@ -16,7 +18,7 @@ public class ActionAppealArchive extends BaseAction {
 	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, String id ) throws Exception {
 		ActionResult<Wo> result = new ActionResult<>();
 
-		if (id != null && !id.isEmpty()) { // 归档指定的考勤申诉记录
+		if ( StringUtils.isNotEmpty( id )) { // 归档指定的考勤申诉记录
 			try {
 				attendanceAppealInfoServiceAdv.archive(id);
 				result.setData(new Wo(id));

+ 5 - 3
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/ActionAppealCreate.java

@@ -5,6 +5,8 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
 import com.x.attendance.assemble.control.jaxrs.AppealConfig;
@@ -85,7 +87,7 @@ public class ActionAppealCreate extends BaseAction {
 		
 		//查询申诉审核人
 		if (check) {
-			if( appeal_auditor_type != null && !appeal_auditor_type.isEmpty() ) {
+			if( StringUtils.isNotEmpty( appeal_auditor_type ) ) {
 				try {
 					System.out.println("personName:" + personName );
 					System.out.println("attendanceAppealInfo.getUnitName():" + attendanceAppealInfo.getUnitName() );
@@ -134,7 +136,7 @@ public class ActionAppealCreate extends BaseAction {
 		
 		//查询申诉复核人
 		if (check) {
-			if( appeal_checker_type != null && !appeal_auditor_type.isEmpty() && !"无".equals( appeal_auditor_type  ) ) {
+			if( StringUtils.isNotEmpty( appeal_checker_type ) && !"无".equals( appeal_auditor_type  ) ) {
 				try {
 					appealCheckPersonName = attendanceAppealInfoServiceAdv.getAppealCheckPerson( personName, attendanceAppealInfo.getUnitName(), wrapIn.getIdentity() );
 					attendanceAppealInfo.setProcessPerson2( appealCheckPersonName );
@@ -148,7 +150,7 @@ public class ActionAppealCreate extends BaseAction {
 			}
 		}
 		if (check) {
-			if( appeal_checker_type != null && !appeal_checker_type.isEmpty() && !"无".equals( appeal_checker_type ) ) {
+			if( StringUtils.isNotEmpty( appeal_checker_type ) && !"无".equals( appeal_checker_type ) ) {
 				if( appealCheckPersonName == null || appealCheckPersonName.isEmpty() ) {
 					//申诉复核人不存在
 					check = false;

+ 4 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/ActionAttendanceDetailAppeal.java

@@ -5,6 +5,8 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
 import com.x.attendance.assemble.control.jaxrs.AppealConfig;
@@ -79,7 +81,7 @@ public class ActionAttendanceDetailAppeal extends BaseAction {
 		}
 		//查询申诉审核人
 		if (check) {
-			if( appeal_auditor_type != null && !appeal_auditor_type.isEmpty() ) {
+			if( StringUtils.isNotEmpty( appeal_auditor_type ) ) {
 				try {
 					appealAuditPersonName = attendanceAppealInfoServiceAdv.getAppealAuditPerson( personName, attendanceAppealInfo.getUnitName(), wrapIn.getIdentity() );
 					attendanceAppealInfo.setProcessPerson1( appealAuditPersonName );
@@ -95,7 +97,7 @@ public class ActionAttendanceDetailAppeal extends BaseAction {
 		}
 		//查询申诉复核人
 		if (check) {
-			if( appeal_checker_type != null && !appeal_auditor_type.isEmpty() ) {
+			if( StringUtils.isNotEmpty( appeal_checker_type ) ) {
 				try {
 					appealCheckPersonName = attendanceAppealInfoServiceAdv.getAppealCheckPerson( personName, attendanceAppealInfo.getUnitName(), wrapIn.getIdentity() );
 					attendanceAppealInfo.setProcessPerson2( appealCheckPersonName );

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/ActionAttendanceDetailArchive.java

@@ -2,6 +2,8 @@ package com.x.attendance.assemble.control.jaxrs.attendanceappealinfo;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.control.jaxrs.attendanceappealinfo.exception.ExceptionAttendanceAppealProcess;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
@@ -16,7 +18,7 @@ public class ActionAttendanceDetailArchive extends BaseAction {
 	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, String id ) throws Exception {
 		ActionResult<Wo> result = new ActionResult<>();
 
-		if (id != null && !id.isEmpty()) { // 归档指定的考勤申诉记录
+		if ( StringUtils.isNotEmpty( id )) { // 归档指定的考勤申诉记录
 			try {
 				attendanceAppealInfoServiceAdv.archive(id);
 				result.setData(new Wo(id));

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionArchiveAttendanceDetail.java

@@ -2,6 +2,8 @@ package com.x.attendance.assemble.control.jaxrs.attendancedetail;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.control.jaxrs.attendancedetail.exception.ExceptionAttendanceDetailProcess;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
@@ -19,7 +21,7 @@ public class ActionArchiveAttendanceDetail extends BaseAction {
 		Boolean check = true;
 
 		if (check) {
-			if (id != null && !id.isEmpty()) {
+			if ( StringUtils.isNotEmpty( id )) {
 				try {
 					attendanceDetailServiceAdv.archive(id);
 				} catch (Exception e) {

+ 9 - 7
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListMobileWithFilter.java

@@ -6,6 +6,8 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.common.date.DateOperation;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
@@ -66,15 +68,15 @@ public class ActionListMobileWithFilter extends BaseAction {
 			count = 20;
 		}
 		if (check) {
-			if (wrapIn.getEmpNo() != null && !wrapIn.getEmpNo().isEmpty()) {
+			if ( StringUtils.isNotEmpty( wrapIn.getEmpNo() )) {
 				queryConditionIsNull = false;
 			}
-			if (wrapIn.getEmpName() != null && !wrapIn.getEmpName().isEmpty()) {
+			if ( StringUtils.isNotEmpty( wrapIn.getEmpName() )) {
 				queryConditionIsNull = false;
 			}
-			if (wrapIn.getStartDate() != null && !wrapIn.getStartDate().isEmpty()) {
+			if ( StringUtils.isNotEmpty( wrapIn.getStartDate() )) {
 				queryConditionIsNull = false;
-				if (wrapIn.getEndDate() == null || wrapIn.getEndDate().isEmpty()) {
+				if ( StringUtils.isNotEmpty( wrapIn.getEndDate() )) {
 					wrapIn.setEndDate(wrapIn.getStartDate());
 				}
 			}
@@ -85,7 +87,7 @@ public class ActionListMobileWithFilter extends BaseAction {
 			}
 		}
 		if (check) {
-			if (wrapIn.getEndDate() != null && !wrapIn.getEndDate().isEmpty()) {
+			if ( StringUtils.isNotEmpty( wrapIn.getEndDate() )) {
 				try {
 					datetime = dateOperation.getDateFromString(wrapIn.getEndDate());
 					wrapIn.setEndDate(dateOperation.getDateStringFromDate(datetime, "YYYY-MM-DD")); // 结束日期
@@ -96,11 +98,11 @@ public class ActionListMobileWithFilter extends BaseAction {
 					result.error(exception);
 					logger.error(e, currentPerson, request, null);
 				}
-				if (wrapIn.getEndDate() == null || wrapIn.getEndDate().isEmpty()) {
+				if ( StringUtils.isNotEmpty( wrapIn.getEndDate() )) {
 					wrapIn.setEndDate(wrapIn.getStartDate());
 				}
 			}
-			if (wrapIn.getStartDate() != null && !wrapIn.getStartDate().isEmpty()) {
+			if ( StringUtils.isNotEmpty( wrapIn.getStartDate() )) {
 				try {
 					datetime = dateOperation.getDateFromString(wrapIn.getStartDate());
 					wrapIn.setStartDate(dateOperation.getDateStringFromDate(datetime, "YYYY-MM-DD")); // 开始日期

+ 2 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListNextWithFilter.java

@@ -65,7 +65,7 @@ public class ActionListNextWithFilter extends BaseAction {
 				}
 
 				// 处理一下顶层组织,查询下级顶层组织
-				if (wrapIn.getQ_topUnitName() != null && !wrapIn.getQ_topUnitName().isEmpty()) {
+				if ( StringUtils.isNotEmpty( wrapIn.getQ_topUnitName() )) {
 					topUnitNames.add(wrapIn.getQ_topUnitName());
 					try {
 						topUnitNames_tmp = userManagerService.listSubUnitNameWithParent(wrapIn.getQ_topUnitName());
@@ -84,7 +84,7 @@ public class ActionListNextWithFilter extends BaseAction {
 				}
 
 				// 处理一下组织,查询下级组织
-				if (wrapIn.getQ_unitName() != null && !wrapIn.getQ_unitName().isEmpty()) {
+				if ( StringUtils.isNotEmpty( wrapIn.getQ_unitName() )) {
 					unitNames.add(wrapIn.getQ_unitName());
 					try {
 						unitNames_tmp = userManagerService.listSubUnitNameWithParent(wrapIn.getQ_unitName());

+ 2 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListPrevWithFilter.java

@@ -65,7 +65,7 @@ public class ActionListPrevWithFilter extends BaseAction {
 				}
 
 				// 处理一下顶层组织,查询下级顶层组织
-				if (wrapIn.getQ_topUnitName() != null && !wrapIn.getQ_topUnitName().isEmpty()) {
+				if ( StringUtils.isNotEmpty( wrapIn.getQ_topUnitName() )) {
 					topUnitNames.add(wrapIn.getQ_topUnitName());
 					try {
 						topUnitNames_tmp = userManagerService.listSubUnitNameWithParent(wrapIn.getQ_topUnitName());
@@ -84,7 +84,7 @@ public class ActionListPrevWithFilter extends BaseAction {
 				}
 
 				// 处理一下组织,查询下级组织
-				if (wrapIn.getQ_topUnitName() != null && !wrapIn.getQ_topUnitName().isEmpty()) {
+				if ( StringUtils.isNotEmpty( wrapIn.getQ_topUnitName() )) {
 					unitNames.add(wrapIn.getQ_topUnitName());
 					try {
 						unitNames_tmp = userManagerService.listSubUnitNameWithParent(wrapIn.getQ_topUnitName());

+ 4 - 3
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListWithEmployee.java

@@ -6,13 +6,14 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.common.date.DateOperation;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
 import com.x.attendance.assemble.control.jaxrs.attendancedetail.exception.ExceptionAttendanceDetailProcess;
 import com.x.attendance.entity.AttendanceDetail;
 import com.x.base.core.entity.JpaObject;
-import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.base.core.project.bean.WrapCopier;
 import com.x.base.core.project.bean.WrapCopierFactory;
 import com.x.base.core.project.gson.GsonPropertyObject;
@@ -85,7 +86,7 @@ public class ActionListWithEmployee extends BaseAction {
 			}
 		}
 		if (check) {
-			if (cycleYear != null && cycleMonth != null && !cycleYear.isEmpty() && !cycleMonth.isEmpty()) {
+			if ( StringUtils.isNotEmpty( cycleYear ) && StringUtils.isNotEmpty( cycleMonth )) {
 				try {
 					ids = attendanceDetailServiceAdv.listUserAttendanceDetailByCycleYearAndMonth(q_empName, cycleYear,
 							cycleMonth);
@@ -96,7 +97,7 @@ public class ActionListWithEmployee extends BaseAction {
 					result.error(exception);
 					logger.error(e, currentPerson, request, null);
 				}
-			} else if (q_year != null && q_month != null && !q_year.isEmpty() && !q_month.isEmpty()) {
+			} else if ( StringUtils.isNotEmpty( q_year ) && StringUtils.isNotEmpty( q_month )) {
 				try {
 					ids = attendanceDetailServiceAdv.listUserAttendanceDetailByYearAndMonth(q_empName, q_year, q_month);
 				} catch (Exception e) {

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListWithTopUnit.java

@@ -6,6 +6,8 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.common.date.DateOperation;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
@@ -78,7 +80,7 @@ public class ActionListWithTopUnit extends BaseAction {
 			}
 		}
 		if (check) {
-			if (q_topUnitName != null && !q_topUnitName.isEmpty()) {
+			if ( StringUtils.isNotEmpty( q_topUnitName )) {
 				try {
 					topUnitNames = userManagerService.listSubUnitNameWithParent(q_topUnitName);
 				} catch (Exception e) {

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListWithUnit.java

@@ -6,6 +6,8 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.common.date.DateOperation;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
@@ -77,7 +79,7 @@ public class ActionListWithUnit extends BaseAction {
 			}
 		}
 		if (check) {
-			if (q_unitName != null && !q_unitName.isEmpty()) {
+			if ( StringUtils.isNotEmpty( q_unitName )) {
 				try {
 					unitNames = userManagerService.listSubUnitNameWithParent(q_unitName);
 					if (!unitNames.contains(q_unitName)) {

+ 4 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionReciveAttendanceMobile.java

@@ -4,6 +4,8 @@ import java.util.Date;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.common.date.DateOperation;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
@@ -90,7 +92,7 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 			}
 		}
 		if( check ){
-			if( wrapIn.getRecordDateString() != null && !wrapIn.getRecordDateString().isEmpty() ){
+			if( StringUtils.isNotEmpty( wrapIn.getRecordDateString() ) ){
 				try{
 					datetime = dateOperation.getDateFromString( wrapIn.getRecordDateString() );
 					attendanceDetailMobile.setRecordDateString( dateOperation.getDateStringFromDate( datetime, "yyyy-MM-dd") ); //打卡时间
@@ -106,7 +108,7 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 			}
 		}
 		if( check ){
-			if( wrapIn.getId() != null && !wrapIn.getId().isEmpty()){
+			if( StringUtils.isNotEmpty( wrapIn.getId() )){
 				attendanceDetailMobile.setId( wrapIn.getId() );
 			}
 			attendanceDetailMobile.setSignDescription( wrapIn.getSignDescription() );

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceemployeeconfig/ActionSave.java

@@ -2,6 +2,8 @@ package com.x.attendance.assemble.control.jaxrs.attendanceemployeeconfig;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
 import com.x.attendance.assemble.control.jaxrs.attendanceemployeeconfig.exception.ExceptionAttendanceEmployeeProcess;
@@ -37,7 +39,7 @@ public class ActionSave extends BaseAction {
 		if (check) {
 			try {
 				attendanceEmployeeConfig = Wi.copier.copy(wrapIn);
-				if (wrapIn.getId() != null && !wrapIn.getId().isEmpty()) {
+				if ( StringUtils.isNotEmpty( wrapIn.getId() )) {
 					attendanceEmployeeConfig.setId(wrapIn.getId());
 				}
 			} catch (Exception e) {

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceimportfileinfo/ActionDelete.java

@@ -4,6 +4,8 @@ import java.io.File;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.control.jaxrs.attendanceimportfileinfo.exception.ExceptionAttendanceImportFileProcess;
 import com.x.attendance.assemble.control.jaxrs.attendanceimportfileinfo.exception.ExceptionFileIdEmpty;
 import com.x.attendance.assemble.control.jaxrs.attendanceimportfileinfo.exception.ExceptionImportFileNotExists;
@@ -52,7 +54,7 @@ public class ActionDelete extends BaseAction {
 				result.setData( new Wo( id ) );
 				
 				//删除临时文件,如果存在的话
-				if( attendanceImportFileInfo.getTempFilePath() != null && !attendanceImportFileInfo.getTempFilePath().isEmpty() ) {
+				if( StringUtils.isNotEmpty( attendanceImportFileInfo.getTempFilePath() ) ) {
 					File file = new File( attendanceImportFileInfo.getTempFilePath() );
 					if( file.exists() ) {
 						file.delete();

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceimportfileinfo/ActionListAll.java

@@ -5,6 +5,8 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.google.gson.Gson;
 import com.x.attendance.assemble.control.jaxrs.attendanceemployeeconfig.exception.ExceptionAttendanceEmployeeProcess;
 import com.x.attendance.assemble.control.jaxrs.attendanceimportfileinfo.exception.ExceptionAttendanceImportFileProcess;
@@ -48,7 +50,7 @@ public class ActionListAll extends BaseAction {
 				if (!"COMPLETED".equals(fileInfo.getCurrentProcessName())) {
 					// 如果未完成 ,则在系统文件导入处理状态对象中创建该文件的详细对象
 					try {
-						if (fileInfo.getDataContent() != null && !fileInfo.getDataContent().isEmpty()) {
+						if ( StringUtils.isNotEmpty( fileInfo.getDataContent() )) {
 							// 还原为对象
 							statusImportFileDetail = gson.fromJson(fileInfo.getDataContent(),
 									StatusImportFileDetail.class);

+ 1 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceschedulesetting/ActionSave.java

@@ -87,7 +87,7 @@ public class ActionSave extends BaseAction {
 			attendanceScheduleSetting = new AttendanceScheduleSetting();
 			try {
 				attendanceScheduleSetting = Wi.copier.copy(wrapIn);
-				if (wrapIn.getId() != null && !wrapIn.getId().isEmpty()) {
+				if ( StringUtils.isNotEmpty( wrapIn.getId() )) {
 					attendanceScheduleSetting.setId(wrapIn.getId());
 				}
 			} catch (Exception e) {

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancesetting/ActionDelete.java

@@ -2,6 +2,8 @@ package com.x.attendance.assemble.control.jaxrs.attendancesetting;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.control.jaxrs.attendancesetting.exception.ExceptionAttendanceSettingProcess;
 import com.x.attendance.assemble.control.jaxrs.attendancesetting.exception.ExceptionSettingIdEmpty;
 import com.x.attendance.assemble.control.jaxrs.attendancesetting.exception.ExceptionSettingNotExists;
@@ -22,7 +24,7 @@ public class ActionDelete extends BaseAction {
 		Boolean check = true;
 		
 		if( check ){
-			if( id != null && !id.isEmpty() ){
+			if( StringUtils.isNotEmpty( id ) ){
 				check = false;
 				Exception exception = new ExceptionSettingIdEmpty();
 				result.error( exception );

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancesetting/ActionSave.java

@@ -2,6 +2,8 @@ package com.x.attendance.assemble.control.jaxrs.attendancesetting;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
 import com.x.attendance.assemble.control.jaxrs.attendancesetting.exception.ExceptionAttendanceSettingProcess;
@@ -53,7 +55,7 @@ public class ActionSave extends BaseAction {
 		if (check) {
 			try {
 				attendanceSetting = Wi.copier.copy(wrapIn);
-				if (wrapIn.getId() != null && !wrapIn.getId().isEmpty()) {
+				if ( StringUtils.isNotEmpty( wrapIn.getId() )) {
 					attendanceSetting.setId(wrapIn.getId());
 				}
 			} catch (Exception e) {

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancestatistic/ActionShowStdForUnitInTopUnitWithDate.java

@@ -5,6 +5,8 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.control.Business;
 import com.x.attendance.entity.StatisticUnitForDay;
 import com.x.base.core.container.EntityManagerContainer;
@@ -38,7 +40,7 @@ public class ActionShowStdForUnitInTopUnitWithDate extends BaseAction {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			business = new Business(emc);
 			
-			if( name != null && !name.isEmpty()){
+			if( StringUtils.isNotEmpty( name )){
 				getTopUnitNameList( name, unitNames, effectivePerson.getDebugger() );
 			}
 			

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancestatistic/ActionShowStdForUnitWithDate.java

@@ -5,6 +5,8 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.control.Business;
 import com.x.attendance.entity.StatisticUnitForDay;
 import com.x.base.core.container.EntityManagerContainer;
@@ -37,7 +39,7 @@ public class ActionShowStdForUnitWithDate extends BaseAction {
 		}
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			business = new Business(emc);
-			if( unitName != null && !unitName.isEmpty()){
+			if( StringUtils.isNotEmpty( unitName )){
 				try{
 					unitNames = userManagerService.listSubUnitNameWithParent( unitName );
 					if( unitNames == null ) {

+ 4 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancestatistic/BaseAction.java

@@ -3,6 +3,8 @@ package com.x.attendance.assemble.control.jaxrs.attendancestatistic;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.control.service.AttendanceStatisticServiceAdv;
 import com.x.attendance.assemble.control.service.UserManagerService;
 import com.x.base.core.container.EntityManagerContainer;
@@ -22,7 +24,7 @@ public class BaseAction extends StandardJaxrsAction {
 		if (unitNameList == null) {
 			unitNameList = new ArrayList<String>();
 		}
-		if (unitName != null && !unitNameList.contains(unitName.trim())) {
+		if ( StringUtils.isNotEmpty( unitName ) && !unitNameList.contains(unitName.trim())) {
 			unitNameList.add(unitName.trim());
 
 			// 查询该组织的下级组织
@@ -48,7 +50,7 @@ public class BaseAction extends StandardJaxrsAction {
 		if (unitNameList == null) {
 			unitNameList = new ArrayList<String>();
 		}
-		if (topUnitName != null && !unitNameList.contains(topUnitName.trim())) {
+		if ( StringUtils.isNotEmpty( topUnitName ) && !unitNameList.contains(topUnitName.trim())) {
 			unitNameList.add( topUnitName.trim() );
 
 			// 查询该组织的下级组织

+ 0 - 3
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancestatisticalcycle/ActionGet.java

@@ -1,8 +1,5 @@
 package com.x.attendance.assemble.control.jaxrs.attendancestatisticalcycle;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.servlet.http.HttpServletRequest;
 
 import com.x.attendance.entity.AttendanceStatisticalCycle;

+ 6 - 4
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceworkdayconfig/ActionListWithFilter.java

@@ -5,6 +5,8 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.control.Business;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
@@ -56,19 +58,19 @@ public class ActionListWithFilter extends BaseAction {
 				business = new Business(emc);
 				attendanceWorkDayConfigFactory = business.getAttendanceWorkDayConfigFactory();
 				// 获取所有应用列表
-				if (q_Year != null && !q_Year.isEmpty()) {
-					if (q_Month != null && !q_Month.isEmpty()) {
+				if ( StringUtils.isNotEmpty( q_Year )) {
+					if ( StringUtils.isNotEmpty( q_Month )) {
 						// 根据年份月份获取所有节假日配置列表
 						logger.debug(effectivePerson, ">>>>>>>>>>根据年份月份获取所有节假日配置列表");
 						ids = attendanceWorkDayConfigFactory.listByYearAndMonth(q_Year, q_Month);
 					}
-					if (q_Name != null && !q_Name.isEmpty()) {
+					if ( StringUtils.isNotEmpty( q_Name )) {
 						// 根据年份名称获取所有节假日配置列表
 						logger.debug(effectivePerson, ">>>>>>>>>>根据年份名称获取所有节假日配置列表");
 						ids = attendanceWorkDayConfigFactory.listByYearAndName(q_Year, q_Name);
 					}
 				} else {
-					if (q_Name != null && !q_Name.isEmpty()) {
+					if ( StringUtils.isNotEmpty( q_Name )) {
 						// 根据名称获取所有节假日配置列表
 						logger.debug(effectivePerson, ">>>>>>>>>>根据名称获取所有节假日配置列表");
 						ids = attendanceWorkDayConfigFactory.listByName(q_Name);

+ 0 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceworkdayconfig/ActionSave.java

@@ -1,8 +1,6 @@
 package com.x.attendance.assemble.control.jaxrs.attendanceworkdayconfig;
 
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 

+ 2 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionListNextWithFilter.java

@@ -64,7 +64,7 @@ public class ActionListNextWithFilter extends BaseAction {
 				}
 				
 				//处理一下顶层组织,查询下级顶层组织
-				if( wrapIn.getQ_topUnitName() != null && !wrapIn.getQ_topUnitName().isEmpty() ){
+				if( StringUtils.isNotEmpty( wrapIn.getQ_topUnitName() ) ){
 					topUnitNames.add( wrapIn.getQ_topUnitName() );
 					try{
 						unitNameList = userManagerService.listSubUnitNameWithParent( wrapIn.getQ_topUnitName() );
@@ -83,7 +83,7 @@ public class ActionListNextWithFilter extends BaseAction {
 				}
 				
 				//处理一下组织,查询下级组织
-				if( wrapIn.getQ_unitName() != null && !wrapIn.getQ_unitName().isEmpty() ){
+				if( StringUtils.isNotEmpty( wrapIn.getQ_unitName() ) ){
 					unitNames.add(wrapIn.getQ_unitName());
 					try{
 						unitNameList = userManagerService.listSubUnitNameWithParent( wrapIn.getQ_unitName() );

+ 2 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionListPrevWithFilter.java

@@ -64,7 +64,7 @@ public class ActionListPrevWithFilter extends BaseAction {
 				}
 				
 				//处理一下顶层组织,查询下级顶层组织
-				if( wrapIn.getQ_topUnitName() != null && !wrapIn.getQ_topUnitName().isEmpty() ){
+				if( StringUtils.isNotEmpty( wrapIn.getQ_topUnitName() ) ){
 					topUnitNames.add( wrapIn.getQ_topUnitName() );
 					try{
 						unitNameList = userManagerService.listSubUnitNameWithParent( wrapIn.getQ_topUnitName() );
@@ -82,7 +82,7 @@ public class ActionListPrevWithFilter extends BaseAction {
 				}
 				
 				//处理一下组织,查询下级组织
-				if( wrapIn.getQ_unitName() != null && !wrapIn.getQ_unitName().isEmpty() ){
+				if( StringUtils.isNotEmpty( wrapIn.getQ_unitName() ) ){
 					unitNames.add(wrapIn.getQ_unitName());
 					try{
 						unitNameList = userManagerService.listSubUnitNameWithParent( wrapIn.getQ_unitName() );

+ 0 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionSave.java

@@ -1,6 +1,5 @@
 package com.x.attendance.assemble.control.jaxrs.selfholiday;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 

+ 0 - 3
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/workplace/ActionGet.java

@@ -1,8 +1,5 @@
 package com.x.attendance.assemble.control.jaxrs.workplace;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.servlet.http.HttpServletRequest;
 
 import com.x.attendance.assemble.control.jaxrs.workplace.exception.ExceptionWorkPlaceProcess;

+ 3 - 4
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/workplace/ActionSave.java

@@ -1,10 +1,9 @@
 package com.x.attendance.assemble.control.jaxrs.workplace;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
 import com.x.attendance.assemble.control.jaxrs.workplace.exception.ExceptionLatitudeEmpty;
@@ -77,7 +76,7 @@ public class ActionSave extends BaseAction {
 				attendanceWorkPlace = new AttendanceWorkPlace();
 				Wi.copier.copy(wrapIn, attendanceWorkPlace);
 				attendanceWorkPlace.setCreator(currentPerson.getDistinguishedName());
-				if (wrapIn.getId() != null && !wrapIn.getId().isEmpty()) {
+				if ( StringUtils.isNotEmpty( wrapIn.getId() )) {
 					attendanceWorkPlace.setId(wrapIn.getId());
 				}
 			} catch (Exception e) {

+ 0 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/processor/thread/OperatorDataSaver.java

@@ -18,10 +18,8 @@ public class OperatorDataSaver implements Runnable {
 	private EntityImportDataDetail cacheImportRowDetail = null;
 	
 	private AttendanceDetailServiceAdv attendanceDetailServiceAdv = new AttendanceDetailServiceAdv();
-	private Boolean debugger = false;
 	public OperatorDataSaver( EntityImportDataDetail cacheImportRowDetail, Boolean debugger ) {
 		this.cacheImportRowDetail = cacheImportRowDetail ;
-		this.debugger = debugger;
 	}
 	
 	@Override

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceAppealInfoService.java

@@ -3,6 +3,8 @@ package com.x.attendance.assemble.control.service;
 import java.util.Date;
 import java.util.List;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.control.Business;
 import com.x.attendance.entity.AttendanceAppealInfo;
 import com.x.attendance.entity.AttendanceDetail;
@@ -29,7 +31,7 @@ public class AttendanceAppealInfoService {
 	}
 	public void delete( EntityManagerContainer emc, String id ) throws Exception {
 		AttendanceAppealInfo attendanceAppealInfo = null;
-		if( id != null && !id.isEmpty() && !"(0)".equals( id )){
+		if( StringUtils.isNotEmpty( id ) && !"(0)".equals( id )){
 			attendanceAppealInfo = emc.find(id, AttendanceAppealInfo.class);
 			if ( null == attendanceAppealInfo ) {
 				throw new Exception("需要删除的申诉信息信息不存在。id=" + id);

+ 6 - 4
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceAppealInfoServiceAdv.java

@@ -3,6 +3,8 @@ package com.x.attendance.assemble.control.service;
 import java.util.Date;
 import java.util.List;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.common.date.DateOperation;
 import com.x.attendance.assemble.control.Business;
 import com.x.attendance.assemble.control.jaxrs.AppealConfig;
@@ -162,19 +164,19 @@ public class AttendanceAppealInfoServiceAdv {
 	 * @throws Exception
 	 */
 	private String getPersonWithUnitDuty( String personName, String dutyName, String personUnitName, String identity ) throws Exception {
-		if( personName == null || personName.isEmpty() ) {
+		if( StringUtils.isNotEmpty( personName ) ) {
 			logger.info( "personName is null!" );
 			return null;
 		}
-		if( dutyName == null || dutyName.isEmpty() ) {
+		if( StringUtils.isNotEmpty( dutyName ) ) {
 			logger.info( "dutyName is null!" );
 			return null;
 		}
 		List<String> duties = null;
-		if( identity != null && !identity.isEmpty() ) {
+		if( StringUtils.isNotEmpty( identity ) ) {
 			duties = userManagerService.getUnitDutyWithIdentityWithDuty( identity, dutyName );
 		}else {
-			if( personUnitName != null && !personUnitName.isEmpty() ) {
+			if( StringUtils.isNotEmpty( personUnitName ) ) {
 				duties = userManagerService.getUnitDutyWithUnitWithDuty( personUnitName, dutyName );
 			}else {
 				duties = userManagerService.getUnitDutyWithPersonWithDuty( personName, dutyName );

+ 6 - 4
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailAnalyseService.java

@@ -6,6 +6,8 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.common.date.DateOperation;
 import com.x.attendance.assemble.control.Business;
 import com.x.attendance.assemble.control.factory.AttendanceStatisticRequireLogFactory;
@@ -256,7 +258,7 @@ public class AttendanceDetailAnalyseService {
 			if( check ){
 				if( attendanceScheduleSetting != null ){
 					detail.setTopUnitName( attendanceScheduleSetting.getTopUnitName() );
-					if( attendanceScheduleSetting.getUnitName() != null && !attendanceScheduleSetting.getUnitName().isEmpty() && !"*".equals( attendanceScheduleSetting.getUnitName() )) {
+					if( StringUtils.isNotEmpty( attendanceScheduleSetting.getUnitName() ) && !"*".equals( attendanceScheduleSetting.getUnitName() )) {
 						detail.setUnitName( attendanceScheduleSetting.getUnitName() );
 					}else {
 						detail.setUnitName( userManagerService.getUnitNameWithPersonName( detail.getEmpName() ) );
@@ -788,7 +790,7 @@ public class AttendanceDetailAnalyseService {
 			logger.error(e);
 		}
 		
-		if( attendanceScheduleSetting.getLateStartTime() != null && !attendanceScheduleSetting.getLateStartTime().isEmpty() ){
+		if( StringUtils.isNotEmpty( attendanceScheduleSetting.getLateStartTime() ) ){
 			try {
 				lateStartTime = dateOperation.getDateFromString( detail.getRecordDateString() + " " + attendanceScheduleSetting.getLateStartTime() );
 			} catch (Exception e) {
@@ -801,7 +803,7 @@ public class AttendanceDetailAnalyseService {
 			logger.debug( debugger, ">>>>>>>>>>迟到时间设置为空!系统将不判断迟到情况");
 		}
 		
-		if( attendanceScheduleSetting.getLeaveEarlyStartTime()  != null && !attendanceScheduleSetting.getLeaveEarlyStartTime().trim().isEmpty() ){
+		if( StringUtils.isNotEmpty( attendanceScheduleSetting.getLeaveEarlyStartTime() ) ){
 			try {
 				logger.debug( debugger, ">>>>>>>>>>格式化[早退起算时间]leaveEarlyStartTime=" +  detail.getRecordDateString() + " " + attendanceScheduleSetting.getLeaveEarlyStartTime() );
 				leaveEarlyStartTime = dateOperation.getDateFromString( detail.getRecordDateString() + " " + attendanceScheduleSetting.getLeaveEarlyStartTime() );
@@ -815,7 +817,7 @@ public class AttendanceDetailAnalyseService {
 			logger.debug( debugger, ">>>>>>>>>>早退时间设置为空!系统将不判断早退情况");
 		}
 		
-		if( attendanceScheduleSetting.getAbsenceStartTime()  != null && !attendanceScheduleSetting.getAbsenceStartTime().trim().isEmpty() ){
+		if( StringUtils.isNotEmpty( attendanceScheduleSetting.getAbsenceStartTime() ) ){
 			try {
 				logger.debug( debugger, ">>>>>>>>>>格式化[缺勤起算时间]absenceStartTime=" +  detail.getRecordDateString() + " " + attendanceScheduleSetting.getAbsenceStartTime() );
 				absenceStartTime = dateOperation.getDateFromString( detail.getRecordDateString() + " " + attendanceScheduleSetting.getAbsenceStartTime() );

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailMobileAnalyseServiceAdv.java

@@ -3,6 +3,8 @@ package com.x.attendance.assemble.control.service;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.control.Business;
 import com.x.attendance.entity.AttendanceDetail;
 import com.x.attendance.entity.AttendanceDetailMobile;
@@ -45,7 +47,7 @@ public class AttendanceDetailMobileAnalyseServiceAdv {
 			if( attendanceDetailMobile != null ){
 				attendanceDetail = attendanceDetailMobileAnalyseService.composeAttendanceDetailMobile( emc, id );
 				if( attendanceDetail != null ){
-					if( attendanceDetail.getOffDutyTime() != null && !attendanceDetail.getOffDutyTime().isEmpty() ){
+					if( StringUtils.isNotEmpty( attendanceDetail.getOffDutyTime() ) ){
 						attendanceDetailAnalyseService.analyseAttendanceDetail(emc, attendanceDetail, topUnitAttendanceStatisticalCycleMap, debugger );
 					}
 				}

+ 5 - 3
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceEmployeeConfigServiceAdv.java

@@ -2,6 +2,8 @@ package com.x.attendance.assemble.control.service;
 
 import java.util.List;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.entity.AttendanceEmployeeConfig;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
@@ -62,14 +64,14 @@ public class AttendanceEmployeeConfigServiceAdv {
 	public AttendanceEmployeeConfig checkAttendanceEmployeeConfig( AttendanceEmployeeConfig attendanceEmployeeConfig ) throws Exception {
 		String unitName = null;
 		String topUnitName = null;
-		if ( attendanceEmployeeConfig.getUnitName() != null ){
+		if ( StringUtils.isNotEmpty( attendanceEmployeeConfig.getUnitName() )){
 			//检验一下组织是否存在,如果不存在,则重新进行查询
 			unitName = userManagerService.checkUnitNameExists( attendanceEmployeeConfig.getUnitName() );
 		}
-		if( unitName == null || unitName.isEmpty() ){
+		if( StringUtils.isEmpty( unitName ) ){
 			unitName = userManagerService.getUnitNameWithPersonName( attendanceEmployeeConfig.getEmployeeName() );
 		}
-		if( unitName != null && !unitName.isEmpty() ){
+		if( StringUtils.isNotEmpty( unitName ) ){
 			topUnitName = userManagerService.getTopUnitNameWithUnitName( unitName );
 			attendanceEmployeeConfig.setUnitName( unitName );
 			attendanceEmployeeConfig.setTopUnitName( topUnitName );

+ 14 - 14
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceNoticeService.java

@@ -1,5 +1,7 @@
 package com.x.attendance.assemble.control.service;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.entity.AttendanceAppealInfo;
 
 public class AttendanceNoticeService {
@@ -16,11 +18,11 @@ public class AttendanceNoticeService {
 			throws Exception {
 		if (attendanceAppealInfo != null) {
 			String targetName = attendanceAppealInfo.getEmpName();
-			String messageContent = "您好,[" + attendanceAppealInfo.getRecordDateString() + "]考勤结果的申诉已经通过审核。";
-			if (targetName != null && !targetName.isEmpty()) {
+//			String messageContent = "您好,[" + attendanceAppealInfo.getRecordDateString() + "]考勤结果的申诉已经通过审核。";
+			if (StringUtils.isNotEmpty( targetName )) {
 				String[] array = targetName.split(",");
 				for (String name : array) {
-					if (name != null && !name.trim().isEmpty()) {
+					if ( StringUtils.isNotEmpty( name )) {
 						// @Todo
 //						AttendanceAppealAcceptMessage message = new AttendanceAppealAcceptMessage( name, attendanceAppealInfo.getId(), attendanceAppealInfo.getDetailId(), messageContent );
 //						Collaboration.send(message);
@@ -44,11 +46,11 @@ public class AttendanceNoticeService {
 			throws Exception {
 		if (attendanceAppealInfo != null) {
 			String targetName = attendanceAppealInfo.getEmpName();
-			String messageContent = "您好,[" + attendanceAppealInfo.getRecordDateString() + "]考勤结果的申诉未通过审核。";
-			if (targetName != null && !targetName.isEmpty()) {
+//			String messageContent = "您好,[" + attendanceAppealInfo.getRecordDateString() + "]考勤结果的申诉未通过审核。";
+			if ( StringUtils.isNotEmpty( targetName )) {
 				String[] array = targetName.split(",");
 				for (String name : array) {
-					if (name != null && !name.trim().isEmpty()) {
+					if ( StringUtils.isNotEmpty( name )) {
 //						AttendanceAppealRejectMessage message = new AttendanceAppealRejectMessage(name,
 //								attendanceAppealInfo.getId(), attendanceAppealInfo.getDetailId(), messageContent);
 //						Collaboration.send(message);
@@ -70,12 +72,11 @@ public class AttendanceNoticeService {
 	public void notifyAttendanceAppealProcessness1Message(AttendanceAppealInfo attendanceAppealInfo) throws Exception {
 		if (attendanceAppealInfo != null) {
 			String targetName = attendanceAppealInfo.getCurrentProcessor();
-			String messageContent = "您收到了" + attendanceAppealInfo.getEmpName() + "的考勤结果申诉,申诉类型为["
-					+ attendanceAppealInfo.getAppealReason() + "],请您审核!";
-			if (targetName != null && !targetName.isEmpty()) {
+//			String messageContent = "您收到了" + attendanceAppealInfo.getEmpName() + "的考勤结果申诉,申诉类型为[" + attendanceAppealInfo.getAppealReason() + "],请您审核!";
+			if ( StringUtils.isNotEmpty( targetName )) {
 				String[] array = targetName.split(",");
 				for (String name : array) {
-					if (name != null && !name.trim().isEmpty()) {
+					if ( StringUtils.isNotEmpty( name )) {
 //						AttendanceAppealInviteMessage message = new AttendanceAppealInviteMessage(name,
 //								attendanceAppealInfo.getId(), attendanceAppealInfo.getDetailId(), messageContent);
 //						Collaboration.send(message);
@@ -97,12 +98,11 @@ public class AttendanceNoticeService {
 	public void notifyAttendanceAppealProcessness2Message(AttendanceAppealInfo attendanceAppealInfo) throws Exception {
 		if (attendanceAppealInfo != null) {
 			String targetName = attendanceAppealInfo.getCurrentProcessor();
-			String messageContent = "您收到了" + attendanceAppealInfo.getEmpName() + "的考勤结果申诉,申诉类型为["
-					+ attendanceAppealInfo.getAppealReason() + "],请您复核!";
-			if (targetName != null && !targetName.isEmpty()) {
+//			String messageContent = "您收到了" + attendanceAppealInfo.getEmpName() + "的考勤结果申诉,申诉类型为[" + attendanceAppealInfo.getAppealReason() + "],请您复核!";
+			if ( StringUtils.isNotEmpty( targetName )) {
 				String[] array = targetName.split(",");
 				for (String name : array) {
-					if (name != null && !name.trim().isEmpty()) {
+					if ( StringUtils.isNotEmpty( name )) {
 //						AttendanceAppealInviteMessage message = new AttendanceAppealInviteMessage(name,
 //								attendanceAppealInfo.getId(), attendanceAppealInfo.getDetailId(), messageContent);
 //						Collaboration.send(message);

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceScheduleSettingService.java

@@ -2,6 +2,8 @@ package com.x.attendance.assemble.control.service;
 
 import java.util.List;
 
+import org.apache.commons.lang3.StringUtils;
+
 import com.x.attendance.assemble.control.Business;
 import com.x.attendance.entity.AttendanceScheduleSetting;
 import com.x.base.core.container.EntityManagerContainer;
@@ -102,7 +104,7 @@ public class AttendanceScheduleSettingService {
 				}
 			}else{
 				superUnitName = userManagerService.getParentUnitWithUnitName( unitName );
-				if( superUnitName != null && !superUnitName.isEmpty() && !"0".equals( superUnitName )) {
+				if( StringUtils.isNotEmpty( superUnitName ) && !"0".equals( superUnitName )) {
 					return getAttendanceScheduleSettingWithUnitName( superUnitName );
 				}
 			}		

+ 6 - 5
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/UserManagerService.java

@@ -9,6 +9,7 @@ import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.project.organization.Person;
 import com.x.base.core.project.organization.Unit;
+import com.x.base.core.project.tools.ListTools;
 
 /**
  * 用户组织顶层组织信息管理服务类
@@ -42,9 +43,9 @@ public class UserManagerService {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			business = new Business(emc);
 			unitNames = business.organization().unit().listWithPerson( personName );
-			if( unitNames != null && !unitNames.isEmpty() ) {
+			if( ListTools.isNotEmpty( unitNames ) ) {
 				for( String unitName : unitNames ) {
-					if( unitName != null && !"null".equals( unitName ) && !unitName.isEmpty() ) {
+					if( StringUtils.isNotEmpty( unitName ) && !"null".equals( unitName ) ) {
 						unit = business.organization().unit().getObject( unitName );
 						if( level < unit.getLevel() ) {
 							level = unit.getLevel();
@@ -129,7 +130,7 @@ public class UserManagerService {
 			//兼容一下传过来的personName有可能是个人,有可能是身份
 			personName = business.organization().person().get( personName );
 			identity = getIdentityWithPerson( personName );
-			if( identity != null && !identity.isEmpty() ){
+			if( StringUtils.isNotEmpty( identity ) ){
 				topUnitName = business.organization().unit().getWithIdentityWithLevel( identity, 1 );
 			}
 			if( StringUtils.isEmpty( topUnitName )) {
@@ -190,7 +191,7 @@ public class UserManagerService {
 			currentUnit = business.organization().unit().getObject( unitName );
 			if( currentUnit != null ) {
 				parentUnitName = currentUnit.getSuperior();
-				if( parentUnitName != null && !parentUnitName.isEmpty() && !"0".equals( parentUnitName ) ) {
+				if( StringUtils.isNotEmpty( parentUnitName ) && !"0".equals( parentUnitName ) ) {
 					try {
 						parentUnit = business.organization().unit().getObject( currentUnit.getSuperior() );
 						if( parentUnit == null ) {
@@ -224,7 +225,7 @@ public class UserManagerService {
 			currentUnit = business.organization().unit().getObject( unitName );
 			if( currentUnit != null ) {
 				parentUnitName = currentUnit.getSuperior();
-				if( parentUnitName != null && !parentUnitName.isEmpty() && !"0".equals( parentUnitName ) ) {
+				if( StringUtils.isNotEmpty( parentUnitName ) && !"0".equals( parentUnitName ) ) {
 					try {
 						parentUnit = business.organization().unit().getObject( parentUnitName );
 					}catch( NullPointerException e ) {

+ 110 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java

@@ -28,6 +28,7 @@ import org.apache.commons.lang3.reflect.FieldUtils;
 
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.JpaObject;
+import com.x.base.core.entity.JpaObject_;
 import com.x.base.core.entity.annotation.CheckPersist;
 import com.x.base.core.entity.annotation.CheckPersistType;
 import com.x.base.core.entity.annotation.CheckRemove;
@@ -42,15 +43,20 @@ import com.x.base.core.project.tools.StringTools;
 
 public class EntityManagerContainer extends EntityManagerContainerBasic {
 
+	public static final Integer DEFAULT_PAGESIZE = 20;
+	public static final Integer MAX_PAGESIZE = 1000;
+
 	public EntityManagerContainer(EntityManagerContainerFactory entityManagerContainerFactory) {
 		super(entityManagerContainerFactory);
 	}
 
 	public void persist(JpaObject o) throws Exception {
+		// o.onPersist();
 		this.get(o.getClass()).persist(o);
 	}
 
 	public void persist(JpaObject o, CheckPersistType type) throws Exception {
+		// o.onPersist();
 		if (!type.equals(CheckPersistType.none)) {
 			check(o, type);
 		}
@@ -400,6 +406,21 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 		return new TreeList<T>(os);
 	}
 
+	public <T extends JpaObject> List<T> listEqualAndEqualAndNotEqual(Class<T> cls, String equalAttribute,
+			Object equalValue, String otherEqualAttribute, Object otherEqualValue, String notEqualAttribute,
+			Object notEqualValue) throws Exception {
+		EntityManager em = this.get(cls);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<T> cq = cb.createQuery(cls);
+		Root<T> root = cq.from(cls);
+		cq.select(root)
+				.where(cb.and(cb.equal(root.get(equalAttribute), equalValue),
+						cb.equal(root.get(otherEqualAttribute), otherEqualValue),
+						cb.notEqual(root.get(notEqualAttribute), notEqualValue)));
+		List<T> os = em.createQuery(cq).getResultList();
+		return new TreeList<T>(os);
+	}
+
 	public <T extends JpaObject, W extends Object> List<T> listEqualAndIn(Class<T> cls, String attribute, Object value,
 			String otherAttribute, Collection<W> otherValues) throws Exception {
 		EntityManager em = this.get(cls);
@@ -503,6 +524,35 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 		return em.createQuery(cq).getSingleResult();
 	}
 
+	public <T extends JpaObject> Long countEqualAndEqualAndNotEqual(Class<T> cls, String euqalAttribute,
+			Object equalValue, String otherEqualAttribute, Object otherEqualValue, String notEqualAttribute,
+			Object notEqualValue) throws Exception {
+		EntityManager em = this.get(cls);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<T> root = cq.from(cls);
+		cq.select(cb.count(root))
+				.where(cb.and(cb.equal(root.get(euqalAttribute), equalValue),
+						cb.equal(root.get(otherEqualAttribute), otherEqualValue),
+						cb.notEqual(root.get(notEqualAttribute), notEqualValue)));
+		return em.createQuery(cq).getSingleResult();
+	}
+
+	public <T extends JpaObject> Long countEqualAndEqualAndEqualAndNotEqual(Class<T> cls, String firstEuqalAttribute,
+			Object firstEqualValue, String secondEqualAttribute, Object secondEqualValue, String thirdEqualAttribute,
+			Object thirdEqualValue, String notEqualAttribute, Object notEqualValue) throws Exception {
+		EntityManager em = this.get(cls);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<T> root = cq.from(cls);
+		cq.select(cb.count(root))
+				.where(cb.and(cb.equal(root.get(firstEuqalAttribute), firstEqualValue),
+						cb.equal(root.get(secondEqualAttribute), secondEqualValue),
+						cb.equal(root.get(thirdEqualAttribute), thirdEqualValue),
+						cb.notEqual(root.get(notEqualAttribute), notEqualValue)));
+		return em.createQuery(cq).getSingleResult();
+	}
+
 	public <T extends JpaObject> Long countEqualAndNotEqual(Class<T> cls, String attribute, Object value,
 			String otherAttribute, Object otherValue) throws Exception {
 		EntityManager em = this.get(cls);
@@ -1280,4 +1330,64 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 		return null;
 	}
 
+	public <T extends JpaObject> List<T> listEqualAndSequenceAfter(Class<T> clz, String equalAttribute,
+			Object equalValue, Integer count, String sequence) throws Exception {
+		EntityManager em = this.get(clz);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<T> cq = cb.createQuery(clz);
+		Root<T> root = cq.from(clz);
+		Predicate p = cb.equal(root.get(equalAttribute), equalValue);
+		if (StringUtils.isNotEmpty(sequence)) {
+			p = cb.and(p, cb.greaterThan(root.get(JpaObject_.sequence), sequence));
+		}
+		cq.select(root).where(p).orderBy(cb.asc(root.get(JpaObject_.sequence)));
+		List<T> os = em.createQuery(cq).setMaxResults((count != null && count > 0) ? count : 100).getResultList();
+		List<T> list = new ArrayList<>(os);
+		return list;
+	}
+
+	/* 仅在单一数据库可用 */
+	public <T extends JpaObject, W extends GsonPropertyObject> List<W> fetchEqualDescPaging(Class<T> clz,
+			WrapCopier<T, W> copier, String equalAttribute, Object equalValue, Integer page, Integer count,
+			String orderAttribute) throws Exception {
+		List<T> os = fetchEqualDescPaging(clz, copier.getCopyFields(), equalAttribute, equalValue, page, count,
+				orderAttribute);
+		return copier.copy(os);
+	}
+
+	/* 仅在单一数据库可用 */
+	public <T extends JpaObject> List<T> fetchEqualDescPaging(Class<T> clz, String equalAttribute, Object equalValue,
+			Integer page, Integer count, String orderAttribute) throws Exception {
+		return fetchEqualDescPaging(clz, JpaObject.singularAttributeField(clz, true, true), equalAttribute, equalValue,
+				page, count, orderAttribute);
+	}
+
+	/* 仅在单一数据库可用 */
+	public <T extends JpaObject, W extends GsonPropertyObject> List<T> fetchEqualDescPaging(Class<T> clz,
+			List<String> fetchAttributes, String equalAttribute, Object equalValue, Integer page, Integer pageSize,
+			String orderAttribute) throws Exception {
+		List<T> list = new ArrayList<>();
+		int max = (pageSize == null || pageSize < 1 || pageSize > MAX_PAGESIZE) ? DEFAULT_PAGESIZE : pageSize;
+		int startPosition = (page == null || page < 1) ? 0 : (page - 1) * max;
+		List<String> fields = ListTools.trim(fetchAttributes, true, true, JpaObject.id_FIELDNAME);
+		EntityManager em = this.get(clz);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Tuple> cq = cb.createQuery(Tuple.class);
+		Root<T> root = cq.from(clz);
+		List<Selection<?>> selections = new ArrayList<>();
+		for (String str : fields) {
+			selections.add(root.get(str));
+		}
+		Predicate p = cb.equal(root.get(equalAttribute), equalValue);
+		cq.multiselect(selections).where(p).orderBy(cb.desc(root.get(orderAttribute)));
+		for (Tuple o : em.createQuery(cq).setFirstResult(startPosition).setMaxResults(max).getResultList()) {
+			T t = clz.newInstance();
+			for (int i = 0; i < fields.size(); i++) {
+				PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i)));
+			}
+			list.add(t);
+		}
+		return list;
+	}
+
 }

+ 6 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/EntityManagerContainerFactory.java

@@ -54,7 +54,12 @@ public class EntityManagerContainerFactory extends SliceEntityManagerContainerFa
 	}
 
 	private EntityManagerContainerFactory(String webApplicationDirectory, List<String> entities) throws Exception {
-		super(webApplicationDirectory, entities);
+		super(webApplicationDirectory, entities,false);
+	}
+
+	private EntityManagerContainerFactory(String webApplicationDirectory, List<String> entities,
+			boolean sliceFeatureEnable) throws Exception {
+		super(webApplicationDirectory, entities,sliceFeatureEnable);
 	}
 
 	private EntityManagerContainerFactory(String source) throws Exception {

+ 58 - 10
o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/PersistenceXmlHelper.java

@@ -61,18 +61,26 @@ public class PersistenceXmlHelper {
 		}
 	}
 
-	public static Properties properties(String className) throws Exception {
-		if (Config.externalDataSources().enable()) {
-			return properties_external(className);
+	public static Properties properties(String className, boolean sliceFeatureEnable) throws Exception {
+		if (sliceFeatureEnable) {
+			if (Config.externalDataSources().enable()) {
+				return properties_external_slice(className);
+			} else {
+				return properties_internal_slice(className);
+			}
 		} else {
-			return properties_internal(className);
+			if (Config.externalDataSources().enable()) {
+				return properties_external_single(className);
+			} else {
+				return properties_internal_single(className);
+			}
 		}
+
 	}
 
-	private static Properties properties_base(String className) throws Exception {
+	private static Properties properties_base_slice(String className) throws Exception {
 		Properties properties = new Properties();
 		properties.put("openjpa.BrokerFactory", "slice");
-		/* 如果是DB2 添加 Schema,mysql 不需要Schema 如果用了Schema H2数据库就会报错说没有Schema */
 		properties.put("openjpa.slice.Lenient", "false");
 		properties.put("openjpa.slice.DistributionPolicy", FactorDistributionPolicy.class.getName());
 		properties.put("openjpa.QueryCompilationCache", "false");
@@ -88,8 +96,8 @@ public class PersistenceXmlHelper {
 		return properties;
 	}
 
-	private static Properties properties_external(String className) throws Exception {
-		Properties properties = properties_base(className);
+	private static Properties properties_external_slice(String className) throws Exception {
+		Properties properties = properties_base_slice(className);
 		properties.put("openjpa.jdbc.DBDictionary", Config.externalDataSources().dictionary());
 		/* 如果是DB2 添加 Schema,mysql 不需要Schema 如果用了Schema H2数据库就会报错说没有Schema */
 		if (Config.externalDataSources().hasSchema()) {
@@ -104,8 +112,8 @@ public class PersistenceXmlHelper {
 		return properties;
 	}
 
-	private static Properties properties_internal(String className) throws Exception {
-		Properties properties = properties_base(className);
+	private static Properties properties_internal_slice(String className) throws Exception {
+		Properties properties = properties_base_slice(className);
 		properties.put("openjpa.jdbc.DBDictionary", SlicePropertiesBuilder.dictionary_h2);
 		properties.put("openjpa.slice.Names",
 				StringUtils.join(Config.nodes().dataServers().findNamesOfContainerEntity(className), ","));
@@ -116,4 +124,44 @@ public class PersistenceXmlHelper {
 		return properties;
 	}
 
+	private static Properties properties_base_single(String className) throws Exception {
+		Properties properties = new Properties();
+		properties.put("openjpa.QueryCompilationCache", "false");
+		properties.put("openjpa.IgnoreChanges", "true");
+		properties.put("openjpa.QueryCache", "false");
+		properties.put("openjpa.QueryCompilationCache", "false");
+		properties.put("openjpa.LockManager", "none");
+		properties.put("openjpa.jdbc.ResultSetType", "scroll-insensitive");
+		/* 如果启用本地初始化会导致classLoad的问题 */
+		properties.put("openjpa.DynamicEnhancementAgent", "false");
+		properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=false)");
+		return properties;
+	}
+
+	private static Properties properties_external_single(String className) throws Exception {
+		Properties properties = properties_base_single(className);
+		properties.put("openjpa.jdbc.DBDictionary", Config.externalDataSources().dictionary());
+		/* 如果是DB2 添加 Schema,mysql 不需要Schema 如果用了Schema H2数据库就会报错说没有Schema */
+		if (Config.externalDataSources().hasSchema()) {
+			properties.put("openjpa.jdbc.Schema", JpaObject.default_schema);
+		}
+		for (String name : Config.externalDataSources().findNamesOfContainerEntity(className)) {
+			properties.put("openjpa.ConnectionFactoryName", Config.RESOUCE_JDBC_PREFIX + name);
+			properties.put("openjpa.Log", Config.externalDataSources().log(name));
+			break;
+		}
+		return properties;
+	}
+
+	private static Properties properties_internal_single(String className) throws Exception {
+		Properties properties = properties_base_single(className);
+		properties.put("openjpa.jdbc.DBDictionary", SlicePropertiesBuilder.dictionary_h2);
+		for (String name : Config.nodes().dataServers().findNamesOfContainerEntity(className)) {
+			properties.put("openjpa.ConnectionFactoryName", Config.RESOUCE_JDBC_PREFIX + name);
+			properties.put("openjpa.Log", Config.nodes().dataServers().log(name));
+			break;
+		}
+		return properties;
+	}
+
 }

+ 4 - 195
o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/SliceEntityManagerContainerFactory.java

@@ -46,15 +46,15 @@ public abstract class SliceEntityManagerContainerFactory {
 	/* class 与 class 中需要检查 Remove 字段的对应表 */
 	protected Map<Class<? extends JpaObject>, Map<Field, CheckRemove>> checkRemoveFieldMap = new ConcurrentHashMap<Class<? extends JpaObject>, Map<Field, CheckRemove>>();
 
-	protected SliceEntityManagerContainerFactory(String webApplicationDirectory, List<String> entities)
-			throws Exception {
+	protected SliceEntityManagerContainerFactory(String webApplicationDirectory, List<String> entities,
+			boolean sliceFeatureEnable) throws Exception {
 		File path = new File(webApplicationDirectory + "/WEB-INF/classes/" + PERSISTENCE_XML_PATH);
 		List<String> classNames = PersistenceXmlHelper.write(path.getAbsolutePath(), entities);
 		for (String className : classNames) {
 			Class<? extends JpaObject> clz = (Class<? extends JpaObject>) Class.forName(className);
 			checkPersistFieldMap.put(clz, this.loadCheckPersistField(clz));
 			checkRemoveFieldMap.put(clz, this.loadCheckRemoveField(clz));
-			Properties properties = PersistenceXmlHelper.properties(clz.getName());
+			Properties properties = PersistenceXmlHelper.properties(clz.getName(), sliceFeatureEnable);
 			entityManagerFactoryMap.put(clz,
 					OpenJPAPersistence.createEntityManagerFactory(clz.getName(), PERSISTENCE_XML_PATH, properties));
 			List<Field> flagFields = new ArrayList<>();
@@ -75,40 +75,12 @@ public abstract class SliceEntityManagerContainerFactory {
 		}
 	}
 
-//	protected SliceEntityManagerContainerFactory(String webApplicationDirectory, DataMappings dataMappings,
-//			List<String> entities) throws Exception {
-//		Set<Class<? extends JpaObject>> classes = persistenceXml(webApplicationDirectory, dataMappings, entities);
-//		for (Class<? extends JpaObject> clz : classes) {
-//			checkPersistFieldMap.put(clz, this.loadCheckPersistField(clz));
-//			checkRemoveFieldMap.put(clz, this.loadCheckRemoveField(clz));
-//			entityManagerFactoryMap.put(clz,
-//					OpenJPAPersistence.createEntityManagerFactory(clz.getName(), PERSISTENCE_XML_PATH));
-//			List<Field> flagFields = new ArrayList<>();
-//			List<Field> restrictFlagFields = new ArrayList<>();
-//			for (Field o : FieldUtils.getFieldsListWithAnnotation(clz, Id.class)) {
-//				flagFields.add(o);
-//				restrictFlagFields.add(o);
-//			}
-//			for (Field o : FieldUtils.getFieldsListWithAnnotation(clz, Flag.class)) {
-//				flagFields.add(o);
-//				restrictFlagFields.add(o);
-//			}
-//			for (Field o : FieldUtils.getFieldsListWithAnnotation(clz, RestrictFlag.class)) {
-//				restrictFlagFields.add(o);
-//			}
-//			flagMap.put(clz, Collections.unmodifiableList(flagFields));
-//			restrictFlagMap.put(clz, Collections.unmodifiableList(restrictFlagFields));
-//		}
-//	}
-
 	protected SliceEntityManagerContainerFactory(String source) throws Exception {
 		Set<Class<? extends JpaObject>> classes = this.listUitClass(source);
 		for (Class<? extends JpaObject> clz : classes) {
 			checkPersistFieldMap.put(clz, this.loadCheckPersistField(clz));
 			checkRemoveFieldMap.put(clz, this.loadCheckRemoveField(clz));
-			Properties properties = PersistenceXmlHelper.properties(clz.getName());
-			entityManagerFactoryMap.put(clz,
-					OpenJPAPersistence.createEntityManagerFactory(clz.getName(), source, properties));
+			entityManagerFactoryMap.put(clz, OpenJPAPersistence.createEntityManagerFactory(clz.getName(), source));
 			List<Field> flagFields = new ArrayList<>();
 			List<Field> restrictFlagFields = new ArrayList<>();
 			for (Field o : FieldUtils.getFieldsListWithAnnotation(clz, Id.class)) {
@@ -127,99 +99,6 @@ public abstract class SliceEntityManagerContainerFactory {
 		}
 	}
 
-//	/** 扫描受管实体,生成 x_perisitence.xml */
-//	@SuppressWarnings("unchecked")
-//	private Set<Class<? extends JpaObject>> persistenceXml(String webApplicationDirectory, DataMappings dataMappings,
-//			List<String> entities) throws Exception {
-//		String name = "";
-//		Set<Class<? extends JpaObject>> classes = new HashSet<>();
-//		try {
-//			List<String> names = new ArrayList<>();
-//			names.addAll(dataMappings.keySet());
-//			names = ListTools.includesExcludesWildcard(names, entities, null);
-//			Document document = DocumentHelper.createDocument();
-//			Element persistence = document.addElement("persistence", "http://java.sun.com/xml/ns/persistence");
-//			persistence.addAttribute(QName.get("schemaLocation", "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
-//					"http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd");
-//			persistence.addAttribute("version", "2.0");
-//			for (String className : names) {
-//				name = className;
-//				Class<? extends JpaObject> clazz = (Class<JpaObject>) Class.forName(className);
-//				Element unit = persistence.addElement("persistence-unit");
-//				unit.addAttribute("name", className);
-//				unit.addAttribute("transaction-type", "RESOURCE_LOCAL");
-//				Element provider = unit.addElement("provider");
-//				provider.addText(PersistenceProviderImpl.class.getName());
-//				for (Class<?> o : JpaObjectTools.scanMappedSuperclass(clazz)) {
-//					Element mapped_element = unit.addElement("class");
-//					mapped_element.addText(o.getName());
-//				}
-//				Element slice_unit_properties = unit.addElement("properties");
-//				for (Entry<String, String> entry : SlicePropertiesBuilder.getPropertiesDBCP(dataMappings.get(className))
-//						.entrySet()) {
-//					Element property = slice_unit_properties.addElement("property");
-//					property.addAttribute("name", entry.getKey());
-//					property.addAttribute("value", entry.getValue());
-//				}
-//				classes.add(clazz);
-//			}
-//			OutputFormat format = OutputFormat.createPrettyPrint();
-//			format.setEncoding("UTF-8");
-//			File dir = new File(webApplicationDirectory + "/WEB-INF/classes/" + META_INF);
-//			FileUtils.forceMkdir(dir);
-//			File file = new File(webApplicationDirectory + "/WEB-INF/classes/" + PERSISTENCE_XML_PATH);
-//			XMLWriter writer = new XMLWriter(new FileWriter(file), format);
-//			writer.write(document);
-//			writer.close();
-//			return classes;
-//		} catch (Exception e) {
-//			throw new Exception("registContainerEntity error.className:" + name, e);
-//		}
-//	}
-//
-//	/** 扫描受管实体,生成 x_perisitence.xml */
-//	@SuppressWarnings("unchecked")
-//	private Set<Class<? extends JpaObject>> persist1enceXml(String webApplicationDirectory, List<String> entities)
-//			throws Exception {
-//		String name = "";
-//		Set<Class<? extends JpaObject>> classes = new HashSet<>();
-//		try {
-//			List<String> names = new ArrayList<>();
-//			names.addAll((List<String>) Config.resource(Config.RESOUCE_CONTAINERENTITYNAMES));
-//			names = ListTools.includesExcludesWildcard(names, entities, null);
-//			Document document = DocumentHelper.createDocument();
-//			Element persistence = document.addElement("persistence", "http://java.sun.com/xml/ns/persistence");
-//			persistence.addAttribute(QName.get("schemaLocation", "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
-//					"http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd");
-//			persistence.addAttribute("version", "2.0");
-//			for (String className : names) {
-//				name = className;
-//				Class<? extends JpaObject> clazz = (Class<JpaObject>) Class.forName(className);
-//				Element unit = persistence.addElement("persistence-unit");
-//				unit.addAttribute("name", className);
-//				unit.addAttribute("transaction-type", "RESOURCE_LOCAL");
-//				Element provider = unit.addElement("provider");
-//				provider.addText(PersistenceProviderImpl.class.getName());
-//				for (Class<?> o : JpaObjectTools.scanMappedSuperclass(clazz)) {
-//					Element mapped_element = unit.addElement("class");
-//					mapped_element.addText(o.getName());
-//				}
-//				classes.add(clazz);
-//			}
-//			OutputFormat format = OutputFormat.createPrettyPrint();
-//			format.setEncoding("UTF-8");
-//			File dir = new File(webApplicationDirectory + "/WEB-INF/classes/" + META_INF);
-//			FileUtils.forceMkdir(dir);
-//			File file = new File(webApplicationDirectory + "/WEB-INF/classes/" + PERSISTENCE_XML_PATH);
-//			XMLWriter writer = new XMLWriter(new FileWriter(file), format);
-//			writer.write(document);
-//			writer.close();
-//			return classes;
-//		} catch (Exception e) {
-//			throw new Exception("registContainerEntity error.className:" + name, e);
-//		}
-//	}
-
 	@SuppressWarnings("unchecked")
 	public <T> Class<T> assignableFrom(Class<T> cls) throws Exception {
 		for (Class<?> clazz : this.entityManagerFactoryMap.keySet()) {
@@ -277,74 +156,4 @@ public abstract class SliceEntityManagerContainerFactory {
 		}
 	}
 
-//	private Properties properties(String className) throws Exception {
-//		if (Config.externalDataSources().enable()) {
-//			return properties_external(className);
-//		} else {
-//			return properties_internal(className);
-//		}
-//	}
-//
-//	private Properties properties_external(String className) throws Exception {
-//		Properties properties = new Properties();
-//		properties.put("openjpa.jdbc.DBDictionary", Config.externalDataSources().dictionary());
-//		properties.put("openjpa.BrokerFactory", "slice");
-//		/* 如果是DB2 添加 Schema,mysql 不需要Schema 如果用了Schema H2数据库就会报错说没有Schema */
-//		if (Config.externalDataSources().hasSchema()) {
-//			properties.put("openjpa.jdbc.Schema", JpaObject.default_schema);
-//		}
-//		properties.put("openjpa.slice.Lenient", "false");
-//		properties.put("openjpa.slice.DistributionPolicy", FactorDistributionPolicy.class.getName());
-//		properties.put("openjpa.slice.Names",
-//				StringUtils.join(Config.externalDataSources().findNamesOfContainerEntity(className), ","));
-//		// properties.put("openjpa.ConnectionDriverName",
-//		// DruidDataSource.class.getName());
-//		properties.put("openjpa.QueryCompilationCache", "false");
-//		properties.put("openjpa.IgnoreChanges", "true");
-//		properties.put("openjpa.QueryCache", "false");
-//		properties.put("openjpa.QueryCompilationCache", "false");
-//		properties.put("openjpa.LockManager", "none");
-//		properties.put("openjpa.jdbc.ResultSetType", "scroll-insensitive");
-//		/* 如果启用本地初始化会导致classLoad的问题 */
-//		properties.put("openjpa.DynamicEnhancementAgent", "false");
-//		properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=false)");
-//		/* 锁 */
-//		properties.put("openjpa.Log", "DefaultLevel=WARN");
-//		// properties.put("openjpa.ConnectionFactoryProperties", "PrettyPrint=true,
-//		// PrettyPrintLineLength=72");
-//		for (String name : Config.externalDataSources().findNamesOfContainerEntity(className)) {
-//			properties.put("openjpa.slice." + name + ".ConnectionFactoryName", Config.RESOUCE_JDBC_PREFIX + name);
-//		}
-//		return properties;
-//	}
-//
-//	private Properties properties_internal(String className) throws Exception {
-//		Properties properties = new Properties();
-//		properties.put("openjpa.jdbc.DBDictionary", SlicePropertiesBuilder.dictionary_h2);
-//		properties.put("openjpa.BrokerFactory", "slice");
-//		properties.put("openjpa.slice.Lenient", "false");
-//		properties.put("openjpa.slice.DistributionPolicy", FactorDistributionPolicy.class.getName());
-//		properties.put("openjpa.slice.Names",
-//				StringUtils.join(Config.nodes().dataServers().findNamesOfContainerEntity(className), ","));
-//		properties.put("openjpa.QueryCompilationCache", "false");
-//		properties.put("openjpa.IgnoreChanges", "true");
-//		properties.put("openjpa.QueryCache", "false");
-//		properties.put("openjpa.QueryCompilationCache", "false");
-//		properties.put("openjpa.LockManager", "none");
-//		properties.put("openjpa.jdbc.ResultSetType", "scroll-insensitive");
-//		/* 如果启用本地初始化会导致classLoad的问题 */
-//		properties.put("openjpa.DynamicEnhancementAgent", "false");
-//		properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=false)");
-//		// properties.put("openjpa.ConnectionDriverName",
-//		// "com.alibaba.druid.pool.DruidDataSource");
-//		/* 锁 */
-//		properties.put("openjpa.Log", "DefaultLevel=WARN");
-//		for (String name : Config.nodes().dataServers().findNamesOfContainerEntity(className)) {
-//			properties.put("openjpa.slice." + name + ".ConnectionFactoryName", Config.RESOUCE_JDBC_PREFIX + name);
-//			// properties.put("openjpa.slice." + name + ".ConnectionDriverName",
-//			// "com.alibaba.druid.pool.DruidDataSource");
-//		}
-//		return properties;
-//	}
-
 }

+ 0 - 260
o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/SlicePropertiesBuilder.java

@@ -25,7 +25,6 @@ public class SlicePropertiesBuilder {
 	public static String dictionary_dm = "com.x.base.core.openjpa.jdbc.sql.DMDictionary";
 	public static String dictionary_sqlserver = "sqlserver(schemaCase=preserve)";
 	public static String dictionary_gbase = "com.x.base.core.openjpa.jdbc.sql.GBaseDictionary";
-//	public static String dictionary_kingbase = "com.x.base.core.openjpa.jdbc.sql.KingbaseDictionary";
 	public static String dictionary_kingbase = "com.x.base.core.openjpa.jdbc.sql.KingbaseDictionary";
 	public static String dictionary_kingbase8 = "com.x.base.core.openjpa.jdbc.sql.Kingbase8Dictionary";
 
@@ -41,92 +40,6 @@ public class SlicePropertiesBuilder {
 	public static String validationQuery_kingbase = "select now()";
 	public static String validationQuery_kingbase8 = "select now()";
 
-//	public static Map<String, String> getPropertiesDBCP(List<DataMapping> list) throws Exception {
-//		try {
-//			if (list.isEmpty()) {
-//				throw new Exception("parameter data list is empty.");
-//			}
-//			Map<String, String> properties = new LinkedHashMap<String, String>();
-//			properties.put("openjpa.BrokerFactory", "slice");
-//			properties.put("openjpa.jdbc.DBDictionary", determineDBDictionary(list.get(0)));
-//			/**
-//			 * 如果是DB2 添加 Schema,mysql 不需要Schema 如果用了Schema H2数据库就会报错说没有Schema
-//			 */
-//
-//			String driver = getConnectionDriverName(list.get(0));
-//			if ((StringUtils.equals(driver, driver_db2)) || (StringUtils.equals(driver, driver_informix))
-//					|| (StringUtils.equals(driver, driver_gbase)) || (StringUtils.equals(driver, driver_dm))
-//					|| (StringUtils.equals(driver, driver_kingbase))
-//					|| (StringUtils.equals(driver, driver_kingbase8))) {
-//				properties.put("openjpa.jdbc.Schema", JpaObject.default_schema);
-//			}
-//			properties.put("openjpa.slice.Lenient", "false");
-//			// properties.put("openjpa.Multithreaded", "true");
-//			properties.put("openjpa.slice.DistributionPolicy", FactorDistributionPolicy.class.getName());
-//			properties.put("openjpa.slice.Names", getSliceNames(list));
-//			// properties.put("openjpa.ConnectionDriverName",
-//			// org.apache.commons.dbcp2.BasicDataSource.class.getName());
-//			// properties.put("openjpa.ConnectionDriverName",
-//			// DruidDataSource.class.getName());
-//			// properties.put("openjpa.ConnectionDriverName",
-//			// org.apache.commons.dbcp2.managed.BasicManagedDataSource.class.getCanonicalName());
-//			properties.put("openjpa.QueryCompilationCache", "false");
-//			properties.put("openjpa.IgnoreChanges", "true");
-//			properties.put("openjpa.QueryCache", "false");
-//			properties.put("openjpa.jdbc.ResultSetType", "scroll-insensitive");
-//			/* 如果启用本地初始化会导致classLoad的问题 */
-//			properties.put("openjpa.DynamicEnhancementAgent", "false");
-//			properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=false)");
-//			// properties.put("openjpa.jdbc.SchemaFactory",
-//			// "native(ForeignKeys=false)");
-//			// properties.put("openjpa.Compatibility",
-//			// "StrictIdentityValues=true");
-//			/* 事务管理 */
-//			// properties.put("openjpa.ManagedRuntime",
-//			// "jndi(TransactionManagerName=java:/TransactionManager)");
-//			/* 锁 */
-//			properties.put("openjpa.LockManager", "none");
-//			properties.put("openjpa.Log", "DefaultLevel=WARN");
-//			for (int i = 0; i < list.size(); i++) {
-//				String slice = getName(i);
-//				DataMapping dataMapping = list.get(i);
-//				properties.put("openjpa.slice." + slice + ".ConnectionProperties",
-//						getConnectionPropertiesDruid(dataMapping));
-//				// properties.put("openjpa.slice." + slice +
-//				// ".ConnectionDriverName",
-//				// org.apache.commons.dbcp.BasicDataSource.class.getCanonicalName());
-//				// properties.put("openjpa.slice." + slice + ".ConnectionDriverName",
-//				// DruidDataSource.class.getName());
-//				// properties.put("openjpa.slice." + slice +
-//				// ".ConnectionDriverName",
-//				// org.apache.commons.dbcp2.managed.BasicManagedDataSource.class.getCanonicalName());
-//				properties.put("openjpa.slice." + slice + ".Log", getLog(dataMapping));
-//				properties.put("openjpa.slice." + slice + ".IgnoreChanges", "true");
-//				properties.put("openjpa.slice." + slice + ".QueryCache", "false");
-//				properties.put("openjpa.slice." + slice + ".QueryCompilationCache", "false");
-//				properties.put("openjpa.slice." + slice + ".LockManager", "none");
-//				properties.put("openjpa.slice." + slice + ".ConnectionFactoryProperties",
-//						"PrettyPrint=true, PrettyPrintLineLength=72");
-//			}
-//			return properties;
-//		} catch (Exception e) {
-//			throw new Exception("can not convert connection to slice properties", e);
-//		}
-//	}
-
-//	// openjpa.slice.Names 属性值
-//	public static String getSliceNames(List<DataMapping> list) throws Exception {
-//		try {
-//			String[] arr = new String[list.size()];
-//			for (int j = 0; j < list.size(); j++) {
-//				arr[j] = getName(j);
-//			}
-//			return StringUtils.join(arr, ", ");
-//		} catch (Exception e) {
-//			throw new Exception("can not create slice names", e);
-//		}
-//	}
-
 	// 单个slice名称
 	public static String getName(Integer i) throws Exception {
 		try {
@@ -136,179 +49,6 @@ public class SlicePropertiesBuilder {
 		}
 	}
 
-//	/* 使用DBCP2连接池时产生的属性 */
-//	protected static String getConnectionPropertiesDBCP2(DataMapping dataMapping) throws Exception {
-//		try {
-//			String str = "maxTotal=4, maxIdle=2, minIdle=0, maxWaitMillis=30000, timeBetweenEvictionRunsMillis=300000, minEvictableIdleTimeMillis=300000, maxConnLifetimeMillis=1200000, Username="
-//					+ dataMapping.getUsername() + ", Password=" + dataMapping.getPassword();
-//			if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_db2)) {
-//				str += ",validationQuery=" + validationQuery_db2 + ", driverClassName=" + driver_db2 + ", url="
-//						+ dataMapping.getUrl();
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_oracle)) {
-//				String url = dataMapping.getUrl();
-//				str += ",validationQuery=" + validationQuery_oracle + ", driverClassName=" + driver_oracle + ", url="
-//						+ url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_mysql)) {
-//				String url = dataMapping.getUrl();
-//				// url += "?autoReconnect=true";
-//				str += ",validationQuery=" + validationQuery_mysql + ", driverClassName=" + driver_mysql + ", url="
-//						+ url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_postgresql)) {
-//				String url = dataMapping.getUrl();
-//				str += ",validationQuery=" + validationQuery_postgresql + ", driverClassName=" + driver_postgresql
-//						+ ", url=" + url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_informix)) {
-//				String url = dataMapping.getUrl();
-//				str += ",validationQuery=" + validationQuery_informix + ", driverClassName=" + driver_informix
-//						+ ", url=" + url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_gbase)) {
-//				String url = dataMapping.getUrl();
-//				str += ",validationQuery=" + validationQuery_gbase + ", driverClassName=" + driver_gbase + ", url="
-//						+ url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_h2)) {
-//				String url = dataMapping.getUrl();
-//				str += ",validationQuery=" + validationQuery_h2 + ", driverClassName=" + driver_h2 + ", url=" + url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_dm)) {
-//				String url = dataMapping.getUrl();
-//				str += ",validationQuery=" + validationQuery_oracle + ", driverClassName=" + driver_dm + ", url=" + url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_sqlserver)) {
-//				String url = dataMapping.getUrl();
-//				str += ",validationQuery=" + validationQuery_sqlserver + ", driverClassName=" + driver_sqlserver
-//						+ ", url=" + url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_kingbase)) {
-//				String url = dataMapping.getUrl();
-//				str += ",validationQuery=" + validationQuery_kingbase + ", driverClassName=" + driver_kingbase
-//						+ ", url=" + url;
-//			}
-//			return str;
-//		} catch (Exception e) {
-//			throw new Exception("can not create connection properites", e);
-//		}
-//	}
-
-//	/* 使用Druid连接池时产生的属性 */
-//	protected static String getConnectionPropertiesDruid(DataMapping dataMapping) throws Exception {
-//		try {
-//			String str = "filters=stat, poolPreparedStatements=true, maxActive=4, minIdle=0, testOnBorrow=true, Username="
-//					+ dataMapping.getUsername() + ", Password=" + dataMapping.getPassword();
-//			if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_db2)) {
-//				str += ", validationQuery=" + validationQuery_db2 + ", driverClassName=" + driver_db2 + ", url="
-//						+ dataMapping.getUrl();
-//			}
-//			if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_oracle)) {
-//				str += ", validationQuery=" + validationQuery_oracle + ", driverClassName=" + driver_oracle + ", url="
-//						+ dataMapping.getUrl();
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_mysql)) {
-//				String url = dataMapping.getUrl();
-//				// url += "?autoReconnect=true";
-//				str += ", validationQuery=" + validationQuery_mysql + ", driverClassName=" + driver_mysql + ", url="
-//						+ url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_postgresql)) {
-//				String url = dataMapping.getUrl();
-//				str += ", validationQuery=" + validationQuery_postgresql + ", driverClassName=" + driver_postgresql
-//						+ ", url=" + url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_informix)) {
-//				String url = dataMapping.getUrl();
-//				str += ", validationQuery=" + validationQuery_informix + ", driverClassName=" + driver_informix
-//						+ ", url=" + url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_gbase)) {
-//				String url = dataMapping.getUrl();
-//				str += ", validationQuery=" + validationQuery_gbase + ", driverClassName=" + driver_gbase + ", url="
-//						+ url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_h2)) {
-//				String url = dataMapping.getUrl();
-//				str += ", validationQuery=" + validationQuery_h2 + ", driverClassName=" + driver_h2 + ", url=" + url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_dm)) {
-//				String url = dataMapping.getUrl();
-//				str += ", validationQuery=" + validationQuery_dm + ", driverClassName=" + driver_dm + ", url=" + url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_sqlserver)) {
-//				String url = dataMapping.getUrl();
-//				str += ", validationQuery=" + validationQuery_sqlserver + ", driverClassName=" + driver_sqlserver
-//						+ ", url=" + url;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_kingbase)) {
-//				String url = dataMapping.getUrl();
-//				str += ", validationQuery=" + validationQuery_kingbase + ", driverClassName=" + driver_kingbase
-//						+ ", url=" + url;
-//			}
-//			return str;
-//		} catch (Exception e) {
-//			throw new Exception("can not create connection properites", e);
-//		}
-//	}
-
-//	/* 获取驱动名称 */
-//	public static String getConnectionDriverName(DataMapping dataMapping) throws Exception {
-//		try {
-//			if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_db2)) {
-//				return driver_db2;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_oracle)) {
-//				return driver_oracle;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_mysql)) {
-//				return driver_mysql;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_postgresql)) {
-//				return driver_postgresql;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_informix)) {
-//				return driver_informix;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_gbase)) {
-//				return driver_gbase;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_h2)) {
-//				return driver_h2;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_dm)) {
-//				return driver_dm;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_sqlserver)) {
-//				return driver_sqlserver;
-//			} else if (StringUtils.equals(determineDBDictionary(dataMapping), dictionary_kingbase)) {
-//				return driver_kingbase;
-//			}
-//			throw new Exception("database jdbc driver miss match:" + dataMapping.getUrl());
-//		} catch (Exception e) {
-//			throw new Exception("can not get driverClassName property", e);
-//		}
-//	}
-
-//	/** 获取日志属性 */
-//	protected static String getLog(DataMapping dataMapping) throws Exception {
-//		try {
-//			return "Tool=" + dataMapping.getToolLevel() + ", Enhance=" + dataMapping.getEnhanceLevel() + ", METADATA="
-//					+ dataMapping.getMetaDataLevel() + ", RUNTIME=" + dataMapping.getRuntimeLevel() + ", Query="
-//					+ dataMapping.getQueryLevel() + ", DataCache=" + dataMapping.getDataCacheLevel() + ", JDBC="
-//					+ dataMapping.getJdbcLevel() + ", SQL=" + dataMapping.getSqlLevel();
-//		} catch (Exception e) {
-//			throw new Exception("can not get log property.", e);
-//		}
-//	}
-//
-//	public static String determineDBDictionary(DataMapping dataMapping) throws Exception {
-//		try {
-//			if (StringUtils.containsIgnoreCase(dataMapping.getUrl(), "jdbc:db2:")) {
-//				return dictionary_db2;
-//			} else if (StringUtils.containsIgnoreCase(dataMapping.getUrl(), "jdbc:oracle:")) {
-//				return dictionary_oracle;
-//			} else if (StringUtils.containsIgnoreCase(dataMapping.getUrl(), "jdbc:mysql:")) {
-//				return dictionary_mysql;
-//			} else if (StringUtils.containsIgnoreCase(dataMapping.getUrl(), "jdbc:postgresql:")) {
-//				return dictionary_postgresql;
-//			} else if (StringUtils.containsIgnoreCase(dataMapping.getUrl(), "jdbc:informix-sqli:")) {
-//				return dictionary_informix;
-//			} else if (StringUtils.containsIgnoreCase(dataMapping.getUrl(), "jdbc:gbasedbt-sqli")) {
-//				return dictionary_gbase;
-//			} else if (StringUtils.containsIgnoreCase(dataMapping.getUrl(), "jdbc:h2:tcp:")) {
-//				return dictionary_h2;
-//			} else if (StringUtils.containsIgnoreCase(dataMapping.getUrl(), "jdbc:dm:")) {
-//				return dictionary_dm;
-//			} else if (StringUtils.containsIgnoreCase(dataMapping.getUrl(), "jdbc:sqlserver:")) {
-//				return dictionary_sqlserver;
-//			} else if (StringUtils.containsIgnoreCase(dataMapping.getUrl(), "jdbc:kingbase:")) {
-//				return dictionary_kingbase;
-//			} else if (StringUtils.containsIgnoreCase(dataMapping.getUrl(), "jdbc:kingbase8:")) {
-//				return dictionary_kingbase8;
-//			}
-//			throw new Exception("database jdbc driver miss match:" + dataMapping.getUrl());
-//		} catch (Exception e) {
-//			throw new Exception("can not get driverClassName property", e);
-//		}
-//	}
-
 	public static String driverClassNameOfUrl(String url) throws Exception {
 		if (StringUtils.containsIgnoreCase(url, "jdbc:db2:")) {
 			return driver_db2;

+ 18 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/entity/JpaObject.java

@@ -235,6 +235,24 @@ public abstract class JpaObject extends GsonPropertyObject implements Serializab
 	public static final String ORDERCOLUMNCOLUMN = "xorderColumn";
 
 	public static final String DISTINGUISHEDNAME = "distinguishedName";
+	
+	public static final String TYPE_STRING = "string";
+	public static final String TYPE_INTEGER = "integer";
+	public static final String TYPE_LONG = "long";
+	public static final String TYPE_DOUBLE = "double";
+	public static final String TYPE_BOOLEAN = "boolean";
+	public static final String TYPE_DATE = "date";
+	public static final String TYPE_TIME = "time";
+	public static final String TYPE_DATETIME = "dateTime";
+
+	public static final String TYPE_STRINGLIST = "stringList";
+	public static final String TYPE_INTEGERLIST = "integerList";
+	public static final String TYPE_LONGLIST = "longList";
+	public static final String TYPE_DOUBLELIST = "doubleList";
+	public static final String TYPE_BOOLEANLIST = "booleanList";
+
+	public static final String TYPE_STRINGLOB = "stringLob";
+	public static final String TYPE_STRINGMAP = "stringMap";
 
 	public static final String[] ID_DISTRIBUTEFACTOR = new String[] { id_FIELDNAME, distributeFactor_FIELDNAME };
 

+ 32 - 32
o2server/x_base_core_project/src/main/java/com/x/base/core/entity/dynamic/DynamicEntity.java

@@ -16,23 +16,23 @@ public class DynamicEntity extends GsonPropertyObject {
 	public static final String FIELDNAME_SUFFIX = "_FIELDNAME";
 	public static final String JAR_NAME = "x_query_dynamic_entity";
 
-	public static final String TYPE_string = "string";
-	public static final String TYPE_integer = "integer";
-	public static final String TYPE_long = "long";
-	public static final String TYPE_double = "double";
-	public static final String TYPE_boolean = "boolean";
-	public static final String TYPE_date = "date";
-	public static final String TYPE_time = "time";
-	public static final String TYPE_dateTime = "dateTime";
-
-	public static final String TYPE_stringList = "stringList";
-	public static final String TYPE_integerList = "integerList";
-	public static final String TYPE_longList = "longList";
-	public static final String TYPE_doubleList = "doubleList";
-	public static final String TYPE_booleanList = "booleanList";
-
-	public static final String TYPE_stringLob = "stringLob";
-	public static final String TYPE_stringMap = "stringMap";
+//	public static final String TYPE_string = "string";
+//	public static final String TYPE_integer = "integer";
+//	public static final String TYPE_long = "long";
+//	public static final String TYPE_double = "double";
+//	public static final String TYPE_boolean = "boolean";
+//	public static final String TYPE_date = "date";
+//	public static final String TYPE_time = "time";
+//	public static final String TYPE_dateTime = "dateTime";
+//
+//	public static final String TYPE_stringList = "stringList";
+//	public static final String TYPE_integerList = "integerList";
+//	public static final String TYPE_longList = "longList";
+//	public static final String TYPE_doubleList = "doubleList";
+//	public static final String TYPE_booleanList = "booleanList";
+//
+//	public static final String TYPE_stringLob = "stringLob";
+//	public static final String TYPE_stringMap = "stringMap";
 
 	private String name;
 
@@ -74,77 +74,77 @@ public class DynamicEntity extends GsonPropertyObject {
 	}
 
 	public List<Field> stringFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_string))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_STRING))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> integerFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_integer))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_INTEGER))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> longFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_long))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_LONG))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> doubleFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_double))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_DOUBLE))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> booleanFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_boolean))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_BOOLEAN))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> dateFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_date))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_DATE))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> timeFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_time))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_TIME))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> dateTimeFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_dateTime))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_DATETIME))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> stringListFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_stringList))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_STRINGLIST))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> integerListFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_integerList))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_INTEGERLIST))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> longListFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_longList))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_LONGLIST))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> doubleListFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_doubleList))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_DOUBLELIST))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> booleanListFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_booleanList))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_BOOLEANLIST))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> stringLobFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_stringLob))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_STRINGLOB))
 				.collect(Collectors.toList());
 	}
 
 	public List<Field> stringMapFields() {
-		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), TYPE_stringMap))
+		return this.fieldList.stream().filter(o -> StringUtils.equals(o.getType(), JpaObject.TYPE_STRINGMAP))
 				.collect(Collectors.toList());
 	}
 

+ 0 - 8
o2server/x_base_core_project/src/main/java/com/x/base/core/project/Context.java

@@ -269,14 +269,6 @@ public class Context extends AbstractContext {
 		}
 	}
 
-//	private void initDatas() throws Exception {
-//		if (ListTools.isNotEmpty(clazzInstance.dependency.containerEntities)) {
-//			logger.print("{} loading datas, entity size:{}.", this.clazz.getName(),
-//					clazzInstance.dependency.containerEntities.size());
-//			EntityManagerContainerFactory.init(path, AnnotationUtils.this.clazzInstance.dependency.containerEntities);
-//		}
-//	}
-
 	private void initDatas() throws Exception {
 		if (ArrayUtils.isNotEmpty(this.module.containerEntities())) {
 			logger.print("{} loading datas, entity size:{}.", this.clazz.getName(),

+ 18 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/build/CheckCore.java

@@ -40,6 +40,7 @@ public class CheckCore {
 				classes.add(Class.forName(info.getName()));
 			}
 			checkColumnName(classes);
+			checkColumnLength(classes);
 			checkLobIndex(classes);
 			checkListFieldContainerTableName(classes);
 			checkFieldDescribeOnStatic(classes);
@@ -219,6 +220,23 @@ public class CheckCore {
 		}
 	}
 
+	/* 检查是否有对String lob 之外的字段设定长度 */
+	@Test
+	public static void checkColumnLength(List<Class<?>> classes) throws Exception {
+		for (Class<?> cls : classes) {
+			List<Field> fields = FieldUtils.getFieldsListWithAnnotation(cls, Column.class);
+			for (Field field : fields) {
+				if ((!String.class.isAssignableFrom(field.getType())) && (!field.getType().isEnum())) {
+					Column column = field.getAnnotation(Column.class);
+					if (column.length() != 255) {
+						System.err.println(String.format("checkColumnLength error: class: %s, field: %s.",
+								cls.getName(), field.getName()));
+					}
+				}
+			}
+		}
+	}
+
 	public class Argument {
 		private String path;
 		private String project;

+ 30 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java

@@ -52,6 +52,7 @@ public class Config {
 	public static final String PATH_CONFIG_QIYEWEIXIN = "config/qiyeweixin.json";
 	public static final String PATH_CONFIG_LOGLEVEL = "config/logLevel.json";
 	public static final String PATH_CONFIG_BINDLOGO = "config/bindLogo.png";
+	public static final String PATH_CONFIG_SLICE = "config/slice.json";
 	public static final String PATH_COMMONS_INITIALSCRIPTTEXT = "commons/initialScriptText.js";
 	public static final String PATH_COMMONS_MOOTOOLSSCRIPTTEXT = "commons/mooToolsScriptText.js";
 
@@ -98,6 +99,8 @@ public class Config {
 
 	public static final String RESOUCE_JDBC_PREFIX = "jdbc/";
 
+	public static final String RESOUCE_AUDITLOGPRINTSTREAM = "auditLogPrintStream";
+
 	public static final String RESOUCE_CONFIG = "config";
 
 	private static final String DEFAULT_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCWcVZIS57VeOUzi8c01WKvwJK9uRe6hrGTUYmF6J/pI6/UvCbdBWCoErbzsBZOElOH8Sqal3vsNMVLjPYClfoDyYDaUlakP3ldfnXJzAFJVVubF53KadG+fwnh9ZMvxdh7VXVqRL3IQBDwGgzX4rmSK+qkUJjc3OkrNJPB7LLD8QIDAQAB";
@@ -301,6 +304,16 @@ public class Config {
 		return new File(base(), DIR_LOGS);
 	}
 
+	public static File dir_logs(Boolean force) throws Exception {
+		File dir = new File(base(), DIR_LOGS);
+		if (force) {
+			if ((!dir.exists()) || dir.isFile()) {
+				FileUtils.forceMkdir(dir);
+			}
+		}
+		return dir;
+	}
+
 	public static File dir_servers() throws Exception {
 		return new File(base(), DIR_SERVERS);
 	}
@@ -963,6 +976,23 @@ public class Config {
 		return instance().initialContext;
 	}
 
+	public Slice slice;
+
+	public static Slice slice() throws Exception {
+		if (null == instance().slice) {
+			synchronized (Config.class) {
+				if (null == instance().slice) {
+					Slice obj = BaseTools.readObject(PATH_CONFIG_SLICE, Slice.class);
+					if (null == obj) {
+						obj = Slice.defaultInstance();
+					}
+					instance().slice = obj;
+				}
+			}
+		}
+		return instance().slice;
+	}
+
 	public static Object resource(String name) throws Exception {
 		return initialContext().lookup(name);
 	}

+ 3 - 3
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/DataServers.java

@@ -80,13 +80,13 @@ public class DataServers extends ConcurrentSkipListMap<String, DataServer> {
 				String n = "s" + ("" + (1000 + idx)).substring(1);
 				if (StringUtils.equals(n, name)) {
 					String value = o.getLogLevel().toString();
-					return "Tool=" + value + ", Enhance=" + value + ", METADATA=" + value
-							+ ", RUNTIME=" + value + ", Query=" + value + ", DataCache=" + value + ", JDBC=" + value
+					return "DefaultLevel=WARN, Tool=" + value + ", Enhance=" + value + ", METADATA=" + value
+							+ ", Runtime=" + value + ", Query=" + value + ", DataCache=" + value + ", JDBC=" + value
 							+ ", SQL=" + value;
 				}
 			}
 		}
-		return "Tool=WARN, Enhance=WARN, METADATA=WARN, RUNTIME=WARN, Query=WARN, DataCache=WARN, JDBC=ERROR, SQL=WARN";
+		return "DefaultLevel=WARN, Tool=WARN, Enhance=WARN, METADATA=WARN, Runtime=WARN, Query=WARN, DataCache=WARN, JDBC=ERROR, SQL=WARN";
 	}
 
 }

+ 3 - 3
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ExternalDataSources.java

@@ -86,13 +86,13 @@ public class ExternalDataSources extends CopyOnWriteArrayList<ExternalDataSource
 				String n = "s" + ("" + (1000 + idx)).substring(1);
 				if (StringUtils.equals(n, name)) {
 					String value = o.getLogLevel().toString();
-					return "Tool=" + value + ", Enhance=" + value + ", METADATA=" + value
-							+ ", RUNTIME=" + value + ", Query=" + value + ", DataCache=" + value + ", JDBC=" + value
+					return "DefaultLevel=WARN, Tool=" + value + ", Enhance=" + value + ", METADATA=" + value
+							+ ", Runtime=" + value + ", Query=" + value + ", DataCache=" + value + ", JDBC=" + value
 							+ ", SQL=" + value;
 				}
 			}
 		}
-		return "Tool=WARN, Enhance=WARN, METADATA=WARN, RUNTIME=WARN, Query=WARN, DataCache=WARN, JDBC=ERROR, SQL=WARN";
+		return "DefaultLevel=WARN, Tool=WARN, Enhance=WARN, METADATA=WARN, Runtime=WARN, Query=WARN, DataCache=WARN, JDBC=ERROR, SQL=WARN";
 	}
 
 	public String dictionary() throws Exception {

+ 37 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/LogLevel.java

@@ -1,5 +1,6 @@
 package com.x.base.core.project.config;
 
+import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import com.x.base.core.project.annotation.FieldDescribe;
@@ -94,10 +95,17 @@ public class LogLevel extends ConfigObject {
 	@FieldDescribe("是否启用调试")
 	private String x_processplatform_assemble_bam = "";
 
+	@FieldDescribe("审计日志配置")
+	private Audit audit = Audit.defaultInstance();
+
 	public static LogLevel defaultInstance() {
 		return new LogLevel();
 	}
 
+	public Audit audit() {
+		return (null == this.audit) ? Audit.defaultInstance() : this.audit;
+	}
+
 	public String x_attendance_assemble_control() {
 		return this.get(this.x_attendance_assemble_control);
 	}
@@ -232,4 +240,33 @@ public class LogLevel extends ConfigObject {
 		}
 		return Logger.INFO;
 	}
+
+	public static class Audit extends ConfigObject {
+
+		public static final Integer DEFAULT_LOGSIZE = 31;
+		public static final Boolean DEFAULT_ENABLE = false;
+
+		public static Audit defaultInstance() {
+			return new Audit();
+		}
+
+		@FieldDescribe("是否启用审计日志")
+		private Boolean enable;
+
+		@FieldDescribe("审计日志保留天数")
+		private Integer logSize;
+
+		public Boolean enable() {
+			return BooleanUtils.isTrue(this.enable);
+		}
+
+		public Integer logSize() {
+			if ((null == logSize) || (logSize < 0)) {
+				return DEFAULT_LOGSIZE;
+			} else {
+				return this.logSize;
+			}
+		}
+
+	}
 }

+ 2 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Node.java

@@ -56,6 +56,8 @@ public class Node extends ConfigObject {
 	private ScheduleRestoreStorage restoreStorage;
 	@FieldDescribe("日志文件保留天数.")
 	private Integer logSize;
+	@FieldDescribe("审计日志文件保留天数.")
+	private Integer auditLogSize;
 	@FieldDescribe("是否启用节点代理")
 	private Boolean nodeAgentEnable;
 	@FieldDescribe("是否启用节点端口")

+ 44 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Slice.java

@@ -0,0 +1,44 @@
+package com.x.base.core.project.config;
+
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.container.FactorDistributionPolicy;
+import com.x.base.core.project.annotation.FieldDescribe;
+
+public class Slice extends ConfigObject {
+
+	private static final Boolean DEFAULT_ENABLE = false;
+	private static final String DEFAULT_DISTRIBUTIONPOLICY = FactorDistributionPolicy.class.getName();
+
+	public Slice() {
+		this.enable = DEFAULT_ENABLE;
+		this.distributionPolicy = DEFAULT_DISTRIBUTIONPOLICY;
+	}
+
+	public static Slice defaultInstance() {
+		return new Slice();
+	}
+
+	@FieldDescribe("是否启用切片特性")
+	private Boolean enable;
+	@FieldDescribe("分布策略")
+	private String distributionPolicy;
+
+	public Boolean getEnable() {
+		return BooleanUtils.isTrue(this.enable);
+	}
+
+	public void setEnable(Boolean enable) {
+		this.enable = enable;
+	}
+
+	public String getDistributionPolicy() {
+		return StringUtils.isEmpty(this.distributionPolicy) ? DEFAULT_DISTRIBUTIONPOLICY : this.distributionPolicy;
+	}
+
+	public void setDistributionPolicy(String distributionPolicy) {
+		this.distributionPolicy = distributionPolicy;
+	}
+
+}

+ 3 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/exception/ExceptionEntityFieldEmpty.java

@@ -7,6 +7,9 @@ public class ExceptionEntityFieldEmpty extends PromptException {
 	private static final long serialVersionUID = -5285504041469792111L;
 
 	public <T extends JpaObject> ExceptionEntityFieldEmpty(Class<T> cls, String field) {
+		
+		
+		
 		super("实体类: {} , 字段: {} 不能为空.", cls.getName(), field);
 	}
 

+ 20 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/ActionResult.java

@@ -32,6 +32,10 @@ public class ActionResult<T> implements Serializable {
 
 	protected Long size = -1L;
 
+	protected Long page = -1L;
+
+	protected Long pageSize = -1L;
+
 	protected Long count = 0L;
 
 	protected Long position = 0L;
@@ -163,4 +167,20 @@ public class ActionResult<T> implements Serializable {
 		return message;
 	}
 
+	public Long getPage() {
+		return page;
+	}
+
+	public void setPage(Long page) {
+		this.page = page;
+	}
+
+	public Long getPageSize() {
+		return pageSize;
+	}
+
+	public void setPageSize(Long pageSize) {
+		this.pageSize = pageSize;
+	}
+
 }

+ 30 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/EffectivePerson.java

@@ -31,10 +31,26 @@ public class EffectivePerson extends GsonPropertyObject {
 	private String distinguishedName = "";
 	private Boolean debugger = false;
 
+	private String remoteAddress = "";
+	private String uri = "";
+	private String userAgent = "";
+
 	private EffectivePerson() {
 
 	}
 
+	public void setUri(String uri) {
+		this.uri = Objects.toString(uri, "");
+	}
+
+	public void setUserAgent(String userAgent) {
+		this.userAgent = Objects.toString(userAgent, "");
+	}
+
+	public void setRemoteAddress(String remoteAddress) {
+		this.remoteAddress = Objects.toString(remoteAddress, "");
+	}
+
 	private void setDistinguishedName(String distinguishedName) {
 		this.distinguishedName = distinguishedName;
 		Matcher matcher = person_distinguishedName_pattern.matcher(distinguishedName);
@@ -130,7 +146,8 @@ public class EffectivePerson extends GsonPropertyObject {
 	}
 
 	public boolean isPerson(Collection<String> names) {
-		if (Objects.equals(TokenType.user, this.getTokenType())||Objects.equals(TokenType.manager, this.getTokenType())) {
+		if (Objects.equals(TokenType.user, this.getTokenType())
+				|| Objects.equals(TokenType.manager, this.getTokenType())) {
 			if (null != names) {
 				List<String> list = new ArrayList<>(names);
 				if (list.contains(this.distinguishedName)) {
@@ -186,4 +203,16 @@ public class EffectivePerson extends GsonPropertyObject {
 		this.debugger = debugger;
 	}
 
+	public String getRemoteAddress() {
+		return remoteAddress;
+	}
+
+	public String getUserAgent() {
+		return userAgent;
+	}
+
+	public String getUri() {
+		return uri;
+	}
+
 }

+ 23 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/HttpToken.java

@@ -19,6 +19,7 @@ import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.Crypto;
 import com.x.base.core.project.tools.DateTools;
+import com.x.base.core.project.tools.DomainTools;
 
 public class HttpToken {
 
@@ -35,7 +36,10 @@ public class HttpToken {
 
 	public EffectivePerson who(HttpServletRequest request, HttpServletResponse response, String key) throws Exception {
 		EffectivePerson effectivePerson = this.who(this.getToken(request), key);
-		/** 加入调试标记 */
+		effectivePerson.setRemoteAddress(this.remoteAddress(request));
+		effectivePerson.setUserAgent(this.userAgent(request));
+		effectivePerson.setUri(request.getRequestURI());
+		/* 加入调试标记 */
 		Object debugger = request.getHeader(HttpToken.X_Debugger);
 		if (null != debugger && BooleanUtils.toBoolean(Objects.toString(debugger))) {
 			effectivePerson.setDebugger(true);
@@ -160,7 +164,11 @@ public class HttpToken {
 			Pattern pattern = Pattern.compile(RegularExpression_IP);
 			Matcher matcher = pattern.matcher(str);
 			if (!matcher.find()) {
-				return "." + StringUtils.substringAfter(str, ".");
+				if (StringUtils.equalsIgnoreCase(DomainTools.getMainDomain(str), str)) {
+					return str;
+				} else {
+					return "." + StringUtils.substringAfter(str, ".");
+				}
 			}
 		}
 		return str;
@@ -169,4 +177,17 @@ public class HttpToken {
 	private void setAttribute(HttpServletRequest request, EffectivePerson effectivePerson) {
 		request.setAttribute(X_Person, effectivePerson);
 	}
+
+	private String remoteAddress(HttpServletRequest request) {
+		String value = Objects.toString(request.getHeader("X-Forwarded-For"), "");
+		if (StringUtils.isEmpty(value)) {
+			value = Objects.toString(request.getRemoteAddr(), "");
+		}
+		return value;
+	}
+
+	private String userAgent(HttpServletRequest request) {
+		return Objects.toString(request.getHeader("User-Agent"), "");
+	}
+
 }

+ 74 - 132
o2server/x_base_core_project/src/main/java/com/x/base/core/project/jaxrs/StandardJaxrsAction.java

@@ -12,6 +12,7 @@ import javax.persistence.Query;
 import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.commons.collections4.map.ListOrderedMap;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.cxf.jaxb.MarshallerAwareXMLWriter;
 
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
@@ -34,34 +35,20 @@ public abstract class StandardJaxrsAction extends AbstractJaxrsAction {
 	 * 
 	 * [2015年12月24日 李义添加了注释内容,代码没有改变]
 	 * 
-	 * @param cls
-	 *            实体类
-	 * @param wcls
-	 *            wrap类
-	 * @param id
-	 *            上一页最后一条的ID
-	 * @param count
-	 *            每页条目数:pagesize
-	 * @param sequenceField
-	 *            作分页序列的属性名
-	 * @param equals
-	 *            等于的条件集合
-	 * @param notEquals
-	 *            不等于(例外)的条件集合
-	 * @param likes
-	 *            模糊查询条件集合
-	 * @param ins
-	 *            IN查询条件集合
-	 * @param notIns
-	 *            NOT IN查询条件集合
-	 * @param members
-	 *            隶属于
-	 * @param notMembers
-	 *            非隶属于
-	 * @param andJoin
-	 *            条件的连接方式
-	 * @param order
-	 *            排序方式ASC|DESC
+	 * @param cls           实体类
+	 * @param wcls          wrap类
+	 * @param id            上一页最后一条的ID
+	 * @param count         每页条目数:pagesize
+	 * @param sequenceField 作分页序列的属性名
+	 * @param equals        等于的条件集合
+	 * @param notEquals     不等于(例外)的条件集合
+	 * @param likes         模糊查询条件集合
+	 * @param ins           IN查询条件集合
+	 * @param notIns        NOT IN查询条件集合
+	 * @param members       隶属于
+	 * @param notMembers    非隶属于
+	 * @param andJoin       条件的连接方式
+	 * @param order         排序方式ASC|DESC
 	 * @return
 	 * @throws Exception
 	 */
@@ -192,32 +179,19 @@ public abstract class StandardJaxrsAction extends AbstractJaxrsAction {
 	 * 
 	 * [2015年12月24日 李义添加了注释内容,代码没有改变]
 	 * 
-	 * @param copier
-	 *            对象转换类
-	 * @param id
-	 *            上一页最后一条的ID
-	 * @param count
-	 *            每页条目数:pagesize
-	 * @param sequenceField
-	 *            作分页序列的属性名
-	 * @param equals
-	 *            等于的条件集合
-	 * @param notEquals
-	 *            不等于(例外)的条件集合
-	 * @param likes
-	 *            模糊查询条件集合
-	 * @param ins
-	 *            IN查询条件集合
-	 * @param notIns
-	 *            NOT IN查询条件集合
-	 * @param members
-	 *            隶属于
-	 * @param notMembers
-	 *            非隶属于
-	 * @param andJoin
-	 *            条件的连接方式
-	 * @param order
-	 *            排序方式ASC|DESC
+	 * @param copier        对象转换类
+	 * @param id            上一页最后一条的ID
+	 * @param count         每页条目数:pagesize
+	 * @param sequenceField 作分页序列的属性名
+	 * @param equals        等于的条件集合
+	 * @param notEquals     不等于(例外)的条件集合
+	 * @param likes         模糊查询条件集合
+	 * @param ins           IN查询条件集合
+	 * @param notIns        NOT IN查询条件集合
+	 * @param members       隶属于
+	 * @param notMembers    非隶属于
+	 * @param andJoin       条件的连接方式
+	 * @param order         排序方式ASC|DESC
 	 * @return
 	 * @throws Exception
 	 */
@@ -351,34 +325,20 @@ public abstract class StandardJaxrsAction extends AbstractJaxrsAction {
 	 * 
 	 * [2015年12月24日 李义添加了注释内容,代码没有改变]
 	 * 
-	 * @param cls
-	 *            实体类
-	 * @param wcls
-	 *            wrap类
-	 * @param id
-	 *            上一页最后一条的ID
-	 * @param count
-	 *            每页条目数:pagesize
-	 * @param sequenceField
-	 *            作分页序列的属性名
-	 * @param equals
-	 *            等于的条件集合
-	 * @param notEquals
-	 *            不等于(例外)的条件集合
-	 * @param likes
-	 *            模糊查询条件集合
-	 * @param ins
-	 *            IN查询条件集合
-	 * @param notIns
-	 *            NOT IN查询条件集合
-	 * @param members
-	 *            隶属于
-	 * @param notMembers
-	 *            非隶属于
-	 * @param andJoin
-	 *            条件的连接方式
-	 * @param order
-	 *            排序方式ASC|DESC
+	 * @param cls           实体类
+	 * @param wcls          wrap类
+	 * @param id            上一页最后一条的ID
+	 * @param count         每页条目数:pagesize
+	 * @param sequenceField 作分页序列的属性名
+	 * @param equals        等于的条件集合
+	 * @param notEquals     不等于(例外)的条件集合
+	 * @param likes         模糊查询条件集合
+	 * @param ins           IN查询条件集合
+	 * @param notIns        NOT IN查询条件集合
+	 * @param members       隶属于
+	 * @param notMembers    非隶属于
+	 * @param andJoin       条件的连接方式
+	 * @param order         排序方式ASC|DESC
 	 * @return
 	 * @throws Exception
 	 */
@@ -510,30 +470,18 @@ public abstract class StandardJaxrsAction extends AbstractJaxrsAction {
 	 * 
 	 * [2015年12月24日 李义添加了注释内容,代码没有改变]
 	 * 
-	 * @param id
-	 *            上一页最后一条的ID
-	 * @param count
-	 *            每页条目数:pagesize
-	 * @param sequenceField
-	 *            作分页序列的属性名
-	 * @param equals
-	 *            等于的条件集合
-	 * @param notEquals
-	 *            不等于(例外)的条件集合
-	 * @param likes
-	 *            模糊查询条件集合
-	 * @param ins
-	 *            IN查询条件集合
-	 * @param notIns
-	 *            NOT IN查询条件集合
-	 * @param members
-	 *            隶属于
-	 * @param notMembers
-	 *            非隶属于
-	 * @param andJoin
-	 *            条件的连接方式
-	 * @param order
-	 *            排序方式ASC|DESC
+	 * @param id            上一页最后一条的ID
+	 * @param count         每页条目数:pagesize
+	 * @param sequenceField 作分页序列的属性名
+	 * @param equals        等于的条件集合
+	 * @param notEquals     不等于(例外)的条件集合
+	 * @param likes         模糊查询条件集合
+	 * @param ins           IN查询条件集合
+	 * @param notIns        NOT IN查询条件集合
+	 * @param members       隶属于
+	 * @param notMembers    非隶属于
+	 * @param andJoin       条件的连接方式
+	 * @param order         排序方式ASC|DESC
 	 * @return
 	 * @throws Exception
 	 */
@@ -816,32 +764,19 @@ public abstract class StandardJaxrsAction extends AbstractJaxrsAction {
 	 * 
 	 * [2015年12月24日 李义添加了注释内容,代码没有改变]
 	 * 
-	 * @param copier
-	 *            对象转换类
-	 * @param id
-	 *            上一页最后一条的ID
-	 * @param count
-	 *            每页条目数:pagesize
-	 * @param sequenceField
-	 *            作分页序列的属性名
-	 * @param equals
-	 *            等于的条件集合
-	 * @param notEquals
-	 *            不等于(例外)的条件集合
-	 * @param likes
-	 *            模糊查询条件集合
-	 * @param ins
-	 *            IN查询条件集合
-	 * @param notIns
-	 *            NOT IN查询条件集合
-	 * @param members
-	 *            隶属于
-	 * @param notMembers
-	 *            非隶属于
-	 * @param andJoin
-	 *            条件的连接方式
-	 * @param order
-	 *            排序方式ASC|DESC
+	 * @param copier        对象转换类
+	 * @param id            上一页最后一条的ID
+	 * @param count         每页条目数:pagesize
+	 * @param sequenceField 作分页序列的属性名
+	 * @param equals        等于的条件集合
+	 * @param notEquals     不等于(例外)的条件集合
+	 * @param likes         模糊查询条件集合
+	 * @param ins           IN查询条件集合
+	 * @param notIns        NOT IN查询条件集合
+	 * @param members       隶属于
+	 * @param notMembers    非隶属于
+	 * @param andJoin       条件的连接方式
+	 * @param order         排序方式ASC|DESC
 	 * @return
 	 * @throws Exception
 	 */
@@ -1071,4 +1006,11 @@ public abstract class StandardJaxrsAction extends AbstractJaxrsAction {
 		return result;
 	}
 
+	public void setPage(ActionResult<?> result, Integer page, Integer pageSize) {
+		result.setPage((page == null || page < 1) ? 1L : pageSize);
+		result.setPageSize((pageSize == null || pageSize < 1 || pageSize > EntityManagerContainer.MAX_PAGESIZE)
+				? EntityManagerContainer.DEFAULT_PAGESIZE.longValue()
+				: pageSize);
+	}
+
 }

+ 46 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/logger/Audit.java

@@ -0,0 +1,46 @@
+package com.x.base.core.project.logger;
+
+import java.io.PrintStream;
+import java.util.Date;
+import java.util.Objects;
+
+import org.slf4j.helpers.MessageFormatter;
+
+import com.x.base.core.project.config.Config;
+
+public class Audit {
+
+	private Date start;
+
+	private String className = "";
+
+	private String person = "";
+
+	private String remoteAddress = "";
+	private String uri = "";
+	private String userAgent = "";
+
+	protected Audit(String person, String remoteAddress, String uri, String userAgent, String className) {
+		this.start = new Date();
+		this.person = Objects.toString(person, "");
+		this.remoteAddress = Objects.toString(remoteAddress, "");
+		this.uri = Objects.toString(uri,"");
+		this.userAgent = Objects.toString(userAgent, "");
+		this.className = Objects.toString(className, "");
+	}
+
+	public void log() throws Exception {
+		this.log("");
+	}
+
+	public void log(String message, Object... os) throws Exception {
+		if (Config.logLevel().audit().enable()) {
+			Date end = new Date();
+			long elapsed = end.getTime() - start.getTime();
+			PrintStream stream = (PrintStream) Config.resource(Config.RESOUCE_AUDITLOGPRINTSTREAM);
+			stream.printf("%tF %tT,,,%d,,,%s,,,%s,,,%s,,,%s,,,%s,,,%s%n", end, end, elapsed, this.person,
+					this.remoteAddress, this.uri, this.userAgent, this.className,
+					MessageFormatter.arrayFormat(Objects.toString(message, ""), os).getMessage());
+		}
+	}
+}

+ 6 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/logger/Logger.java

@@ -8,7 +8,6 @@ import javax.servlet.http.HttpServletRequest;
 
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.SystemUtils;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.slf4j.helpers.MessageFormatter;
 
@@ -286,4 +285,10 @@ public class Logger {
 		return sb.toString();
 	}
 
+	public Audit audit(EffectivePerson effectivePerson) {
+		Audit o = new Audit(effectivePerson.getDistinguishedName(), effectivePerson.getRemoteAddress(),
+				effectivePerson.getUri(), effectivePerson.getUserAgent(), this.name);
+		return o;
+	}
+
 }

+ 12 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/message/MessageConnector.java

@@ -30,6 +30,14 @@ public class MessageConnector {
 	/* 有新的工作通过消息节点 */
 	public static final String TYPE_ACTIVITY_MESSAGE = "activity_message";
 
+	public static final String TYPE_WORK_CREATE = "work_create";
+
+	public static final String TYPE_WORK_DELETE = "work_delete";
+
+	public static final String TYPE_WORKCOMPLETED_CREATE = "workCompleted_create";
+
+	public static final String TYPE_WORKCOMPLETED_DELETE = "workCompleted_delete";
+
 	public static final String TYPE_TASK_CREATE = "task_create";
 
 	public static final String TYPE_TASK_DELETE = "task_delete";
@@ -55,6 +63,10 @@ public class MessageConnector {
 	public static final String TYPE_REVIEW_CREATE = "review_create";
 
 	public static final String TYPE_REVIEW_DELETE = "review_delete";
+	
+	public static final String TYPE_ATTACHMENT_CREATE = "attachment_create";
+
+	public static final String TYPE_ATTACHMENT_DELETE = "attachment_delete";
 
 	public static final String TYPE_MEETING_INVITE = "meeting_invite";
 

+ 5 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/queue/AbstractQueue.java

@@ -47,6 +47,10 @@ public abstract class AbstractQueue<T> {
 		logger.info(className + " new fixed thread pool with max thread count : " + count);
 	}
 
+	public boolean contains(T t) {
+		return this.queue.contains(t);
+	}
+
 	public void send(T t) throws Exception {
 		queue.put(t);
 	}
@@ -101,7 +105,7 @@ public abstract class AbstractQueue<T> {
 	public Boolean isEmpty() {
 		return this.queue.isEmpty();
 	}
-	
+
 	private static class StopSignal {
 	}
 }

+ 8 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/DateTools.java

@@ -105,6 +105,14 @@ public class DateTools {
 		return isDateTime(str) || isDate(str) || isTime(str);
 	}
 
+	public static Boolean isDateTimeOrDate(String str) {
+		return isDateTime(str) || isDate(str);
+	}
+
+	public static Boolean isDateTimeOrTime(String str) {
+		return isDateTime(str) || isTime(str);
+	}
+
 	public static Date parse(String str, String format) throws Exception {
 		return DateUtils.parseDate(str, format);
 	}

+ 927 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/DomainTools.java

@@ -0,0 +1,927 @@
+package com.x.base.core.project.tools;
+
+import java.util.HashMap;
+import java.util.NoSuchElementException;
+import java.util.StringTokenizer;
+
+public class DomainTools {
+
+	public static final String HTTP_PROTOCOL_HEAD = "http://";
+	public static final int HTTP_PROTOCOL_HEAD_LENGTH = HTTP_PROTOCOL_HEAD.length();
+	public static final String HTTPS_PROTOCOL_HEAD = "https://";
+	public static final int HTTPS_PROTOCOL_HEAD_LENGTH = HTTPS_PROTOCOL_HEAD.length();
+
+	public static final boolean isLetterOrDigit(char c) {
+		return ('0' <= c && c <= '9') || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
+	}
+
+	/**
+	 * 获取url的域名部分,注意:域名部分包括端口号。
+	 * 
+	 * @param url
+	 * @return
+	 */
+	public static final String getDomain(String url) {
+		// 0. 参数检验
+		if (url == null)
+			return null;
+
+		// 1. 剔出域名
+		String domain;
+
+		int l = 0;
+		if (url.startsWith(HTTP_PROTOCOL_HEAD)) {
+			l = HTTP_PROTOCOL_HEAD_LENGTH;
+		} else if (url.startsWith(HTTPS_PROTOCOL_HEAD)) {
+			l = HTTPS_PROTOCOL_HEAD_LENGTH;
+		}
+		int slash = url.indexOf('/', l);
+		if (slash > 0) {
+			domain = url.substring(l, slash);
+		} else {
+			if (l > 0) {
+				domain = url.substring(l);
+			} else {
+				domain = url;
+			}
+		}
+		return domain;
+	}
+
+	public static final String getDomainWithoutPort(String url) {
+		String domain = getDomain(url);
+		if (domain == null)
+			return null;
+		int idx = domain.indexOf(':');
+		if (idx > 0) {
+			return domain.substring(0, idx);
+		} else {
+			return domain;
+		}
+	}
+
+	public static final String getDomainWithProtocal(String url) {
+		// 0. 参数检验
+		if (url == null)
+			return null;
+
+		// 1. 剔出域名
+		String domain;
+
+		int l = 0;
+		if (url.startsWith(HTTP_PROTOCOL_HEAD)) {
+			l = HTTP_PROTOCOL_HEAD_LENGTH;
+		} else if (url.startsWith(HTTPS_PROTOCOL_HEAD)) {
+			l = HTTPS_PROTOCOL_HEAD_LENGTH;
+		}
+
+		int slash = url.indexOf('/', l);
+		if (slash > 0) {
+			domain = url.substring(0, slash);
+		} else {
+			domain = url;
+		}
+		return domain;
+	}
+
+	public static final String regulateUrl(String url) {
+		if (url == null)
+			return null;
+
+		boolean needProt = false;
+		boolean needTail = false;
+		if (!url.startsWith("http://") && !url.startsWith("https://")) {
+			needProt = true;
+		}
+		if (isDomain(url) && !url.endsWith("/")) {
+			needTail = true;
+		}
+		if (needProt) {
+			url = "http://" + url;
+		}
+		if (needTail) {
+			url += '/';
+		}
+
+		return url;
+	}
+
+	/**
+	 * 判定一个字符串是否为URL,并返回归一化后的URL字符串。 归一化规则:1.以http://打头; 2.端口号为80时,要省略; 3.
+	 * 纯域名时,要加"/"作结尾
+	 * 
+	 * @param query 检查字符串
+	 * @return 当结果为URL时,返回归一化的结果,否则返回null。
+	 */
+	private static final String[] traditionalUrlPostfix = { ".com", ".biz", ".pro", ".aero", ".coop", ".museum",
+			".mobi", ".edu", ".gov", ".info", ".mil", ".name", ".net", ".org", ".jobs", ".travel", ".mil", ".arpa",
+			".int", ".cat", ".asia", ".tel" };
+	private static final String[] internationalTraditionalUrlPostfix = { ".com", ".net", ".edu", };
+	private static final String[] regionalUrlPostfix = {
+
+			".ac", ".ad", ".ae", ".af", ".ag", ".ai", ".al", ".am", ".an", ".ao", ".aq", ".ar", ".as", ".at", ".au",
+			".aw", ".az", ".ba", ".bb", ".bd", ".be", ".bf", ".bg", ".bh", ".bi", ".bj", ".bm", ".bn", ".bo", ".br",
+			".bs", ".bt", ".bv", ".bw", ".by", ".bz", ".ca", ".cc", ".cd", ".cf", ".cg", ".ch", ".ci", ".ck", ".cl",
+			".cm", ".cn", ".co", ".cr", ".cs", ".cu", ".cv", ".cx", ".cy", ".cz", ".de", ".dj", ".dk", ".dm", ".do",
+			".dz", ".ec", ".eu", ".fi", ".fj", ".fk", ".fm", ".fo", ".fr", ".fx", ".ga", ".gb", ".gd", ".ge", ".gf",
+			".gh", ".gi", ".gl", ".gp", ".gq", ".gf", ".gm", ".gn", ".gr", ".gs", ".gt", ".gu", ".gw", ".gy", ".hk",
+			".hm", ".hn", ".hr", ".ht", ".hu", ".id", ".ie", ".il", ".in", ".io", ".iq", ".ir", ".is", ".it", ".jm",
+			".jo", ".jp", ".ke", ".kg", ".kh", ".ki", ".km", ".kn", ".kp", ".kr", ".kw", ".ky", ".kz", ".la", ".lb",
+			".lc", ".li", ".lk", ".lr", ".ls", ".lt", ".lu", ".lv", ".ly", ".ma", ".mc", ".md", ".mg", ".mh", ".mk",
+			".ml", ".mm", ".mn", ".mo", ".mp", ".mq", ".mr", ".ms", ".mt", ".mu", ".mv", ".mw", ".mx", ".my", ".mz",
+			".na", ".nc", ".ne", ".nf", ".ng", ".ni", ".nl", ".no", ".np", ".nr", ".nt", ".nu", ".nz", ".om", ".pa",
+			".pe", ".pf", ".pg", ".ph", ".pk", ".pl", ".pm", ".pn", ".pt", ".pr", ".pw", ".py", ".qa", ".re", ".ro",
+			".ru", ".rw", ".sa", ".sb", ".sc", ".sd", ".se", ".sg", ".sh", ".si", ".sj", ".sk", ".sl", ".sm", ".sn",
+			".so", ".sr", ".st", ".su", ".sv", ".sy", ".sz", ".tc", ".td", ".tf", ".tg", ".th", ".tj", ".tk", ".tm",
+			".tn", ".to", ".tp", ".tr", ".tt", ".tv", ".tw", ".tz", ".ua", ".ug", ".uk", ".um", ".us", ".uy", ".uz",
+			".va", ".vc", ".ve", ".vg", ".vi", ".vn", ".vu", ".wf", ".ws", ".ye", ".yt", ".yu", ".za", ".zm", ".zr",
+			".zw", ".ad", ".ae", ".af", ".ag", ".ai", ".al", ".am", ".an", ".ao", ".aq", ".ar", ".as", ".at", ".au",
+			".aw", ".az", ".ba", ".bb", ".bd", ".be", ".bf", ".bg", ".bh", ".bi", ".bj", ".bm", ".bn", ".bo", ".br",
+			".bs", ".bt", ".bv", ".bw", ".by", ".bz", ".ca", ".cc", ".cf", ".cg", ".ch", ".ci", ".ck", ".cl", ".cm",
+			".cn", ".co", ".cq", ".cr", ".cu", ".cv", ".cx", ".cy", ".cz", ".de", ".dj", ".dk", ".dm", ".do", ".dz",
+			".ec", ".ee", ".eg", ".eh", ".es", ".et", ".ev", ".fi", ".fj", ".fk", ".fm", ".fo", ".fr", ".ga", ".gb",
+			".gd", ".ge", ".gf", ".gh", ".gi", ".gl", ".gm", ".gn", ".gp", ".gr", ".gt", ".gu", ".gw", ".gy", ".hk",
+			".hm", ".hn", ".hr", ".ht", ".hu", ".id", ".ie", ".il", ".in", ".io", ".iq", ".ir", ".is", ".it", ".jm",
+			".jo", ".jp", ".ke", ".kg", ".kh", ".ki", ".km", ".kn", ".kp", ".kr", ".kw", ".ky", ".kz", ".la", ".lb",
+			".lc", ".li", ".lk", ".lr", ".ls", ".lt", ".lu", ".lv", ".ly", ".ma", ".mc", ".md", ".me", ".mg", ".mh",
+			".ml", ".mm", ".mn", ".mo", ".mp", ".mq", ".mr", ".ms", ".mt", ".mv", ".mw", ".mx", ".my", ".mz", ".na",
+			".nc", ".ne", ".nf", ".ng", ".ni", ".nl", ".no", ".np", ".nr", ".nt", ".nu", ".nz", ".om", ".pa", ".pe",
+			".pf", ".pg", ".ph", ".pk", ".pl", ".pm", ".pn", ".pr", ".pt", ".pw", ".py", ".qa", ".re", ".ro", ".rs",
+			".ru", ".rw", ".sa", ".sb", ".sc", ".sd", ".se", ".sg", ".sh", ".si", ".sj", ".sk", ".sl", ".sm", ".sn",
+			".so", ".sr", ".st", ".su", ".sy", ".sz", ".tc", ".td", ".tf", ".tg", ".th", ".tj", ".tk", ".tl", ".tm",
+			".tn", ".to", ".tp", ".tr", ".tt", ".tv", ".tw", ".tz", ".ua", ".ug", ".uk", ".us", ".uy", ".va", ".vc",
+			".ve", ".vg", ".vn", ".vu", ".wf", ".ws", ".ye", ".yu", ".za", ".zm", ".zr", ".zw"
+
+	};
+	// A C-科研机构; COM-工、商、金融等专业; EDU-教育机构; GOV-政府部门; NET-互
+	// 联网络、接入网络的信息中心和运行中心; ORG
+	private static final String[] fixupPostfix = new String[] { ".cn", ".bj", ".id", ".co", ".il", ".co", ".jp", ".co",
+			".kr", ".co", ".nr", ".co", ".uk", ".co", ".uz", ".co", ".cn", ".ac", ".cn", ".com", ".cn", ".edu", ".cn",
+			".gov", ".cn", ".net", ".cn", ".org", ".cn", ".sh", ".cn", ".tj", ".cn", ".cq", ".cn", ".he", ".cn", ".sx",
+			".cn", ".nm", ".cn", ".ln", ".cn", ".jl", ".cn", ".hl", ".cn", ".js", ".cn", ".zj", ".cn", ".ah", ".cn",
+			".fj", ".cn", ".jx", ".cn", ".sd", ".cn", ".ha", ".cn", ".hb", ".cn", ".hn", ".cn", ".gd", ".cn", ".gx",
+			".cn", ".hi", ".cn", ".sc", ".cn", ".gz", ".cn", ".yn", ".cn", ".xz", ".cn", ".sn", ".cn", ".gs", ".cn",
+			".qh", ".cn", ".nx", ".cn", ".xj", ".cn", ".tw", ".cn", ".hk", ".cn", ".mo", ".ru", ".net", };
+	public static HashMap<String, HashMap<String, Object>> urlPostfixMap = new HashMap<String, HashMap<String, Object>>();
+	public static HashMap<String, String> regionalUrlPostfixMap = new HashMap<String, String>();
+	public static HashMap<String, String> traditionalUrlPostfixMap = new HashMap<String, String>();
+	// 所有顶级域名列表(不带前边的.)
+	public static HashMap<String, HashMap<String, Object>> urlPostfixMap_noDot = new HashMap<String, HashMap<String, Object>>();
+	// 最初定义的几组业务相关的顶级域名列表(不带前边的.)
+	public static HashMap<String, String> regionalUrlPostfixMap_noDot = new HashMap<String, String>();
+	// 后来加入的国家级顶级域名列表(不带前边的.)
+	public static HashMap<String, String> traditionalUrlPostfixMap_noDot = new HashMap<String, String>();
+
+	static {
+		for (int i = 0; i < traditionalUrlPostfix.length; i++) {
+			if (traditionalUrlPostfix[i] != null) {
+				String temp = traditionalUrlPostfix[i].trim();
+				traditionalUrlPostfixMap.put(temp, null);
+				urlPostfixMap.put(temp, null);
+				if (temp.length() > 0) {
+					temp = temp.substring(1);
+					traditionalUrlPostfixMap_noDot.put(temp, null);
+					urlPostfixMap_noDot.put(temp, null);
+				}
+			}
+		}
+		for (int i = 0; i < regionalUrlPostfix.length; i++) {
+			if (regionalUrlPostfix[i] != null) {
+				String temp = regionalUrlPostfix[i].trim();
+				regionalUrlPostfixMap.put(temp, null);
+				urlPostfixMap.put(temp, null);
+				HashMap<String, Object> obj = (HashMap<String, Object>) urlPostfixMap.get(temp);
+				for (String international : internationalTraditionalUrlPostfix) {
+					if (obj == null) {
+						obj = new HashMap<String, Object>();
+						urlPostfixMap.put(temp, obj);
+					}
+					obj.put(international, null);
+				}
+				if (temp.length() > 0) {
+					temp = temp.substring(1);
+					regionalUrlPostfixMap_noDot.put(temp.substring(1), null);
+					urlPostfixMap_noDot.put(temp, null);
+				}
+			}
+		}
+		for (int i = 0; i < fixupPostfix.length && i + 1 < fixupPostfix.length; i += 2) {
+			String key = fixupPostfix[i];
+			String val = fixupPostfix[i + 1];
+			{
+				HashMap<String, Object> obj = (HashMap<String, Object>) urlPostfixMap.get(key);
+				if (obj == null) {
+					obj = new HashMap<String, Object>();
+					urlPostfixMap.put(key, obj);
+				}
+				obj.put(val, null);
+			}
+			if (key.length() > 0 && val.length() > 0) {
+				key = key.substring(1);
+				val = val.substring(1);
+				HashMap<String, Object> obj = (HashMap<String, Object>) urlPostfixMap_noDot.get(key);
+				if (obj == null) {
+					obj = new HashMap<String, Object>();
+					urlPostfixMap_noDot.put(key, obj);
+				}
+				obj.put(val, null);
+			}
+		}
+	}
+
+	public static final String URL_PATH_SEPERATOR = "/";
+	public static final String URL_HTTP_HEAD = "http://";
+	public static final String URL_DOMAIN_SEPERATOR = ".";
+
+	/**
+	 * 判定一个字符串是否为URL,并返回归一化后的URL字符串。 归一化规则:1.以http://打头; 2.端口号为80时,要省略; 3.
+	 * 纯域名时,要加"/"作结尾
+	 * 
+	 * @param query 检查字符串
+	 * @return 当结果为URL时,返回归一化的结果,否则返回null。
+	 */
+	public static final String getLookupUrl(String query) {
+		String temp = query.trim();
+		String domain;
+		String filePath = URL_PATH_SEPERATOR;
+
+		String protocalHead = HTTP_PROTOCOL_HEAD;
+
+		String tempLower = temp.toLowerCase();
+		if (tempLower.startsWith(HTTP_PROTOCOL_HEAD)) {
+			protocalHead = HTTP_PROTOCOL_HEAD;
+			temp = temp.substring(HTTP_PROTOCOL_HEAD_LENGTH);
+		} else if (tempLower.startsWith(HTTPS_PROTOCOL_HEAD)) {
+			protocalHead = HTTPS_PROTOCOL_HEAD;
+			temp = temp.substring(HTTPS_PROTOCOL_HEAD_LENGTH);
+		}
+		int idxSlash = temp.indexOf('/');
+		int idxColon = temp.indexOf(':');
+
+		int port = 80;
+		if (idxSlash < 0) { // 纯域名
+			if (idxColon > 0) {
+				try {
+					port = Integer.parseInt(temp.substring(idxColon + 1));
+				} catch (NumberFormatException e) {
+					return null;
+				}
+				domain = temp.substring(0, idxColon);
+			} else
+				domain = temp;
+			filePath = URL_PATH_SEPERATOR;
+		} else { // 域名+目录
+			if (idxColon > 0 && idxColon < idxSlash) {
+				try {
+					port = Integer.parseInt(temp.substring(idxColon + 1, idxSlash));
+				} catch (NumberFormatException e) {
+					return null;
+				}
+				domain = temp.substring(0, idxColon);
+			} else {
+				domain = temp.substring(0, idxSlash);
+			}
+			filePath = temp.substring(idxSlash);
+		}
+		// 判断 port 是否在合法范围内
+		if (port <= 0 || port > 65535) {
+			return null;
+		}
+		// 判断域名部分是否合法
+
+		domain = validateDomain(domain);
+		// 确定为URL
+		if (domain != null) {
+
+			String result;
+			if (port == 80) {
+				result = protocalHead + domain + filePath;
+			} else {
+				result = protocalHead + domain + ':' + port + filePath;
+			}
+			return result;
+		}
+		return null;
+	}
+
+	public static final boolean isIP(String domain) {
+		if (domain == null)
+			return false;
+
+		boolean isValid = false;
+		// 判断一:xxx.xxx.xxx.xxx形式的IP地址
+		try {
+			StringTokenizer token = new StringTokenizer(domain, URL_DOMAIN_SEPERATOR);
+			int i;
+			for (i = 0; i < 4; i++) {
+				int tempInt = Integer.parseInt(token.nextToken());
+				if (tempInt < 0 || tempInt > 255)
+					break;
+			}
+			if (i == 4) {
+				if (!token.hasMoreTokens()) {
+					// 验证成功
+					isValid = true;
+				}
+			}
+		} catch (NoSuchElementException e) {
+		} catch (NumberFormatException e) {
+		}
+		return isValid;
+
+	}
+
+	/**
+	 * 检验域名部分是否符合RFC规范
+	 * 
+	 * @param domain
+	 * @return 如果返回null,说明参数不是域名,否则就返回domain自身
+	 * 
+	 */
+	public static final String validateDomain(String domain) {
+		if (domain == null)
+			return null;
+
+		// 判断零:不含非法字符
+		for (int i = 0; i < domain.length(); i++) {
+
+			char c = domain.charAt(i);
+
+			if (c > 0x7f) {
+				return null;
+			} else if (!isLetterOrDigit(c)) {
+				// 域名不能包含符号, 但可以包含'.'或'-'或'_',且不能以这三个符号打头或结尾
+				if ((c == '.' && i != 0 && i != domain.length() - 1)
+						|| ((c == '-' || c == '_') && i != 0 && i != domain.length() - 1)) {
+					continue;
+				} else {
+					return null;
+				}
+			}
+		}
+
+		boolean isValid = false;
+		do {
+			if (isIP(domain)) {
+				isValid = true;
+				break;
+			}
+			// 否则判断是否满足其他的形式
+			{
+				isValid = true;
+				// 判断二.1:xx.xxxx.com形式的域名(判断字符组成的合法性)
+				StringTokenizer token = new StringTokenizer(domain, URL_DOMAIN_SEPERATOR);
+				while (token.hasMoreTokens()) {
+					String tok = token.nextToken();
+					if (tok.length() == 0 || tok.startsWith(".") || tok.endsWith(".") || tok.startsWith("-")
+							|| tok.endsWith("-") || tok.startsWith("_") || tok.endsWith("_")) {
+						isValid = false;
+						break;
+					}
+				}
+				if (isValid && domain.indexOf("..") >= 0)
+					isValid = false;
+				// 不满足域名形式,跳出
+				if (!isValid)
+					break; // do .. while(false);
+			}
+			// 判断二:xx.xxxx.com形式的域名(根据后缀判断)
+			{
+				isValid = false;
+				domain = domain.toLowerCase();
+				int p = domain.lastIndexOf('.');
+				try {
+					String postfix = domain.substring(p);
+					if (urlPostfixMap.containsKey(postfix)) {
+						isValid = true;
+						// 验证成功,跳出不再执行其他的模板判断
+						break; // do .. while(false);
+					}
+				} catch (IndexOutOfBoundsException e) {
+				}
+			}
+		} while (false);
+
+		// 确定为URL
+		if (isValid) {
+			return domain;
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * 判断URL是不是域名形式的URL
+	 * 
+	 * @param url url必须是符合本类中的URL归一化函数规则的URL
+	 * @return
+	 */
+	public static final boolean isDomain(String url) {
+		int t = 0;
+		if (url.startsWith(HTTP_PROTOCOL_HEAD)) {
+			t = HTTP_PROTOCOL_HEAD_LENGTH;
+		} else if (url.startsWith(HTTPS_PROTOCOL_HEAD)) {
+			t = HTTPS_PROTOCOL_HEAD_LENGTH;
+		}
+		t = url.indexOf('/', t);
+		if (t < 0 || t == url.length() - 1)
+			return true;
+		return false;
+	}
+
+	/**
+	 * 找出url的一级域名 一级域名的格式: [a-z0-9]([a-z0-9\-]*[a-z0-9])?\.{顶级域名} 或
+	 * [a-z0-9]([a-z0-9\-]*[a-z0-9])?\.{域名商提供的域名}.{顶级域名}
+	 * 
+	 * @param url url必须是符合本类中的URL归一化函数规则的URL
+	 * @return 如果参数不是一个url返回null, 否则返回对应的顶级域名串,如:
+	 *         "http://www.sogou.com.cn/"返回值是"sogou.com.cn"
+	 */
+	@SuppressWarnings("rawtypes")
+	public static final String getMainDomain(String url) {
+
+		String domain = getDomainWithoutPort(url);
+
+		if (domain == null)
+			return null;
+
+		HashMap map = urlPostfixMap;
+		int lastDot = domain.length();
+		int last = lastDot;
+		do {
+			last = domain.lastIndexOf('.', lastDot - 1);
+
+			// 前边已经没有'.'了
+			if (last < 0)
+				break;
+			// 已经没有第n+1级域名了
+			if (map == null)
+				break;
+
+			String topDomain = domain.substring(last, lastDot);
+
+			if (!map.containsKey(topDomain))
+				break;
+			else
+				map = (HashMap) map.get(topDomain);
+			lastDot = last;
+		} while (true);
+		if (lastDot == domain.length()) {
+			return null; // 没有顶级域名
+		} else {
+			if (last < 0) { // xxx.com.cn
+				return domain;
+			} else { // xxx.domain.com.cn
+				return domain.substring(last + 1);
+			}
+		}
+	}
+
+	/**
+	 * 检查url是否为不以www开头的一级域名 一级域名的格式: [a-z0-9]([a-z0-9\-]*[a-z0-9])?\.{任意顶级域名} 或
+	 * [a-z0-9]([a-z0-9\-]*[a-z0-9])?\.{传统顶级域名}.{地区顶级域名}
+	 * 
+	 * @param url url必须是符合本类中的URL归一化函数规则的URL
+	 * @return
+	 */
+	public static final boolean isNonWWW(String url) {
+
+		String domain = getDomainWithoutPort(url);
+
+		if (domain == null)
+			return false;
+
+		String mainDomain = getMainDomain(domain);
+		return (mainDomain != null && mainDomain.equals(domain));
+
+	}
+
+	/**
+	 * 从URL串中获取QueryString串
+	 * 
+	 * @param url 完整的URL串,包括协议头、域名部分等
+	 * @return null 如果url参数为null,或url中不含'?'字符
+	 *         否则根据RFC标准,返回第一个'?'以后,第一个'#'中间的部分作为QueryString串
+	 */
+	public static final String getQueryString(String url) {
+		if (url == null)
+			return null;
+		int index = url.indexOf('?');
+		if (index < 0) {
+			return null;
+		}
+		index++;
+		int hash = url.indexOf('#', index);
+		if (hash < 0) {
+			return url.substring(index);
+		} else {
+			return url.substring(index, hash);
+		}
+	}
+
+	private static final boolean checkHexChar(byte[] str, int i) {
+		if (str == null || i >= str.length)
+			return false;
+		byte ch1 = str[i];
+		return (ch1 >= '0' && ch1 <= '9') || (ch1 >= 'a' && ch1 <= 'f') || (ch1 >= 'A' && ch1 <= 'F');
+	}
+
+	private static final boolean checkMultiHexChar(byte[] str, int idx, int n) {
+		for (int i = 0; i < n; i++) {
+			if (!checkHexChar(str, idx + i))
+				return false;
+		}
+		return true;
+	}
+
+	private static final boolean tryPut(byte[] buff, int idx, byte b) {
+		if (buff == null || idx < 0 || idx >= buff.length)
+			return false;
+		buff[idx] = b;
+		return true;
+	}
+//	private static final boolean tryMultiPut(byte[]buff, int idx, byte[] b){
+//		if( buff == null || b == null || idx < 0 || idx + b.length > buff.length ) return false;
+//		System.arraycopy(b, 0, buff, idx, b.length);
+//		return true;
+//	}
+
+	/**
+	 * 通用url解码,将%xx等编码的字符串直接转成对应的byte,不考虑具体编码
+	 * 
+	 * @see genericUrlDecode(String url, byte[]buff, int flag)
+	 * @param url  被解码的url.
+	 * @param buff 用于存放解码后数据的缓存
+	 * @return >=0 解析成功,buff中数据的长度 -1 参数有问题,url为空 -2 参数有问题,buff空间不足 -3 未知问题 -4
+	 *         确认编码为GBK
+	 */
+	public static final int genericUrlDecode(String url, byte[] buff) {
+		return genericUrlDecode(url, buff, 0);
+	}
+
+	/**
+	 * 通用url解码,将%xx直接转成对应的byte,不考虑具体编码 支持%FF,%uFFFF,四种编码方法。注意,这里指的编码同"GBK"不同,不要混淆
+	 * 
+	 * @param url  被解码的url.
+	 * @param buff 用于存放解码后数据的缓存
+	 * @param flag 格式扩展参数, 0表示仅针对url编码处理 第一位为1,表示需要处理apache格式的编码
+	 * @return >=0 解析成功,buff中数据的长度 -1 参数有问题,url为空 -2 参数有问题,buff空间不足 -3 未知问题 -4
+	 *         确认编码为GBK
+	 */
+	public static final int genericUrlDecode(String url1, byte[] buff, int flag) {
+		if (url1 == null || buff == null) {
+			return -1;
+		}
+		byte[] data = url1.getBytes();
+		byte[] bb = buff;
+		int idx = 0;
+		for (int i = 0; i < data.length; i++) { // 已知的做了编码的字符串必定超过3个字符
+			if (data[i] == '%') { // 处理%FF和%uFFFF的情况
+				if (checkMultiHexChar(data, i + 1, 2)) { // 处理%ff格式
+					try {
+						int a = Integer.parseInt(new String(data, i + 1, 2), 16);
+						if (!tryPut(bb, idx, (byte) a))
+							return -2;
+						idx++;
+						i += 2;
+					} catch (Exception e) {
+						return -3;
+					}
+				} else if (i + 1 < data.length && data[i + 1] == 'u') { // 处理%uFFFF格式
+					if (checkMultiHexChar(data, i + 2, 4)) {
+						// 可以确认为gbk编码
+						return -4;
+					}
+				}
+			} else if ((flag & 1) == 1) {
+				// 为apache格式解析预留的扩展
+				if (data[i] == '\\' && i + 1 < data.length && data[i + 1] == 'x') { // 处理\xFF格式
+					if (checkMultiHexChar(data, i + 2, 2)) {
+						try {
+							int a = Integer.parseInt(new String(data, i + 2, 2), 16);
+							if (!tryPut(bb, idx, (byte) a))
+								return -2;
+							idx++;
+							i += 3;
+						} catch (Exception e) {
+							return -3;
+						}
+					}
+				}
+			} else {
+				// 放入其他字符
+				if (!tryPut(bb, idx, (byte) data[i]))
+					return -2;
+				idx++;
+			}
+		}
+
+		return idx;
+	}
+
+	/**
+	 * 根据一串byte码流判断可能的字符编码 依赖于jchardet包,根据其提供的probe机制判断对应的编码类型,有一定的误判率
+	 * 码流必须是按照一种统一的规则来编码的,码流的数据越多,判定的正确性越高
+	 * 
+	 * @param s 待判定的码流
+	 * @return 可能的编码类型数组,"UTF-8", "GBK", "UTF-16"等等. 如果参数有问题,返回值为null
+	 */
+//	public static final String[] probeAllCharsets(byte[] s) {
+//		if( s == null || s.length == 0 ) return null;
+//		return probeAllCharsets(s,s.length);
+//	}
+//	public static final String[] probeAllCharsets(byte[] s, int limit) {
+//		if( s == null || limit <=0 || limit > s.length ) return null;
+//		nsDetector det = new nsDetector(nsDetector.SIMPLIFIED_CHINESE);
+//		nsICharsetDetectionObserver c = null;
+//		det.Init(c);
+//		int limitPerIteration = 1024;
+//		if (limit <= limitPerIteration) {
+//			det.DoIt(s, limit, false);
+//			det.Done();
+//
+//			String prob[] = det.getProbableCharsets();
+//			return prob;
+//		}
+//		byte[] bytes = new byte[limitPerIteration];
+//		int index = 0;
+//		while ((index + limitPerIteration) < limit) {
+//			System.arraycopy(s, index, bytes, 0, limitPerIteration);
+//			if (det.DoIt(bytes, bytes.length, false)) {
+//				det.Done();
+//				String prob[] = det.getProbableCharsets();
+//				return prob;
+//			}
+//			index += limitPerIteration;
+//		}
+//		System.arraycopy(s, index, bytes, 0, limit - index);
+//		det.DoIt(bytes, bytes.length, false);
+//		det.Done();
+//		String prob[] = det.getProbableCharsets();
+//
+//		return prob;
+//	}
+
+	/**
+	 * 判断字符串可能的编码类型
+	 * 
+	 * @param line 经过编码的字符串,一般应该是url参数
+	 * @return 可能的编码类型"GBK","UTF-8"等,如果出现错误,返回值是null
+	 */
+//	public static final String probeCharset(String line){
+//		String dft = null;
+//		String ret = null;
+//		int limit = Integer.MAX_VALUE>>2;
+//		if( line == null || line.length() == 0 || line.length() >= limit ) 
+//			return dft;
+//		byte[] buff = new byte[line.length()*2];
+//		int n = genericUrlDecode(line, buff);
+//		if( n >= 0 ){
+//			ret = probeCharset(buff, 0, n);
+//			try{
+//				String oldret = probeCharset2(buff, 0, n);
+//				if (!ret.equals(oldret)){
+//					StringBuilder sb = new StringBuilder();
+//					sb.append("charset diff:");
+//					sb.append(ret);
+//					sb.append(" ");
+//					sb.append(oldret);
+//					sb.append(" ");
+//					sb.append(line);
+//					System.out.println(sb.toString());
+//				}
+//			}catch(Exception e){
+//				System.out.println("charset diff:exception "+line);
+//			}
+//		} else if( n == -1 ){
+//			// 参数有问题
+//			ret = dft;
+//		} else if( n == -2 ){ // 空间不足,重试
+//			buff = new byte[line.length()*4];
+//			n = genericUrlDecode(line, buff);
+//			if( n < 0 ){
+//				ret = dft;
+//			} else {
+//				ret = probeCharset(buff, 0, n);
+//			}
+//		} else if( n == -4 ){ // n == -4 编码类型确认为GBK
+//			ret = "GBK";
+//		} else {// n == -3 未知错误
+//			ret = dft;
+//		}
+//		return ret;
+//		
+//	}
+
+//	private static final float count(String str){
+//		if( str == null || str.length() == 0 ) return 1.0f;
+//		int total = 0;
+//		float sum = 0.0f;
+//		for(int i=0;i<str.length(); i++){
+//			char ch = str.charAt(i);
+//			if( ch > 128 ){
+//				total ++;
+//				if( !GB2312Charset.has(ch) ){
+//					if( ch >= '\ufff0' ){
+//						sum += 2.0f;
+//					} else {
+//						sum += 1.0f;
+//					}
+//				} else {
+//					if( ch < 39 * 8 * 64 ){
+//						sum += 0.05;
+//					} else if( ch < 58 * 8 * 64 ){
+//						sum += 0.07;
+//					} else if( ch > 80 * 8 * 64 ){
+//						sum += 0.2;
+//					}
+//				}
+//			}
+//		}
+//		return total == 0 ? 1 : (sum)/total;
+//	}
+
+//	private static final float count2(String str){
+//		if( str == null || str.length() == 0 ) return 1.0f;
+//		int total = 0;
+//		float sum = 0.0f;
+//		for(int i=0;i<str.length(); i++){
+//			char ch = str.charAt(i);
+//			if( ch > 128 ){
+//				total ++;
+//				if( !GB2312Charset.has(ch) ){
+//					if( ch >= '\ufff0' ){
+//						sum += 2.0f;
+//					} else {
+//						sum += 1.0f;
+//					}
+//				} else {
+//					if( ch < 39 * 8 * 64 ){
+//						sum += 0.05;
+//					} else if( ch < 58 * 8 * 64 ){
+//						sum += 0.07;
+//					} else if( ch > 80 * 8 * 64 ){
+//						sum += 0.2;
+//					} else if( !GB2312Charset.has2312(ch) ){
+//						sum += 0.15;
+//					}
+//				}
+//			}
+//		}
+//		return total == 0 ? 1 : (sum)/total;
+//	}
+	/**
+	 * 判定一段码流对应的编码类型
+	 * 
+	 * @param buff  原始码流,数据量越大越准确,但是性能也随之下降
+	 * @param start 起始位置
+	 * @param limit 码流的长度
+	 * @return null 参数有误,或者判定失败
+	 */
+//	public static final String probeCharset(byte[] bb, int start, int limit){
+//
+//		if (bb == null || start < 0 || limit <= 0 || limit + start > bb.length) {
+//			return null;
+//		}
+//		byte[] buff = new byte[limit];
+//		System.arraycopy(bb, start, buff, 0, limit);
+//		String[] css = probeAllCharsets(buff);
+//		for (String cs : css) {
+//			if ( cs.equals("GBK") || cs.equals("GB2312")
+//					|| cs.equals("GB18030"))
+//				return "GBK";
+//			else if( cs.equals("UTF-8") ){
+//				// fixup
+//				// 发现chardet包对“一”等字的识别有明显的问题
+//				{
+//					try{
+//						String str = new String( bb, start, limit, cs);
+//						if (str != null && str.contains("中國")){
+//							return "UTF-8";
+//						}
+//						if (str != null && str.contains("豬v")){
+//							return "GBK";
+//						}
+//						if(count(str) > 0.5){
+//							cs = "GBK";
+//						}
+//						if(count(str) == 0.5){
+//							try{
+//								str = new String( bb, start, limit, "GBK");
+//								if (count(str) < 0.5){
+//									return "GBK";
+//								}
+//							}catch(Exception e){
+//								cs = "UTF-8";
+//							}
+//						}
+//					}catch(Exception e){
+//						cs = "GBK";
+//					}
+//				}
+//				return cs;
+//			}
+//		}
+//		return null;
+//
+//	}
+//	
+//	public static final String probeCharset2(byte[] bb, int start, int limit){
+//
+//		if (bb == null || start < 0 || limit <= 0 || limit + start > bb.length) {
+//			return null;
+//		}
+//		byte[] buff = new byte[limit];
+//		System.arraycopy(bb, start, buff, 0, limit);
+//		String[] css = probeAllCharsets(buff);
+//		String maybeSET = null;
+//		for (String cs : css) {
+//			if ( cs.equals("GBK") || cs.equals("GB2312")
+//					|| cs.equals("GB18030"))
+//				return "GBK";
+//			else if( cs.equals("UTF-8") ){
+//				// fixup
+//				// 发现chardet包对“一”等字的识别有明显的问题
+//				{
+//					try{
+//						String str = new String( bb, start, limit, cs);
+//						float cnt = count2(CharsetConverter.getInstance().getGBKOfBig5(str));  
+//						if (cnt > 0.5){
+//							return "GBK";
+//						}
+//						
+//						try{
+//							str = new String( bb, start, limit, "GBK");
+//							float cnt2 = count2(str);  
+//							if (cnt2+0.1 < cnt){
+//								//gbk的可能性比utf8高,但如果chardet没有判断出gbk,则仍然用utf8
+//								maybeSET = "UTF-8";
+//								continue;
+//							}else if (cnt2 == 0.0 && cnt > 0.0){
+//								maybeSET = "UTF-8";
+//								continue;
+//							}
+//						}catch(Exception e){
+//							cs = "UTF-8";
+//						}
+//						
+//					}catch(Exception e){
+//						cs = "GBK";
+//					}
+//				}
+//				return cs;
+//			}
+//		}
+//		return maybeSET;
+//
+//	}
+
+	/**
+	 * 从url参数,或者带参数的url中截取一个特定的参数,考虑了"#"锚标的情况
+	 * 
+	 * @param url   原始字符串
+	 * @param param 需要找的参数
+	 * @return 找到的对应参数 null 参数不存在,或者参数非法
+	 */
+	public static final String getParameter(String url, String param) {
+		if (url == null || param == null)
+			return null;
+		String key = param + "=";
+		int right = url.indexOf("/#");
+		if (right < 0) {
+			right = url.indexOf('#');
+		} else {
+			right = url.indexOf('#', right + 2);
+		}
+		if (right < 0)
+			right = url.length();
+		int left = -1;
+		while (true) {
+			int idx = url.indexOf(key, left + 1);
+			if (idx < 0) {
+				return null;
+			} else if (idx == 0) {
+				left = idx;
+				break;
+			} else if (url.charAt(idx - 1) == '?' || url.charAt(idx - 1) == '&' || url.charAt(idx - 1) == '#') {
+				left = idx;
+				break;
+			} else {
+				left = idx;
+			}
+		}
+		// 未找到
+		if (left < 0)
+			return null;
+		left += key.length();
+		// 处理#锚标
+		if (left >= right)
+			return null;
+
+		int end = url.indexOf('&', left + 1);
+		if (end > 0 && end < right)
+			right = end;
+		return url.substring(left, right);
+	}
+
+}

+ 83 - 7
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/ListTools.java

@@ -168,15 +168,18 @@ public class ListTools {
 				arrayList.add(t);
 			}
 		}
-		for (T t : ts) {
-			if (ignoreNull && (null == t)) {
-				continue;
-			}
-			if (unique && arrayList.contains(t)) {
-				continue;
+		if (null != ts) {
+			for (T t : ts) {
+				if (ignoreNull && (null == t)) {
+					continue;
+				}
+				if (unique && arrayList.contains(t)) {
+					continue;
+				}
+				arrayList.add(t);
 			}
-			arrayList.add(t);
 		}
+		
 		return arrayList;
 	}
 
@@ -474,4 +477,77 @@ public class ListTools {
 		return os;
 	}
 
+	/**
+	 * 判断两个字符串集合是否内容一致
+	 * 
+	 * @param list1
+	 * @param list2
+	 * @return
+	 */
+	public static boolean isSameList(List<String> list1, List<String> list2) {
+		if (list1 == null) {
+			list1 = new ArrayList<>();
+		}
+		if (list2 == null) {
+			list2 = new ArrayList<>();
+		}
+		if (list1 == list2)
+			return true;
+		if (list1.size() != list2.size())
+			return false;
+		for (String str : list1) {
+			if (!list2.contains(str)) {
+				return false;
+			}
+		}
+		for (String str : list2) {
+			if (!list1.contains(str)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/* 判断是否是List对象 */
+	public static boolean isList(Object obj) {
+		if (null == obj) {
+			return true;
+		} else if (List.class.isAssignableFrom(obj.getClass())) {
+			return true;
+		}
+		return false;
+	}
+
+
+
+	public static String toStringJoin(Object obj, String separator) {
+		if (isList(obj)) {
+			return StringUtils.join((List<?>) obj, separator);
+		} else {
+			return obj.toString();
+		}
+	}
+
+	public static String toStringJoin(Object obj) {
+		if (isList(obj)) {
+			return StringUtils.join((List<?>) obj, ",");
+		} else {
+			return obj.toString();
+		}
+	}
+	
+	/**
+	 * 去重
+	 * @param list
+	 */
+	private static void removeDuplicate(List<String> list) {
+	    List<String> result = new ArrayList<String>(list.size());
+	    for (String str : list) {
+	        if (!result.contains(str)) {
+	            result.add(str);
+	        }
+	    }
+	    list.clear();
+	    list.addAll(result);
+	}
 }

+ 42 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/SortTools.java

@@ -3,6 +3,8 @@ package com.x.base.core.project.tools;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.commons.lang3.ObjectUtils;
@@ -141,4 +143,44 @@ public class SortTools {
 			}
 		});
 	}
+
+	/* 按模板给出的顺序进行排序,不在模板中的排在最前 */
+	public static <T> List<T> orderWithTemplateNotFoundFirst(List<T> list, List<T> template) {
+		if ((null == list) || template == list) {
+			return list;
+		}
+		return list.stream().sorted(Comparator.comparing(Function.identity(), (x, y) -> {
+			int indx = template.indexOf(x);
+			int indy = template.indexOf(y);
+			if (indx == indy) {
+				return 0;
+			} else if (indx == -1) {
+				return -1;
+			} else if (indy == -1) {
+				return 1;
+			} else {
+				return indx - indy;
+			}
+		})).collect(Collectors.toList());
+	}
+
+	/* 按模板给出的顺序进行排序,不在模板中的排在最后 */
+	public static <T> List<T> orderWithTemplateNotFoundLast(List<T> list, List<T> template) {
+		if ((null == list) || template == list) {
+			return list;
+		}
+		return list.stream().sorted(Comparator.comparing(Function.identity(), (x, y) -> {
+			int indx = template.indexOf(x);
+			int indy = template.indexOf(y);
+			if (indx == indy) {
+				return 0;
+			} else if (indx == -1) {
+				return 1;
+			} else if (indy == -1) {
+				return -1;
+			} else {
+				return indx - indy;
+			}
+		})).collect(Collectors.toList());
+	}
 }

+ 1 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/StringTools.java

@@ -30,7 +30,7 @@ import org.slf4j.helpers.MessageFormatter;
 
 public class StringTools {
 	public static final Pattern MOBILE_REGEX = Pattern.compile(
-			"(^(\\+)?0{0,2}852\\d{8}$)|(^(\\+)?0{0,2}853\\d{8}$)|(^(\\+)?0{0,2}886\\d{9}$)|(^1(3|4|5|7|8|9)\\d{9}$)");
+			"(^(\\+)?0{0,2}852\\d{8}$)|(^(\\+)?0{0,2}853\\d{8}$)|(^(\\+)?0{0,2}886\\d{9}$)|(^1(3|4|5|6|7|8|9)\\d{9}$)");
 	/** 中文,英文,数字,-,. 【】() */
 	public static final Pattern SIMPLY_REGEX = Pattern
 			.compile("^[\u4e00-\u9fa5a-zA-Z0-9\\_\\(\\)\\-\\ \\.\\【\\】\\(\\)]*$");

+ 2 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_cms_assemble_control.java

@@ -16,7 +16,8 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.cms.core.entity.element.File", "com.x.cms.core.entity.FileInfo", "com.x.cms.core.entity.Log",
 		"com.x.processplatform.core.entity.content.Attachment", "com.x.query.core.entity.Item",
 		"com.x.query.core.entity.View", "com.x.cms.core.entity.ReadRemind", "com.x.cms.core.entity.DocumentCommend",
-		"com.x.cms.core.entity.DocumentCommentInfo", "com.x.cms.core.entity.CmsBatchOperation" }, storageTypes = {
+		"com.x.cms.core.entity.DocumentCommentInfo", "com.x.cms.core.entity.CmsBatchOperation", "com.x.cms.core.entity.Review",
+		"com.x.cms.core.entity.DocumentCommentContent"}, storageTypes = {
 				StorageType.cms, StorageType.processPlatform }, storeJars = { "x_processplatform_core_entity",
 						"x_organization_core_entity", "x_organization_core_express", "x_cms_core_entity",
 						"x_query_core_entity", "x_query_core_express" })

+ 2 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_processplatform_assemble_designer.java

@@ -25,8 +25,8 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.processplatform.core.entity.element.End", "com.x.processplatform.core.entity.element.ApplicationDict",
 		"com.x.processplatform.core.entity.element.ApplicationDictItem",
 		"com.x.processplatform.core.entity.element.QueryView", "com.x.processplatform.core.entity.element.QueryStat",
-		"com.x.query.core.entity.Item" }, storeJars = { "x_organization_core_entity", "x_organization_core_express",
-				"x_processplatform_core_entity",
+		"com.x.processplatform.core.entity.element.Projection", "com.x.query.core.entity.Item" }, storeJars = {
+				"x_organization_core_entity", "x_organization_core_express", "x_processplatform_core_entity",
 				"x_query_core_entity" }, storageTypes = { StorageType.processPlatform })
 public class x_processplatform_assemble_designer extends Deployable {
 

+ 4 - 3
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_processplatform_assemble_surface.java

@@ -25,9 +25,10 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.processplatform.core.entity.element.Process", "com.x.processplatform.core.entity.element.Route",
 		"com.x.processplatform.core.entity.element.Script", "com.x.processplatform.core.entity.element.Service",
 		"com.x.processplatform.core.entity.element.Split", "com.x.processplatform.core.entity.element.QueryView",
-		"com.x.processplatform.core.entity.element.QueryStat", "com.x.query.core.entity.Item" }, storageTypes = {
-				StorageType.processPlatform }, storeJars = { "x_organization_core_entity",
-						"x_organization_core_express", "x_processplatform_core_entity", "x_query_core_entity" })
+		"com.x.processplatform.core.entity.element.QueryStat", "com.x.processplatform.core.entity.element.Projection",
+		"com.x.query.core.entity.Item" }, storageTypes = { StorageType.processPlatform }, storeJars = {
+				"x_organization_core_entity", "x_organization_core_express", "x_processplatform_core_entity",
+				"x_query_core_entity" })
 public class x_processplatform_assemble_surface extends Deployable {
 
 //	public x_processplatform_assemble_surface() {

+ 3 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_processplatform_service_processing.java

@@ -25,8 +25,9 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.processplatform.core.entity.element.Service", "com.x.processplatform.core.entity.element.Agent",
 		"com.x.processplatform.core.entity.element.Delay", "com.x.processplatform.core.entity.element.File",
 		"com.x.processplatform.core.entity.element.Form", "com.x.processplatform.core.entity.element.FormField",
-		"com.x.processplatform.core.entity.element.Embed", "com.x.processplatform.core.entity.log.ProcessingError",
-		"com.x.query.core.entity.Item" }, storageTypes = { StorageType.processPlatform }, storeJars = {
+		"com.x.processplatform.core.entity.element.Embed", "com.x.processplatform.core.entity.element.Projection",
+		"com.x.processplatform.core.entity.log.ProcessingError", "com.x.query.core.entity.Item",
+		"com.x.query.dynamic.entity.*" }, storageTypes = { StorageType.processPlatform }, storeJars = {
 				"x_organization_core_entity", "x_organization_core_express", "x_processplatform_core_entity",
 				"x_query_core_entity" })
 public class x_processplatform_service_processing extends ServiceA {

+ 4 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_teamwork_assemble_control.java

@@ -14,8 +14,10 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.teamwork.core.entity.TaskDetail", "com.x.teamwork.core.entity.TaskList",
 		"com.x.teamwork.core.entity.TaskListRele", "com.x.teamwork.core.entity.TaskRelevance",
 		"com.x.teamwork.core.entity.TaskView", "com.x.teamwork.core.entity.SystemConfig",
-		"com.x.teamwork.core.entity.SystemConfigLobValue" }, storeJars = { "x_organization_core_entity",
-				"x_organization_core_express", "x_teamwork_core_entity" })
+		"com.x.teamwork.core.entity.SystemConfigLobValue", "com.x.teamwork.core.entity.Review",
+		"com.x.teamwork.core.entity.BatchOperation", "com.x.teamwork.core.entity.TaskTag", 
+		"com.x.teamwork.core.entity.TaskTagRele", "com.x.teamwork.core.entity.Attachment"}, storeJars = { "x_organization_core_entity",
+		"x_organization_core_express", "x_teamwork_core_entity" })
 public class x_teamwork_assemble_control extends Deployable {
 
 //	public x_teamwork_assemble_control() {

Некоторые файлы не были показаны из-за большого количества измененных файлов