提交 90e3f2ed 编写于 作者: O o2null

Merge branch 'feature/#272' into 'develop'

add erase content entity

See merge request o2oa/o2oa!1350
......@@ -55,12 +55,12 @@ public class Main {
/* getVersion需要FileUtils在后面运行 */
cleanTempDir(base);
createTempClassesDirectory(base);
//LogTools.setSlf4jSimple();
// LogTools.setSlf4jSimple();
try {
Main.class.getClassLoader().loadClass("org.slf4j.impl.SimpleLogger");
LogTools.setSlf4jSimple();
}catch(ClassNotFoundException ex) {
System.out.println("ignore:"+ex.getMessage());
} catch (ClassNotFoundException ex) {
System.out.println("ignore:" + ex.getMessage());
slf4jOtherImplOn = true;
}
org.slf4j.impl.StaticLoggerBinder.getSingleton();
......@@ -125,7 +125,7 @@ public class Main {
}
}
}.start();
/* 启动NodeAgent */
if (BooleanUtils.isTrue(Config.currentNode().nodeAgentEnable())) {
NodeAgent nodeAgent = new NodeAgent();
......@@ -157,48 +157,48 @@ public class Main {
matcher = CommandFactory.start_pattern.matcher(cmd);
if (matcher.find()) {
switch (matcher.group(1)) {
case "application":
startApplicationServer();
break;
case "center":
startCenterServer();
break;
case "web":
startWebServer();
break;
case "storage":
startStorageServer();
break;
case "data":
startDataServer();
break;
default:
startAll();
break;
case "application":
startApplicationServer();
break;
case "center":
startCenterServer();
break;
case "web":
startWebServer();
break;
case "storage":
startStorageServer();
break;
case "data":
startDataServer();
break;
default:
startAll();
break;
}
continue;
}
matcher = CommandFactory.stop_pattern.matcher(cmd);
if (matcher.find()) {
switch (matcher.group(1)) {
case "application":
stopApplicationServer();
break;
case "center":
stopCenterServer();
break;
case "web":
stopWebServer();
break;
case "storage":
stopStorageServer();
break;
case "data":
stopDataServer();
break;
default:
stopAll();
break;
case "application":
stopApplicationServer();
break;
case "center":
stopCenterServer();
break;
case "web":
stopWebServer();
break;
case "storage":
stopStorageServer();
break;
case "data":
stopDataServer();
break;
default:
stopAll();
break;
}
continue;
}
......@@ -245,25 +245,9 @@ public class Main {
}
/* 关闭定时器 */
scheduler.shutdown();
// }
SystemOutErrorSideCopyBuilder.stop();
}
private static boolean test() {
try {
DeploymentManager deployer = Servers.applicationServer.getBean(DeploymentManager.class);
for (App app : deployer.getApps()) {
System.out.println(app.getContextPath());
if (StringUtils.equals("/x_query_assemble_designer", app.getContextPath())) {
app.getContextHandler().stop();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
private static boolean createEncryptKey() {
try {
return new ActionCreateEncryptKey().execute();
......
......@@ -2,10 +2,6 @@ package com.x.server.console.action;
import java.util.Objects;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
......@@ -13,8 +9,13 @@ import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
/*
@author zhourui
......@@ -132,7 +133,7 @@ public class ActionControl extends ActionBase {
private static Option ecOption() {
return Option.builder("ec").longOpt("eraseContent").argName("type").hasArg().optionalArg(false)
.desc("清空实例数据,保留设计数据,type可选值 bbs cms log processPlatform message org.").build();
.desc("清空实例数据,保留设计数据,type可选值: bbs,cms,log,processPlatform,message,org或者实体类名.").build();
}
private static Option clh2Option() {
......@@ -183,26 +184,31 @@ public class ActionControl extends ActionBase {
}
String type = Objects.toString(cmd.getOptionValue("ec"));
switch (type) {
case "processPlatform":
new EraseContentProcessPlatform().execute();
break;
case "bbs":
new EraseContentBbs().execute();
break;
case "cms":
new EraseContentCms().execute();
break;
case "log":
new EraseContentLog().execute();
break;
case "message":
new EraseContentMessage().execute();
break;
case "org":
new EraseContentOrg().execute();
break;
default:
logger.print("type may be processPlatform bbs cms log message.");
case "processPlatform":
new EraseContentProcessPlatform().execute();
break;
case "bbs":
new EraseContentBbs().execute();
break;
case "cms":
new EraseContentCms().execute();
break;
case "log":
new EraseContentLog().execute();
break;
case "message":
new EraseContentMessage().execute();
break;
case "org":
new EraseContentOrg().execute();
break;
default:
EraseContentEntity eraseContentEntity = new EraseContentEntity();
for (String str : StringUtils.split(type, ",")) {
eraseContentEntity.addClass(str);
}
eraseContentEntity.execute();
break;
}
}
......
package com.x.server.console.action;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.apache.commons.collections4.ListUtils;
import org.apache.openjpa.persistence.OpenJPAPersistence;
import com.x.base.core.container.factory.PersistenceXmlHelper;
import com.x.base.core.entity.JpaObject;
import com.x.base.core.entity.StorageObject;
import com.x.base.core.entity.annotation.ContainerEntity;
import com.x.base.core.entity.dataitem.DataItem;
import com.x.base.core.entity.dataitem.ItemCategory;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.config.StorageMapping;
import com.x.base.core.project.config.StorageMappings;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.DateTools;
import com.x.base.core.project.tools.ListTools;
public abstract class EraseContent {
private static Logger logger = LoggerFactory.getLogger(EraseContent.class);
private Date start;
private String name;
private List<String> classNames = new ArrayList<>();
private ItemCategory itemCategory;
public abstract boolean execute() throws Exception;
protected void addClass(Class<?> cls) {
this.classNames.add(cls.getName());
}
protected void addClass(String className) {
this.classNames.add(className);
}
protected void init(String name, ItemCategory itemCategory) throws Exception {
this.name = name;
this.itemCategory = itemCategory;
this.start = new Date();
}
protected void run() throws Exception {
logger.print("erase {} content data: start at {}.", name, DateTools.format(start));
this.classNames = ListUtils.intersection(this.classNames,
(List<String>) Config.resource(Config.RESOURCE_CONTAINERENTITYNAMES));
StorageMappings storageMappings = Config.storageMappings();
File persistence = new File(Config.dir_local_temp_classes(),
DateTools.compact(this.start) + "_eraseContent.xml");
PersistenceXmlHelper.write(persistence.getAbsolutePath(), classNames);
for (int i = 0; i < classNames.size(); i++) {
Class<? extends JpaObject> cls = (Class<? extends JpaObject>) Class.forName(classNames.get(i));
EntityManagerFactory emf = OpenJPAPersistence.createEntityManagerFactory(cls.getName(),
persistence.getName(), PersistenceXmlHelper.properties(cls.getName(), Config.slice().getEnable()));
EntityManager em = emf.createEntityManager();
if (DataItem.class.isAssignableFrom(cls)) {
Long total = this.estimateItemCount(em, cls);
logger.print("erase {} content data:{}, total {}.", name, cls.getName(), total);
this.eraseItem(cls, em, total);
} else {
Long total = this.estimateCount(em, cls);
logger.print("erase {} content data:{}, total {}.", name, cls.getName(), total);
this.erase(cls, em, storageMappings, total);
}
}
Date end = new Date();
logger.print("erase {} content data: completed at {}, elapsed {} ms.", name, DateTools.format(end),
(end.getTime() - start.getTime()));
}
private <T extends JpaObject> long estimateCount(EntityManager em, Class<T> cls) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<T> root = cq.from(cls);
cq.select(cb.count(root));
return em.createQuery(cq).getSingleResult();
}
private <T extends JpaObject> long estimateItemCount(EntityManager em, Class<T> cls) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<T> root = cq.from(cls);
Predicate p = cb.equal(root.get(DataItem.itemCategory_FIELDNAME), this.itemCategory);
cq.select(cb.count(root)).where(p);
return em.createQuery(cq).getSingleResult();
}
private <T> Long erase(Class<T> cls, EntityManager em, StorageMappings storageMappings, Long total)
throws Exception {
Long count = 0L;
List<T> list = null;
ContainerEntity containerEntity = cls.getAnnotation(ContainerEntity.class);
do {
if (ListTools.isNotEmpty(list)) {
em.getTransaction().begin();
for (T t : list) {
em.remove(t);
}
em.getTransaction().commit();
if (StorageObject.class.isAssignableFrom(cls)) {
for (T t : list) {
StorageObject storageObject = (StorageObject) t;
String storageName = storageObject.getStorage();
StorageMapping mapping = storageMappings.get(storageObject.getClass(), storageName);
if (null != mapping) {
storageObject.deleteContent(mapping);
} else {
logger.print("can not find storage mapping {}.", storageName);
}
}
}
count += list.size();
em.clear();
logger.print("erase {} content data:{}, {}/{}.", name, cls.getName(), count, total);
}
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(cls);
Root<T> root = cq.from(cls);
cq.select(root);
list = em.createQuery(cq).setMaxResults(containerEntity.dumpSize()).getResultList();
} while (ListTools.isNotEmpty(list));
return count;
}
private <T> Long eraseItem(Class<T> cls, EntityManager em, Long total) throws Exception {
Long count = 0L;
List<T> list = null;
ContainerEntity containerEntity = cls.getAnnotation(ContainerEntity.class);
do {
if (ListTools.isNotEmpty(list)) {
em.getTransaction().begin();
for (T t : list) {
em.remove(t);
}
em.getTransaction().commit();
count += list.size();
em.clear();
logger.print("erase {} content data:{}, {}/{}.", name, cls.getName(), count, total);
}
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(cls);
Root<T> root = cq.from(cls);
Predicate p = cb.equal(root.get(DataItem.itemCategory_FIELDNAME), itemCategory);
cq.select(root).where(p);
list = em.createQuery(cq).setMaxResults(containerEntity.dumpSize()).getResultList();
} while (ListTools.isNotEmpty(list));
return count;
}
}
\ No newline at end of file
package com.x.server.console.action;
import com.x.base.core.entity.dataitem.ItemCategory;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.bbs.entity.BBSOperationRecord;
import com.x.bbs.entity.BBSReplyInfo;
import com.x.bbs.entity.BBSSubjectAttachment;
......@@ -13,9 +11,8 @@ import com.x.bbs.entity.BBSVoteOption;
import com.x.bbs.entity.BBSVoteOptionGroup;
import com.x.bbs.entity.BBSVoteRecord;
public class EraseContentBbs extends EraseContentProcessPlatform {
public class EraseContentBbs extends EraseContent {
private static Logger logger = LoggerFactory.getLogger(EraseContentBbs.class);
@Override
public boolean execute() throws Exception {
this.init("bbs", ItemCategory.bbs);
......
package com.x.server.console.action;
import org.apache.commons.lang3.StringUtils;
import com.x.base.core.entity.dataitem.ItemCategory;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.cms.core.entity.CmsBatchOperation;
import com.x.cms.core.entity.Document;
import com.x.cms.core.entity.Review;
import com.x.cms.core.entity.DocumentCommend;
import com.x.cms.core.entity.DocumentCommentCommend;
import com.x.cms.core.entity.DocumentCommentContent;
import com.x.cms.core.entity.DocumentCommentInfo;
import com.x.cms.core.entity.DocumentViewRecord;
import com.x.cms.core.entity.FileInfo;
import com.x.cms.core.entity.Log;
import com.x.cms.core.entity.ReadRemind;
import com.x.cms.core.entity.DocumentCommentInfo;
import com.x.cms.core.entity.DocumentCommentContent;
import com.x.cms.core.entity.DocumentCommentCommend;
import com.x.cms.core.entity.DocumentCommend;
import com.x.cms.core.entity.CmsBatchOperation;
import com.x.cms.core.entity.Review;
public class EraseContentCms extends EraseContentProcessPlatform {
public class EraseContentCms extends EraseContent {
private static Logger logger = LoggerFactory.getLogger(EraseContentCms.class);
@Override
public boolean execute() throws Exception {
this.init("cms", ItemCategory.cms);
......
package com.x.server.console.action;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
public class EraseContentEntity extends EraseContent {
private static Logger logger = LoggerFactory.getLogger(EraseContentEntity.class);
@Override
public boolean execute() throws Exception {
this.init("entity", null);
this.run();
return true;
}
}
\ No newline at end of file
package com.x.server.console.action;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.processplatform.core.entity.element.FormVersion;
import com.x.processplatform.core.entity.element.ProcessVersion;
import com.x.processplatform.core.entity.element.ScriptVersion;
......@@ -10,9 +8,7 @@ import com.x.program.center.core.entity.ScheduleLog;
import com.x.program.center.core.entity.UnexpectedErrorLog;
import com.x.program.center.core.entity.WarnLog;
public class EraseContentLog extends EraseContentProcessPlatform {
private static Logger logger = LoggerFactory.getLogger(EraseContentLog.class);
public class EraseContentLog extends EraseContent {
@Override
public boolean execute() throws Exception {
......
package com.x.server.console.action;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.message.core.entity.IMConversation;
import com.x.message.core.entity.IMConversationExt;
import com.x.message.core.entity.IMMsg;
......@@ -10,9 +8,8 @@ import com.x.message.core.entity.Mass;
import com.x.message.core.entity.Message;
import com.x.message.core.entity.Org;
public class EraseContentMessage extends EraseContentProcessPlatform {
public class EraseContentMessage extends EraseContent {
private static Logger logger = LoggerFactory.getLogger(EraseContentMessage.class);
@Override
public boolean execute() throws Exception {
this.init("message", null);
......
......@@ -2,8 +2,6 @@ package com.x.server.console.action;
import javax.wsdl.Definition;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.organization.core.entity.Bind;
import com.x.organization.core.entity.Custom;
import com.x.organization.core.entity.Group;
......@@ -19,9 +17,7 @@ import com.x.organization.core.entity.UnitDuty;
import com.x.organization.core.entity.accredit.Empower;
import com.x.organization.core.entity.accredit.EmpowerLog;
public class EraseContentOrg extends EraseContentProcessPlatform {
private static Logger logger = LoggerFactory.getLogger(EraseContentOrg.class);
public class EraseContentOrg extends EraseContent {
@Override
public boolean execute() throws Exception {
......
package com.x.server.console.action;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import com.x.base.core.container.factory.PersistenceXmlHelper;
import com.x.base.core.entity.JpaObject;
import com.x.base.core.entity.StorageObject;
import com.x.base.core.entity.dataitem.DataItem;
import com.x.base.core.entity.dataitem.ItemCategory;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.config.StorageMapping;
import com.x.base.core.project.config.StorageMappings;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.DateTools;
import com.x.base.core.project.tools.ListTools;
import com.x.processplatform.core.entity.content.Attachment;
import com.x.processplatform.core.entity.content.DocumentVersion;
import com.x.processplatform.core.entity.content.Draft;
......@@ -39,20 +16,7 @@ import com.x.processplatform.core.entity.content.WorkCompleted;
import com.x.processplatform.core.entity.content.WorkLog;
import com.x.query.core.entity.Item;
import org.apache.commons.collections4.ListUtils;
import org.apache.openjpa.persistence.OpenJPAPersistence;
public class EraseContentProcessPlatform {
private static Logger logger = LoggerFactory.getLogger(EraseContentProcessPlatform.class);
private Date start;
private String name;
private List<String> classNames = new ArrayList<>();
private ItemCategory itemCategory;
public class EraseContentProcessPlatform extends EraseContent {
public boolean execute() throws Exception {
this.init("processPlatform", ItemCategory.pp);
......@@ -73,115 +37,4 @@ public class EraseContentProcessPlatform {
this.run();
return true;
}
protected void addClass(Class<?> cls) throws Exception {
this.classNames.add(cls.getName());
}
protected void init(String name, ItemCategory itemCategory) throws Exception {
this.name = name;
this.itemCategory = itemCategory;
this.start = new Date();
}
protected void run() throws Exception {
logger.print("clean {} content data, start at {}.", name, DateTools.format(start));
this.classNames = ListUtils.intersection(this.classNames,
(List<String>) Config.resource(Config.RESOURCE_CONTAINERENTITYNAMES));
StorageMappings storageMappings = Config.storageMappings();
File persistence = new File(Config.dir_local_temp_classes(),
DateTools.compact(this.start) + "_eraseContent.xml");
PersistenceXmlHelper.write(persistence.getAbsolutePath(), classNames);
for (int i = 0; i < classNames.size(); i++) {
Class<? extends JpaObject> cls = (Class<? extends JpaObject>) Class.forName(classNames.get(i));
EntityManagerFactory emf = OpenJPAPersistence.createEntityManagerFactory(cls.getName(),
persistence.getName(), PersistenceXmlHelper.properties(cls.getName(), Config.slice().getEnable()));
EntityManager em = emf.createEntityManager();
if (DataItem.class.isAssignableFrom(cls)) {
logger.print("erase {} content data:{}, total:{}.", name, cls.getName(),
this.estimateItemCount(em, cls));
this.eraseItem(cls, em);
} else {
logger.print("erase {} content data:{}, total:{}.", name, cls.getName(), this.estimateCount(em, cls));
this.erase(cls, em, storageMappings);
}
}
Date end = new Date();
logger.print("erase {} completed at {}, elapsed: {} ms.", name, DateTools.format(end),
(end.getTime() - start.getTime()));
}
private <T extends JpaObject> long estimateCount(EntityManager em, Class<T> cls) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<T> root = cq.from(cls);
cq.select(cb.count(root));
return em.createQuery(cq).getSingleResult();
}
private <T extends JpaObject> long estimateItemCount(EntityManager em, Class<T> cls) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<T> root = cq.from(cls);
Predicate p = cb.equal(root.get(DataItem.itemCategory_FIELDNAME), this.itemCategory);
cq.select(cb.count(root)).where(p);
return em.createQuery(cq).getSingleResult();
}
private <T> Long erase(Class<T> cls, EntityManager em, StorageMappings storageMappings) throws Exception {
Long count = 0L;
List<T> list = null;
do {
if (ListTools.isNotEmpty(list)) {
em.getTransaction().begin();
for (T t : list) {
em.remove(t);
}
em.getTransaction().commit();
if (StorageObject.class.isAssignableFrom(cls)) {
for (T t : list) {
StorageObject storageObject = (StorageObject) t;
String name = storageObject.getStorage();
StorageMapping mapping = storageMappings.get(storageObject.getClass(), name);
if (null != mapping) {
storageObject.deleteContent(mapping);
} else {
logger.print("can not find storage mapping: {}.", name);
}
}
}
count += list.size();
}
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(cls);
Root<T> root = cq.from(cls);
cq.select(root);
list = em.createQuery(cq).setMaxResults(1000).getResultList();
} while (ListTools.isNotEmpty(list));
return count;
}
private <T> Long eraseItem(Class<T> cls, EntityManager em) throws Exception {
Long count = 0L;
List<T> list = null;
do {
if (ListTools.isNotEmpty(list)) {
em.getTransaction().begin();
for (T t : list) {
em.remove(t);
}
em.getTransaction().commit();
count += list.size();
}
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(cls);
Root<T> root = cq.from(cls);
Predicate p = cb.equal(root.get(DataItem.itemCategory_FIELDNAME), itemCategory);
cq.select(root).where(p);
list = em.createQuery(cq).setMaxResults(1000).getResultList();
} while (ListTools.isNotEmpty(list));
return count;
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册