瀏覽代碼

Merge branch 'wrdp' into 'develop'

Wrdp

See merge request o2oa/o2oa!2065
o2null 5 年之前
父節點
當前提交
9c51cbc583

+ 5 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/PersistenceXmlHelper.java

@@ -172,7 +172,7 @@ public class PersistenceXmlHelper {
 					mapped_element.addText(o.getName());
 				}
 			}
-			if(dynamicFlag) {
+			if (dynamicFlag) {
 				for (String className : names) {
 					if (className.startsWith(DynamicEntity.CLASS_PACKAGE)) {
 						dyClasses.add(className);
@@ -192,7 +192,7 @@ public class PersistenceXmlHelper {
 						mapped_element.addText(dyClass);
 					}
 					for (Class<?> o : JpaObjectTools.scanMappedSuperclass(DynamicBaseEntity.class)) {
-						if(!o.getName().equals(DynamicBaseEntity.class.getName())) {
+						if (!o.getName().equals(DynamicBaseEntity.class.getName())) {
 							Element mapped_element = unit.addElement("class");
 							mapped_element.addText(o.getName());
 						}
@@ -296,6 +296,9 @@ public class PersistenceXmlHelper {
 		if (Config.externalDataSources().hasSchema()) {
 			properties.put("openjpa.jdbc.Schema", JpaObject.default_schema);
 		}
+		if (StringUtils.isNotEmpty(Config.externalDataSources().getTransactionIsolation())) {
+			properties.put("openjpa.jdbc.TransactionIsolation", Config.externalDataSources().getTransactionIsolation());
+		}
 		for (String name : Config.externalDataSources().findNamesOfContainerEntity(className)) {
 			properties.put("openjpa.ConnectionFactoryName", Config.RESOURCE_JDBC_PREFIX + name);
 			properties.put("openjpa.Log", Config.externalDataSources().log(name));

+ 10 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ExternalDataSource.java

@@ -30,6 +30,7 @@ public class ExternalDataSource extends ConfigObject {
 		this.statEnable = DEFAULT_STATENABLE;
 		this.statFilter = DEFAULT_STATFILTER;
 		this.slowSqlMillis = DEFAULT_SLOWSQLMILLIS;
+		this.transactionIsolation = DEFAULT_TRANSACTIONISOLATION;
 	}
 
 	public static ExternalDataSource defaultInstance() {
@@ -65,6 +66,8 @@ public class ExternalDataSource extends ConfigObject {
 	private List<String> excludes;
 	@FieldDescribe("默认日志级别,FATAL, ERROR, WARN, INFO, TRACE. 完成的配置为DefaultLevel=WARN, Tool=TRACE, Enhance=TRACE, METADATA=TRACE, Runtime=TRACE, Query=TRACE, DataCache=TRACE, JDBC=TRACE, SQL=TRACE")
 	private String logLevel = DEFAULT_LOGLEVEL;
+	@FieldDescribe("事务隔离级别:default,none,read-committed,read-uncommitted,repeatable-read,serializable.默认使用default(数据库设置的事务级别).")
+	private String transactionIsolation;
 
 	public static final Integer DEFAULT_MAXTOTAL = 50;
 
@@ -78,6 +81,13 @@ public class ExternalDataSource extends ConfigObject {
 
 	public static final String DEFAULT_LOGLEVEL = "WARN";
 
+	public static final String DEFAULT_TRANSACTIONISOLATION = "default";
+
+	public String getTransactionIsolation() {
+		return StringUtils.isEmpty(this.transactionIsolation) ? DEFAULT_TRANSACTIONISOLATION
+				: this.transactionIsolation;
+	}
+
 	public String getLogLevel() {
 		return StringUtils.isEmpty(this.logLevel) ? DEFAULT_LOGLEVEL : this.logLevel;
 	}

+ 7 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ExternalDataSources.java

@@ -117,4 +117,11 @@ public class ExternalDataSources extends CopyOnWriteArrayList<ExternalDataSource
 		throw new Exception("hasSchema error.");
 	}
 
+	public String getTransactionIsolation() {
+		for (ExternalDataSource o : this) {
+			return o.getTransactionIsolation();
+		}
+		return null;
+	}
+
 }

+ 100 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/ActionQueryGetDocumentData.java

@@ -0,0 +1,100 @@
+package com.x.cms.assemble.control.jaxrs.document;
+
+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.cache.Cache;
+import com.x.base.core.project.cache.CacheManager;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.cms.core.entity.Document;
+import com.x.cms.core.entity.content.Data;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+public class ActionQueryGetDocumentData extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger(ActionQueryGetDocumentData.class);
+
+	protected ActionResult<Wo> execute(HttpServletRequest request, EffectivePerson effectivePerson, String id) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wo = getDocumentQueryResult(id);
+		result.setData(wo);
+		return result;			
+	}
+
+	private Wo getDocumentQueryResult(String id) throws Exception {
+		Wo wo = null;
+
+		Cache.CacheKey cacheKey = new Cache.CacheKey(this.getClass(), id);
+		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+		if (optional.isPresent()) {
+			wo = (Wo)optional.get();
+		} else {
+			Document document = documentQueryService.get(id);
+			wo = new Wo();
+			if(document!=null) {
+				WoDocument woOutDocument = WoDocument.copier.copy(document);
+				wo.setDocId(document.getId());
+				wo.setDocument(woOutDocument);
+				wo.setData(documentQueryService.getDocumentData(document));
+				CacheManager.put(cacheCategory, cacheKey, wo);
+			}
+		}
+		return wo;
+	}
+
+	public static class Wo extends GsonPropertyObject {
+		@FieldDescribe( "文档ID." )
+		private String docId;
+
+		@FieldDescribe( "作为输出的CMS文档数据对象." )
+		private WoDocument document;
+
+		@FieldDescribe( "文档所有数据信息." )
+		private Data data;
+
+		public String getDocId() {
+			return docId;
+		}
+
+		public void setDocId(String docId) {
+			this.docId = docId;
+		}
+
+		public WoDocument getDocument() {
+			return document;
+		}
+
+		public void setDocument( WoDocument document) {
+			this.document = document;
+		}
+
+		public Data getData() {
+			return data;
+		}
+
+		public void setData(Data data) {
+			this.data = data;
+		}
+
+	}
+	
+	public static class WoDocument extends Document {
+		
+		private static final long serialVersionUID = -5076990764713538973L;
+		
+		public static List<String> Excludes = new ArrayList<String>();
+		
+		public static WrapCopier<Document, WoDocument> copier = WrapCopierFactory.wo( Document.class, WoDocument.class, null,JpaObject.FieldsInvisible);
+
+	}
+
+}

+ 5 - 4
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/ActionQueryListDocumentData.java

@@ -46,10 +46,11 @@ public class ActionQueryListDocumentData extends BaseAction {
 		List<Wo> wos = new ArrayList<>();
 		Wo wo = null;
 		List<Document> docs = documentQueryService.list(ids);
-		List<String> unitNames = userManagerService.listUnitNamesWithPerson(effectivePerson.getDistinguishedName());
-		List<String> groupNames = userManagerService.listGroupNamesByPerson(effectivePerson.getDistinguishedName());
+		//先不考虑阅读权限的问题
+		/*List<String> unitNames = userManagerService.listUnitNamesWithPerson(effectivePerson.getDistinguishedName());
+		List<String> groupNames = userManagerService.listGroupNamesByPerson(effectivePerson.getDistinguishedName());*/
 		for (Document document : docs){
-			if(this.hasReadPermission(business, document, unitNames, groupNames, effectivePerson, null)) {
+			//if(this.hasReadPermission(business, document, unitNames, groupNames, effectivePerson, null)) {
 				Cache.CacheKey cacheKey = new Cache.CacheKey(this.getClass(), document.getId());
 				Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
 				if (optional.isPresent()) {
@@ -63,7 +64,7 @@ public class ActionQueryListDocumentData extends BaseAction {
 					CacheManager.put(cacheCategory, cacheKey, wo);
 				}
 				wos.add(wo);
-			}
+			//}
 		}
 		
 		return wos;

+ 23 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/DocumentAction.java

@@ -695,4 +695,27 @@ public class DocumentAction extends StandardJaxrsAction{
 
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
+
+	@JaxrsMethodDescribe(value = "查看文档数据.", action = ActionQueryGetDocumentData.class)
+	@GET
+	@Path("{id}/document/data")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void query_getDocumentData( @Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+											  @JaxrsParameterDescribe("信息文档ID") @PathParam("id") String id) {
+		EffectivePerson effectivePerson = this.effectivePerson( request );
+		ActionResult<ActionQueryGetDocumentData.Wo> result = new ActionResult<>();
+		Boolean check = true;
+
+		if( check ){
+			try {
+				result = new ActionQueryGetDocumentData().execute(request, effectivePerson, id);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				result.error( e );
+				logger.error( e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
 }

+ 1 - 1
o2server/x_message_assemble_communicate/src/main/java/com/x/message/assemble/communicate/schedule/Clean.java

@@ -98,7 +98,7 @@ public class Clean extends AbstractJob {
 		Root<Message> root = cq.from(Message.class);
 		Date limit = DateUtils.addDays(new Date(), -Config.communicate().clean().getKeep());
 		Predicate p = cb.lessThan(root.get(Message_.createTime), limit);
-		return em.createQuery(cq.select(root).where(p)).setMaxResults(2000).getResultList();
+		return em.createQuery(cq.select(root).where(p)).setMaxResults(200).getResultList();
 	}
 
 }

+ 149 - 147
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/BaseAction.java

@@ -23,152 +23,154 @@ import com.x.query.core.entity.Item;
 
 abstract class BaseAction extends StandardJaxrsAction {
 
-    protected boolean cascadeDeleteWorkBeginButNotCommit(Business business, Work work) throws Exception {
-        if (business.work().listWithJob(work.getJob()).size() > 1) {
-            List<String> taskIds = business.entityManagerContainer().idsEqual(Task.class, Task.work_FIELDNAME,
-                    work.getId());
-            if (ListTools.isNotEmpty(taskIds)) {
-                business.entityManagerContainer().beginTransaction(Task.class);
-                business.entityManagerContainer().delete(Task.class, taskIds);
-            }
-            business.entityManagerContainer().beginTransaction(Work.class);
-            business.entityManagerContainer().remove(work, CheckRemoveType.all);
-            business.entityManagerContainer().commit();
-            return false;
-        } else {
-            deleteTask(business, work.getJob());
-            deleteTaskCompleted(business, work.getJob());
-            deleteRead(business, work.getJob());
-            deleteReadCompleted(business, work.getJob());
-            deleteReview(business, work.getJob());
-            deleteAttachment(business, work.getJob());
-            deleteWorkLog(business, work.getJob());
-            deleteItem(business, work.getJob());
-            deleteDocumentVersion(business, work.getJob());
-            deleteRecord(business, work.getJob());
-            deleteWork(business, work);
-            return true;
-        }
-    }
-
-    private void deleteTask(Business business, String job) throws Exception {
-        List<String> ids = business.entityManagerContainer().idsEqual(Task.class, Task.job_FIELDNAME, job);
-        if (ListTools.isNotEmpty(ids)) {
-            business.entityManagerContainer().beginTransaction(Task.class);
-            for (Task o : business.entityManagerContainer().list(Task.class, ids)) {
-                business.entityManagerContainer().remove(o);
-                MessageFactory.task_delete(o);
-            }
-        }
-    }
-
-    private void deleteTaskCompleted(Business business, String job) throws Exception {
-        List<String> ids = business.entityManagerContainer().idsEqual(TaskCompleted.class, TaskCompleted.job_FIELDNAME,
-                job);
-        if (ListTools.isNotEmpty(ids)) {
-            business.entityManagerContainer().beginTransaction(TaskCompleted.class);
-            for (TaskCompleted o : business.entityManagerContainer().list(TaskCompleted.class, ids)) {
-                business.entityManagerContainer().remove(o);
-                MessageFactory.taskCompleted_delete(o);
-            }
-        }
-    }
-
-    private void deleteRead(Business business, String job) throws Exception {
-        List<String> ids = business.entityManagerContainer().idsEqual(Read.class, Read.job_FIELDNAME, job);
-        if (ListTools.isNotEmpty(ids)) {
-            business.entityManagerContainer().beginTransaction(Read.class);
-            for (Read o : business.entityManagerContainer().list(Read.class, ids)) {
-                business.entityManagerContainer().remove(o);
-                MessageFactory.read_delete(o);
-            }
-        }
-    }
-
-    private void deleteReadCompleted(Business business, String job) throws Exception {
-        List<String> ids = business.entityManagerContainer().idsEqual(ReadCompleted.class, ReadCompleted.job_FIELDNAME,
-                job);
-        if (ListTools.isNotEmpty(ids)) {
-            business.entityManagerContainer().beginTransaction(ReadCompleted.class);
-            for (ReadCompleted o : business.entityManagerContainer().list(ReadCompleted.class, ids)) {
-                business.entityManagerContainer().remove(o);
-                MessageFactory.readCompleted_delete(o);
-            }
-        }
-    }
-
-    private void deleteReview(Business business, String job) throws Exception {
-        List<String> ids = business.entityManagerContainer().idsEqual(Review.class, Review.job_FIELDNAME, job);
-        if (ListTools.isNotEmpty(ids)) {
-            business.entityManagerContainer().beginTransaction(Review.class);
-            business.entityManagerContainer().delete(Review.class, ids);
-        }
-    }
-
-    private void deleteAttachment(Business business, String job) throws Exception {
-        List<String> ids = business.entityManagerContainer().idsEqual(Attachment.class, Attachment.job_FIELDNAME, job);
-        if (ListTools.isNotEmpty(ids)) {
-            business.entityManagerContainer().beginTransaction(Attachment.class);
-            Attachment obj;
-            for (String id : ids) {
-                obj = business.entityManagerContainer().find(id, Attachment.class);
-                if (null != obj) {
-                    StorageMapping mapping = ThisApplication.context().storageMappings().get(Attachment.class,
-                            obj.getStorage());
-                    if (null != mapping) {
-                        obj.deleteContent(mapping);
-                    }
-                    business.entityManagerContainer().remove(obj, CheckRemoveType.all);
-                }
-            }
-        }
-    }
-
-    private void deleteWorkLog(Business business, String job) throws Exception {
-        List<String> ids = business.entityManagerContainer().idsEqual(WorkLog.class, WorkLog.job_FIELDNAME, job);
-        if (ListTools.isNotEmpty(ids)) {
-            business.entityManagerContainer().beginTransaction(WorkLog.class);
-            business.entityManagerContainer().delete(WorkLog.class, ids);
-        }
-    }
-
-    private void deleteItem(Business business, String job) throws Exception {
-        List<String> ids = business.entityManagerContainer().idsEqual(Item.class, Item.bundle_FIELDNAME, job);
-        if (ListTools.isNotEmpty(ids)) {
-            business.entityManagerContainer().beginTransaction(Item.class);
-            business.entityManagerContainer().delete(Item.class, ids);
-        }
-    }
-
-    private void deleteWork(Business business, Work work) throws Exception {
-        business.entityManagerContainer().beginTransaction(Work.class);
-        List<String> ids = business.entityManagerContainer().idsEqualAndNotEqual(Work.class, Work.job_FIELDNAME,
-                work.getJob(), Work.id_FIELDNAME, work.getId());
-        if (ListTools.isNotEmpty(ids)) {
-            for (Work o : business.entityManagerContainer().list(Work.class, ids)) {
-                business.entityManagerContainer().remove(o);
-                MessageFactory.work_delete(o);
-            }
-        }
-        business.entityManagerContainer().remove(work);
-        MessageFactory.work_delete(work);
-    }
-
-    private void deleteDocumentVersion(Business business, String job) throws Exception {
-        List<String> ids = business.entityManagerContainer().idsEqual(DocumentVersion.class,
-                DocumentVersion.job_FIELDNAME, job);
-        if (ListTools.isNotEmpty(ids)) {
-            business.entityManagerContainer().beginTransaction(DocumentVersion.class);
-            business.entityManagerContainer().delete(DocumentVersion.class, ids);
-        }
-    }
-
-    private void deleteRecord(Business business, String job) throws Exception {
-        List<String> ids = business.entityManagerContainer().idsEqual(Record.class, Record.job_FIELDNAME, job);
-        if (ListTools.isNotEmpty(ids)) {
-            business.entityManagerContainer().beginTransaction(Record.class);
-            business.entityManagerContainer().delete(Record.class, ids);
-        }
-    }
+	protected boolean cascadeDeleteWorkBeginButNotCommit(Business business, Work work) throws Exception {
+		if (business.work().listWithJob(work.getJob()).size() > 1) {
+			List<String> taskIds = business.entityManagerContainer().idsEqual(Task.class, Task.work_FIELDNAME,
+					work.getId());
+			if (ListTools.isNotEmpty(taskIds)) {
+				business.entityManagerContainer().beginTransaction(Task.class);
+				for (Task o : business.entityManagerContainer().list(Task.class, taskIds)) {
+					business.entityManagerContainer().remove(o);
+					MessageFactory.task_delete(o);
+				}
+			}
+			business.entityManagerContainer().beginTransaction(Work.class);
+			business.entityManagerContainer().remove(work, CheckRemoveType.all);
+			return false;
+		} else {
+			deleteTask(business, work.getJob());
+			deleteTaskCompleted(business, work.getJob());
+			deleteRead(business, work.getJob());
+			deleteReadCompleted(business, work.getJob());
+			deleteReview(business, work.getJob());
+			deleteAttachment(business, work.getJob());
+			deleteWorkLog(business, work.getJob());
+			deleteItem(business, work.getJob());
+			deleteDocumentVersion(business, work.getJob());
+			deleteRecord(business, work.getJob());
+			deleteWork(business, work);
+			return true;
+		}
+	}
+
+	private void deleteTask(Business business, String job) throws Exception {
+		List<String> ids = business.entityManagerContainer().idsEqual(Task.class, Task.job_FIELDNAME, job);
+		if (ListTools.isNotEmpty(ids)) {
+			business.entityManagerContainer().beginTransaction(Task.class);
+			for (Task o : business.entityManagerContainer().list(Task.class, ids)) {
+				business.entityManagerContainer().remove(o);
+				MessageFactory.task_delete(o);
+			}
+		}
+	}
+
+	private void deleteTaskCompleted(Business business, String job) throws Exception {
+		List<String> ids = business.entityManagerContainer().idsEqual(TaskCompleted.class, TaskCompleted.job_FIELDNAME,
+				job);
+		if (ListTools.isNotEmpty(ids)) {
+			business.entityManagerContainer().beginTransaction(TaskCompleted.class);
+			for (TaskCompleted o : business.entityManagerContainer().list(TaskCompleted.class, ids)) {
+				business.entityManagerContainer().remove(o);
+				MessageFactory.taskCompleted_delete(o);
+			}
+		}
+	}
+
+	private void deleteRead(Business business, String job) throws Exception {
+		List<String> ids = business.entityManagerContainer().idsEqual(Read.class, Read.job_FIELDNAME, job);
+		if (ListTools.isNotEmpty(ids)) {
+			business.entityManagerContainer().beginTransaction(Read.class);
+			for (Read o : business.entityManagerContainer().list(Read.class, ids)) {
+				business.entityManagerContainer().remove(o);
+				MessageFactory.read_delete(o);
+			}
+		}
+	}
+
+	private void deleteReadCompleted(Business business, String job) throws Exception {
+		List<String> ids = business.entityManagerContainer().idsEqual(ReadCompleted.class, ReadCompleted.job_FIELDNAME,
+				job);
+		if (ListTools.isNotEmpty(ids)) {
+			business.entityManagerContainer().beginTransaction(ReadCompleted.class);
+			for (ReadCompleted o : business.entityManagerContainer().list(ReadCompleted.class, ids)) {
+				business.entityManagerContainer().remove(o);
+				MessageFactory.readCompleted_delete(o);
+			}
+		}
+	}
+
+	private void deleteReview(Business business, String job) throws Exception {
+		List<String> ids = business.entityManagerContainer().idsEqual(Review.class, Review.job_FIELDNAME, job);
+		if (ListTools.isNotEmpty(ids)) {
+			business.entityManagerContainer().beginTransaction(Review.class);
+			business.entityManagerContainer().delete(Review.class, ids);
+		}
+	}
+
+	private void deleteAttachment(Business business, String job) throws Exception {
+		List<String> ids = business.entityManagerContainer().idsEqual(Attachment.class, Attachment.job_FIELDNAME, job);
+		if (ListTools.isNotEmpty(ids)) {
+			business.entityManagerContainer().beginTransaction(Attachment.class);
+			Attachment obj;
+			for (String id : ids) {
+				obj = business.entityManagerContainer().find(id, Attachment.class);
+				if (null != obj) {
+					StorageMapping mapping = ThisApplication.context().storageMappings().get(Attachment.class,
+							obj.getStorage());
+					if (null != mapping) {
+						obj.deleteContent(mapping);
+					}
+					business.entityManagerContainer().remove(obj, CheckRemoveType.all);
+				}
+			}
+		}
+	}
+
+	private void deleteWorkLog(Business business, String job) throws Exception {
+		List<String> ids = business.entityManagerContainer().idsEqual(WorkLog.class, WorkLog.job_FIELDNAME, job);
+		if (ListTools.isNotEmpty(ids)) {
+			business.entityManagerContainer().beginTransaction(WorkLog.class);
+			business.entityManagerContainer().delete(WorkLog.class, ids);
+		}
+	}
+
+	private void deleteItem(Business business, String job) throws Exception {
+		List<String> ids = business.entityManagerContainer().idsEqual(Item.class, Item.bundle_FIELDNAME, job);
+		if (ListTools.isNotEmpty(ids)) {
+			business.entityManagerContainer().beginTransaction(Item.class);
+			business.entityManagerContainer().delete(Item.class, ids);
+		}
+	}
+
+	private void deleteWork(Business business, Work work) throws Exception {
+		business.entityManagerContainer().beginTransaction(Work.class);
+		List<String> ids = business.entityManagerContainer().idsEqualAndNotEqual(Work.class, Work.job_FIELDNAME,
+				work.getJob(), Work.id_FIELDNAME, work.getId());
+		if (ListTools.isNotEmpty(ids)) {
+			for (Work o : business.entityManagerContainer().list(Work.class, ids)) {
+				business.entityManagerContainer().remove(o);
+				MessageFactory.work_delete(o);
+			}
+		}
+		business.entityManagerContainer().remove(work);
+		MessageFactory.work_delete(work);
+	}
+
+	private void deleteDocumentVersion(Business business, String job) throws Exception {
+		List<String> ids = business.entityManagerContainer().idsEqual(DocumentVersion.class,
+				DocumentVersion.job_FIELDNAME, job);
+		if (ListTools.isNotEmpty(ids)) {
+			business.entityManagerContainer().beginTransaction(DocumentVersion.class);
+			business.entityManagerContainer().delete(DocumentVersion.class, ids);
+		}
+	}
+
+	private void deleteRecord(Business business, String job) throws Exception {
+		List<String> ids = business.entityManagerContainer().idsEqual(Record.class, Record.job_FIELDNAME, job);
+		if (ListTools.isNotEmpty(ids)) {
+			business.entityManagerContainer().beginTransaction(Record.class);
+			business.entityManagerContainer().delete(Record.class, ids);
+		}
+	}
 
 }

+ 95 - 76
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/invoke/ActionExecute.java

@@ -1,6 +1,5 @@
 package com.x.program.center.jaxrs.invoke;
 
-import java.util.Date;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.regex.Matcher;
@@ -12,7 +11,6 @@ import javax.script.ScriptContext;
 import javax.script.SimpleScriptContext;
 import javax.servlet.http.HttpServletRequest;
 
-import com.x.base.core.project.cache.CacheManager;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 
@@ -21,7 +19,8 @@ import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.project.cache.Cache.CacheCategory;
 import com.x.base.core.project.cache.Cache.CacheKey;
-import com.x.base.core.entity.annotation.CheckPersistType;
+import com.x.base.core.project.cache.CacheManager;
+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.WoContentType;
@@ -44,86 +43,104 @@ class ActionExecute extends BaseAction {
 
 	ActionResult<Object> execute(HttpServletRequest request, EffectivePerson effectivePerson, String flag,
 			JsonElement jsonElement) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Object> result = new ActionResult<>();
-			Invoke invoke = emc.flag(flag, Invoke.class);
-			if (null == invoke) {
-				throw new ExceptionInvokeNotExist(flag);
-			}
-			if (!BooleanUtils.isTrue(invoke.getEnable())) {
-				throw new ExceptionNotEnable(invoke.getName());
-			}
-			if (StringUtils.isNotEmpty(invoke.getRemoteAddrRegex())) {
-				Matcher matcher = Pattern.compile(invoke.getRemoteAddrRegex()).matcher(request.getRemoteAddr());
-				if (!matcher.find()) {
-					throw new ExceptionInvalidRemoteAddr(request.getRemoteAddr(), invoke.getName());
-				}
-			}
-			emc.beginTransaction(Invoke.class);
-			invoke.setLastStartTime(new Date());
-			emc.commit();
-
-			CacheCategory cacheCategory = new CacheCategory(Invoke.class);
-			CacheKey cacheKey = new CacheKey(ActionExecute.class, invoke.getId());
-			CompiledScript compiledScript = null;
-			Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
-			if (optional.isPresent()) {
-				compiledScript = (CompiledScript)optional.get();
-			}else {
-				compiledScript = ScriptFactory.compile(invoke.getText());
-				CacheManager.put(cacheCategory, cacheKey, compiledScript);
-			}
 
-			ScriptContext scriptContext = new SimpleScriptContext();
-			Bindings bindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
-			Resources resources = new Resources();
-			resources.setEntityManagerContainer(emc);
-			resources.setContext(ThisApplication.context());
-			resources.setOrganization(new Organization(ThisApplication.context()));
-			resources.setWebservicesClient(new WebservicesClient());
-			resources.setApplications(ThisApplication.context().applications());
-			bindings.put(ScriptFactory.BINDING_NAME_RESOURCES, resources);
-			bindings.put("requestText", gson.toJson(jsonElement));
-			bindings.put("request", request);
-			bindings.put("effectivePerson", effectivePerson);
-			bindings.put(ScriptFactory.BINDING_NAME_APPLICATIONS, ThisApplication.context().applications());
-			CustomResponse customResponse = new CustomResponse();
-			bindings.put("customResponse", customResponse);
-			Wo wo = new Wo();
-			try {
-				ScriptFactory.initialServiceScriptText().eval(scriptContext);
-				Object o = compiledScript.eval(scriptContext);
-				if (StringUtils.equals("seeOther", customResponse.type)) {
-					WoSeeOther woSeeOther = new WoSeeOther(Objects.toString(customResponse.value, ""));
-					result.setData(woSeeOther);
-				} else if (StringUtils.equals("temporaryRedirect", customResponse.type)) {
-					WoTemporaryRedirect woTemporaryRedirect = new WoTemporaryRedirect(
-							Objects.toString(customResponse.value, ""));
-					result.setData(woTemporaryRedirect);
-				} else {
-					if (null != customResponse.value) {
-						if (StringUtils.isNotEmpty(customResponse.contentType)) {
-							result.setData(new WoContentType(customResponse.value, customResponse.contentType));
-						} else if (customResponse.value instanceof WoText) {
-							result.setData(customResponse.value);
-						} else {
-							wo.setValue(customResponse.value);
-							result.setData(wo);
-						}
+		CacheCategory cacheCategory = new CacheCategory(Invoke.class);
+
+		Invoke invoke = this.get(cacheCategory, flag);
+
+		if (null == invoke) {
+			throw new ExceptionEntityNotExist(flag, Invoke.class);
+		}
+
+		if (!BooleanUtils.isTrue(invoke.getEnable())) {
+			throw new ExceptionNotEnable(invoke.getName());
+		}
+		
+		if (StringUtils.isNotEmpty(invoke.getRemoteAddrRegex())) {
+			Matcher matcher = Pattern.compile(invoke.getRemoteAddrRegex()).matcher(request.getRemoteAddr());
+			if (!matcher.find()) {
+				throw new ExceptionInvalidRemoteAddr(request.getRemoteAddr(), invoke.getName());
+			}
+		}
+		
+		ActionResult<Object> result = new ActionResult<>();
+		CompiledScript compiledScript = this.getCompiledScript(cacheCategory, invoke);
+		ScriptContext scriptContext = new SimpleScriptContext();
+		Bindings bindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
+		Resources resources = new Resources();
+		// 此方法不用装载emc
+		// resources.setEntityManagerContainer(emc);
+		resources.setContext(ThisApplication.context());
+		resources.setOrganization(new Organization(ThisApplication.context()));
+		resources.setWebservicesClient(new WebservicesClient());
+		resources.setApplications(ThisApplication.context().applications());
+		bindings.put(ScriptFactory.BINDING_NAME_RESOURCES, resources);
+		bindings.put("requestText", gson.toJson(jsonElement));
+		bindings.put("request", request);
+		bindings.put("effectivePerson", effectivePerson);
+		bindings.put(ScriptFactory.BINDING_NAME_APPLICATIONS, ThisApplication.context().applications());
+		CustomResponse customResponse = new CustomResponse();
+		bindings.put("customResponse", customResponse);
+		Wo wo = new Wo();
+		try {
+			ScriptFactory.initialServiceScriptText().eval(scriptContext);
+			Object o = compiledScript.eval(scriptContext);
+			if (StringUtils.equals("seeOther", customResponse.type)) {
+				WoSeeOther woSeeOther = new WoSeeOther(Objects.toString(customResponse.value, ""));
+				result.setData(woSeeOther);
+			} else if (StringUtils.equals("temporaryRedirect", customResponse.type)) {
+				WoTemporaryRedirect woTemporaryRedirect = new WoTemporaryRedirect(
+						Objects.toString(customResponse.value, ""));
+				result.setData(woTemporaryRedirect);
+			} else {
+				if (null != customResponse.value) {
+					if (StringUtils.isNotEmpty(customResponse.contentType)) {
+						result.setData(new WoContentType(customResponse.value, customResponse.contentType));
+					} else if (customResponse.value instanceof WoText) {
+						result.setData(customResponse.value);
 					} else {
-						wo.setValue(o);
+						wo.setValue(customResponse.value);
 						result.setData(wo);
 					}
+				} else {
+					wo.setValue(o);
+					result.setData(wo);
 				}
-			} catch (Exception e) {
-				throw new ExceptionExecuteError(invoke.getName(), e);
 			}
-			emc.beginTransaction(Invoke.class);
-			invoke.setLastEndTime(new Date());
-			emc.check(invoke, CheckPersistType.all);
-			emc.commit();
-			return result;
+		} catch (Exception e) {
+			throw new ExceptionExecuteError(invoke.getName(), e);
 		}
+
+		return result;
+	}
+
+	private Invoke get(CacheCategory cacheCategory, String flag) throws Exception {
+		CacheKey cacheKey = new CacheKey(ActionExecute.class, flag);
+		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+		if (optional.isPresent()) {
+			return (Invoke) optional.get();
+		} else {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Invoke invoke = emc.flag(flag, Invoke.class);
+				if (null != invoke) {
+					CacheManager.put(cacheCategory, cacheKey, invoke);
+				}
+				return invoke;
+			}
+		}
+	}
+
+	private CompiledScript getCompiledScript(CacheCategory cacheCategory, Invoke invoke) throws Exception {
+		CacheKey cacheKey = new CacheKey(ActionExecute.class, "CompiledScript", invoke.getId());
+		CompiledScript compiledScript = null;
+		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+		if (optional.isPresent()) {
+			compiledScript = (CompiledScript) optional.get();
+		} else {
+			compiledScript = ScriptFactory.compile(invoke.getText());
+			CacheManager.put(cacheCategory, cacheKey, compiledScript);
+		}
+		return compiledScript;
 	}
 
 	public static class CustomResponse {
@@ -154,6 +171,8 @@ class ActionExecute extends BaseAction {
 
 	public static class Wo extends WoValue {
 
+		private static final long serialVersionUID = -2253926744723217590L;
+
 	}
 
 	public static class Resources extends AbstractResources {

+ 171 - 0
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/invoke/ActionExecute2.java

@@ -0,0 +1,171 @@
+package com.x.program.center.jaxrs.invoke;
+
+import java.util.Date;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.script.Bindings;
+import javax.script.CompiledScript;
+import javax.script.ScriptContext;
+import javax.script.SimpleScriptContext;
+import javax.servlet.http.HttpServletRequest;
+
+import com.x.base.core.project.cache.CacheManager;
+import org.apache.commons.lang3.BooleanUtils;
+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.project.cache.Cache.CacheCategory;
+import com.x.base.core.project.cache.Cache.CacheKey;
+import com.x.base.core.entity.annotation.CheckPersistType;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoContentType;
+import com.x.base.core.project.jaxrs.WoSeeOther;
+import com.x.base.core.project.jaxrs.WoTemporaryRedirect;
+import com.x.base.core.project.jaxrs.WoText;
+import com.x.base.core.project.jaxrs.WoValue;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.script.AbstractResources;
+import com.x.base.core.project.script.ScriptFactory;
+import com.x.base.core.project.webservices.WebservicesClient;
+import com.x.organization.core.express.Organization;
+import com.x.program.center.ThisApplication;
+import com.x.program.center.core.entity.Invoke;
+
+class ActionExecute2 extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionExecute2.class);
+
+	ActionResult<Object> execute(HttpServletRequest request, EffectivePerson effectivePerson, String flag,
+			JsonElement jsonElement) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Object> result = new ActionResult<>();
+			Invoke invoke = emc.flag(flag, Invoke.class);
+			if (null == invoke) {
+				throw new ExceptionInvokeNotExist(flag);
+			}
+			if (!BooleanUtils.isTrue(invoke.getEnable())) {
+				throw new ExceptionNotEnable(invoke.getName());
+			}
+			if (StringUtils.isNotEmpty(invoke.getRemoteAddrRegex())) {
+				Matcher matcher = Pattern.compile(invoke.getRemoteAddrRegex()).matcher(request.getRemoteAddr());
+				if (!matcher.find()) {
+					throw new ExceptionInvalidRemoteAddr(request.getRemoteAddr(), invoke.getName());
+				}
+			}
+			emc.beginTransaction(Invoke.class);
+			invoke.setLastStartTime(new Date());
+			emc.commit();
+
+			CacheCategory cacheCategory = new CacheCategory(Invoke.class);
+			CacheKey cacheKey = new CacheKey(ActionExecute2.class, invoke.getId());
+			CompiledScript compiledScript = null;
+			Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+			if (optional.isPresent()) {
+				compiledScript = (CompiledScript)optional.get();
+			}else {
+				compiledScript = ScriptFactory.compile(invoke.getText());
+				CacheManager.put(cacheCategory, cacheKey, compiledScript);
+			}
+
+			ScriptContext scriptContext = new SimpleScriptContext();
+			Bindings bindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
+			Resources resources = new Resources();
+			resources.setEntityManagerContainer(emc);
+			resources.setContext(ThisApplication.context());
+			resources.setOrganization(new Organization(ThisApplication.context()));
+			resources.setWebservicesClient(new WebservicesClient());
+			resources.setApplications(ThisApplication.context().applications());
+			bindings.put(ScriptFactory.BINDING_NAME_RESOURCES, resources);
+			bindings.put("requestText", gson.toJson(jsonElement));
+			bindings.put("request", request);
+			bindings.put("effectivePerson", effectivePerson);
+			bindings.put(ScriptFactory.BINDING_NAME_APPLICATIONS, ThisApplication.context().applications());
+			CustomResponse customResponse = new CustomResponse();
+			bindings.put("customResponse", customResponse);
+			Wo wo = new Wo();
+			try {
+				ScriptFactory.initialServiceScriptText().eval(scriptContext);
+				Object o = compiledScript.eval(scriptContext);
+				if (StringUtils.equals("seeOther", customResponse.type)) {
+					WoSeeOther woSeeOther = new WoSeeOther(Objects.toString(customResponse.value, ""));
+					result.setData(woSeeOther);
+				} else if (StringUtils.equals("temporaryRedirect", customResponse.type)) {
+					WoTemporaryRedirect woTemporaryRedirect = new WoTemporaryRedirect(
+							Objects.toString(customResponse.value, ""));
+					result.setData(woTemporaryRedirect);
+				} else {
+					if (null != customResponse.value) {
+						if (StringUtils.isNotEmpty(customResponse.contentType)) {
+							result.setData(new WoContentType(customResponse.value, customResponse.contentType));
+						} else if (customResponse.value instanceof WoText) {
+							result.setData(customResponse.value);
+						} else {
+							wo.setValue(customResponse.value);
+							result.setData(wo);
+						}
+					} else {
+						wo.setValue(o);
+						result.setData(wo);
+					}
+				}
+			} catch (Exception e) {
+				throw new ExceptionExecuteError(invoke.getName(), e);
+			}
+			emc.beginTransaction(Invoke.class);
+			invoke.setLastEndTime(new Date());
+			emc.check(invoke, CheckPersistType.all);
+			emc.commit();
+			return result;
+		}
+	}
+
+	public static class CustomResponse {
+		protected String type = null;
+		protected Object value;
+		protected String contentType;
+
+		public void seeOther(String url) {
+			this.type = "seeOther";
+			this.value = url;
+		}
+
+		public void temporaryRedirect(String url) {
+			this.type = "temporaryRedirect";
+			this.value = url;
+		}
+
+		public void setBody(Object obj) {
+			this.value = obj;
+		}
+
+		public void setBody(Object obj, String contentType) {
+			this.value = obj;
+			this.contentType = contentType;
+		}
+
+	}
+
+	public static class Wo extends WoValue {
+
+	}
+
+	public static class Resources extends AbstractResources {
+		private Organization organization;
+
+		public Organization getOrganization() {
+			return organization;
+		}
+
+		public void setOrganization(Organization organization) {
+			this.organization = organization;
+		}
+
+	}
+}