Forráskód Böngészése

Merge branch 'feature/新版应用市场应用卸载' into 'develop'

【新版应用市场】应用卸载

See merge request o2oa/o2oa!1089
o2null 5 éve
szülő
commit
6edf2a75c3

+ 50 - 39
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/market/ActionInstallOrUpdate.java

@@ -12,6 +12,7 @@ import com.x.base.core.project.config.Collect;
 import com.x.base.core.project.config.Config;
 import com.x.base.core.project.connection.CipherConnectionAction;
 import com.x.base.core.project.connection.ConnectionAction;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
 import com.x.base.core.project.gson.GsonPropertyObject;
 import com.x.base.core.project.http.ActionResult;
@@ -58,6 +59,9 @@ class ActionInstallOrUpdate extends BaseAction {
 			if (null == app) {
 				throw new ExceptionEntityNotExist(id, Application.class);
 			}
+			if(!hasAuth(effectivePerson, null)){
+				throw new ExceptionAccessDenied(effectivePerson, app);
+			}
 			logger.print("{}发起安装或更新应用:{}", effectivePerson.getDistinguishedName(), app.getName());
 			Wo wo = new Wo();
 			wo.setValue(false);
@@ -67,7 +71,7 @@ class ActionInstallOrUpdate extends BaseAction {
 					byte[] bytes = ConnectionAction.getFile(Config.collect().url(Collect.ADDRESS_COLLECT_APPLICATION_DOWN + "/" + id),
 							ListTools.toList(new NameValuePair(Collect.COLLECT_TOKEN, token)));
 					if(bytes!=null){
-						WrapModule module = this.install(bytes);
+						WrapModule module = this.install(id, bytes);
 						if(module!=null) {
 							wo.setValue(true);
 							emc.beginTransaction(InstallLog.class);
@@ -101,12 +105,12 @@ class ActionInstallOrUpdate extends BaseAction {
 		}
 	}
 
-	private WrapModule install(byte[] bytes) throws Exception{
+	private WrapModule install(String id, byte[] bytes) throws Exception{
 		WrapModule module = null;
 		File tempFile = new File(Config.base(), "local/temp/install");
 		FileTools.forceMkdir(tempFile);
 		FileUtils.cleanDirectory(tempFile);
-		File zipFile = new File(tempFile.getAbsolutePath(), UUID.randomUUID().toString()+".zip");
+		File zipFile = new File(tempFile.getAbsolutePath(), id+".zip");
 		FileUtils.writeByteArrayToFile(zipFile, bytes);
 		File dist = new File(tempFile.getAbsolutePath(), "data");
 		FileTools.forceMkdir(dist);
@@ -125,56 +129,63 @@ class ActionInstallOrUpdate extends BaseAction {
 				if(file.getName().toLowerCase().endsWith(".zip")){
 					logger.print("开始安装静态资源");
 					try {
-						Business.dispatch(true, file.getName(), "", FileUtils.readFileToByteArray(file));
+						Business.dispatch(false, file.getName(), "", FileUtils.readFileToByteArray(file));
 					} catch (Exception e) {
 						logger.print("模块安装成功但静态资源安装失败:{}",e.getMessage());
 					}
 				}
 			}
 		}
+		FileUtils.cleanDirectory(tempFile);
 		return module;
 	}
 
 	private InstallWo installModule(WrapModule module) throws Exception{
 		InstallWo wo = new InstallWo();
 		logger.print("开始安装应用");
-		for (WrapProcessPlatform obj : module.getProcessPlatformList()) {
-			wo.getProcessPlatformList()
-					.add(ThisApplication.context().applications()
-							.putQuery(x_processplatform_assemble_designer.class,
-									Applications.joinQueryUri("input", "cover"), obj)
-							.getData(WoId.class).getId());
-			obj.setIcon(null);
-			obj.setApplicationDictList(null);
-			obj.setFileList(null);
-			obj.setFormList(null);
-			obj.setProcessList(null);
-			obj.setScriptList(null);
+		if(module.getProcessPlatformList()!=null) {
+			for (WrapProcessPlatform obj : module.getProcessPlatformList()) {
+				wo.getProcessPlatformList()
+						.add(ThisApplication.context().applications()
+								.putQuery(x_processplatform_assemble_designer.class,
+										Applications.joinQueryUri("input", "cover"), obj)
+								.getData(WoId.class).getId());
+				obj.setIcon(null);
+				obj.setApplicationDictList(null);
+				obj.setFileList(null);
+				obj.setFormList(null);
+				obj.setProcessList(null);
+				obj.setScriptList(null);
+			}
 		}
-		for (WrapCms obj : module.getCmsList()) {
-			wo.getCmsList()
-					.add(ThisApplication.context().applications()
-							.putQuery(x_cms_assemble_control.class,
-									Applications.joinQueryUri("input", "cover"), obj)
-							.getData(WoId.class).getId());
-			obj.setAppIcon(null);
-			obj.setAppDictList(null);
-			obj.setCategoryInfoList(null);
-			obj.setFileList(null);
-			obj.setFormList(null);
-			obj.setScriptList(null);
+		if(module.getCmsList()!=null) {
+			for (WrapCms obj : module.getCmsList()) {
+				wo.getCmsList()
+						.add(ThisApplication.context().applications()
+								.putQuery(x_cms_assemble_control.class,
+										Applications.joinQueryUri("input", "cover"), obj)
+								.getData(WoId.class).getId());
+				obj.setAppIcon(null);
+				obj.setAppDictList(null);
+				obj.setCategoryInfoList(null);
+				obj.setFileList(null);
+				obj.setFormList(null);
+				obj.setScriptList(null);
+			}
 		}
-		for (WrapPortal obj : module.getPortalList()) {
-			wo.getPortalList()
-					.add(ThisApplication.context().applications()
-							.putQuery(x_portal_assemble_designer.class,
-									Applications.joinQueryUri("input", "cover"), obj)
-							.getData(WoId.class).getId());
-			obj.setIcon(null);
-			obj.setFileList(null);
-			obj.setPageList(null);
-			obj.setScriptList(null);
-			obj.setWidgetList(null);
+		if(module.getPortalList()!=null) {
+			for (WrapPortal obj : module.getPortalList()) {
+				wo.getPortalList()
+						.add(ThisApplication.context().applications()
+								.putQuery(x_portal_assemble_designer.class,
+										Applications.joinQueryUri("input", "cover"), obj)
+								.getData(WoId.class).getId());
+				obj.setIcon(null);
+				obj.setFileList(null);
+				obj.setPageList(null);
+				obj.setScriptList(null);
+				obj.setWidgetList(null);
+			}
 		}
 		if(module.getQueryList()!=null){
 			for (WrapQuery obj : module.getQueryList()) {

+ 134 - 0
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/market/ActionUninstall.java

@@ -0,0 +1,134 @@
+package com.x.program.center.jaxrs.market;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.enums.CommonStatus;
+import com.x.base.core.project.*;
+import com.x.base.core.project.config.Config;
+import com.x.base.core.project.connection.CipherConnectionAction;
+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.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+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;
+import com.x.program.center.ThisApplication;
+import com.x.program.center.WrapModule;
+import com.x.program.center.core.entity.Application;
+import com.x.program.center.core.entity.InstallLog;
+import com.x.program.center.core.entity.wrap.WrapAgent;
+import com.x.program.center.core.entity.wrap.WrapInvoke;
+import com.x.program.center.core.entity.wrap.WrapServiceModule;
+import com.x.query.core.entity.wrap.WrapQuery;
+
+import java.util.Date;
+
+class ActionUninstall extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionUninstall.class);
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Application app = emc.find(id, Application.class);
+			if (null == app) {
+				throw new ExceptionEntityNotExist(id, Application.class);
+			}
+			InstallLog installLog = emc.find(id, InstallLog.class);
+			if(installLog==null){
+				throw new ExceptionEntityNotExist(id, InstallLog.class);
+			}
+			if(!hasAuth(effectivePerson, installLog.getInstallPerson())){
+				throw new ExceptionAccessDenied(effectivePerson, app);
+			}
+			logger.print("{}发起卸载应用:{}", effectivePerson.getDistinguishedName(), app.getName());
+			Wo wo = new Wo();
+			WrapModule module = gson.fromJson(installLog.getData(), WrapModule.class);
+			this.uninstall(module);
+			emc.beginTransaction(InstallLog.class);
+			installLog.setStatus(CommonStatus.INVALID.getValue());
+			installLog.setUnInstallPerson(effectivePerson.getDistinguishedName());
+			installLog.setUnInstallTime(new Date());
+			emc.commit();
+			wo.setValue(true);
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	private void uninstall(WrapModule module) throws Exception{
+		boolean flag = true;
+		try {
+			if(module.getProcessPlatformList()!=null) {
+				for (WrapProcessPlatform obj : module.getProcessPlatformList()) {
+					ThisApplication.context().applications()
+							.deleteQuery(x_processplatform_assemble_designer.class,
+									Applications.joinQueryUri("application", obj.getId()), "true");
+				}
+			}
+		} catch (Exception e) {
+			logger.warn("卸载流程平台应用异常:{}",e.getMessage());
+		}
+		try {
+			if(module.getCmsList()!=null) {
+				for (WrapCms obj : module.getCmsList()) {
+					ThisApplication.context().applications()
+							.deleteQuery(x_cms_assemble_control.class,
+									Applications.joinQueryUri("appinfo/erase/app", obj.getId()));
+				}
+			}
+		} catch (Exception e) {
+			logger.warn("卸载CMS应用异常:{}",e.getMessage());
+		}
+		try {
+			if(module.getPortalList()!=null) {
+				for (WrapPortal obj : module.getPortalList()) {
+					ThisApplication.context().applications()
+							.deleteQuery(x_portal_assemble_designer.class,
+									Applications.joinQueryUri("portal", obj.getId()));
+				}
+			}
+		} catch (Exception e) {
+			logger.warn("卸载门户应用异常:{}",e.getMessage());
+		}
+		try {
+			if(module.getQueryList()!=null){
+				for (WrapQuery obj : module.getQueryList()) {
+					ThisApplication.context().applications()
+							.deleteQuery(x_query_assemble_designer.class,
+									Applications.joinQueryUri("query", obj.getId()));
+				}
+			}
+		} catch (Exception e) {
+			logger.warn("卸载数据中心应用异常:{}",e.getMessage());
+		}
+
+		try {
+			if(module.getServiceModuleList()!=null) {
+				for (WrapServiceModule obj : module.getServiceModuleList()) {
+					if(obj.getInvokeList()!=null){
+						for(WrapInvoke invoke : obj.getInvokeList()){
+							CipherConnectionAction.delete(false, Config.url_x_program_center_jaxrs("invoke", invoke.getId()));
+						}
+					}
+					if(obj.getAgentList()!=null){
+						for(WrapAgent agent : obj.getAgentList()){
+							CipherConnectionAction.delete(false, Config.url_x_program_center_jaxrs("agent", agent.getId()));
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			logger.warn("卸载服务模块异常:{}",e.getMessage());
+		}
+
+	}
+
+	public static class Wo extends WrapBoolean {
+
+	}
+}

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

@@ -1,6 +1,7 @@
 package com.x.program.center.jaxrs.market;
 
 import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.program.center.WrapModule;
 import com.x.program.center.core.entity.Application;
@@ -10,4 +11,14 @@ abstract class BaseAction extends StandardJaxrsAction {
 
 	protected Ehcache cache = ApplicationCache.instance().getCache(Application.class);
 
+	public boolean hasAuth(EffectivePerson effectivePerson, String person){
+		if(effectivePerson.isManager()){
+			return true;
+		}
+		if(effectivePerson.getDistinguishedName().equals(person)){
+			return true;
+		}
+		return false;
+	}
+
 }

+ 22 - 4
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/market/MarketAction.java

@@ -50,7 +50,7 @@ public class MarketAction extends StandardJaxrsAction {
 	@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) {
+					@JaxrsParameterDescribe("应用标识") @PathParam("flag") String flag) {
 		ActionResult<ActionGet.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
@@ -68,7 +68,7 @@ public class MarketAction extends StandardJaxrsAction {
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
 	public void getCoverPic(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
-					@JaxrsParameterDescribe("标识") @PathParam("flag") String flag) {
+					@JaxrsParameterDescribe("应用标识") @PathParam("flag") String flag) {
 		ActionResult<ActionGetCoverPic.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
@@ -102,8 +102,8 @@ public class MarketAction extends StandardJaxrsAction {
 	@Path("{flag}/install/or/update")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
-	public void installOrUpdate(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
-					@JaxrsParameterDescribe("标识") @PathParam("flag") String flag) {
+	public synchronized void installOrUpdate(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+					@JaxrsParameterDescribe("应用标识") @PathParam("flag") String flag) {
 		ActionResult<ActionInstallOrUpdate.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
@@ -187,4 +187,22 @@ public class MarketAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
+	@JaxrsMethodDescribe(value = "卸载应用.", action = ActionUninstall.class)
+	@GET
+	@Path("{flag}/uninstall")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public synchronized void uninstall(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+								@JaxrsParameterDescribe("应用标识") @PathParam("flag") String flag) {
+		ActionResult<ActionUninstall.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionUninstall().execute(effectivePerson, flag);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
 }

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

@@ -127,7 +127,7 @@ public class ModuleAction extends StandardJaxrsAction {
 	@Path("write/{flag}")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
-	public void write(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+	public synchronized void write(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
 			@JaxrsParameterDescribe("输出文件标识") @PathParam("flag") String flag, JsonElement jsonElement) {
 		ActionResult<ActionWrite.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);