Просмотр исходного кода

Merge branch 'feature/中心服务用到的文件缓存改为存储到附件' into 'wrdp'

[中心服务]文件缓存改为附件存储、平台配置文件保存修改

See merge request o2oa/o2oa!2269
o2null 5 лет назад
Родитель
Сommit
5626740f4c
14 измененных файлов с 415 добавлено и 465 удалено
  1. 0 2
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/ActionApplication.java
  2. 0 13
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/EditConfigJaxrsFilter.java
  3. 15 17
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/config/ActionList.java
  4. 7 25
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/config/ActionOpen.java
  5. 20 46
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/config/ActionSave.java
  6. 35 0
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/config/BaseAction.java
  7. 52 5
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/config/ConfigAction.java
  8. 12 0
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/config/ExceptionNameEmpty.java
  9. 0 42
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/edit/BaseAction.java
  10. 0 80
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/edit/EditConfigAction.java
  11. 23 12
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/module/ActionCompareUpload.java
  12. 248 221
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/module/ActionWrite.java
  13. 2 1
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/module/ModuleAction.java
  14. 1 1
      o2server/x_program_center_core_entity/src/main/java/com/x/program/center/core/entity/Structure.java

+ 0 - 2
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/ActionApplication.java

@@ -20,7 +20,6 @@ import com.x.program.center.jaxrs.config.ConfigAction;
 import com.x.program.center.jaxrs.datastructure.DataStructureAction;
 import com.x.program.center.jaxrs.dingding.DingdingAction;
 import com.x.program.center.jaxrs.distribute.DistributeAction;
-import com.x.program.center.jaxrs.edit.EditConfigAction;
 import com.x.program.center.jaxrs.input.InputAction;
 import com.x.program.center.jaxrs.invoke.InvokeAction;
 import com.x.program.center.jaxrs.jest.JestAction;
@@ -73,7 +72,6 @@ public class ActionApplication extends AbstractActionApplication {
 		classes.add(OutputAction.class);
 		classes.add(InputAction.class);
 		classes.add(MarketAction.class);
-		classes.add(EditConfigAction.class);
 		return classes;
 	}
 }

+ 0 - 13
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/EditConfigJaxrsFilter.java

@@ -1,13 +0,0 @@
-package com.x.program.center.jaxrs;
-
-import javax.servlet.annotation.WebFilter;
-
-import com.x.base.core.project.jaxrs.CipherManagerJaxrsFilter;
-
-@WebFilter(urlPatterns = "/jaxrs/editconfig/*", asyncSupported = true)
-public class EditConfigJaxrsFilter extends CipherManagerJaxrsFilter {
-
-	
-	
-	
-}

+ 15 - 17
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/edit/ActionList.java → o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/config/ActionList.java

@@ -1,20 +1,4 @@
-package com.x.program.center.jaxrs.edit;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileFilter;
-import java.net.Socket;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.filefilter.WildcardFileFilter;
-import org.apache.commons.lang3.StringUtils;
+package com.x.program.center.jaxrs.config;
 
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
@@ -28,6 +12,20 @@ import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.Crypto;
 import com.x.base.core.project.tools.DefaultCharset;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.filefilter.WildcardFileFilter;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileFilter;
+import java.net.Socket;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 public class ActionList extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionList.class);

+ 7 - 25
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/edit/ActionOpen.java → o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/config/ActionOpen.java

@@ -1,38 +1,20 @@
-package com.x.program.center.jaxrs.edit;
+package com.x.program.center.jaxrs.config;
 
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.Socket;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.io.FileUtils;
-
-import com.google.gson.Gson;
 import com.google.gson.JsonElement;
 import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.base.core.project.config.Config;
-import com.x.base.core.project.config.Nodes;
 import com.x.base.core.project.gson.GsonPropertyObject;
-import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
-import com.x.base.core.project.tools.Crypto;
 import com.x.base.core.project.tools.DefaultCharset;
-import com.x.program.center.jaxrs.command.ActionCommand.Wi;
-import com.x.program.center.jaxrs.command.ActionCommand.Wo;
+import org.apache.commons.io.FileUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 
 public class ActionOpen extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionOpen.class);

+ 20 - 46
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/edit/ActionSave.java → o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/config/ActionSave.java

@@ -1,25 +1,5 @@
-package com.x.program.center.jaxrs.edit;
+package com.x.program.center.jaxrs.config;
 
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.Socket;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.io.FileUtils;
-import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
-
-import com.google.gson.Gson;
 import com.google.gson.JsonElement;
 import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.base.core.project.config.Config;
@@ -32,8 +12,15 @@ import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.Crypto;
 import com.x.base.core.project.tools.DefaultCharset;
-import com.x.program.center.jaxrs.command.ActionCommand.Wi;
-import com.x.program.center.jaxrs.command.ActionCommand.Wo;
+import org.apache.commons.io.FileUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.net.Socket;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 public class ActionSave extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionSave.class);
@@ -41,30 +28,17 @@ public class ActionSave extends BaseAction {
 		ActionResult<Wo> result = new ActionResult<>();
 		Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
 		Wo wo = new Wo();
-		String curServer = request.getLocalAddr();
 		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 		String fileName = wi.getFileName();
 		
 		if(fileName == null) {
-			wo.setTime(df.format(new Date()));
-			wo.setStatus("failure");
-			wo.setMessage("文件名为null");
-			result.setData(wo);
-			return result;
+			throw new ExceptionNameEmpty();
 		}
 		
 		String data = wi.getFileContent();
-		
-		if(fileName.equalsIgnoreCase("node_127.0.0.1.json")) {
-			fileName = "node_"+ curServer +".json";
-		}
 
 		if(!Config.nodes().centerServers().first().getValue().getConfigApiEnable()) {
-			wo.setTime(df.format(new Date()));
-			wo.setStatus("failure");
-			wo.setMessage("禁止编辑");
-			result.setData(wo);
-			return result;
+			throw new ExceptionModifyConfig();
 		}
 
 		File configFold = new File(Config.base(),Config.DIR_CONFIG);
@@ -86,16 +60,16 @@ public class ActionSave extends BaseAction {
 		Nodes nodes = Config.nodes();
 		//同步config文件
 		for (String node : nodes.keySet()){
-			//其他服务器
-			if(!node.equalsIgnoreCase(curServer)) {
-				if(!node.equalsIgnoreCase("127.0.0.1")) {
-					if(nodes.get(node).getApplication().getEnable() || nodes.get(node).getCenter().getEnable()){
-						boolean Syncflag = executeSyncFile(Config.DIR_CONFIG+"/"+fileName , node ,nodes.get(node).nodeAgentPort());
-					}
-				}
+			if(nodes.get(node).getApplication().getEnable() || nodes.get(node).getCenter().getEnable()){
+				boolean Syncflag = executeSyncFile(Config.DIR_CONFIG+"/"+fileName , node ,nodes.get(node).nodeAgentPort());
 			}
 		}
-		
+
+		try {
+			Thread.sleep(1000);
+		} catch (InterruptedException e) {
+		}
+		this.configFlush(effectivePerson);
 	
 		wo.setTime(df.format(new Date()));
 		wo.setStatus("success");

+ 35 - 0
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/config/BaseAction.java

@@ -3,12 +3,14 @@ package com.x.program.center.jaxrs.config;
 import java.util.List;
 
 import com.x.base.core.project.Applications;
+import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.config.Config;
 import com.x.base.core.project.connection.CipherConnectionAction;
 import com.x.base.core.project.gson.GsonPropertyObject;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.program.center.ThisApplication;
+import net.sf.ehcache.Ehcache;
 
 class BaseAction extends StandardJaxrsAction {
 	public static class AbstractWoProxy extends GsonPropertyObject {
@@ -150,4 +152,37 @@ class BaseAction extends StandardJaxrsAction {
 		});
 	}
 
+	public static Ehcache cacheLog = ApplicationCache.instance().getCache(CacheLogObject.class);
+
+	public static class CacheLogObject extends GsonPropertyObject {
+		private String userToken;
+
+		private String node;
+
+		private long lastPoint;
+		public long getLastPoint() {
+			return lastPoint;
+		}
+
+		public void setLastPoint(long lastPoint) {
+			this.lastPoint = lastPoint;
+		}
+
+		public String getNode() {
+			return node;
+		}
+
+		public void setNode(String node) {
+			this.node = node;
+		}
+
+		public String getUserToken() {
+			return userToken;
+		}
+
+		public void setUserToken(String userToken) {
+			this.userToken = userToken;
+		}
+	}
+
 }

+ 52 - 5
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/config/ConfigAction.java

@@ -1,11 +1,7 @@
 package com.x.program.center.jaxrs.config;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
+import javax.ws.rs.*;
 import javax.ws.rs.container.AsyncResponse;
 import javax.ws.rs.container.Suspended;
 import javax.ws.rs.core.Context;
@@ -254,4 +250,55 @@ public class ConfigAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
+	@JaxrsMethodDescribe(value = "获取所有配置文件信息", action = ActionList.class)
+	@GET
+	@Path("list")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void getList(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		ActionResult<ActionList.Wo> result = new ActionResult<>();
+		try {
+			result = new ActionList().execute(request,effectivePerson);
+		} catch (Exception e) {
+			e.printStackTrace();
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "打开config文件", action = ActionOpen.class)
+	@POST
+	@Path("open")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void open(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, JsonElement jsonElement) {
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		ActionResult<ActionOpen.Wo> result = new ActionResult<>();
+		try {
+			result = new ActionOpen().execute(request,effectivePerson, jsonElement);
+		} catch (Exception e) {
+			e.printStackTrace();
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "保存config文件", action = ActionSave.class)
+	@POST
+	@Path("save")
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	public void save(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, JsonElement jsonElement) {
+		ActionResult<ActionSave.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionSave().execute(request , effectivePerson, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
 }

+ 12 - 0
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/config/ExceptionNameEmpty.java

@@ -0,0 +1,12 @@
+package com.x.program.center.jaxrs.config;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionNameEmpty extends PromptException {
+
+	private static final long serialVersionUID = -3287459468603291619L;
+
+	ExceptionNameEmpty() {
+		super("名称不能为空.");
+	}
+}

+ 0 - 42
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/edit/BaseAction.java

@@ -1,42 +0,0 @@
-package com.x.program.center.jaxrs.edit;
-
-import com.x.base.core.project.cache.ApplicationCache;
-import com.x.base.core.project.gson.GsonPropertyObject;
-import com.x.base.core.project.jaxrs.StandardJaxrsAction;
-import net.sf.ehcache.Ehcache;
-
-abstract class BaseAction extends StandardJaxrsAction {
-    public static Ehcache cacheLog = ApplicationCache.instance().getCache(CacheLogObject.class);
-
-    public static class CacheLogObject extends GsonPropertyObject {
-        private String userToken;
-
-        private String node;
-
-        private long lastPoint;
-        public long getLastPoint() {
-            return lastPoint;
-        }
-
-        public void setLastPoint(long lastPoint) {
-            this.lastPoint = lastPoint;
-        }
-
-        public String getNode() {
-            return node;
-        }
-
-        public void setNode(String node) {
-            this.node = node;
-        }
-
-        public String getUserToken() {
-            return userToken;
-        }
-
-        public void setUserToken(String userToken) {
-            this.userToken = userToken;
-        }
-    }
-
-}

+ 0 - 80
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/edit/EditConfigAction.java

@@ -1,80 +0,0 @@
-package com.x.program.center.jaxrs.edit;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-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 com.google.gson.JsonElement;
-import com.x.base.core.project.annotation.JaxrsDescribe;
-import com.x.base.core.project.annotation.JaxrsMethodDescribe;
-import com.x.base.core.project.http.ActionResult;
-import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.http.HttpMediaType;
-import com.x.base.core.project.jaxrs.ResponseFactory;
-import com.x.base.core.project.jaxrs.StandardJaxrsAction;
-import com.x.base.core.project.logger.Logger;
-import com.x.base.core.project.logger.LoggerFactory;
-
-@Path("editconfig")
-@JaxrsDescribe("编辑配置文件")
-public class EditConfigAction<Wo> extends StandardJaxrsAction{
-	private static Logger logger = LoggerFactory.getLogger(EditConfigAction.class);
-	
-	@JaxrsMethodDescribe(value = "获取所有配置文件信息", action = ActionList.class)
-	@GET
-	@Path("list")
-	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
-	@Consumes(MediaType.APPLICATION_JSON)
-	public void getList(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
-		EffectivePerson effectivePerson = this.effectivePerson(request);
-		ActionResult<ActionList.Wo> result = new ActionResult<>();
-		try {
-			result = (ActionResult<ActionList.Wo>) new ActionList().execute(request,effectivePerson);
-		} catch (Exception e) {
-			e.printStackTrace();
-			result.error(e);
-		}
-		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
-	}
-	
-	@JaxrsMethodDescribe(value = "打开config文件", action = ActionOpen.class)
-	@POST
-	@Path("open")
-	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
-	@Consumes(MediaType.APPLICATION_JSON)
-	public void open(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, JsonElement jsonElement) {		
-		EffectivePerson effectivePerson = this.effectivePerson(request);
-		ActionResult<ActionOpen.Wo> result = new ActionResult<>();
-		try {
-			result = new ActionOpen().execute(request,effectivePerson, jsonElement);
-		} catch (Exception e) {
-			e.printStackTrace();
-			result.error(e);
-		}
-		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
-	}
-	
-	@JaxrsMethodDescribe(value = "保存config文件", action = ActionSave.class)
-	@POST
-	@Path("save")
-	@Consumes(MediaType.APPLICATION_JSON)
-	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)	
-	public void save(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, JsonElement jsonElement) {
-		ActionResult<ActionSave.Wo> result = new ActionResult<>();
-		EffectivePerson effectivePerson = this.effectivePerson(request);
-		try {
-			result = new ActionSave().execute(request , effectivePerson, jsonElement);
-		} catch (Exception e) {
-			logger.error(e, effectivePerson, request, null);
-			result.error(e);
-		}
-		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
-	}
-
-}

+ 23 - 12
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/module/ActionCompareUpload.java

@@ -3,10 +3,15 @@ package com.x.program.center.jaxrs.module;
 import java.util.ArrayList;
 import java.util.List;
 
-import com.x.base.core.project.cache.CacheManager;
+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.config.Config;
+import com.x.base.core.project.config.StorageMapping;
 import com.x.base.core.project.connection.CipherConnectionAction;
+import com.x.program.center.core.entity.Structure;
 import com.x.program.center.core.entity.wrap.WrapServiceModule;
+import org.apache.commons.lang3.StringUtils;
 import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
 
 import com.google.gson.JsonElement;
@@ -16,8 +21,6 @@ import com.x.base.core.project.x_portal_assemble_designer;
 import com.x.base.core.project.x_processplatform_assemble_designer;
 import com.x.base.core.project.x_query_assemble_designer;
 import com.x.base.core.project.annotation.FieldDescribe;
-import com.x.base.core.project.cache.Cache.CacheCategory;
-import com.x.base.core.project.cache.Cache.CacheKey;
 import com.x.base.core.project.connection.ActionResponse;
 import com.x.base.core.project.gson.GsonPropertyObject;
 import com.x.base.core.project.gson.XGsonBuilder;
@@ -26,7 +29,6 @@ import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.DefaultCharset;
-import com.x.base.core.project.tools.StringTools;
 import com.x.cms.core.entity.element.wrap.WrapCms;
 import com.x.portal.core.entity.wrap.WrapPortal;
 import com.x.processplatform.core.entity.element.wrap.WrapProcessPlatform;
@@ -38,20 +40,29 @@ class ActionCompareUpload extends BaseAction {
 
 	private static Logger logger = LoggerFactory.getLogger(ActionCompareUpload.class);
 
-	ActionResult<Wo> execute(EffectivePerson effectivePerson, byte[] bytes, FormDataContentDisposition disposition)
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, byte[] bytes, String fileName, FormDataContentDisposition disposition)
 			throws Exception {
 		logger.debug(effectivePerson, "name: {}.", disposition.getName());
 		ActionResult<Wo> result = new ActionResult<>();
 		Wo wo = new Wo();
 		String json = new String(bytes, DefaultCharset.charset);
 		WrapModule module = XGsonBuilder.instance().fromJson(json, WrapModule.class);
-		CacheObject cacheObject = new CacheObject();
-		cacheObject.setModule(module);
-		String flag = StringTools.uniqueToken();
-		CacheCategory cacheCategory = new CacheCategory(CacheObject.class);
-		CacheKey cacheKey = new CacheKey(flag);
-		CacheManager.put(cacheCategory, cacheKey, cacheObject);
-		wo.setFlag(flag);
+
+		if (StringUtils.isEmpty(fileName)) {
+			fileName = this.fileName(disposition);
+		}
+		if(fileName.indexOf(".")==-1){
+			fileName = fileName + ".xapp";
+		}
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			StorageMapping mapping = ThisApplication.context().storageMappings().random(Structure.class);
+			Structure structure = new Structure(mapping.getName(), fileName);
+			structure.saveContent(mapping, bytes, fileName);
+			emc.beginTransaction(Structure.class);
+			emc.persist(structure, CheckPersistType.all);
+			emc.commit();
+			wo.setFlag(structure.getId());
+		}
 		for (WrapProcessPlatform o : module.getProcessPlatformList()) {
 			ActionResponse r = ThisApplication.context().applications().putQuery(effectivePerson.getDebugger(),
 					x_processplatform_assemble_designer.class, Applications.joinQueryUri("input", "compare"), o);

+ 248 - 221
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/module/ActionWrite.java

@@ -5,7 +5,11 @@ import java.util.List;
 import java.util.Optional;
 
 import com.x.base.core.project.config.Config;
+import com.x.base.core.project.config.StorageMapping;
 import com.x.base.core.project.connection.CipherConnectionAction;
+import com.x.base.core.project.gson.XGsonBuilder;
+import com.x.base.core.project.tools.DefaultCharset;
+import com.x.program.center.core.entity.Structure;
 import com.x.program.center.core.entity.wrap.WrapServiceModule;
 import org.apache.commons.lang3.StringUtils;
 
@@ -40,263 +44,286 @@ public class ActionWrite extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionWrite.class);
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String flag, JsonElement jsonElement) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
-			Wo wo = new Wo();
-			ActionResult<Wo> result = new ActionResult<>();
-			CacheCategory cacheCategory = new CacheCategory(CacheObject.class);
-			CacheKey cacheKey = new CacheKey(flag);
-			Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
-			if (!optional.isPresent()) {
-				throw new ExceptionFlagNotExist(flag);
-			}
+		Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+		Wo wo = new Wo();
+		ActionResult<Wo> result = new ActionResult<>();
+		CacheCategory cacheCategory = new CacheCategory(CacheObject.class);
+		CacheKey cacheKey = new CacheKey(flag);
+		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+		WrapModule module;
+		String name = "";
+		if (optional.isPresent()) {
 			CacheObject cacheObject = (CacheObject) optional.get();
-			WrapModule module = cacheObject.getModule();
-			List<WrapPair> replaces = new ArrayList<>();
-			for (WiCommand cmd : wi.getProcessPlatformList()) {
-				WrapProcessPlatform o = module.getProcessPlatform(cmd.getId());
-				if (null != o) {
-					switch (cmd.getMethod()) {
-					case "create":
-						replaces.addAll(ThisApplication.context().applications()
-								.putQuery(x_processplatform_assemble_designer.class,
-										Applications.joinQueryUri("input", "prepare", "create"), o)
-								.getDataAsList(WrapPair.class));
-						break;
-					case "cover":
-						replaces.addAll(ThisApplication.context().applications()
-								.putQuery(x_processplatform_assemble_designer.class,
-										Applications.joinQueryUri("input", "prepare", "cover"), o)
-								.getDataAsList(WrapPair.class));
-						break;
-					default:
-						break;
-					}
+			module = cacheObject.getModule();
+		}else{
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Structure structure = emc.find(flag, Structure.class);
+				if(structure!=null){
+					StorageMapping gfMapping = ThisApplication.context().storageMappings().get(Structure.class,
+							structure.getStorage());
+					String json = new String(structure.readContent(gfMapping), DefaultCharset.charset);
+					module = XGsonBuilder.instance().fromJson(json, WrapModule.class);
+					name = structure.getName();
+					structure.deleteContent(gfMapping);
+					emc.beginTransaction(Structure.class);
+					emc.delete(Structure.class, structure.getId());
+					emc.commit();
+				}else{
+					throw new ExceptionFlagNotExist(flag);
 				}
 			}
-			for (WiCommand cmd : wi.getCmsList()) {
-				WrapCms o = module.getCms(cmd.getId());
-				if (null != o) {
-					switch (cmd.getMethod()) {
-					case "create":
-						replaces.addAll(ThisApplication.context().applications()
-								.putQuery(x_cms_assemble_control.class,
-										Applications.joinQueryUri("input", "prepare", "create"), o)
-								.getDataAsList(WrapPair.class));
-						break;
-					case "cover":
-						replaces.addAll(ThisApplication.context().applications()
-								.putQuery(x_cms_assemble_control.class,
-										Applications.joinQueryUri("input", "prepare", "cover"), o)
-								.getDataAsList(WrapPair.class));
-						break;
-					default:
-						break;
-					}
+		}
+		if(StringUtils.isNotBlank(name)) {
+			logger.print("开始安装模块:{}", name);
+		}
+		List<WrapPair> replaces = new ArrayList<>();
+		for (WiCommand cmd : wi.getProcessPlatformList()) {
+			WrapProcessPlatform o = module.getProcessPlatform(cmd.getId());
+			if (null != o) {
+				switch (cmd.getMethod()) {
+				case "create":
+					replaces.addAll(ThisApplication.context().applications()
+							.putQuery(x_processplatform_assemble_designer.class,
+									Applications.joinQueryUri("input", "prepare", "create"), o)
+							.getDataAsList(WrapPair.class));
+					break;
+				case "cover":
+					replaces.addAll(ThisApplication.context().applications()
+							.putQuery(x_processplatform_assemble_designer.class,
+									Applications.joinQueryUri("input", "prepare", "cover"), o)
+							.getDataAsList(WrapPair.class));
+					break;
+				default:
+					break;
 				}
 			}
-			for (WiCommand cmd : wi.getPortalList()) {
-				WrapPortal o = module.getPortal(cmd.getId());
-				if (null != o) {
-					switch (cmd.getMethod()) {
-					case "create":
-						replaces.addAll(ThisApplication.context().applications()
-								.putQuery(x_portal_assemble_designer.class,
-										Applications.joinQueryUri("input", "prepare", "create"), o)
-								.getDataAsList(WrapPair.class));
-						break;
-					case "cover":
-						replaces.addAll(ThisApplication.context().applications()
-								.putQuery(x_portal_assemble_designer.class,
-										Applications.joinQueryUri("input", "prepare", "cover"), o)
-								.getDataAsList(WrapPair.class));
-						break;
-					default:
-						break;
-					}
+		}
+		for (WiCommand cmd : wi.getCmsList()) {
+			WrapCms o = module.getCms(cmd.getId());
+			if (null != o) {
+				switch (cmd.getMethod()) {
+				case "create":
+					replaces.addAll(ThisApplication.context().applications()
+							.putQuery(x_cms_assemble_control.class,
+									Applications.joinQueryUri("input", "prepare", "create"), o)
+							.getDataAsList(WrapPair.class));
+					break;
+				case "cover":
+					replaces.addAll(ThisApplication.context().applications()
+							.putQuery(x_cms_assemble_control.class,
+									Applications.joinQueryUri("input", "prepare", "cover"), o)
+							.getDataAsList(WrapPair.class));
+					break;
+				default:
+					break;
 				}
 			}
-			for (WiCommand cmd : wi.getQueryList()) {
-				WrapQuery o = module.getQuery(cmd.getId());
-				if (null != o) {
-					switch (cmd.getMethod()) {
+		}
+		for (WiCommand cmd : wi.getPortalList()) {
+			WrapPortal o = module.getPortal(cmd.getId());
+			if (null != o) {
+				switch (cmd.getMethod()) {
+				case "create":
+					replaces.addAll(ThisApplication.context().applications()
+							.putQuery(x_portal_assemble_designer.class,
+									Applications.joinQueryUri("input", "prepare", "create"), o)
+							.getDataAsList(WrapPair.class));
+					break;
+				case "cover":
+					replaces.addAll(ThisApplication.context().applications()
+							.putQuery(x_portal_assemble_designer.class,
+									Applications.joinQueryUri("input", "prepare", "cover"), o)
+							.getDataAsList(WrapPair.class));
+					break;
+				default:
+					break;
+				}
+			}
+		}
+		for (WiCommand cmd : wi.getQueryList()) {
+			WrapQuery o = module.getQuery(cmd.getId());
+			if (null != o) {
+				switch (cmd.getMethod()) {
+				case "create":
+					replaces.addAll(ThisApplication.context().applications()
+							.putQuery(x_query_assemble_designer.class,
+									Applications.joinQueryUri("input", "prepare", "create"), o)
+							.getDataAsList(WrapPair.class));
+					break;
+				case "cover":
+					replaces.addAll(ThisApplication.context().applications()
+							.putQuery(x_query_assemble_designer.class,
+									Applications.joinQueryUri("input", "prepare", "cover"), o)
+							.getDataAsList(WrapPair.class));
+					break;
+				default:
+					break;
+				}
+			}
+		}
+		for (WiCommand cmd : wi.getServiceModuleList()) {
+			WrapServiceModule o = module.getServiceModule(cmd.getId());
+			if (null != o) {
+				switch (cmd.getMethod()) {
 					case "create":
-						replaces.addAll(ThisApplication.context().applications()
-								.putQuery(x_query_assemble_designer.class,
-										Applications.joinQueryUri("input", "prepare", "create"), o)
+						replaces.addAll(CipherConnectionAction.put(false,
+								Config.url_x_program_center_jaxrs("input", "prepare", "create"), o)
 								.getDataAsList(WrapPair.class));
 						break;
 					case "cover":
-						replaces.addAll(ThisApplication.context().applications()
-								.putQuery(x_query_assemble_designer.class,
-										Applications.joinQueryUri("input", "prepare", "cover"), o)
+						replaces.addAll(CipherConnectionAction.put(false,
+								Config.url_x_program_center_jaxrs("input", "prepare", "cover"), o)
 								.getDataAsList(WrapPair.class));
 						break;
 					default:
 						break;
-					}
 				}
 			}
-			for (WiCommand cmd : wi.getServiceModuleList()) {
-				WrapServiceModule o = module.getServiceModule(cmd.getId());
-				if (null != o) {
-					switch (cmd.getMethod()) {
-						case "create":
-							replaces.addAll(CipherConnectionAction.put(false,
-									Config.url_x_program_center_jaxrs("input", "prepare", "create"), o)
-									.getDataAsList(WrapPair.class));
-							break;
-						case "cover":
-							replaces.addAll(CipherConnectionAction.put(false,
-									Config.url_x_program_center_jaxrs("input", "prepare", "cover"), o)
-									.getDataAsList(WrapPair.class));
-							break;
-						default:
-							break;
-					}
+		}
+		for (WiCommand cmd : wi.getProcessPlatformList()) {
+			WrapProcessPlatform o = module.getProcessPlatform(cmd.getId());
+			if (null != o) {
+				String json = gson.toJson(o);
+				for (WrapPair re : replaces) {
+					json = StringUtils.replace(json, re.getFirst(), re.getSecond());
+				}
+				WrapProcessPlatform obj = gson.fromJson(json, WrapProcessPlatform.class);
+				switch (cmd.getMethod()) {
+				case "create":
+					wo.getProcessPlatformList()
+							.add(ThisApplication.context().applications()
+									.putQuery(x_processplatform_assemble_designer.class,
+											Applications.joinQueryUri("input", "create"), obj)
+									.getData(WoId.class).getId());
+					break;
+				case "cover":
+					wo.getProcessPlatformList()
+							.add(ThisApplication.context().applications()
+									.putQuery(x_processplatform_assemble_designer.class,
+											Applications.joinQueryUri("input", "cover"), obj)
+									.getData(WoId.class).getId());
+					break;
+				default:
+					break;
 				}
 			}
-			for (WiCommand cmd : wi.getProcessPlatformList()) {
-				WrapProcessPlatform o = module.getProcessPlatform(cmd.getId());
-				if (null != o) {
-					String json = gson.toJson(o);
-					for (WrapPair re : replaces) {
-						json = StringUtils.replace(json, re.getFirst(), re.getSecond());
-					}
-					WrapProcessPlatform obj = gson.fromJson(json, WrapProcessPlatform.class);
-					switch (cmd.getMethod()) {
-					case "create":
-						wo.getProcessPlatformList()
-								.add(ThisApplication.context().applications()
-										.putQuery(x_processplatform_assemble_designer.class,
-												Applications.joinQueryUri("input", "create"), obj)
-										.getData(WoId.class).getId());
-						break;
-					case "cover":
-						wo.getProcessPlatformList()
-								.add(ThisApplication.context().applications()
-										.putQuery(x_processplatform_assemble_designer.class,
-												Applications.joinQueryUri("input", "cover"), obj)
-										.getData(WoId.class).getId());
-						break;
-					default:
-						break;
-					}
+		}
+		for (WiCommand cmd : wi.getCmsList()) {
+			WrapCms o = module.getCms(cmd.getId());
+			if (null != o) {
+				String json = gson.toJson(o);
+				for (WrapPair re : replaces) {
+					json = StringUtils.replace(json, re.getFirst(), re.getSecond());
+				}
+				WrapCms obj = gson.fromJson(json, WrapCms.class);
+				switch (cmd.getMethod()) {
+				case "create":
+					wo.getCmsList()
+							.add(ThisApplication.context().applications()
+									.putQuery(x_cms_assemble_control.class,
+											Applications.joinQueryUri("input", "create"), obj)
+									.getData(WoId.class).getId());
+					break;
+				case "cover":
+					wo.getCmsList()
+							.add(ThisApplication.context().applications()
+									.putQuery(x_cms_assemble_control.class,
+											Applications.joinQueryUri("input", "cover"), obj)
+									.getData(WoId.class).getId());
+					break;
+				default:
+					break;
 				}
 			}
-			for (WiCommand cmd : wi.getCmsList()) {
-				WrapCms o = module.getCms(cmd.getId());
-				if (null != o) {
-					String json = gson.toJson(o);
-					for (WrapPair re : replaces) {
-						json = StringUtils.replace(json, re.getFirst(), re.getSecond());
-					}
-					WrapCms obj = gson.fromJson(json, WrapCms.class);
-					switch (cmd.getMethod()) {
-					case "create":
-						wo.getCmsList()
-								.add(ThisApplication.context().applications()
-										.putQuery(x_cms_assemble_control.class,
-												Applications.joinQueryUri("input", "create"), obj)
-										.getData(WoId.class).getId());
-						break;
-					case "cover":
-						wo.getCmsList()
-								.add(ThisApplication.context().applications()
-										.putQuery(x_cms_assemble_control.class,
-												Applications.joinQueryUri("input", "cover"), obj)
-										.getData(WoId.class).getId());
-						break;
-					default:
-						break;
-					}
+		}
+		for (WiCommand cmd : wi.getPortalList()) {
+			WrapPortal o = module.getPortal(cmd.getId());
+			if (null != o) {
+				String json = gson.toJson(o);
+				for (WrapPair re : replaces) {
+					json = StringUtils.replace(json, re.getFirst(), re.getSecond());
+				}
+				WrapPortal obj = gson.fromJson(json, WrapPortal.class);
+				switch (cmd.getMethod()) {
+				case "create":
+					wo.getPortalList()
+							.add(ThisApplication.context().applications()
+									.putQuery(x_portal_assemble_designer.class,
+											Applications.joinQueryUri("input", "create"), obj)
+									.getData(WoId.class).getId());
+					break;
+				case "cover":
+					wo.getPortalList()
+							.add(ThisApplication.context().applications()
+									.putQuery(x_portal_assemble_designer.class,
+											Applications.joinQueryUri("input", "cover"), obj)
+									.getData(WoId.class).getId());
+					break;
+				default:
+					break;
 				}
 			}
-			for (WiCommand cmd : wi.getPortalList()) {
-				WrapPortal o = module.getPortal(cmd.getId());
-				if (null != o) {
-					String json = gson.toJson(o);
-					for (WrapPair re : replaces) {
-						json = StringUtils.replace(json, re.getFirst(), re.getSecond());
-					}
-					WrapPortal obj = gson.fromJson(json, WrapPortal.class);
-					switch (cmd.getMethod()) {
-					case "create":
-						wo.getPortalList()
-								.add(ThisApplication.context().applications()
-										.putQuery(x_portal_assemble_designer.class,
-												Applications.joinQueryUri("input", "create"), obj)
-										.getData(WoId.class).getId());
-						break;
-					case "cover":
-						wo.getPortalList()
-								.add(ThisApplication.context().applications()
-										.putQuery(x_portal_assemble_designer.class,
-												Applications.joinQueryUri("input", "cover"), obj)
-										.getData(WoId.class).getId());
-						break;
-					default:
-						break;
-					}
+		}
+		for (WiCommand cmd : wi.getQueryList()) {
+			WrapQuery o = module.getQuery(cmd.getId());
+			if (null != o) {
+				String json = gson.toJson(o);
+				for (WrapPair re : replaces) {
+					json = StringUtils.replace(json, re.getFirst(), re.getSecond());
+				}
+				WrapQuery obj = gson.fromJson(json, WrapQuery.class);
+				switch (cmd.getMethod()) {
+				case "create":
+					wo.getQueryList()
+							.add(ThisApplication.context().applications()
+									.putQuery(x_query_assemble_designer.class,
+											Applications.joinQueryUri("input", "create"), obj)
+									.getData(WoId.class).getId());
+					break;
+				case "cover":
+					wo.getQueryList()
+							.add(ThisApplication.context().applications()
+									.putQuery(x_query_assemble_designer.class,
+											Applications.joinQueryUri("input", "cover"), obj)
+									.getData(WoId.class).getId());
+					break;
+				default:
+					break;
 				}
 			}
-			for (WiCommand cmd : wi.getQueryList()) {
-				WrapQuery o = module.getQuery(cmd.getId());
-				if (null != o) {
-					String json = gson.toJson(o);
-					for (WrapPair re : replaces) {
-						json = StringUtils.replace(json, re.getFirst(), re.getSecond());
-					}
-					WrapQuery obj = gson.fromJson(json, WrapQuery.class);
-					switch (cmd.getMethod()) {
+		}
+		for (WiCommand cmd : wi.getServiceModuleList()) {
+			WrapServiceModule o = module.getServiceModule(cmd.getId());
+			if (null != o) {
+				String json = gson.toJson(o);
+				for (WrapPair re : replaces) {
+					json = StringUtils.replace(json, re.getFirst(), re.getSecond());
+				}
+				WrapServiceModule obj = gson.fromJson(json, WrapServiceModule.class);
+				switch (cmd.getMethod()) {
 					case "create":
-						wo.getQueryList()
-								.add(ThisApplication.context().applications()
-										.putQuery(x_query_assemble_designer.class,
-												Applications.joinQueryUri("input", "create"), obj)
+						wo.getServiceModuleList()
+								.add(CipherConnectionAction.put(false,
+										Config.url_x_program_center_jaxrs("input", "create"), obj)
 										.getData(WoId.class).getId());
 						break;
 					case "cover":
-						wo.getQueryList()
-								.add(ThisApplication.context().applications()
-										.putQuery(x_query_assemble_designer.class,
-												Applications.joinQueryUri("input", "cover"), obj)
+						wo.getServiceModuleList()
+								.add(CipherConnectionAction.put(false,
+										Config.url_x_program_center_jaxrs("input", "cover"), obj)
 										.getData(WoId.class).getId());
 						break;
 					default:
 						break;
-					}
 				}
 			}
-			for (WiCommand cmd : wi.getServiceModuleList()) {
-				WrapServiceModule o = module.getServiceModule(cmd.getId());
-				if (null != o) {
-					String json = gson.toJson(o);
-					for (WrapPair re : replaces) {
-						json = StringUtils.replace(json, re.getFirst(), re.getSecond());
-					}
-					WrapServiceModule obj = gson.fromJson(json, WrapServiceModule.class);
-					switch (cmd.getMethod()) {
-						case "create":
-							wo.getServiceModuleList()
-									.add(CipherConnectionAction.put(false,
-											Config.url_x_program_center_jaxrs("input", "create"), obj)
-											.getData(WoId.class).getId());
-							break;
-						case "cover":
-							wo.getServiceModuleList()
-									.add(CipherConnectionAction.put(false,
-											Config.url_x_program_center_jaxrs("input", "cover"), obj)
-											.getData(WoId.class).getId());
-							break;
-						default:
-							break;
-					}
-				}
-			}
-			result.setData(wo);
-			return result;
 		}
+		if(StringUtils.isNotBlank(name)) {
+			logger.print("完成安装模块:{}", name);
+		}
+		result.setData(wo);
+		return result;
+
 	}
 
 	public static class Wi extends GsonPropertyObject {

+ 2 - 1
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/module/ModuleAction.java

@@ -90,11 +90,12 @@ public class ModuleAction extends StandardJaxrsAction {
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	public void compareUpload(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
 			@FormDataParam(FILE_FIELD) final byte[] bytes,
+			@JaxrsParameterDescribe("附件名称") @FormDataParam(FILENAME_FIELD) String fileName,
 			@JaxrsParameterDescribe(".xapp文件") @FormDataParam(FILE_FIELD) final FormDataContentDisposition disposition) {
 		ActionResult<ActionCompareUpload.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
-			result = new ActionCompareUpload().execute(effectivePerson, bytes, disposition);
+			result = new ActionCompareUpload().execute(effectivePerson, bytes, fileName, disposition);
 		} catch (Exception e) {
 			logger.error(e, effectivePerson, request, null);
 			result.error(e);

+ 1 - 1
o2server/x_program_center_core_entity/src/main/java/com/x/program/center/core/entity/Structure.java

@@ -166,7 +166,7 @@ public class Structure extends StorageObject {
 	public static final String name_FIELDNAME = "name";
 	@FieldDescribe("名称.")
 	@Column(length = JpaObject.length_255B, name = ColumnNamePrefix + name_FIELDNAME)
-	@CheckPersist(allowEmpty = false, simplyString = true)
+	@CheckPersist(allowEmpty = false)
 	@Index(name = TABLE + IndexNameMiddle + name_FIELDNAME)
 	private String name;