Browse Source

add erase content entity

zhourui 5 years ago
parent
commit
b62c210713

+ 40 - 56
o2server/x_console/src/main/java/com/x/server/console/Main.java

@@ -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();

+ 31 - 25
o2server/x_console/src/main/java/com/x/server/console/action/ActionControl.java

@@ -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;
 		}
 	}
 

+ 169 - 0
o2server/x_console/src/main/java/com/x/server/console/action/EraseContent.java

@@ -0,0 +1,169 @@
+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;
+	}
+
+}

+ 1 - 4
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentBbs.java

@@ -1,8 +1,6 @@
 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);

+ 7 - 13
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentCms.java

@@ -1,26 +1,20 @@
 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);

+ 17 - 0
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentEntity.java

@@ -0,0 +1,17 @@
+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;
+	}
+
+}

+ 1 - 5
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentLog.java

@@ -1,7 +1,5 @@
 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 {

+ 1 - 4
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentMessage.java

@@ -1,7 +1,5 @@
 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);

+ 1 - 5
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentOrg.java

@@ -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 {

+ 1 - 148
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentProcessPlatform.java

@@ -1,29 +1,6 @@
 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;
-	}
 }