Quellcode durchsuchen

云文件上传容量和文件类型限制

o2sword vor 5 Jahren
Ursprung
Commit
287d841d27
19 geänderte Dateien mit 433 neuen und 32 gelöschten Zeilen
  1. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_file_assemble_control.java
  2. 43 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/Business.java
  3. 2 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/ActionApplication.java
  4. 10 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/ConfigJaxrsFilter.java
  5. 10 2
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ActionUpload.java
  6. 2 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ActionUploadCallback.java
  7. 45 1
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/BaseAction.java
  8. 15 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ExceptionAttachmentUploadDenied.java
  9. 13 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/attachment2/ExceptionCapacityOut.java
  10. 47 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/ActionGetSystemConfig.java
  11. 100 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/ActionSaveSystemConfig.java
  12. 7 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/BaseAction.java
  13. 64 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/config/ConfigAction.java
  14. 11 2
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/recycle/ActionResume.java
  15. 13 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/recycle/ExceptionCapacityOut.java
  16. 19 7
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/share/ActionSaveToFolder.java
  17. 13 0
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/share/ExceptionCapacityOut.java
  18. 7 5
      o2server/x_file_core_entity/src/main/java/com/x/file/core/entity/open/FileConfig.java
  19. 11 14
      o2server/x_general_assemble_control/src/main/java/com/x/general/assemble/control/schedule/Clean.java

+ 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 = {
 @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.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.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" })
 		storageTypes = { StorageType.file }, storeJars = { "x_file_core_entity", "x_organization_core_express", "x_organization_core_entity" })
 public class x_file_assemble_control extends Deployable {
 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;
 package com.x.file.assemble.control;
 
 
 import com.x.base.core.container.EntityManagerContainer;
 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.assemble.control.factory.*;
+import com.x.file.core.entity.open.FileConfig;
 import com.x.organization.core.express.Organization;
 import com.x.organization.core.express.Organization;
 
 
+import java.util.Optional;
+
 public class Business {
 public class Business {
 
 
 	public final static String TOP_FOLD = "$$TOP_FOLD";
 	public final static String TOP_FOLD = "$$TOP_FOLD";
 
 
+	public final static String SYSTEM_CONFIG = "systemConfig";
+
 	private EntityManagerContainer emc;
 	private EntityManagerContainer emc;
 
 
 	public Business(EntityManagerContainer emc) throws Exception {
 	public Business(EntityManagerContainer emc) throws Exception {
@@ -99,4 +108,38 @@ public class Business {
 		return organization;
 		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.attachment.AttachmentAction;
 import com.x.file.assemble.control.jaxrs.attachment2.Attachment2Action;
 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.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.editor.EditorAction;
 import com.x.file.assemble.control.jaxrs.file.FileAction;
 import com.x.file.assemble.control.jaxrs.file.FileAction;
 import com.x.file.assemble.control.jaxrs.folder.FolderAction;
 import com.x.file.assemble.control.jaxrs.folder.FolderAction;
@@ -28,6 +29,7 @@ public class ActionApplication extends AbstractActionApplication {
 		classes.add(RecycleAction.class);
 		classes.add(RecycleAction.class);
 		classes.add(EditorAction.class);
 		classes.add(EditorAction.class);
 		classes.add(FileAction.class);
 		classes.add(FileAction.class);
+		classes.add(ConfigAction.class);
 		return classes;
 		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.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.base.core.project.jaxrs.WoId;
 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.DefaultCharset;
+import com.x.base.core.project.tools.ListTools;
 import com.x.file.assemble.control.Business;
 import com.x.file.assemble.control.Business;
 import com.x.file.assemble.control.FileUtil;
 import com.x.file.assemble.control.FileUtil;
 import com.x.file.assemble.control.ThisApplication;
 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.open.OriginFile;
 import com.x.file.core.entity.personal.Attachment2;
 import com.x.file.core.entity.personal.Attachment2;
 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 {
 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,
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String folderId, String fileName, String fileMd5, byte[] bytes,
 			FormDataContentDisposition disposition) throws Exception {
 			FormDataContentDisposition disposition) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
@@ -82,6 +87,7 @@ class ActionUpload extends BaseAction {
 				if(bytes==null){
 				if(bytes==null){
 					throw new ExceptionAttachmentNone(fileName);
 					throw new ExceptionAttachmentNone(fileName);
 				}
 				}
+				this.verifyConstraint(business, effectivePerson.getDistinguishedName(), bytes.length, fileName);
 				originFile = new OriginFile(mapping.getName(), fileName, effectivePerson.getDistinguishedName(), fileMd5);
 				originFile = new OriginFile(mapping.getName(), fileName, effectivePerson.getDistinguishedName(), fileMd5);
 				emc.check(originFile, CheckPersistType.all);
 				emc.check(originFile, CheckPersistType.all);
 				originFile.saveContent(mapping, bytes, fileName);
 				originFile.saveContent(mapping, bytes, fileName);
@@ -94,6 +100,7 @@ class ActionUpload extends BaseAction {
 				emc.persist(attachment2);
 				emc.persist(attachment2);
 				emc.commit();
 				emc.commit();
 			}else{
 			}else{
+				this.verifyConstraint(business, effectivePerson.getDistinguishedName(), originFile.getLength(), fileName);
 				attachment2 = new Attachment2(fileName, effectivePerson.getDistinguishedName(),
 				attachment2 = new Attachment2(fileName, effectivePerson.getDistinguishedName(),
 						folderId, originFile.getId(), originFile.getLength(), originFile.getType());
 						folderId, originFile.getId(), originFile.getLength(), originFile.getType());
 				emc.check(attachment2, CheckPersistType.all);
 				emc.check(attachment2, CheckPersistType.all);
@@ -110,4 +117,5 @@ class ActionUpload extends BaseAction {
 
 
 	public static class Wo extends WoId {
 	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){
 				if(bytes==null){
 					throw new ExceptionAttachmentNone(fileName);
 					throw new ExceptionAttachmentNone(fileName);
 				}
 				}
+				this.verifyConstraint(business, effectivePerson.getDistinguishedName(), bytes.length, fileName);
 				originFile = new OriginFile(mapping.getName(), fileName, effectivePerson.getDistinguishedName(), fileMd5);
 				originFile = new OriginFile(mapping.getName(), fileName, effectivePerson.getDistinguishedName(), fileMd5);
 				emc.check(originFile, CheckPersistType.all);
 				emc.check(originFile, CheckPersistType.all);
 				originFile.saveContent(mapping, bytes, fileName);
 				originFile.saveContent(mapping, bytes, fileName);
@@ -94,6 +95,7 @@ class ActionUploadCallback extends BaseAction {
 				emc.persist(attachment2);
 				emc.persist(attachment2);
 				emc.commit();
 				emc.commit();
 			}else{
 			}else{
+				this.verifyConstraint(business, effectivePerson.getDistinguishedName(), originFile.getLength(), fileName);
 				attachment2 = new Attachment2(fileName, effectivePerson.getDistinguishedName(),
 				attachment2 = new Attachment2(fileName, effectivePerson.getDistinguishedName(),
 						folderId, originFile.getId(), originFile.getLength(), originFile.getType());
 						folderId, originFile.getId(), originFile.getLength(), originFile.getType());
 				emc.check(attachment2, CheckPersistType.all);
 				emc.check(attachment2, CheckPersistType.all);

+ 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;
 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.gson.XGsonBuilder;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.base.core.project.message.MessageConnector;
 import com.x.base.core.project.message.MessageConnector;
 import com.x.base.core.project.organization.OrganizationDefinition;
 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.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.Attachment;
 import com.x.file.core.entity.personal.Attachment2;
 import com.x.file.core.entity.personal.Attachment2;
 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.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import javax.persistence.criteria.Root;
+import java.util.Optional;
 
 
 abstract class BaseAction extends StandardJaxrsAction {
 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));
 		p = cb.and(p, cb.equal(root.get(Attachment2_.folder), folderId));
 		return em.createQuery(cq.select(cb.count(root)).where(p)).getSingleResult() > 0;
 		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);
+
+
+	}
+}

+ 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 {
+
+}

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

@@ -0,0 +1,64 @@
+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.annotation.JaxrsParameterDescribe;
+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 com.x.file.assemble.control.jaxrs.recycle.*;
+
+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;
+import java.util.List;
+
+@Path("config")
+@JaxrsDescribe("云文件管理配置")
+public class ConfigAction extends StandardJaxrsAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ConfigAction.class);
+
+	@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));
+	}
+
+}

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

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

+ 7 - 5
o2server/x_file_core_entity/src/main/java/com/x/file/core/entity/open/FileConifg.java → o2server/x_file_core_entity/src/main/java/com/x/file/core/entity/open/FileConfig.java

@@ -19,7 +19,7 @@ import javax.persistence.*;
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,
 						JpaObject.CREATETIMECOLUMN, JpaObject.UPDATETIMECOLUMN, JpaObject.SEQUENCECOLUMN }) })
 						JpaObject.CREATETIMECOLUMN, JpaObject.UPDATETIMECOLUMN, JpaObject.SEQUENCECOLUMN }) })
 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
-public class FileConifg extends SliceJpaObject {
+public class FileConfig extends SliceJpaObject {
 
 
 	private static final long serialVersionUID = -2266232193925155825L;
 	private static final long serialVersionUID = -2266232193925155825L;
 	private static final String TABLE = PersistenceProperties.Open.Config.table;
 	private static final String TABLE = PersistenceProperties.Open.Config.table;
@@ -40,10 +40,12 @@ public class FileConifg extends SliceJpaObject {
 	/* 以上为 JpaObject 默认字段 */
 	/* 以上为 JpaObject 默认字段 */
 
 
 	public void onPersist() throws Exception {
 	public void onPersist() throws Exception {
-
+		if(this.properties == null){
+			this.properties = new FileConfigProperties();
+		}
 	}
 	}
 
 
-	public FileConifg() {
+	public FileConfig() {
 		this.properties = new FileConfigProperties();
 		this.properties = new FileConfigProperties();
 	}
 	}
 
 
@@ -53,7 +55,7 @@ public class FileConifg extends SliceJpaObject {
 	@FieldDescribe("所属用户.")
 	@FieldDescribe("所属用户.")
 	@Column(length = length_255B, name = ColumnNamePrefix + person_FIELDNAME)
 	@Column(length = length_255B, name = ColumnNamePrefix + person_FIELDNAME)
 	@Index(name = TABLE + IndexNameMiddle + person_FIELDNAME)
 	@Index(name = TABLE + IndexNameMiddle + person_FIELDNAME)
-	@CheckPersist(allowEmpty = false)
+	@CheckPersist(allowEmpty = false, citationNotExists = @CitationNotExist(fields = person_FIELDNAME, type = FileConfig.class))
 	private String person;
 	private String person;
 
 
 	public static final String name_FIELDNAME = "name";
 	public static final String name_FIELDNAME = "name";
@@ -63,7 +65,7 @@ public class FileConifg extends SliceJpaObject {
 	private String name;
 	private String name;
 
 
 	public static final String capacity_FIELDNAME = "capacity";
 	public static final String capacity_FIELDNAME = "capacity";
-	@FieldDescribe("容量(单位M).")
+	@FieldDescribe("容量(单位M),0表示无限大.")
 	@Column(name = ColumnNamePrefix + capacity_FIELDNAME)
 	@Column(name = ColumnNamePrefix + capacity_FIELDNAME)
 	@CheckPersist(allowEmpty = false)
 	@CheckPersist(allowEmpty = false)
 	private Integer capacity;
 	private Integer capacity;

+ 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 {
 	private Long clearGeneralFile() throws Exception {
 		List<GeneralFile> os = null;
 		List<GeneralFile> os = null;
 		Long count = 0L;
 		Long count = 0L;
-
 		do {
 		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);
 					emc.beginTransaction(GeneralFile.class);
 					for (GeneralFile o : os) {
 					for (GeneralFile o : os) {
 						StorageMapping gfMapping = ThisApplication.context().storageMappings().get(GeneralFile.class,
 						StorageMapping gfMapping = ThisApplication.context().storageMappings().get(GeneralFile.class,
@@ -64,16 +63,14 @@ public class Clean extends AbstractJob {
 		return count;
 		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();
 	}
 	}
 
 
 }
 }