Przeglądaj źródła

Merge branch 'wrdp' into 'develop'

Wrdp

See merge request o2oa/o2oa!1832
o2null 5 lat temu
rodzic
commit
48aa3ece18
42 zmienionych plików z 894 dodań i 68 usunięć
  1. 0 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/CacheUtil.java
  2. 0 3
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/QueueAttendanceDetailStatistic.java
  3. 0 4
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/QueuePersonAttendanceDetailAnalyse.java
  4. 0 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancestatisticalcycle/ActionDelete.java
  5. 0 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancestatisticalcycle/ActionSave.java
  6. 2 4
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancestatisticalcycle/BaseAction.java
  7. 0 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceworkdayconfig/ActionDelete.java
  8. 0 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceworkdayconfig/ActionSave.java
  9. 0 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionDelete.java
  10. 0 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionDeleteByWfDocId.java
  11. 0 9
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionSave.java
  12. 2 4
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/BaseAction.java
  13. 0 4
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailAnalyseService.java
  14. 4 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailServiceAdv.java
  15. 4 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/organization/OrganizationDefinition.java
  16. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_file_assemble_control.java
  17. 43 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/Business.java
  18. 2 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/ActionApplication.java
  19. 10 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/ConfigJaxrsFilter.java
  20. 10 2
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ActionUpload.java
  21. 2 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ActionUploadCallback.java
  22. 1 1
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ActionUseCapacity.java
  23. 45 1
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/BaseAction.java
  24. 15 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ExceptionAttachmentUploadDenied.java
  25. 13 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ExceptionCapacityOut.java
  26. 47 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/ActionGetSystemConfig.java
  27. 27 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/ActionIsManager.java
  28. 100 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/ActionSaveSystemConfig.java
  29. 7 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/BaseAction.java
  30. 78 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/ConfigAction.java
  31. 13 2
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/recycle/ActionResume.java
  32. 13 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/recycle/ExceptionCapacityOut.java
  33. 21 7
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/share/ActionSaveToFolder.java
  34. 13 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/share/ExceptionCapacityOut.java
  35. 3 0
      o2server/x_file_core_entity/src/main/java/com/x/file/core/entity/PersistenceProperties.java
  36. 116 0
      o2server/x_file_core_entity/src/main/java/com/x/file/core/entity/open/FileConfig.java
  37. 34 0
      o2server/x_file_core_entity/src/main/java/com/x/file/core/entity/open/FileConfigProperties.java
  38. 11 14
      o2server/x_general_assemble_control/src/main/java/com/x/general/assemble/control/schedule/Clean.java
  39. 104 0
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionHasIdentity.java
  40. 113 0
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionHasPerson.java
  41. 36 0
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/UnitAction.java
  42. 4 1
      o2server/x_program_center/src/main/java/com/x/program/center/Context.java

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

@@ -1,7 +1,6 @@
 package com.x.attendance.assemble.control;
 
 import com.x.base.core.entity.JpaObject;
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.cache.CacheManager;
 
 /**

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

@@ -5,11 +5,9 @@ import com.x.attendance.assemble.control.service.*;
 import com.x.attendance.entity.AttendanceStatisticRequireLog;
 import com.x.attendance.entity.AttendanceStatisticalCycle;
 import com.x.attendance.entity.AttendanceWorkDayConfig;
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.queue.AbstractQueue;
-import net.sf.ehcache.Ehcache;
 import java.util.List;
 import java.util.Map;
 
@@ -28,7 +26,6 @@ public class QueueAttendanceDetailStatistic extends AbstractQueue<String> {
         AttendanceStatisticalCycleServiceAdv statisticalCycleServiceAdv = new AttendanceStatisticalCycleServiceAdv();
         AttendanceStatisticRequireLog log = statisticRequireLogServiceAdv.get(logId);
 
-        Ehcache cache = ApplicationCache.instance().getCache( AttendanceStatisticalCycle.class);
         if( log != null ){
             logger.debug("system try to statistic attendance detail, logId:" + logId );
             AttendanceStatisticalCycle attendanceStatisticalCycle  = null;

+ 0 - 4
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/QueuePersonAttendanceDetailAnalyse.java

@@ -7,13 +7,9 @@ import com.x.attendance.assemble.control.service.AttendanceWorkDayConfigServiceA
 import com.x.attendance.entity.AttendanceDetail;
 import com.x.attendance.entity.AttendanceStatisticalCycle;
 import com.x.attendance.entity.AttendanceWorkDayConfig;
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.queue.AbstractQueue;
-import net.sf.ehcache.Ehcache;
-import net.sf.ehcache.Element;
-
 import java.util.List;
 import java.util.Map;
 

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

@@ -5,7 +5,6 @@ import com.x.attendance.entity.AttendanceStatisticalCycle;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.annotation.CheckRemoveType;
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.cache.CacheManager;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;

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

@@ -14,7 +14,6 @@ import com.x.base.core.entity.JpaObject;
 import com.x.base.core.entity.annotation.CheckPersistType;
 import com.x.base.core.project.bean.WrapCopier;
 import com.x.base.core.project.bean.WrapCopierFactory;
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.cache.CacheManager;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;

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

@@ -3,13 +3,11 @@ package com.x.attendance.assemble.control.jaxrs.attendancestatisticalcycle;
 import com.x.attendance.assemble.common.date.DateOperation;
 import com.x.attendance.assemble.control.service.UserManagerService;
 import com.x.attendance.entity.AttendanceStatisticalCycle;
-import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.cache.Cache;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
-import net.sf.ehcache.Ehcache;
 
 public class BaseAction extends StandardJaxrsAction{
-
-	protected Ehcache cache = ApplicationCache.instance().getCache( AttendanceStatisticalCycle.class);
+	protected Cache.CacheCategory cache = new Cache.CacheCategory( AttendanceStatisticalCycle.class);
 	protected UserManagerService userManagerService = new UserManagerService();
 	protected DateOperation dateOperation = new DateOperation();
 

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

@@ -2,12 +2,10 @@ package com.x.attendance.assemble.control.jaxrs.attendanceworkdayconfig;
 
 import javax.servlet.http.HttpServletRequest;
 
-import com.x.attendance.entity.AttendanceStatisticalCycle;
 import com.x.attendance.entity.AttendanceWorkDayConfig;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.annotation.CheckRemoveType;
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.cache.CacheManager;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;

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

@@ -14,7 +14,6 @@ import com.x.base.core.entity.JpaObject;
 import com.x.base.core.entity.annotation.CheckPersistType;
 import com.x.base.core.project.bean.WrapCopier;
 import com.x.base.core.project.bean.WrapCopierFactory;
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.cache.CacheManager;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;

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

@@ -7,11 +7,9 @@ import javax.servlet.http.HttpServletRequest;
 
 import com.x.attendance.assemble.control.ThisApplication;
 import com.x.attendance.entity.AttendanceSelfHoliday;
-import com.x.attendance.entity.AttendanceStatisticalCycle;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.annotation.CheckRemoveType;
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.cache.CacheManager;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;

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

@@ -10,7 +10,6 @@ import com.x.attendance.entity.AttendanceSelfHoliday;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.annotation.CheckRemoveType;
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.cache.CacheManager;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;

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

@@ -4,16 +4,11 @@ import com.google.gson.JsonElement;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
 import com.x.attendance.assemble.control.ThisApplication;
 import com.x.attendance.entity.AttendanceSelfHoliday;
-import com.x.attendance.entity.AttendanceStatisticalCycle;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
-import com.x.base.core.entity.AbstractPersistenceProperties;
-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.CheckRemoveType;
 import com.x.base.core.project.annotation.FieldDescribe;
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.cache.CacheManager;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
@@ -25,13 +20,9 @@ import com.x.base.core.project.organization.Unit;
 import com.x.base.core.project.tools.ListTools;
 import org.apache.commons.lang3.StringUtils;
 
-import javax.persistence.Column;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
 import javax.servlet.http.HttpServletRequest;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
 
 public class ActionSave extends BaseAction {
 	

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

@@ -5,14 +5,12 @@ import com.x.attendance.assemble.control.service.AttendanceSelfHolidayServiceAdv
 import com.x.attendance.assemble.control.service.AttendanceStatisticalCycleServiceAdv;
 import com.x.attendance.assemble.control.service.UserManagerService;
 import com.x.attendance.entity.AttendanceSelfHoliday;
-import com.x.attendance.entity.AttendanceStatisticalCycle;
-import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.cache.Cache;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import net.sf.ehcache.Ehcache;
 
 public class BaseAction extends StandardJaxrsAction{
-
-	protected Ehcache cache = ApplicationCache.instance().getCache( AttendanceSelfHoliday.class);
+	protected Cache.CacheCategory cache = new Cache.CacheCategory( AttendanceSelfHoliday.class);
 	protected UserManagerService userManagerService = new UserManagerService();
 	protected AttendanceStatisticalCycleServiceAdv attendanceStatisticCycleServiceAdv = new AttendanceStatisticalCycleServiceAdv();
 	protected AttendanceDetailAnalyseServiceAdv attendanceDetailAnalyseServiceAdv = new AttendanceDetailAnalyseServiceAdv();

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

@@ -7,16 +7,12 @@ import java.util.List;
 import java.util.Map;
 
 import com.x.attendance.assemble.control.ThisApplication;
-import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.tools.ListTools;
-import net.sf.ehcache.Ehcache;
-import net.sf.ehcache.Element;
 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;
-import com.x.attendance.assemble.control.jaxrs.attendancedetail.AttendanceCycles;
 import com.x.attendance.entity.AttendanceDetail;
 import com.x.attendance.entity.AttendanceScheduleSetting;
 import com.x.attendance.entity.AttendanceSelfHoliday;

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

@@ -307,6 +307,7 @@ public class AttendanceDetailServiceAdv {
 				}
 				if( detail_old == null ) {
 					detail.setBatchName( "FromMobile_" + dateOperation.getNowTimeChar() );
+					detail.setRecordStatus(1);
 					emc.beginTransaction( AttendanceDetail.class );
 					emc.persist( detail , CheckPersistType.all );
 					emc.commit();
@@ -314,15 +315,17 @@ public class AttendanceDetailServiceAdv {
 				}else {
 					emc.beginTransaction( AttendanceDetail.class );
 					detail.copyTo( detail_old, JpaObject.FieldsUnmodify);
+					detail_old.setRecordStatus(1);
 					emc.check( detail_old , CheckPersistType.all );
 					emc.commit();
 				}
+				/*可能引起多人同时打卡时commit error
 				emc.beginTransaction( AttendanceDetailMobile.class );
 				for( AttendanceDetailMobile detailMobile : mobileDetails ) {
 					detailMobile.setRecordStatus(1);
 					emc.check( detailMobile , CheckPersistType.all );
 				}
-				emc.commit();
+				emc.commit();*/
 
 				//分析保存好的考勤数据
 				try {

+ 4 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/organization/OrganizationDefinition.java

@@ -74,6 +74,9 @@ public class OrganizationDefinition {
 	public final static String SearchPrivilege = "SearchPrivilege";
 	public final static String SearchPrivilege_description = "搜索管理员(系统角色),可以跨权限对系统内容进行搜索。";
 
+	public final static String FileManager = "FileManager";
+	public final static String FileManager_description = "云文件管理员(系统角色),可以进行云文件系统相关配置。";
+
 	public final static String RoleDefinitionSuffix = "SystemRole";
 
 	public final static Pattern person_distinguishedName_pattern = Pattern.compile("^(.+)\\@(\\S+)\\@P$");
@@ -97,7 +100,7 @@ public class OrganizationDefinition {
 	public final static List<String> DEFAULTROLES = new UnmodifiableList<String>(ListTools.toList(Manager,
 			AttendanceManager, OrganizationManager, PersonManager, GroupManager, UnitManager, RoleManager,
 			ProcessPlatformManager, ProcessPlatformCreator, MeetingManager, MeetingViewer, PortalManager, BBSManager,
-			CMSManager, OKRManager, CRMManager,TeamWorkManager, QueryManager, MessageManager, HotPictureManager, SearchPrivilege));
+			CMSManager, OKRManager, CRMManager,TeamWorkManager, QueryManager, MessageManager, HotPictureManager, SearchPrivilege, FileManager));
 
 	public static String name(String distinguishedName) {
 		if (StringUtils.contains(distinguishedName, "@")) {

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

@@ -8,7 +8,7 @@ import com.x.base.core.project.annotation.ModuleType;
 @Module(type = ModuleType.ASSEMBLE, category = ModuleCategory.OFFICIAL, name = "云文件", packageName = "com.x.file.assemble.control", containerEntities = {
 		"com.x.file.core.entity.personal.Folder", "com.x.file.core.entity.personal.Folder2", "com.x.file.core.entity.personal.Attachment",
 		"com.x.file.core.entity.personal.Attachment2", "com.x.file.core.entity.personal.Share", "com.x.file.core.entity.open.File",
-		"com.x.file.core.entity.open.OriginFile","com.x.file.core.entity.personal.Recycle" },
+		"com.x.file.core.entity.open.OriginFile","com.x.file.core.entity.personal.Recycle","com.x.file.core.entity.open.FileConfig" },
 		storageTypes = { StorageType.file }, storeJars = { "x_file_core_entity", "x_organization_core_express", "x_organization_core_entity" })
 public class x_file_assemble_control extends Deployable {
 }

+ 43 - 0
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/Business.java

@@ -1,13 +1,22 @@
 package com.x.file.assemble.control;
 
 import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.project.cache.Cache;
+import com.x.base.core.project.cache.CacheManager;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.organization.OrganizationDefinition;
 import com.x.file.assemble.control.factory.*;
+import com.x.file.core.entity.open.FileConfig;
 import com.x.organization.core.express.Organization;
 
+import java.util.Optional;
+
 public class Business {
 
 	public final static String TOP_FOLD = "$$TOP_FOLD";
 
+	public final static String SYSTEM_CONFIG = "systemConfig";
+
 	private EntityManagerContainer emc;
 
 	public Business(EntityManagerContainer emc) throws Exception {
@@ -99,4 +108,38 @@ public class Business {
 		return organization;
 	}
 
+	public boolean controlAble(EffectivePerson effectivePerson) throws Exception {
+		boolean result = false;
+		if (effectivePerson.isManager()
+				|| (this.organization().person().hasRole(effectivePerson, OrganizationDefinition.FileManager))) {
+			result = true;
+		}
+		return result;
+	}
+
+	public Integer verifyConstraint(String person, long usedSize) throws Exception{
+		Cache.CacheCategory cacheCategory = new Cache.CacheCategory(FileConfig.class);
+		Cache.CacheKey cacheKey = new Cache.CacheKey(FileConfig.class, Business.SYSTEM_CONFIG);
+		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+		FileConfig config = null;
+		if(optional.isPresent()){
+			config = (FileConfig)optional.get();
+		}else{
+			config = this.entityManagerContainer().firstEqual(FileConfig.class, FileConfig.person_FIELDNAME, Business.SYSTEM_CONFIG);
+			if(config != null){
+				CacheManager.put(cacheCategory, cacheKey, config);
+			}
+		}
+		if (config != null){
+			if(config.getCapacity()!=null && config.getCapacity()>0) {
+				long usedCapacity = usedSize / (1024 * 1024);
+				if (usedCapacity > config.getCapacity()) {
+					return config.getCapacity();
+				}
+			}
+		}
+
+		return 0;
+	}
+
 }

+ 2 - 0
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/ActionApplication.java

@@ -8,6 +8,7 @@ import com.x.base.core.project.jaxrs.AbstractActionApplication;
 import com.x.file.assemble.control.jaxrs.attachment.AttachmentAction;
 import com.x.file.assemble.control.jaxrs.attachment2.Attachment2Action;
 import com.x.file.assemble.control.jaxrs.complex.ComplexAction;
+import com.x.file.assemble.control.jaxrs.config.ConfigAction;
 import com.x.file.assemble.control.jaxrs.editor.EditorAction;
 import com.x.file.assemble.control.jaxrs.file.FileAction;
 import com.x.file.assemble.control.jaxrs.folder.FolderAction;
@@ -28,6 +29,7 @@ public class ActionApplication extends AbstractActionApplication {
 		classes.add(RecycleAction.class);
 		classes.add(EditorAction.class);
 		classes.add(FileAction.class);
+		classes.add(ConfigAction.class);
 		return classes;
 	}
 

+ 10 - 0
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/ConfigJaxrsFilter.java

@@ -0,0 +1,10 @@
+package com.x.file.assemble.control.jaxrs;
+
+import com.x.base.core.project.jaxrs.CipherManagerUserJaxrsFilter;
+
+import javax.servlet.annotation.WebFilter;
+
+@WebFilter(urlPatterns = "/jaxrs/config/*", asyncSupported = true)
+public class ConfigJaxrsFilter extends CipherManagerUserJaxrsFilter {
+
+}

+ 10 - 2
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ActionUpload.java

@@ -8,10 +8,15 @@ import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.DefaultCharset;
+import com.x.base.core.project.tools.ListTools;
 import com.x.file.assemble.control.Business;
 import com.x.file.assemble.control.FileUtil;
 import com.x.file.assemble.control.ThisApplication;
+import com.x.file.core.entity.open.FileConfig;
+import com.x.file.core.entity.open.FileConfigProperties;
 import com.x.file.core.entity.open.OriginFile;
 import com.x.file.core.entity.personal.Attachment2;
 import com.x.file.core.entity.personal.Attachment2_;
@@ -28,8 +33,8 @@ import javax.persistence.criteria.Root;
 
 class ActionUpload extends BaseAction {
 
-	// @HttpMethodDescribe(value = "创建Attachment对象,如果没有上级目录用(0)替代.", response =
-	// WrapOutId.class)
+	private static Logger logger = LoggerFactory.getLogger( ActionUpload.class );
+
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String folderId, String fileName, String fileMd5, byte[] bytes,
 			FormDataContentDisposition disposition) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
@@ -82,6 +87,7 @@ class ActionUpload extends BaseAction {
 				if(bytes==null){
 					throw new ExceptionAttachmentNone(fileName);
 				}
+				this.verifyConstraint(business, effectivePerson.getDistinguishedName(), bytes.length, fileName);
 				originFile = new OriginFile(mapping.getName(), fileName, effectivePerson.getDistinguishedName(), fileMd5);
 				emc.check(originFile, CheckPersistType.all);
 				originFile.saveContent(mapping, bytes, fileName);
@@ -94,6 +100,7 @@ class ActionUpload extends BaseAction {
 				emc.persist(attachment2);
 				emc.commit();
 			}else{
+				this.verifyConstraint(business, effectivePerson.getDistinguishedName(), originFile.getLength(), fileName);
 				attachment2 = new Attachment2(fileName, effectivePerson.getDistinguishedName(),
 						folderId, originFile.getId(), originFile.getLength(), originFile.getType());
 				emc.check(attachment2, CheckPersistType.all);
@@ -110,4 +117,5 @@ class ActionUpload extends BaseAction {
 
 	public static class Wo extends WoId {
 	}
+
 }

+ 2 - 0
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ActionUploadCallback.java

@@ -82,6 +82,7 @@ class ActionUploadCallback extends BaseAction {
 				if(bytes==null){
 					throw new ExceptionAttachmentNone(fileName);
 				}
+				this.verifyConstraint(business, effectivePerson.getDistinguishedName(), bytes.length, fileName);
 				originFile = new OriginFile(mapping.getName(), fileName, effectivePerson.getDistinguishedName(), fileMd5);
 				emc.check(originFile, CheckPersistType.all);
 				originFile.saveContent(mapping, bytes, fileName);
@@ -94,6 +95,7 @@ class ActionUploadCallback extends BaseAction {
 				emc.persist(attachment2);
 				emc.commit();
 			}else{
+				this.verifyConstraint(business, effectivePerson.getDistinguishedName(), originFile.getLength(), fileName);
 				attachment2 = new Attachment2(fileName, effectivePerson.getDistinguishedName(),
 						folderId, originFile.getId(), originFile.getLength(), originFile.getType());
 				emc.check(attachment2, CheckPersistType.all);

+ 1 - 1
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ActionUseCapacity.java

@@ -15,7 +15,7 @@ class ActionUseCapacity extends BaseAction {
 			ActionResult<Wo> result = new ActionResult<>();
 			Business business = new Business(emc);
 			String queryPerson = effectivePerson.getDistinguishedName();
-			if(effectivePerson.isManager() && StringUtils.isNotBlank(person)){
+			if(business.controlAble(effectivePerson) && StringUtils.isNotBlank(person)){
 				queryPerson = person;
 			}
 			Wo wo = new Wo();

+ 45 - 1
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/BaseAction.java

@@ -1,19 +1,26 @@
 package com.x.file.assemble.control.jaxrs.attachment2;
 
+import com.x.base.core.project.cache.Cache;
+import com.x.base.core.project.cache.CacheManager;
 import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.base.core.project.message.MessageConnector;
 import com.x.base.core.project.organization.OrganizationDefinition;
+import com.x.base.core.project.tools.ListTools;
 import com.x.file.assemble.control.Business;
+import com.x.file.core.entity.open.FileConfig;
+import com.x.file.core.entity.open.FileConfigProperties;
 import com.x.file.core.entity.personal.Attachment;
 import com.x.file.core.entity.personal.Attachment2;
 import com.x.file.core.entity.personal.Attachment2_;
+import org.apache.commons.io.FilenameUtils;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import java.util.Optional;
 
 abstract class BaseAction extends StandardJaxrsAction {
 
@@ -62,4 +69,41 @@ abstract class BaseAction extends StandardJaxrsAction {
 		p = cb.and(p, cb.equal(root.get(Attachment2_.folder), folderId));
 		return em.createQuery(cq.select(cb.count(root)).where(p)).getSingleResult() > 0;
 	}
-}
+
+	protected void verifyConstraint(Business business, String person, long size, String fileName) throws Exception{
+		Cache.CacheCategory cacheCategory = new Cache.CacheCategory(FileConfig.class);
+		Cache.CacheKey cacheKey = new Cache.CacheKey(FileConfig.class, Business.SYSTEM_CONFIG);
+		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+		FileConfig config = null;
+		if(optional.isPresent()){
+			config = (FileConfig)optional.get();
+		}else{
+			config = business.entityManagerContainer().firstEqual(FileConfig.class, FileConfig.person_FIELDNAME, Business.SYSTEM_CONFIG);
+			if(config != null){
+				CacheManager.put(cacheCategory, cacheKey, config);
+			}
+		}
+		if (config != null){
+			if(config.getCapacity()!=null && config.getCapacity()>0) {
+				long usedCapacity = (business.attachment2().getUseCapacity(person) + size) / (1024 * 1024);
+				if (usedCapacity > config.getCapacity()) {
+					throw new ExceptionCapacityOut(usedCapacity, config.getCapacity());
+				}
+			}
+			FileConfigProperties properties = config.getProperties();
+			String fileType = FilenameUtils.getExtension(fileName).toLowerCase();
+			if(properties!=null){
+				if(properties.getFileTypeIncludes()!=null && !properties.getFileTypeIncludes().isEmpty()){
+					if(!ListTools.contains(properties.getFileTypeIncludes(), fileType)){
+						throw new ExceptionAttachmentUploadDenied(fileName);
+					}
+				}
+				if(properties.getFileTypeExcludes()!=null && !properties.getFileTypeExcludes().isEmpty()){
+					if(ListTools.contains(properties.getFileTypeExcludes(), fileType)){
+						throw new ExceptionAttachmentUploadDenied(fileName);
+					}
+				}
+			}
+		}
+	}
+}

+ 15 - 0
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ExceptionAttachmentUploadDenied.java

@@ -0,0 +1,15 @@
+package com.x.file.assemble.control.jaxrs.attachment2;
+
+import com.x.base.core.project.exception.PromptException;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.file.core.entity.personal.Attachment;
+import com.x.file.core.entity.personal.Attachment2;
+
+class ExceptionAttachmentUploadDenied extends PromptException {
+
+	private static final long serialVersionUID = -7797553180316608418L;
+
+	ExceptionAttachmentUploadDenied(String name) {
+		super("【{}】文件类型不符合上传要求", name);
+	}
+}

+ 13 - 0
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ExceptionCapacityOut.java

@@ -0,0 +1,13 @@
+package com.x.file.assemble.control.jaxrs.attachment2;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionCapacityOut extends PromptException {
+
+	private static final long serialVersionUID = 5186249956453089454L;
+
+	ExceptionCapacityOut(long curCapacity, long limitCapacity) {
+		super("超过文件存储容量,当前将使用: {}M,限制使用:{}M", curCapacity, limitCapacity);
+	}
+
+}

+ 47 - 0
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/ActionGetSystemConfig.java

@@ -0,0 +1,47 @@
+package com.x.file.assemble.control.jaxrs.config;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.file.assemble.control.Business;
+import com.x.file.core.entity.open.FileConfig;
+
+class ActionGetSystemConfig extends BaseAction {
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Business business = new Business(emc);
+
+			/* 判断当前用户是否有权限访问 */
+			if(!business.controlAble(effectivePerson)) {
+				throw new ExceptionAccessDenied(effectivePerson.getDistinguishedName());
+			}
+
+			FileConfig config = emc.firstEqual(FileConfig.class, FileConfig.person_FIELDNAME, Business.SYSTEM_CONFIG);
+			if(config==null){
+				config = new FileConfig();
+				config.setPerson(Business.SYSTEM_CONFIG);
+				config.setCapacity(0);
+			}
+
+			Wo wo = Wo.copier.copy(config);
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends FileConfig {
+
+		private static final long serialVersionUID = -5752008990171522428L;
+
+		static WrapCopier<FileConfig, Wo> copier = WrapCopierFactory.wo(FileConfig.class, Wo.class, null,
+				FieldsInvisible);
+
+
+	}
+}

+ 27 - 0
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/ActionIsManager.java

@@ -0,0 +1,27 @@
+package com.x.file.assemble.control.jaxrs.config;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WrapBoolean;
+import com.x.file.assemble.control.Business;
+
+class ActionIsManager extends BaseAction {
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Business business = new Business(emc);
+			Wo wo = new Wo();
+			wo.setValue(business.controlAble(effectivePerson));
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WrapBoolean {
+
+
+	}
+}

+ 100 - 0
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/ActionSaveSystemConfig.java

@@ -0,0 +1,100 @@
+package com.x.file.assemble.control.jaxrs.config;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.entity.annotation.CheckPersistType;
+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.cache.CacheManager;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.tools.ListTools;
+import com.x.file.assemble.control.Business;
+import com.x.file.core.entity.open.FileConfig;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ActionSaveSystemConfig extends BaseAction {
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Business business = new Business(emc);
+
+			/* 判断当前用户是否有权限访问 */
+			if(!business.controlAble(effectivePerson)) {
+				throw new ExceptionAccessDenied(effectivePerson.getDistinguishedName());
+			}
+
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			FileConfig fileConfig = emc.firstEqual(FileConfig.class, FileConfig.person_FIELDNAME, Business.SYSTEM_CONFIG);
+			emc.beginTransaction(FileConfig.class);
+			if(fileConfig!=null){
+				if(wi.getCapacity()==null || wi.getCapacity() < 1){
+					fileConfig.setCapacity(0);
+				}else{
+					fileConfig.setCapacity(wi.getCapacity());
+				}
+				fileConfig.getProperties().setFileTypeIncludes(wi.getFileTypeIncludes());
+				fileConfig.getProperties().setFileTypeExcludes(wi.getFileTypeExcludes());
+				emc.check(fileConfig, CheckPersistType.all);
+			}else{
+				fileConfig = Wi.copier.copy(wi);
+				if(fileConfig.getCapacity()==null || fileConfig.getCapacity() < 1){
+					fileConfig.setCapacity(0);
+				}
+				fileConfig.setPerson(Business.SYSTEM_CONFIG);
+				fileConfig.getProperties().setFileTypeIncludes(wi.getFileTypeIncludes());
+				fileConfig.getProperties().setFileTypeExcludes(wi.getFileTypeExcludes());
+				emc.persist(fileConfig, CheckPersistType.all);
+			}
+			emc.commit();
+			CacheManager.notify(FileConfig.class);
+			Wo wo = new Wo();
+			wo.setId(fileConfig.getId());
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wi extends FileConfig {
+
+		private static final long serialVersionUID = 6275876832668367557L;
+
+		static WrapCopier<Wi, FileConfig> copier = WrapCopierFactory.wi(Wi.class, FileConfig.class, null,
+				ListTools.toList(JpaObject.FieldsUnmodify, FileConfig.properties_FIELDNAME));
+
+		@FieldDescribe("只允许上传的文件后缀")
+		private List<String> fileTypeIncludes = new ArrayList<>();
+
+		@FieldDescribe("不允许上传的文件后缀")
+		private List<String> fileTypeExcludes = new ArrayList<>();
+
+		public List<String> getFileTypeIncludes() {
+			return fileTypeIncludes;
+		}
+
+		public void setFileTypeIncludes(List<String> fileTypeIncludes) {
+			this.fileTypeIncludes = fileTypeIncludes;
+		}
+
+		public List<String> getFileTypeExcludes() {
+			return fileTypeExcludes;
+		}
+
+		public void setFileTypeExcludes(List<String> fileTypeExcludes) {
+			this.fileTypeExcludes = fileTypeExcludes;
+		}
+	}
+
+	public static class Wo extends WoId {
+
+	}
+
+}

+ 7 - 0
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/BaseAction.java

@@ -0,0 +1,7 @@
+package com.x.file.assemble.control.jaxrs.config;
+
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+
+abstract class BaseAction extends StandardJaxrsAction {
+
+}

+ 78 - 0
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/ConfigAction.java

@@ -0,0 +1,78 @@
+package com.x.file.assemble.control.jaxrs.config;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.*;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+
+@Path("config")
+@JaxrsDescribe("云文件管理配置")
+public class ConfigAction extends StandardJaxrsAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ConfigAction.class);
+
+	@JaxrsMethodDescribe(value = "判断当前用户是否是云文件管理员。", action = ActionIsManager.class)
+	@GET
+	@Path("is/file/manager")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void isFileManager(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<ActionIsManager.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionIsManager().execute(effectivePerson);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "获取云文件系统配置。", action = ActionGetSystemConfig.class)
+	@GET
+	@Path("system/config")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void getSystemConfig(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<ActionGetSystemConfig.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionGetSystemConfig().execute(effectivePerson);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "保存云文件系统配置.", action = ActionSaveSystemConfig.class)
+	@POST
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void saveSystemConfig(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+					   JsonElement jsonElement) {
+		ActionResult<ActionSaveSystemConfig.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionSaveSystemConfig().execute(effectivePerson, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, jsonElement);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+}

+ 13 - 2
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/recycle/ActionResume.java

@@ -2,7 +2,6 @@ package com.x.file.assemble.control.jaxrs.recycle;
 
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
-import com.x.base.core.entity.annotation.CheckPersistType;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WrapBoolean;
@@ -11,7 +10,6 @@ import com.x.file.core.entity.open.FileStatus;
 import com.x.file.core.entity.personal.Attachment2;
 import com.x.file.core.entity.personal.Folder2;
 import com.x.file.core.entity.personal.Recycle;
-import com.x.file.core.entity.personal.Share;
 import org.apache.commons.lang3.StringUtils;
 
 import javax.persistence.EntityManager;
@@ -33,9 +31,16 @@ class ActionResume extends BaseAction {
 			if(!effectivePerson.isManager() && !StringUtils.equals(effectivePerson.getDistinguishedName(), recycle.getPerson())) {
 				throw new ExceptionAccessDenied(effectivePerson.getDistinguishedName());
 			}
+			long usedSize = business.attachment2().getUseCapacity(effectivePerson.getDistinguishedName());
 			if("attachment".equals(recycle.getFileType())){
 				Attachment2 att = emc.find(recycle.getFileId(), Attachment2.class);
 				if(att!=null){
+					usedSize = usedSize + att.getLength();
+					int vResult = business.verifyConstraint(effectivePerson.getDistinguishedName(), usedSize);
+					if(vResult > 0){
+						long usedCapacity = usedSize / (1024 * 1024);
+						throw new ExceptionCapacityOut(usedCapacity, vResult);
+					}
 					EntityManager aem = emc.beginTransaction(Attachment2.class);
 					att.setStatus(FileStatus.VALID.getName());
 					aem.getTransaction().commit();
@@ -55,6 +60,12 @@ class ActionResume extends BaseAction {
 						fem.getTransaction().commit();
 						List<Attachment2> attachments = business.attachment2().listWithFolder2(fo.getId(),null);
 						for (Attachment2 att : attachments) {
+							usedSize = usedSize + att.getLength();
+							int vResult = business.verifyConstraint(effectivePerson.getDistinguishedName(), usedSize);
+							if(vResult > 0){
+								long usedCapacity = usedSize / (1024 * 1024);
+								throw new ExceptionCapacityOut(usedCapacity, vResult);
+							}
 							EntityManager aem = emc.beginTransaction(Attachment2.class);
 							att.setStatus(FileStatus.VALID.getName());
 							aem.getTransaction().commit();

+ 13 - 0
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/recycle/ExceptionCapacityOut.java

@@ -0,0 +1,13 @@
+package com.x.file.assemble.control.jaxrs.recycle;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionCapacityOut extends PromptException {
+
+	private static final long serialVersionUID = 5186249956453089454L;
+
+	ExceptionCapacityOut(long curCapacity, long limitCapacity) {
+		super("超过文件存储容量,当前将使用: {}M,限制使用:{}M", curCapacity, limitCapacity);
+	}
+
+}

+ 21 - 7
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/share/ActionSaveToFolder.java

@@ -6,7 +6,6 @@ import com.x.base.core.entity.annotation.CheckPersistType;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WrapBoolean;
-import com.x.base.core.project.organization.Unit;
 import com.x.file.assemble.control.Business;
 import com.x.file.core.entity.open.FileStatus;
 import com.x.file.core.entity.personal.Attachment2;
@@ -57,14 +56,23 @@ class ActionSaveToFolder extends BaseAction {
 				throw new Exception("fileId can not be empty.");
 			}
 			/* 转存文件或目录到指定的目录下 */
+			long usedSize = business.attachment2().getUseCapacity(effectivePerson.getDistinguishedName());
 			if("attachment".equals(share.getFileType())){
 				Attachment2 att = emc.find(fileId, Attachment2.class);
-				Attachment2 newAtt = new Attachment2(att.getName(), effectivePerson.getDistinguishedName(),
-						folderId, att.getOriginFile(), att.getLength(), att.getType());
-				emc.check(newAtt, CheckPersistType.all);
-				emc.beginTransaction(Attachment2.class);
-				emc.persist(newAtt);
-				emc.commit();
+				if(att!=null) {
+					usedSize = usedSize + att.getLength();
+					int vResult = business.verifyConstraint(effectivePerson.getDistinguishedName(), usedSize);
+					if(vResult > 0){
+						long usedCapacity = usedSize / (1024 * 1024);
+						throw new ExceptionCapacityOut(usedCapacity, vResult);
+					}
+					Attachment2 newAtt = new Attachment2(att.getName(), effectivePerson.getDistinguishedName(),
+							folderId, att.getOriginFile(), att.getLength(), att.getType());
+					emc.check(newAtt, CheckPersistType.all);
+					emc.beginTransaction(Attachment2.class);
+					emc.persist(newAtt);
+					emc.commit();
+				}
 			}else{
 				Folder2 folder = emc.find(fileId, Folder2.class);
 				Folder2 newFolder = new Folder2(folder.getName(),effectivePerson.getDistinguishedName(),folderId,folder.getStatus());
@@ -81,6 +89,12 @@ class ActionSaveToFolder extends BaseAction {
 					em1.getTransaction().commit();
 					List<Attachment2> attachments = business.attachment2().listWithFolder2(subFold,FileStatus.VALID.getName());
 					for (Attachment2 att : attachments) {
+						usedSize = usedSize + att.getLength();
+						int vResult = business.verifyConstraint(effectivePerson.getDistinguishedName(), usedSize);
+						if(vResult > 0){
+							long usedCapacity = usedSize / (1024 * 1024);
+							throw new ExceptionCapacityOut(usedCapacity, vResult);
+						}
 						Attachment2 newAtt = new Attachment2(att.getName(), effectivePerson.getDistinguishedName(),
 								folderId, att.getOriginFile(), att.getLength(), att.getType());
 						EntityManager em2 = emc.beginTransaction(Attachment2.class);

+ 13 - 0
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/share/ExceptionCapacityOut.java

@@ -0,0 +1,13 @@
+package com.x.file.assemble.control.jaxrs.share;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionCapacityOut extends PromptException {
+
+	private static final long serialVersionUID = 5186249956453089454L;
+
+	ExceptionCapacityOut(long curCapacity, long limitCapacity) {
+		super("超过文件存储容量,当前将使用: {}M,限制使用:{}M", curCapacity, limitCapacity);
+	}
+
+}

+ 3 - 0
o2server/x_file_core_entity/src/main/java/com/x/file/core/entity/PersistenceProperties.java

@@ -40,6 +40,9 @@ public final class PersistenceProperties extends AbstractPersistenceProperties {
 		public static class Link {
 			public static final String table = "FILE_LINK";
 		}
+		public static class Config {
+			public static final String table = "FILE_CONFIG";
+		}
 
 	}
 

+ 116 - 0
o2server/x_file_core_entity/src/main/java/com/x/file/core/entity/open/FileConfig.java

@@ -0,0 +1,116 @@
+package com.x.file.core.entity.open;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.entity.SliceJpaObject;
+import com.x.base.core.entity.annotation.*;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.file.core.entity.PersistenceProperties;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.openjpa.persistence.Persistent;
+import org.apache.openjpa.persistence.jdbc.Index;
+import org.apache.openjpa.persistence.jdbc.Strategy;
+
+import javax.persistence.*;
+
+@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@Entity
+@Table(name = PersistenceProperties.Open.Config.table, uniqueConstraints = {
+		@UniqueConstraint(name = PersistenceProperties.Personal.Folder.table + JpaObject.IndexNameMiddle
+				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,
+						JpaObject.CREATETIMECOLUMN, JpaObject.UPDATETIMECOLUMN, JpaObject.SEQUENCECOLUMN }) })
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class FileConfig extends SliceJpaObject {
+
+	private static final long serialVersionUID = -2266232193925155825L;
+	private static final String TABLE = PersistenceProperties.Open.Config.table;
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	@FieldDescribe("数据库主键,自动生成.")
+	@Id
+	@Column(length = length_id, name = ColumnNamePrefix + id_FIELDNAME)
+	private String id = createId();
+
+	/* 以上为 JpaObject 默认字段 */
+
+	public void onPersist() throws Exception {
+		if(this.properties == null){
+			this.properties = new FileConfigProperties();
+		}
+	}
+
+	public FileConfig() {
+		this.properties = new FileConfigProperties();
+	}
+
+	/* 更新运行方法 */
+
+	public static final String person_FIELDNAME = "person";
+	@FieldDescribe("所属用户.")
+	@Column(length = length_255B, name = ColumnNamePrefix + person_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + person_FIELDNAME)
+	@CheckPersist(allowEmpty = false, citationNotExists = @CitationNotExist(fields = person_FIELDNAME, type = FileConfig.class))
+	private String person;
+
+	public static final String name_FIELDNAME = "name";
+	@FieldDescribe("分类名称.")
+	@Column(length = length_255B, name = ColumnNamePrefix + name_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String name;
+
+	public static final String capacity_FIELDNAME = "capacity";
+	@FieldDescribe("容量(单位M),0表示无限大.")
+	@Column(name = ColumnNamePrefix + capacity_FIELDNAME)
+	@CheckPersist(allowEmpty = false)
+	private Integer capacity;
+
+	public static final String properties_FIELDNAME = "properties";
+	@FieldDescribe("属性对象存储字段.")
+	@Persistent(fetch = FetchType.EAGER)
+	@Strategy(JsonPropertiesValueHandler)
+	@Column(length = JpaObject.length_4K, name = ColumnNamePrefix + properties_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private FileConfigProperties properties;
+
+	public String getPerson() {
+		return person;
+	}
+
+	public void setPerson(String person) {
+		this.person = person;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Integer getCapacity() {
+		return capacity;
+	}
+
+	public void setCapacity(Integer capacity) {
+		this.capacity = capacity;
+	}
+
+	public FileConfigProperties getProperties() {
+		if (null == this.properties) {
+			this.properties = new FileConfigProperties();
+		}
+		return this.properties;
+	}
+
+	public void setProperties(FileConfigProperties properties) {
+		this.properties = properties;
+	}
+
+}

+ 34 - 0
o2server/x_file_core_entity/src/main/java/com/x/file/core/entity/open/FileConfigProperties.java

@@ -0,0 +1,34 @@
+package com.x.file.core.entity.open;
+
+import com.x.base.core.entity.JsonProperties;
+import com.x.base.core.project.annotation.FieldDescribe;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class FileConfigProperties extends JsonProperties {
+
+	private static final long serialVersionUID = -1259157593040432239L;
+
+	@FieldDescribe("只允许上传的文件后缀")
+	private List<String> fileTypeIncludes = new ArrayList<>();
+
+	@FieldDescribe("不允许上传的文件后缀")
+	private List<String> fileTypeExcludes = new ArrayList<>();
+
+	public List<String> getFileTypeIncludes() {
+		return fileTypeIncludes;
+	}
+
+	public void setFileTypeIncludes(List<String> fileTypeIncludes) {
+		this.fileTypeIncludes = fileTypeIncludes;
+	}
+
+	public List<String> getFileTypeExcludes() {
+		return fileTypeExcludes;
+	}
+
+	public void setFileTypeExcludes(List<String> fileTypeExcludes) {
+		this.fileTypeExcludes = fileTypeExcludes;
+	}
+}

+ 11 - 14
o2server/x_general_assemble_control/src/main/java/com/x/general/assemble/control/schedule/Clean.java

@@ -44,11 +44,10 @@ public class Clean extends AbstractJob {
 	private Long clearGeneralFile() throws Exception {
 		List<GeneralFile> os = null;
 		Long count = 0L;
-
 		do {
-			os = this.listInstant();
-			if (!os.isEmpty()) {
-				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				os = this.listInstant(emc);
+				if (!os.isEmpty()) {
 					emc.beginTransaction(GeneralFile.class);
 					for (GeneralFile o : os) {
 						StorageMapping gfMapping = ThisApplication.context().storageMappings().get(GeneralFile.class,
@@ -64,16 +63,14 @@ public class Clean extends AbstractJob {
 		return count;
 	}
 
-	private List<GeneralFile> listInstant() throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			EntityManager em = emc.get(GeneralFile.class);
-			CriteriaBuilder cb = em.getCriteriaBuilder();
-			CriteriaQuery<GeneralFile> cq = cb.createQuery(GeneralFile.class);
-			Root<GeneralFile> root = cq.from(GeneralFile.class);
-			Date limit = DateTools.floorDate(new Date(), 0);
-			Predicate p = cb.lessThan(root.get(GeneralFile_.createTime), limit);
-			return em.createQuery(cq.select(root).where(p)).setMaxResults(100).getResultList();
-		}
+	private List<GeneralFile> listInstant(EntityManagerContainer emc) throws Exception {
+		EntityManager em = emc.get(GeneralFile.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<GeneralFile> cq = cb.createQuery(GeneralFile.class);
+		Root<GeneralFile> root = cq.from(GeneralFile.class);
+		Date limit = DateTools.floorDate(new Date(), 0);
+		Predicate p = cb.lessThan(root.get(GeneralFile_.createTime), limit);
+		return em.createQuery(cq.select(root).where(p)).setMaxResults(100).getResultList();
 	}
 
 }

+ 104 - 0
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionHasIdentity.java

@@ -0,0 +1,104 @@
+package com.x.organization.assemble.express.jaxrs.unit;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.cache.Cache.CacheKey;
+import com.x.base.core.project.cache.CacheManager;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WrapBoolean;
+import com.x.organization.assemble.express.Business;
+import com.x.organization.core.entity.Identity;
+import com.x.organization.core.entity.Unit;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.Optional;
+
+class ActionHasIdentity extends BaseAction {
+
+	/*** 校验身份是否是指定组织的成员 */
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			Business business = new Business(emc);
+			CacheKey cacheKey = new CacheKey(this.getClass(), wi.getIdentity(), wi.getUnit(), wi.getRecursive());
+			Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+			if (optional.isPresent()) {
+				result.setData((Wo) optional.get());
+			} else {
+				Wo wo = new Wo();
+				wo.setValue(this.hasIdentity(business, wi));
+				CacheManager.put(cacheCategory, cacheKey, wo);
+				result.setData(wo);
+			}
+			return result;
+		}
+	}
+
+	public static class Wi extends GsonPropertyObject {
+
+		@FieldDescribe("*身份")
+		private String identity;
+
+		@FieldDescribe("*组织")
+		private String unit;
+
+		@FieldDescribe("*是否递归查找组织(true|false)")
+		private Boolean recursive = true;
+
+		public String getIdentity() {
+			return identity;
+		}
+
+		public void setIdentity(String identity) {
+			this.identity = identity;
+		}
+
+		public String getUnit() {
+			return unit;
+		}
+
+		public void setUnit(String unit) {
+			this.unit = unit;
+		}
+
+		public Boolean getRecursive() {
+			return recursive;
+		}
+
+		public void setRecursive(Boolean recursive) {
+			this.recursive = recursive;
+		}
+	}
+
+	public static class Wo extends WrapBoolean {
+	}
+
+	private boolean hasIdentity(Business business, Wi wi) throws Exception {
+		boolean result = false;
+
+		if(StringUtils.isNotBlank(wi.getIdentity()) && StringUtils.isNotBlank(wi.getUnit())) {
+			Identity identity = business.identity().pick(wi.getIdentity());
+			Unit unit = business.unit().pick(wi.getUnit());
+			if (identity != null && unit != null) {
+				if (unit.getId().equals(identity.getUnit())) {
+					result = true;
+				} else if (BooleanUtils.isTrue(wi.getRecursive())) {
+					List<String> units = business.unit().listSupNested(identity.getUnit());
+					if (units.contains(unit.getId())) {
+						result = true;
+					}
+				}
+			}
+		}
+
+		return result;
+	}
+
+}

+ 113 - 0
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionHasPerson.java

@@ -0,0 +1,113 @@
+package com.x.organization.assemble.express.jaxrs.unit;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.cache.Cache.CacheKey;
+import com.x.base.core.project.cache.CacheManager;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WrapBoolean;
+import com.x.base.core.project.tools.ListTools;
+import com.x.organization.assemble.express.Business;
+import com.x.organization.core.entity.Identity;
+import com.x.organization.core.entity.Person;
+import com.x.organization.core.entity.Unit;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.Optional;
+
+class ActionHasPerson extends BaseAction {
+
+	/*** 校验用户是否在指定组织中注册身份 */
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			Business business = new Business(emc);
+			CacheKey cacheKey = new CacheKey(this.getClass(), wi.getPerson(), wi.getUnit(), wi.getRecursive());
+			Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+			if (optional.isPresent()) {
+				result.setData((Wo) optional.get());
+			} else {
+				Wo wo = new Wo();
+				wo.setValue(this.hasIdentity(business, wi));
+				CacheManager.put(cacheCategory, cacheKey, wo);
+				result.setData(wo);
+			}
+			return result;
+		}
+	}
+
+	public static class Wi extends GsonPropertyObject {
+
+		@FieldDescribe("*用户")
+		private String person;
+
+		@FieldDescribe("*组织")
+		private String unit;
+
+		@FieldDescribe("*是否递归查找组织(true|false)")
+		private Boolean recursive = true;
+
+		public String getPerson() {
+			return person;
+		}
+
+		public void setPerson(String person) {
+			this.person = person;
+		}
+
+		public String getUnit() {
+			return unit;
+		}
+
+		public void setUnit(String unit) {
+			this.unit = unit;
+		}
+
+		public Boolean getRecursive() {
+			return recursive;
+		}
+
+		public void setRecursive(Boolean recursive) {
+			this.recursive = recursive;
+		}
+	}
+
+	public static class Wo extends WrapBoolean {
+	}
+
+	private boolean hasIdentity(Business business, Wi wi) throws Exception {
+		boolean result = false;
+
+		if(StringUtils.isNotBlank(wi.getPerson()) && StringUtils.isNotBlank(wi.getUnit())) {
+			Person person = business.person().pick(wi.getPerson());
+			if(person!=null) {
+				List<Identity> identityList = business.identity().listByPerson(person.getId());
+				Unit unit = business.unit().pick(wi.getUnit());
+				if (identityList != null && !identityList.isEmpty() && unit != null) {
+					List<String> units = ListTools.extractProperty(identityList, Identity.unit_FIELDNAME, String.class, true, true);
+					if (units.contains(unit.getId())) {
+						result = true;
+					} else if (BooleanUtils.isTrue(wi.getRecursive())) {
+						for (String unitId : units){
+							List<String> units2 = business.unit().listSupNested(unitId);
+							if (units2.contains(unit.getId())) {
+								result = true;
+								break;
+							}
+						}
+					}
+				}
+			}
+		}
+
+		return result;
+	}
+
+}

+ 36 - 0
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/UnitAction.java

@@ -585,4 +585,40 @@ public class UnitAction extends StandardJaxrsAction {
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
+
+	@JaxrsMethodDescribe(value = "校验身份是否是指定组织的成员.", action = ActionHasIdentity.class)
+	@POST
+	@Path("check/unit/has/identity")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void checkHasIdentity(@Suspended final AsyncResponse asyncResponse,
+								 @Context HttpServletRequest request, JsonElement jsonElement) {
+		ActionResult<ActionHasIdentity.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionHasIdentity().execute(effectivePerson, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "校验用户是否在指定组织中注册身份.", action = ActionHasPerson.class)
+	@POST
+	@Path("check/unit/has/person")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void checkHasPerson(@Suspended final AsyncResponse asyncResponse,
+								 @Context HttpServletRequest request, JsonElement jsonElement) {
+		ActionResult<ActionHasPerson.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionHasPerson().execute(effectivePerson, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
 }

+ 4 - 1
o2server/x_program_center/src/main/java/com/x/program/center/Context.java

@@ -236,7 +236,8 @@ public class Context extends AbstractContext {
 				OrganizationDefinition.TeamWorkManager, OrganizationDefinition.CMSManager,
 				OrganizationDefinition.OKRManager, OrganizationDefinition.CRMManager,
 				OrganizationDefinition.QueryManager, OrganizationDefinition.MessageManager,
-				OrganizationDefinition.SearchPrivilege, OrganizationDefinition.HotPictureManager);
+				OrganizationDefinition.SearchPrivilege, OrganizationDefinition.HotPictureManager,
+				OrganizationDefinition.FileManager);
 		roles = roles.stream().sorted(Comparator.comparing(String::toString)).collect(Collectors.toList());
 		for (String str : roles) {
 			EntityManager em = emc.get(Role.class);
@@ -310,6 +311,8 @@ public class Context extends AbstractContext {
 			return OrganizationDefinition.MessageManager_description;
 		} else if (OrganizationDefinition.SearchPrivilege.equalsIgnoreCase(str)) {
 			return OrganizationDefinition.SearchPrivilege_description;
+		} else if (OrganizationDefinition.FileManager.equalsIgnoreCase(str)) {
+			return OrganizationDefinition.FileManager_description;
 		}
 		return "";
 	}