roo00 před 7 roky
rodič
revize
c7f96c5708
36 změnil soubory, kde provedl 1191 přidání a 40 odebrání
  1. 9 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/Business.java
  2. 50 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/factory/FileFactory.java
  3. 67 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionContent.java
  4. 92 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionCopy.java
  5. 79 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionCreate.java
  6. 46 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionDelete.java
  7. 67 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionDownload.java
  8. 80 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionEdit.java
  9. 48 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionGet.java
  10. 54 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionListNext.java
  11. 53 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionListPrev.java
  12. 47 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionListWithApplication.java
  13. 57 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionUpload.java
  14. 16 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/BaseAction.java
  15. 12 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ExceptionEmptyName.java
  16. 12 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ExceptionErrorName.java
  17. 240 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/FileAction.java
  18. 2 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/ActionApplication.java
  19. 1 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/CmsJaxrsFilter.java
  20. 20 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/input/ActionCover.java
  21. 14 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/input/ActionCreate.java
  22. 17 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/input/ActionPrepareCover.java
  23. 10 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/input/ActionPrepareCreate.java
  24. 9 2
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/output/ActionList.java
  25. 5 12
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/output/ActionSelect.java
  26. 3 0
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/PersistenceProperties.java
  27. 17 11
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/wrap/WrapCms.java
  28. 5 0
      o2server/x_collaboration_assemble_websocket/src/main/webapp/WEB-INF/web.xml
  29. 5 0
      o2server/x_organization_assemble_authentication/src/main/webapp/WEB-INF/web.xml
  30. 6 3
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionEdit.java
  31. 8 2
      o2server/x_processplatform_assemble_bam/src/main/webapp/WEB-INF/web.xml
  32. 1 1
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/file/FileAction.java
  33. 8 2
      o2server/x_processplatform_assemble_designer/src/main/webapp/WEB-INF/web.xml
  34. 8 2
      o2server/x_processplatform_assemble_surface/src/main/webapp/WEB-INF/web.xml
  35. 5 5
      o2server/x_processplatform_assemble_surface/src/test/java/com/x/processplatform/assemble/surface/test/TestClientImportFile.java
  36. 18 0
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/ScriptHelper.java

+ 9 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/Business.java

@@ -18,6 +18,7 @@ import com.x.cms.assemble.control.factory.CategoryExtFactory;
 import com.x.cms.assemble.control.factory.CategoryInfoFactory;
 import com.x.cms.assemble.control.factory.DocumentFactory;
 import com.x.cms.assemble.control.factory.DocumentViewRecordFactory;
+import com.x.cms.assemble.control.factory.FileFactory;
 import com.x.cms.assemble.control.factory.FileInfoFactory;
 import com.x.cms.assemble.control.factory.FormFactory;
 import com.x.cms.assemble.control.factory.FormFieldFactory;
@@ -59,6 +60,7 @@ public class Business {
 	private DocumentFactory documentFactory;
 	private DocumentViewRecordFactory documentViewRecordFactory;
 	private FormFactory formFactory;
+	private FileFactory fileFactory;
 	private QueryViewFactory queryViewFactory;
 	private ViewCategoryFactory viewCategoryFactory;
 	private ViewFactory viewFactory;
@@ -72,6 +74,13 @@ public class Business {
 	private FormFieldFactory formFieldFactory;
 	private ReviewFactory reviewFactory;
 
+	public FileFactory fileFactory() throws Exception {
+		if (null == this.fileFactory) {
+			this.fileFactory = new FileFactory(this);
+		}
+		return fileFactory;
+	}
+	
 	public ReviewFactory reviewFactory() throws Exception {
 		if (null == this.reviewFactory) {
 			this.reviewFactory = new ReviewFactory(this);

+ 50 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/factory/FileFactory.java

@@ -0,0 +1,50 @@
+package com.x.cms.assemble.control.factory;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+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 com.x.cms.assemble.control.AbstractFactory;
+import com.x.cms.assemble.control.Business;
+import com.x.cms.core.entity.element.File;
+import com.x.cms.core.entity.element.File_;
+
+public class FileFactory extends AbstractFactory {
+
+	public FileFactory(Business business) throws Exception {
+		super(business);
+	}
+	
+	public List<String> listWithApplication(String applicationId) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(File.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<File> root = cq.from(File.class);
+		Predicate p = cb.equal(root.get(File_.appId), applicationId);
+		cq.select(root.get(File_.id)).where(p);
+		return em.createQuery(cq).getResultList();
+	}
+
+	public List<File> listWithApplicationObject(String applicationId) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(File.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<File> cq = cb.createQuery(File.class);
+		Root<File> root = cq.from(File.class);
+		Predicate p = cb.equal(root.get(File_.appId), applicationId);
+		cq.select(root).where(p);
+		return em.createQuery(cq).getResultList();
+	}
+
+	public <T extends File> List<T> sort(List<T> list) {
+		list = list.stream().sorted(Comparator.comparing(File::getName, Comparator.nullsLast(String::compareTo)))
+				.collect(Collectors.toList());
+		return list;
+	}
+
+}

+ 67 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionContent.java

@@ -0,0 +1,67 @@
+package com.x.cms.assemble.control.file;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+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.WoFile;
+import com.x.processplatform.core.entity.element.Application;
+import com.x.processplatform.core.entity.element.File;
+
+import net.sf.ehcache.Ehcache;
+import net.sf.ehcache.Element;
+
+class ActionContent extends StandardJaxrsAction {
+
+	private Ehcache cache = ApplicationCache.instance().getCache(File.class);
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String flag) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Wo wo = null;
+			String cacheKey = ApplicationCache.concreteCacheKey(this.getClass(), flag);
+			Element element = cache.get(cacheKey);
+			if ((null != element) && (null != element.getObjectValue())) {
+				wo = (Wo) element.getObjectValue();
+			} else {
+				File file = emc.flag(flag, File.class);
+				if (null == file) {
+					throw new ExceptionEntityNotExist(flag, File.class);
+				}
+				Application application = emc.find(file.getApplication(), Application.class);
+				if (null == application) {
+					throw new ExceptionEntityNotExist(file.getApplication(), Application.class);
+				}
+				byte[] bs = new byte[] {};
+				if (StringUtils.isNotEmpty(file.getData())) {
+					bs = Base64.decodeBase64(file.getData());
+				}
+				wo = new Wo(bs, this.contentType(false, file.getFileName()),
+						this.contentDisposition(false, file.getFileName()));
+				/**
+				 * 对10M以下的文件进行缓存
+				 */
+				if (bs.length < (1024 * 1024 * 10)) {
+					cache.put(new Element(cacheKey, wo));
+				}
+			}
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoFile {
+
+		public Wo(byte[] bytes, String contentType, String contentDisposition) {
+			super(bytes, contentType, contentDisposition);
+		}
+
+	}
+
+}

+ 92 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionCopy.java

@@ -0,0 +1,92 @@
+package com.x.cms.assemble.control.file;
+
+import java.util.Date;
+
+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 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.cache.ApplicationCache;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+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.cms.assemble.control.Business;
+import com.x.cms.core.entity.AppInfo;
+import com.x.cms.core.entity.element.File;
+import com.x.cms.core.entity.element.File_;
+
+class ActionCopy extends BaseAction {
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String flag, String applicationFlag) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Business business = new Business(emc);
+			File file = emc.flag(flag, File.class);
+			if (null == file) {
+				throw new ExceptionEntityNotExist(flag, File.class);
+			}
+			AppInfo application = emc.find(file.getAppId(), AppInfo.class);
+			if (null == application) {
+				throw new ExceptionEntityNotExist(file.getAppId(), AppInfo.class);
+			}
+			if (!business.editable(effectivePerson, application)) {
+				throw new ExceptionAccessDenied(effectivePerson.getDistinguishedName());
+			}
+			AppInfo toApplication = emc.flag(applicationFlag, AppInfo.class);
+			if (null == toApplication) {
+				throw new ExceptionEntityNotExist(applicationFlag, AppInfo.class);
+			}
+			if (!business.editable(effectivePerson, toApplication)) {
+				throw new ExceptionAccessDenied(effectivePerson.getDistinguishedName());
+			}
+			File toFile = new File();
+			toFile.setName(this.getName(business, file.getName(), toFile.getId(), toApplication.getId()));
+			toFile.setAppId(toApplication.getId());
+			toFile.setDescription(file.getDescription());
+			toFile.setData(file.getData());
+			toFile.setFileName(file.getFileName());
+			toFile.setLastUpdatePerson(file.getLastUpdatePerson());
+			toFile.setLastUpdateTime(new Date());
+			toFile.setLength(file.getLength());
+			emc.beginTransaction(File.class);
+			emc.persist(toFile, CheckPersistType.all);
+			emc.commit();
+			ApplicationCache.notify(File.class);
+			Wo wo = new Wo();
+			wo.setId(toFile.getId());
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	private String getName(Business business, String name, String id, String applicationId) throws Exception {
+		for (int i = 0; i < 10000; i++) {
+			if (!this.exist(business, name + i, id, applicationId)) {
+				return name;
+			}
+		}
+		throw new ExceptionErrorName(name);
+	}
+
+	private boolean exist(Business business, String name, String id, String applicationId) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(File.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<File> root = cq.from(File.class);
+		Predicate p = cb.or(cb.equal(root.get(File_.name), name), cb.equal(root.get(File_.alias), name),
+				cb.equal(root.get(File_.id), name));
+		p = cb.and(p, cb.equal(root.get(File_.appId), applicationId), cb.notEqual(root.get(File_.id), id));
+		cq.select(cb.count(root)).where(p);
+		return em.createQuery(cq).getSingleResult() > 0;
+	}
+
+	public static class Wo extends WoId {
+	}
+
+}

+ 79 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionCreate.java

@@ -0,0 +1,79 @@
+package com.x.cms.assemble.control.file;
+
+import org.apache.commons.lang3.StringUtils;
+
+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.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.exception.ExceptionDuplicateFlag;
+import com.x.base.core.project.exception.ExceptionDuplicateRestrictFlag;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+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.cms.assemble.control.Business;
+import com.x.cms.core.entity.AppInfo;
+import com.x.cms.core.entity.element.File;
+
+class ActionCreate 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);
+			AppInfo application = emc.flag(wi.getAppId(), AppInfo.class);
+			if (null == application) {
+				throw new ExceptionEntityNotExist(wi.getAppId(), AppInfo.class);
+			}
+			if (!business.editable(effectivePerson, application)) {
+				throw new ExceptionAccessDenied(effectivePerson);
+			}
+			File file = new File();
+			Wi.copier.copy(wi, file);
+			/** 设置file 的Id由前端生成提供 */
+			file.setId(wi.getId());
+			file.setAppId(application.getId());
+			this.updateCreator(file, effectivePerson);
+			emc.beginTransaction(File.class);
+			if (StringUtils.isNotEmpty(file.getAlias())) {
+				if (emc.duplicateWithFlags(file.getId(), File.class, file.getAlias())) {
+					throw new ExceptionDuplicateFlag(File.class, file.getAlias());
+				}
+			}
+			if (StringUtils.isEmpty(file.getName())) {
+				throw new ExceptionEmptyName();
+			}
+			if (emc.duplicateWithRestrictFlags(File.class, File.appId_FIELDNAME, file.getAppId(),
+					file.getId(), ListTools.toList(file.getName()))) {
+				throw new ExceptionDuplicateRestrictFlag(File.class, file.getName());
+			}
+			emc.persist(file, CheckPersistType.all);
+			emc.commit();
+			ApplicationCache.notify(File.class);
+			Wo wo = new Wo();
+			wo.setId(file.getId());
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoId {
+	}
+
+	public static class Wi extends File {
+
+		private static final long serialVersionUID = 4289841165185269299L;
+
+		static WrapCopier<Wi, File> copier = WrapCopierFactory.wi(Wi.class, File.class, null,
+				JpaObject.FieldsUnmodifyExcludeId);
+
+	}
+
+}

+ 46 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionDelete.java

@@ -0,0 +1,46 @@
+package com.x.cms.assemble.control.file;
+
+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.exception.ExceptionAccessDenied;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+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.cms.assemble.control.Business;
+import com.x.cms.core.entity.AppInfo;
+import com.x.cms.core.entity.element.File;
+
+class ActionDelete extends BaseAction {
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String flag) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Business business = new Business(emc);
+			File file = emc.flag(flag, File.class);
+			if (null == file) {
+				throw new ExceptionEntityNotExist(flag, File.class);
+			}
+			AppInfo application = emc.find(file.getAppId(), AppInfo.class);
+			if (null == application) {
+				throw new ExceptionEntityNotExist(file.getAppId(), AppInfo.class);
+			}
+			if (!business.editable(effectivePerson, application)) {
+				throw new ExceptionAccessDenied(effectivePerson.getDistinguishedName());
+			}
+			emc.beginTransaction(File.class);
+			emc.remove(file, CheckRemoveType.all);
+			emc.commit();
+			ApplicationCache.notify(File.class);
+			Wo wo = new Wo();
+			wo.setId(file.getId());
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoId {
+	}
+
+}

+ 67 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionDownload.java

@@ -0,0 +1,67 @@
+package com.x.cms.assemble.control.file;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+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.WoFile;
+import com.x.cms.core.entity.AppInfo;
+import com.x.cms.core.entity.element.File;
+
+import net.sf.ehcache.Ehcache;
+import net.sf.ehcache.Element;
+
+class ActionDownload extends StandardJaxrsAction {
+
+	private Ehcache cache = ApplicationCache.instance().getCache(File.class);
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String flag) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Wo wo = null;
+			String cacheKey = ApplicationCache.concreteCacheKey(this.getClass(), flag);
+			Element element = cache.get(cacheKey);
+			if ((null != element) && (null != element.getObjectValue())) {
+				wo = (Wo) element.getObjectValue();
+			} else {
+				File file = emc.flag(flag, File.class);
+				if (null == file) {
+					throw new ExceptionEntityNotExist(flag, File.class);
+				}
+				AppInfo application = emc.find(file.getAppId(), AppInfo.class);
+				if (null == application) {
+					throw new ExceptionEntityNotExist(file.getAppId(), AppInfo.class);
+				}
+				byte[] bs = new byte[] {};
+				if (StringUtils.isNotEmpty(file.getData())) {
+					bs = Base64.decodeBase64(file.getData());
+				}
+				wo = new Wo(bs, this.contentType(true, file.getFileName()),
+						this.contentDisposition(true, file.getFileName()));
+				/**
+				 * 对10M以下的文件进行缓存
+				 */
+				if (bs.length < (1024 * 1024 * 10)) {
+					cache.put(new Element(cacheKey, wo));
+				}
+			}
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoFile {
+
+		public Wo(byte[] bytes, String contentType, String contentDisposition) {
+			super(bytes, contentType, contentDisposition);
+		}
+
+	}
+
+}

+ 80 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionEdit.java

@@ -0,0 +1,80 @@
+package com.x.cms.assemble.control.file;
+
+import org.apache.commons.lang3.StringUtils;
+
+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.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.exception.ExceptionDuplicateFlag;
+import com.x.base.core.project.exception.ExceptionDuplicateRestrictFlag;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+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.cms.assemble.control.Business;
+import com.x.cms.core.entity.AppInfo;
+import com.x.cms.core.entity.element.File;
+
+class ActionEdit extends BaseAction {
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, 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);
+			File file = emc.find(id, File.class);
+			if (null == file) {
+				throw new ExceptionEntityNotExist(id, File.class);
+			}
+			AppInfo application = emc.flag(file.getAppId(), AppInfo.class);
+			if (null == application) {
+				throw new ExceptionEntityNotExist(wi.getAppId(), AppInfo.class);
+			}
+			if ((!business.editable(effectivePerson, application))) {
+				throw new ExceptionAccessDenied(effectivePerson.getDistinguishedName());
+			}
+			Wi.copier.copy(wi, file);
+			file.setAppId(application.getId());
+			this.updateCreator(file, effectivePerson);
+			emc.beginTransaction(File.class);
+			if (StringUtils.isNotEmpty(file.getAlias())) {
+				if (emc.duplicateWithFlags(file.getId(), File.class, file.getAlias())) {
+					throw new ExceptionDuplicateFlag(File.class, file.getAlias());
+				}
+			}
+			if (StringUtils.isEmpty(file.getName())) {
+				throw new ExceptionEmptyName();
+			}
+			if (emc.duplicateWithRestrictFlags(File.class, File.appId_FIELDNAME, file.getAppId(),
+					file.getId(), ListTools.toList(file.getName()))) {
+				throw new ExceptionDuplicateRestrictFlag(File.class, file.getName());
+			}
+			emc.check(file, CheckPersistType.all);
+			emc.commit();
+			ApplicationCache.notify(File.class);
+			Wo wo = new Wo();
+			wo.setId(file.getId());
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoId {
+	}
+
+	public static class Wi extends File {
+
+		private static final long serialVersionUID = 4289841165185269299L;
+
+		static WrapCopier<Wi, File> copier = WrapCopierFactory.wi(Wi.class, File.class, null,
+				ListTools.toList(JpaObject.FieldsUnmodify));
+
+	}
+
+}

+ 48 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionGet.java

@@ -0,0 +1,48 @@
+package com.x.cms.assemble.control.file;
+
+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.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.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.tools.ListTools;
+import com.x.cms.assemble.control.Business;
+import com.x.cms.core.entity.AppInfo;
+import com.x.cms.core.entity.element.File;
+
+class ActionGet extends BaseAction {
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String flag) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Business business = new Business(emc);
+			File file = emc.flag(flag, File.class);
+			if (null == file) {
+				throw new ExceptionEntityNotExist(flag, File.class);
+			}
+			AppInfo application = emc.find(file.getAppId(), AppInfo.class);
+			if (null == application) {
+				throw new ExceptionEntityNotExist(file.getAppId(), AppInfo.class);
+			}
+			if (!business.editable(effectivePerson, application)) {
+				throw new ExceptionAccessDenied(effectivePerson.getDistinguishedName());
+			}
+			Wo wo = Wo.copier.copy(file);
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends File {
+
+		private static final long serialVersionUID = 1541438199059150837L;
+
+		static WrapCopier<File, Wo> copier = WrapCopierFactory.wo(File.class, Wo.class, null,
+				ListTools.toList(JpaObject.FieldsInvisible, File.data_FIELDNAME));
+
+	}
+
+}

+ 54 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionListNext.java

@@ -0,0 +1,54 @@
+package com.x.cms.assemble.control.file;
+
+import java.util.List;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.tools.ListTools;
+import com.x.cms.core.entity.element.File;
+
+class ActionListNext extends BaseAction {
+	ActionResult<List<Wo>> execute(String id, Integer count) throws Exception {
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		result = this.standardListNext(Wo.copier, id, count, "sequence", null, null, null, null, null, null, null, null,
+				true, DESC);
+		for (Wo wo : result.getData()) {
+			wo.setContentType(this.contentType(false, wo.getName()));
+		}
+		return result;
+	}
+
+	public static class Wo extends File {
+
+		private static final long serialVersionUID = -7495725325510376323L;
+
+		public static WrapCopier<File, Wo> copier = WrapCopierFactory.wo(File.class, Wo.class, null,
+				ListTools.toList(JpaObject.FieldsInvisible, File.data_FIELDNAME));
+
+		@FieldDescribe("排序号")
+		private Long rank;
+
+		@FieldDescribe("文件类型")
+		private String contentType;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+
+		public String getContentType() {
+			return contentType;
+		}
+
+		public void setContentType(String contentType) {
+			this.contentType = contentType;
+		}
+
+	}
+}

+ 53 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionListPrev.java

@@ -0,0 +1,53 @@
+package com.x.cms.assemble.control.file;
+
+import java.util.List;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.tools.ListTools;
+import com.x.cms.core.entity.element.File;
+
+class ActionListPrev extends BaseAction {
+	ActionResult<List<Wo>> execute(String id, Integer count) throws Exception {
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		result = this.standardListPrev(Wo.copier, id, count, "sequence", null, null, null, null, null, null, null, null,
+				true, DESC);
+		for (Wo wo : result.getData()) {
+			wo.setContentType(this.contentType(false, wo.getName()));
+		}
+		return result;
+	}
+
+	public static class Wo extends File {
+
+		private static final long serialVersionUID = -7495725325510376323L;
+
+		public static WrapCopier<File, Wo> copier = WrapCopierFactory.wo(File.class, Wo.class, null,
+				ListTools.toList(JpaObject.FieldsInvisible, File.data_FIELDNAME));
+
+		@FieldDescribe("排序号")
+		private Long rank;
+
+		@FieldDescribe("文件类型")
+		private String contentType;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+
+		public String getContentType() {
+			return contentType;
+		}
+
+		public void setContentType(String contentType) {
+			this.contentType = contentType;
+		}
+	}
+}

+ 47 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionListWithApplication.java

@@ -0,0 +1,47 @@
+package com.x.cms.assemble.control.file;
+
+import java.util.List;
+
+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.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.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.tools.ListTools;
+import com.x.cms.assemble.control.Business;
+import com.x.cms.core.entity.AppInfo;
+import com.x.cms.core.entity.element.File;
+
+class ActionListWithApplication extends BaseAction {
+
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String applicationFlag) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<List<Wo>> result = new ActionResult<>();
+			Business business = new Business(emc);
+			AppInfo application = emc.flag(applicationFlag, AppInfo.class);
+			if (null == application) {
+				throw new ExceptionEntityNotExist(applicationFlag, AppInfo.class);
+			}
+			if (!business.editable(effectivePerson, application)) {
+				throw new ExceptionAccessDenied(effectivePerson.getDistinguishedName());
+			}
+			List<Wo> wos = emc.fetchEqual(File.class, Wo.copier, File.appId_FIELDNAME, application.getId());
+			wos = business.fileFactory().sort(wos);
+			result.setData(wos);
+			return result;
+		}
+	}
+
+	public static class Wo extends File {
+
+		private static final long serialVersionUID = -7495725325510376323L;
+
+		public static WrapCopier<File, Wo> copier = WrapCopierFactory.wo(File.class, Wo.class, null,
+				ListTools.toList(JpaObject.FieldsInvisible, File.data_FIELDNAME));
+
+	}
+}

+ 57 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ActionUpload.java

@@ -0,0 +1,57 @@
+package com.x.cms.assemble.control.file;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+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.cms.assemble.control.Business;
+import com.x.cms.core.entity.AppInfo;
+import com.x.cms.core.entity.element.File;
+
+class ActionUpload extends BaseAction {
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, String fileName, byte[] bytes,
+			FormDataContentDisposition disposition) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Business business = new Business(emc);
+			File file = emc.find(id, File.class);
+			if (null == file) {
+				throw new ExceptionEntityNotExist(id, File.class);
+			}
+			AppInfo application = emc.find(file.getAppId(), AppInfo.class);
+			if (null == application) {
+				throw new ExceptionEntityNotExist(file.getAppId(), AppInfo.class);
+			}
+			if ((!business.editable(effectivePerson, application))) {
+				throw new ExceptionAccessDenied(effectivePerson.getDistinguishedName());
+			}
+			emc.beginTransaction(File.class);
+			file.setLength((long) bytes.length);
+			file.setData(Base64.encodeBase64String(bytes));
+			if (StringUtils.isEmpty(fileName)) {
+				file.setFileName(this.fileName(disposition));
+			} else {
+				file.setFileName(fileName);
+			}
+			emc.commit();
+			ApplicationCache.notify(File.class);
+			Wo wo = new Wo();
+			wo.setValue(true);
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WrapBoolean {
+
+	}
+}

+ 16 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/BaseAction.java

@@ -0,0 +1,16 @@
+package com.x.cms.assemble.control.file;
+
+import java.util.Date;
+
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.cms.core.entity.element.File;
+
+abstract class BaseAction extends StandardJaxrsAction {
+	
+	protected void updateCreator(File file,EffectivePerson effectivePerson){
+		file.setLastUpdatePerson(effectivePerson.getDistinguishedName());
+		file.setLastUpdateTime(new Date());
+	}
+
+}

+ 12 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ExceptionEmptyName.java

@@ -0,0 +1,12 @@
+package com.x.cms.assemble.control.file;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionEmptyName extends PromptException {
+
+	private static final long serialVersionUID = -9089355008820123519L;
+
+	ExceptionEmptyName() {
+		super("名称不能为空.");
+	}
+}

+ 12 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/ExceptionErrorName.java

@@ -0,0 +1,12 @@
+package com.x.cms.assemble.control.file;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionErrorName extends PromptException {
+
+	private static final long serialVersionUID = -9089355008820123519L;
+
+	ExceptionErrorName(String name) {
+		super("{} 名称错误.");
+	}
+}

+ 240 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/file/FileAction.java

@@ -0,0 +1,240 @@
+package com.x.cms.assemble.control.file;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+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 org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+import org.glassfish.jersey.media.multipart.FormDataParam;
+
+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;
+
+@Path("file")
+@JaxrsDescribe("资源文件管理")
+public class FileAction extends StandardJaxrsAction {
+
+	private static Logger logger = LoggerFactory.getLogger(FileAction.class);
+
+	@JaxrsMethodDescribe(value = "列示文件对象,下一页.", action = ActionListNext.class)
+	@GET
+	@Path("list/{id}/next/{count}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listNext(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("标识") @PathParam("id") String id,
+			@JaxrsParameterDescribe("数量") @PathParam("count") Integer count) {
+		ActionResult<List<ActionListNext.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionListNext().execute(id, count);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+	@JaxrsMethodDescribe(value = "列示文件对象,上一页.", action = ActionListPrev.class)
+	@GET
+	@Path("list/{id}/prev/{count}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listPrev(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("标识") @PathParam("id") String id,
+			@JaxrsParameterDescribe("数量") @PathParam("count") Integer count) {
+		ActionResult<List<ActionListPrev.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionListPrev().execute(id, count);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+	@JaxrsMethodDescribe(value = "获取文件内容.", action = ActionGet.class)
+	@GET
+	@Path("{flag}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void get(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("标识") @PathParam("flag") String flag) {
+		ActionResult<ActionGet.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionGet().execute(effectivePerson, flag);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+	@JaxrsMethodDescribe(value = "创建文件.", action = ActionCreate.class)
+	@POST
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void create(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			JsonElement jsonElement) {
+		ActionResult<ActionCreate.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionCreate().execute(effectivePerson, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, jsonElement);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+	@JaxrsMethodDescribe(value = "更新文件.", action = ActionEdit.class)
+	@PUT
+	@Path("{id}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void update(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("标识") @PathParam("id") String id, JsonElement jsonElement) {
+		ActionResult<ActionEdit.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionEdit().execute(effectivePerson, id, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, jsonElement);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+	@JaxrsMethodDescribe(value = "删除文件.", action = ActionDelete.class)
+	@DELETE
+	@Path("{flag}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void delete(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("标识") @PathParam("flag") String flag) {
+		ActionResult<ActionDelete.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionDelete().execute(effectivePerson, flag);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+	@JaxrsMethodDescribe(value = "根据应用列示文件.", action = ActionListWithApplication.class)
+	@GET
+	@Path("list/application/{applicationFlag}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listWithApplication(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("应用标识") @PathParam("applicationFlag") String applicationFlag) {
+		ActionResult<List<ActionListWithApplication.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionListWithApplication().execute(effectivePerson, applicationFlag);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+	@JaxrsMethodDescribe(value = "上传文件内容.", action = ActionUpload.class)
+	@POST
+	@Consumes(MediaType.MULTIPART_FORM_DATA)
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Path("{id}/upload")
+	public void upload(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("标识") @PathParam("id") String id,
+			@JaxrsParameterDescribe("附件名称") @FormDataParam(FILENAME_FIELD) String fileName,
+			@FormDataParam(FILE_FIELD) final byte[] bytes,
+			@JaxrsParameterDescribe("文件内容") @FormDataParam(FILE_FIELD) final FormDataContentDisposition disposition) {
+		ActionResult<ActionUpload.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionUpload().execute(effectivePerson, id, fileName, bytes, disposition);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+	@JaxrsMethodDescribe(value = "获取文件内容.以stream方式下载.", action = ActionDownload.class)
+	@GET
+	@Path("{id}/download")
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void download(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("标识") @PathParam("id") String id) {
+		ActionResult<ActionDownload.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionDownload().execute(effectivePerson, id);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+	@JaxrsMethodDescribe(value = "获取文件内容.", action = ActionContent.class)
+	@GET
+	@Path("{id}/content")
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void content(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("标识") @PathParam("id") String id) {
+		ActionResult<ActionContent.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionContent().execute(effectivePerson, id);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+	@JaxrsMethodDescribe(value = "复制资源文件到新的应用.", action = ActionCopy.class)
+	@GET
+	@Path("{flag}/application/{applicationFlag}")
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void copy(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("标识") @PathParam("flag") String flag,
+			@JaxrsParameterDescribe("应用标识") @PathParam("applicationFlag") String applicationFlag) {
+		ActionResult<ActionCopy.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionCopy().execute(effectivePerson, flag, applicationFlag);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+}

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

@@ -5,6 +5,7 @@ import java.util.Set;
 import javax.ws.rs.ApplicationPath;
 
 import com.x.base.core.project.jaxrs.AbstractActionApplication;
+import com.x.cms.assemble.control.file.FileAction;
 import com.x.cms.assemble.control.jaxrs.appdict.AppDictAction;
 import com.x.cms.assemble.control.jaxrs.appdict.AppDictAnonymousAction;
 import com.x.cms.assemble.control.jaxrs.appdictdesign.AppDictDesignAction;
@@ -51,6 +52,7 @@ public class ActionApplication extends AbstractActionApplication {
 		this.classes.add(PermissionForDocumentAction.class);
 		this.classes.add(DocumentViewRecordAction.class);
 		this.classes.add(FileInfoAction.class);
+		this.classes.add(FileAction.class);
 		this.classes.add(FormAction.class);
 		this.classes.add(ViewAction.class);
 		this.classes.add(QueryViewDesignAction.class);

+ 1 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/CmsJaxrsFilter.java

@@ -17,6 +17,7 @@ import com.x.base.core.project.jaxrs.ManagerUserJaxrsFilter;
 		"/jaxrs/data/*", 
 		"/jaxrs/document/*", 
 		"/jaxrs/fileinfo/*", 
+		"/jaxrs/file/*", 
 		"/jaxrs/form/*",
 		"/jaxrs/view/*", 
 		"/jaxrs/queryview/*", 

+ 20 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/input/ActionCover.java

@@ -29,11 +29,13 @@ import com.x.cms.core.entity.CategoryInfo;
 import com.x.cms.core.entity.CategoryInfo_;
 import com.x.cms.core.entity.element.AppDict;
 import com.x.cms.core.entity.element.AppDictItem;
+import com.x.cms.core.entity.element.File;
 import com.x.cms.core.entity.element.Form;
 import com.x.cms.core.entity.element.Script;
 import com.x.cms.core.entity.element.wrap.WrapAppDict;
 import com.x.cms.core.entity.element.wrap.WrapCategoryInfo;
 import com.x.cms.core.entity.element.wrap.WrapCms;
+import com.x.cms.core.entity.element.wrap.WrapFile;
 import com.x.cms.core.entity.element.wrap.WrapForm;
 import com.x.cms.core.entity.element.wrap.WrapScript;
 
@@ -96,6 +98,23 @@ class ActionCover extends BaseAction {
 			}
 		}
 		
+		for (WrapFile _o : wi.getFileList()) {
+			File obj = business.entityManagerContainer().find(_o.getId(), File.class);
+			if (null != obj) {
+				WrapFile.inCopier.copy(_o, obj);
+			} else {
+				obj = WrapFile.inCopier.copy(_o);
+				persistObjects.add(obj);
+			}
+			if (StringUtils.isNotEmpty(obj.getAlias())) {
+				obj.setAlias(this.idleAliasWithAppInfo(business, appInfo.getId(), obj.getAlias(), File.class, obj.getId()));
+			}
+			if (StringUtils.isNotEmpty(obj.getName())) {
+				obj.setName(this.idleNameWithAppInfo(business, appInfo.getId(), obj.getName(), File.class, obj.getId()));
+			}
+			obj.setAppId(appInfo.getId());
+		}
+		
 		for (WrapAppDict _o : wi.getAppDictList()) {
 			AppDict obj = business.entityManagerContainer().find(_o.getId(), AppDict.class);
 			if (null != obj) {
@@ -145,6 +164,7 @@ class ActionCover extends BaseAction {
 			}
 		}
 		
+		business.entityManagerContainer().beginTransaction(File.class);
 		business.entityManagerContainer().beginTransaction(AppInfo.class);
 		business.entityManagerContainer().beginTransaction(Script.class);
 		business.entityManagerContainer().beginTransaction(Form.class);

+ 14 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/input/ActionCreate.java

@@ -18,11 +18,13 @@ import com.x.cms.core.entity.AppInfo;
 import com.x.cms.core.entity.CategoryInfo;
 import com.x.cms.core.entity.element.AppDict;
 import com.x.cms.core.entity.element.AppDictItem;
+import com.x.cms.core.entity.element.File;
 import com.x.cms.core.entity.element.Form;
 import com.x.cms.core.entity.element.Script;
 import com.x.cms.core.entity.element.wrap.WrapAppDict;
 import com.x.cms.core.entity.element.wrap.WrapCategoryInfo;
 import com.x.cms.core.entity.element.wrap.WrapCms;
+import com.x.cms.core.entity.element.wrap.WrapFile;
 import com.x.cms.core.entity.element.wrap.WrapForm;
 import com.x.cms.core.entity.element.wrap.WrapScript;
 
@@ -73,6 +75,16 @@ class ActionCreate extends BaseAction {
 			persistObjects.add(obj);
 		}
 		
+		for (WrapFile _o : wi.getFileList()) {
+			File obj = business.entityManagerContainer().find(_o.getId(), File.class);
+			if (null != obj) {
+				throw new ExceptionEntityExistForCreate(_o.getId(), File.class);
+			}
+			obj = WrapFile.inCopier.copy(_o);
+			obj.setAppId(appInfo.getId());
+			persistObjects.add(obj);
+		}
+		
 		for (WrapAppDict _o : wi.getAppDictList()) {
 			AppDict obj = business.entityManagerContainer().find(_o.getId(), AppDict.class);
 			if (null != obj) {
@@ -101,6 +113,8 @@ class ActionCreate extends BaseAction {
 			categoryInfo.setAppId(appInfo.getId());
 			persistObjects.add(categoryInfo);
 		}
+		
+		business.entityManagerContainer().beginTransaction(File.class);
 		business.entityManagerContainer().beginTransaction(AppInfo.class);
 		business.entityManagerContainer().beginTransaction(Script.class);
 		business.entityManagerContainer().beginTransaction(Form.class);

+ 17 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/input/ActionPrepareCover.java

@@ -27,11 +27,13 @@ import com.x.cms.assemble.control.Business;
 import com.x.cms.core.entity.AppInfo;
 import com.x.cms.core.entity.CategoryInfo;
 import com.x.cms.core.entity.element.AppDict;
+import com.x.cms.core.entity.element.File;
 import com.x.cms.core.entity.element.Form;
 import com.x.cms.core.entity.element.Script;
 import com.x.cms.core.entity.element.wrap.WrapAppDict;
 import com.x.cms.core.entity.element.wrap.WrapCategoryInfo;
 import com.x.cms.core.entity.element.wrap.WrapCms;
+import com.x.cms.core.entity.element.wrap.WrapFile;
 import com.x.cms.core.entity.element.wrap.WrapForm;
 import com.x.cms.core.entity.element.wrap.WrapScript;
 
@@ -73,6 +75,21 @@ class ActionPrepareCover extends BaseAction {
 				}
 			}
 		}
+		
+		for (MatchElement<WrapFile, File> m : this.match(business, wi.getFileList(),
+				ListUtils.union(this.listWithIds(business, wi.getFileList(), File.class),
+						business.fileFactory().listWithApplicationObject(exist.getId())))) {
+			if ((null != m.getW()) && (null != m.getT())) {
+				if (!StringUtils.equals(m.getW().getId(), m.getT().getId())) {
+					if (StringUtils.equals(m.getW().getAppId(), m.getT().getAppId())) {
+						wos.add(new Wo(m.getW().getId(), m.getT().getId()));
+					} else {
+						wos.add(new Wo(m.getW().getId(), JpaObject.createId()));
+					}
+				}
+			}
+		}
+		
 		for (MatchElement<WrapScript, Script> m : this.match(business, wi.getScriptList(),
 				ListUtils.union(this.listWithIds(business, wi.getScriptList(), Script.class),
 						business.getScriptFactory().listScriptWithApp(exist.getId())))) {

+ 10 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/input/ActionPrepareCreate.java

@@ -16,11 +16,13 @@ import com.x.cms.assemble.control.Business;
 import com.x.cms.core.entity.AppInfo;
 import com.x.cms.core.entity.CategoryInfo;
 import com.x.cms.core.entity.element.AppDict;
+import com.x.cms.core.entity.element.File;
 import com.x.cms.core.entity.element.Form;
 import com.x.cms.core.entity.element.Script;
 import com.x.cms.core.entity.element.wrap.WrapAppDict;
 import com.x.cms.core.entity.element.wrap.WrapCategoryInfo;
 import com.x.cms.core.entity.element.wrap.WrapCms;
+import com.x.cms.core.entity.element.wrap.WrapFile;
 import com.x.cms.core.entity.element.wrap.WrapForm;
 import com.x.cms.core.entity.element.wrap.WrapScript;
 
@@ -58,6 +60,14 @@ class ActionPrepareCreate extends BaseAction {
 				wos.add(new Wo(wrap.getId(), JpaObject.createId()));
 			}
 		}
+		
+		for (WrapFile wrap : wi.getFileList()) {
+			File exist_file = business.entityManagerContainer().find(wrap.getId(), File.class);
+			if (null != exist_file) {
+				wos.add(new Wo(wrap.getId(), JpaObject.createId()));
+			}
+		}
+		
 		for (WrapAppDict wrap : wi.getAppDictList()) {
 			AppDict exist_applicationDict = business.entityManagerContainer().find(wrap.getId(),
 					AppDict.class);

+ 9 - 2
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/output/ActionList.java

@@ -15,11 +15,13 @@ import com.x.base.core.project.tools.ListTools;
 import com.x.cms.core.entity.AppInfo;
 import com.x.cms.core.entity.CategoryInfo;
 import com.x.cms.core.entity.element.AppDict;
+import com.x.cms.core.entity.element.File;
 import com.x.cms.core.entity.element.Form;
 import com.x.cms.core.entity.element.Script;
 import com.x.cms.core.entity.element.wrap.WrapAppDict;
 import com.x.cms.core.entity.element.wrap.WrapCategoryInfo;
 import com.x.cms.core.entity.element.wrap.WrapCms;
+import com.x.cms.core.entity.element.wrap.WrapFile;
 import com.x.cms.core.entity.element.wrap.WrapForm;
 import com.x.cms.core.entity.element.wrap.WrapScript;
 
@@ -34,12 +36,14 @@ class ActionList extends BaseAction {
 			List<WrapForm> formList = emc.fetchAll(Form.class, formCopier);
 			List<WrapScript> scriptList = emc.fetchAll(Script.class, scriptCopier);
 			List<WrapAppDict> appDictList = emc.fetchAll(AppDict.class, appDictCopier);
-
+			List<WrapFile> fileList = emc.fetchAll(File.class, fileCopier);
+			
 			ListTools.groupStick(wos, caetgoryList, "id", "appId", "categoryInfoList");
 			ListTools.groupStick(wos, formList, "id", "appId", "formList");
 			ListTools.groupStick(wos, scriptList, "id", "appId", "scriptList");
 			ListTools.groupStick(wos, appDictList, "id", "appId", "appDictList");
-
+			ListTools.groupStick(wos, fileList, AppInfo.id_FIELDNAME, File.appId_FIELDNAME, "fileList");
+			
 			wos = wos.stream()
 					.sorted(Comparator.comparing(Wo::getAppAlias, Comparator.nullsLast(String::compareTo))
 							.thenComparing(Wo::getAppName, Comparator.nullsLast(String::compareTo)))
@@ -49,6 +53,9 @@ class ActionList extends BaseAction {
 		}
 	}
 
+	public static WrapCopier<File, WrapFile> fileCopier = WrapCopierFactory.wo(File.class, WrapFile.class,
+			JpaObject.singularAttributeField(File.class, true, true), null);
+	
 	public static WrapCopier<CategoryInfo, WrapCategoryInfo> categoryInfoCopier = WrapCopierFactory.wo(
 			CategoryInfo.class, WrapCategoryInfo.class,
 			JpaObject.singularAttributeField(CategoryInfo.class, true, true), null);

+ 5 - 12
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/output/ActionSelect.java

@@ -14,7 +14,6 @@ import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.dataitem.DataItemConverter;
 import com.x.base.core.project.annotation.FieldDescribe;
-import com.x.base.core.project.exception.ExceptionWhen;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.tools.ListTools;
@@ -25,11 +24,13 @@ import com.x.cms.core.entity.CategoryInfo;
 import com.x.cms.core.entity.element.AppDict;
 import com.x.cms.core.entity.element.AppDictItem;
 import com.x.cms.core.entity.element.AppDictItem_;
+import com.x.cms.core.entity.element.File;
 import com.x.cms.core.entity.element.Form;
 import com.x.cms.core.entity.element.Script;
 import com.x.cms.core.entity.element.wrap.WrapAppDict;
 import com.x.cms.core.entity.element.wrap.WrapCategoryInfo;
 import com.x.cms.core.entity.element.wrap.WrapCms;
+import com.x.cms.core.entity.element.wrap.WrapFile;
 import com.x.cms.core.entity.element.wrap.WrapForm;
 import com.x.cms.core.entity.element.wrap.WrapScript;
 
@@ -70,19 +71,11 @@ class ActionSelect extends BaseAction {
 
 	private WrapCms get(Business business, AppInfo appInfo, Wi wi) throws Exception {
 		WrapCms wo = WrapCms.outCopier.copy(appInfo);
-		// 装配所有的分类ID列表、脚本ID列表、表单ID列表、数据字典ID列表
-		// List<String> categoryIds = business.getCategoryInfoFactory().listByAppId(
-		// appInfo.getId() );
-		//
-		// if( ListTools.isNotEmpty( categoryIds )) {
-		// wo.setCategoryList(categoryIds);
-		// }
-		wo.setCategoryInfoList(WrapCategoryInfo.outCopier
-				.copy(business.entityManagerContainer().list(CategoryInfo.class, wi.listCategoryInfoId())));
+		wo.setCategoryInfoList(WrapCategoryInfo.outCopier.copy(business.entityManagerContainer().list(CategoryInfo.class, wi.listCategoryInfoId())));
 		wo.setFormList(WrapForm.outCopier.copy(business.entityManagerContainer().list(Form.class, wi.listFormId())));
-		wo.setScriptList(
-				WrapScript.outCopier.copy(business.entityManagerContainer().list(Script.class, wi.listScriptId())));
+		wo.setScriptList( WrapScript.outCopier.copy(business.entityManagerContainer().list(Script.class, wi.listScriptId())));
 		wo.setAppDictList(this.listAppDict(business, appInfo, wi));
+		wo.setFileList(WrapFile.outCopier.copy(business.entityManagerContainer().list(File.class, wi.listFileId())));
 		return wo;
 	}
 

+ 3 - 0
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/PersistenceProperties.java

@@ -20,6 +20,9 @@ public final class PersistenceProperties extends AbstractPersistenceProperties {
 		public static class Form {
 			public static final String table = "CMS_FORM";
 		}
+		public static class File {
+			public static final String table = "CMS_FILE";
+		}
 		public static class FormField {
 			public static final String table = "CMS_FORMFIELD";
 		}

+ 17 - 11
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/wrap/WrapCms.java

@@ -36,31 +36,37 @@ public class WrapCms extends AppInfo {
 		return ListTools.extractProperty(this.getScriptList(), JpaObject.id_FIELDNAME, String.class, true, true);
 	}
 
+	public List<String> listFileId() throws Exception {
+		return ListTools.extractProperty(this.getFileList(), JpaObject.id_FIELDNAME, String.class, true, true);
+	}
+	
 	@FieldDescribe("导出的分类设置")
 	private List<WrapCategoryInfo> categoryInfoList = new ArrayList<>();
 
 	@FieldDescribe("导出的表单设计")
 	private List<WrapForm> formList = new ArrayList<>();
-
-	// @FieldDescribe("栏目下所有表单ID列表")
-	// private List<String> formIds = new ArrayList<>();
-
+	
 	@FieldDescribe("导出的数据字典")
 	private List<WrapAppDict> appDictList = new ArrayList<>();
 
-	// @FieldDescribe("栏目下所有数据字典D列表")
-	// private List<String> appDictIds = new ArrayList<>();
-
 	@FieldDescribe("导出的脚本")
 	private List<WrapScript> scriptList = new ArrayList<>();
-
-	// @FieldDescribe("栏目下所有脚本ID列表")
-	// private List<String> scriptIds = new ArrayList<>();
-
+	
+	@FieldDescribe("导出的文件")
+	private List<WrapFile> fileList = new ArrayList<>();	
+	
 	public List<WrapForm> getFormList() {
 		return formList;
 	}
 
+	public List<WrapFile> getFileList() {
+		return fileList;
+	}
+
+	public void setFileList(List<WrapFile> fileList) {
+		this.fileList = fileList;
+	}
+
 	public List<WrapAppDict> getAppDictList() {
 		return appDictList;
 	}

+ 5 - 0
o2server/x_collaboration_assemble_websocket/src/main/webapp/WEB-INF/web.xml

@@ -2,4 +2,9 @@
 <web-app id="x_collaboration_assemble_websocket"
 	metadata-complete="false" version="3.0">
 	<display-name>x_collaboration_assemble_websocket</display-name>
+	<context-param>
+		<param-name>project</param-name>
+		<param-value>com.x.base.core.project.x_collaboration_assemble_websocket
+		</param-value>
+	</context-param>
 </web-app>

+ 5 - 0
o2server/x_organization_assemble_authentication/src/main/webapp/WEB-INF/web.xml

@@ -2,4 +2,9 @@
 <web-app id="x_organization_assemble_authentication"
 	metadata-complete="false" version="3.0">
 	<display-name>x_organization_assemble_authentication</display-name>
+	<context-param>
+		<param-name>project</param-name>
+		<param-value>com.x.base.core.project.x_organization_assemble_authentication
+		</param-value>
+	</context-param>
 </web-app>

+ 6 - 3
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionEdit.java

@@ -68,10 +68,13 @@ class ActionEdit extends BaseAction {
 
 		private static final long serialVersionUID = -7527954993386512109L;
 
+//		static WrapCopier<Wi, Unit> copier = WrapCopierFactory.wi(Wi.class, Unit.class, null,
+//				ListTools.toList(JpaObject.FieldsUnmodify, Unit.superior_FIELDNAME, Unit.pinyin_FIELDNAME,
+//						Unit.pinyinInitial_FIELDNAME, Unit.level_FIELDNAME, Unit.levelName_FIELDNAME,
+//						Unit.inheritedControllerList_FIELDNAME));
 		static WrapCopier<Wi, Unit> copier = WrapCopierFactory.wi(Wi.class, Unit.class, null,
-				ListTools.toList(JpaObject.FieldsUnmodify, Unit.superior_FIELDNAME, Unit.pinyin_FIELDNAME,
-						Unit.pinyinInitial_FIELDNAME, Unit.level_FIELDNAME, Unit.levelName_FIELDNAME,
-						Unit.inheritedControllerList_FIELDNAME));
+				ListTools.toList(JpaObject.FieldsUnmodify, Unit.pinyin_FIELDNAME, Unit.pinyinInitial_FIELDNAME,
+						Unit.level_FIELDNAME, Unit.levelName_FIELDNAME, Unit.inheritedControllerList_FIELDNAME));
 	}
 
 }

+ 8 - 2
o2server/x_processplatform_assemble_bam/src/main/webapp/WEB-INF/web.xml

@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<web-app id="x_processplatform_assemble_designer" metadata-complete="false" version="3.0">
-  <display-name>x_processplatform_assemble_bam</display-name>
+<web-app id="x_processplatform_assemble_designer"
+	metadata-complete="false" version="3.0">
+	<display-name>x_processplatform_assemble_bam</display-name>
+	<context-param>
+		<param-name>project</param-name>
+		<param-value>com.x.base.core.project.x_processplatform_assemble_bam
+		</param-value>
+	</context-param>
 </web-app>

+ 1 - 1
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/file/FileAction.java

@@ -223,7 +223,7 @@ public class FileAction extends StandardJaxrsAction {
 	@GET
 	@Path("{flag}/application/{applicationFlag}")
 	@Consumes(MediaType.APPLICATION_JSON)
-	public void cpoy(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+	public void copy(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
 			@JaxrsParameterDescribe("标识") @PathParam("flag") String flag,
 			@JaxrsParameterDescribe("应用标识") @PathParam("applicationFlag") String applicationFlag) {
 		ActionResult<ActionCopy.Wo> result = new ActionResult<>();

+ 8 - 2
o2server/x_processplatform_assemble_designer/src/main/webapp/WEB-INF/web.xml

@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<web-app id="x_processplatform_assemble_designer" metadata-complete="false" version="3.0">
-  <display-name>x_processplatform_assemble_designer</display-name>
+<web-app id="x_processplatform_assemble_designer"
+	metadata-complete="false" version="3.0">
+	<display-name>x_processplatform_assemble_designer</display-name>
+	<context-param>
+		<param-name>project</param-name>
+		<param-value>com.x.base.core.project.x_processplatform_assemble_designer
+		</param-value>
+	</context-param>
 </web-app>

+ 8 - 2
o2server/x_processplatform_assemble_surface/src/main/webapp/WEB-INF/web.xml

@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<web-app id="x_processplatform_assemble_designer" metadata-complete="false" version="3.0">
-  <display-name>x_processplatform_assemble_surface</display-name>
+<web-app id="x_processplatform_assemble_designer"
+	metadata-complete="false" version="3.0">
+	<display-name>x_processplatform_assemble_surface</display-name>
+	<context-param>
+		<param-name>project</param-name>
+		<param-value>com.x.base.core.project.x_processplatform_assemble_surface
+		</param-value>
+	</context-param>
 </web-app>

+ 5 - 5
o2server/x_processplatform_assemble_surface/src/test/java/com/x/processplatform/assemble/surface/test/TestClientImportFile.java

@@ -38,9 +38,9 @@ public class TestClientImportFile {
 
 	@Test
 	public void test4() throws Exception {
-		File file = new File("d:/导出");
+		File file = new File("d:/公文中等结果集");
 		List<NameValuePair> heads = new ArrayList<>();
-		String xtoken = "HeEoZIVgPjQ31rEg7ARdQeRVMf3woS408yvnPg3u8lM7ddsEJNHFDLJTxCww6MWxaEy5G28B49o";
+		String xtoken = "jlMh2guoFia-EPxnDppJq1pXYeQZDa_GCp05aUeYqxzMvh87Dpd_A725Uy1VQNhSXe8IsPd8nkw";
 		heads.add(new NameValuePair("x-token", xtoken));
 		for (File dir : FileUtils.listFilesAndDirs(file, FalseFileFilter.FALSE, DirectoryFileFilter.DIRECTORY)) {
 			if (!StringUtils.equals(file.getAbsolutePath(), dir.getAbsolutePath())) {
@@ -55,8 +55,8 @@ public class TestClientImportFile {
 					System.out.println(info);
 					Req req = new Req();
 					req.setTitle(info.getSubject());
-					req.setForm("5606db2a-4e95-4cfd-ad61-219954465e1b");
-					req.setIdentity("周睿@ce37b1c0-61c5-4b94-bcf3-c489347cf062@I");
+					req.setForm("00a9df18-4a5a-490a-a2a4-224faf7d7e2a");
+					req.setIdentity("周睿@93b9c84c-e5be-4fd9-bcef-96754bc34371@I");
 					Map<String, Object> map = new HashMap<>();
 					map.put("mainSend", StringUtils.split(info.getFGMainDepartmentWP(), "#"));
 					map.put("contactSend", StringUtils.split(info.getFGContactDepartmentRP(), "#"));
@@ -64,7 +64,7 @@ public class TestClientImportFile {
 					map.put("subject", info.getSubject());
 					req.setData(XGsonBuilder.instance().toJsonTree(map));
 					ActionResponse resp = ConnectionAction.post(
-							"http://127.0.0.1:20020/x_processplatform_assemble_surface/jaxrs/workcompleted/process/ada7862c-0cb2-433b-a3bb-c6c20765da99",
+							"http://dev.:20020/x_processplatform_assemble_surface/jaxrs/workcompleted/process/	8a01b431-8aac-4ab1-b555-7686952e13a7",
 							heads, req.toString());
 					WoId id = resp.getData(WoId.class);
 					CloseableHttpClient httpclient = HttpClients.createDefault();

+ 18 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/ScriptHelper.java

@@ -14,6 +14,9 @@ import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.SystemUtils;
 
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
 import com.x.base.core.project.exception.ExceptionScriptEval;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
@@ -104,6 +107,20 @@ public class ScriptHelper {
 		if (null != o) {
 			if (o instanceof CharSequence) {
 				list.add(Objects.toString(o, ""));
+			} else if (o instanceof JsonObject) {
+				JsonObject jsonObject = (JsonObject) o;
+				if (jsonObject.has(distinguishedName)) {
+					list.add(jsonObject.get(distinguishedName).getAsString());
+				}
+			} else if (o instanceof JsonArray) {
+				for (JsonElement jsonElement : (JsonArray) o) {
+					if (jsonElement.isJsonObject()) {
+						JsonObject jsonObject = jsonElement.getAsJsonObject();
+						if (jsonObject.has(distinguishedName)) {
+							list.add(jsonObject.get(distinguishedName).getAsString());
+						}
+					}
+				}
 			} else if (o instanceof Iterable) {
 				for (Object obj : (Iterable<?>) o) {
 					if (null != obj) {
@@ -142,6 +159,7 @@ public class ScriptHelper {
 			}
 		}
 		return list;
+
 	}
 
 	private List<String> readAsStringList(Object obj) throws Exception {