From 951dd304650e10a1d9b0b0b544138a3b4fbc4acc Mon Sep 17 00:00:00 2001 From: jakubs <jakubs> Date: Wed, 21 Mar 2012 16:31:59 +0000 Subject: [PATCH] LMS-2843: add deletion of contained datasets when trash is disabled SVN: 24770 --- .../generic/server/AbstractServer.java | 11 ++++++++++ .../generic/server/business/bo/TrashBO.java | 11 +--------- .../generic/server/dataaccess/IDataDAO.java | 6 ++++++ .../generic/server/dataaccess/db/DataDAO.java | 20 +++++++++++++++++++ 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java index 4fe150eddea..e9b2bad4bd5 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java @@ -223,8 +223,19 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp List<String> dataSetCodes, String reason, boolean force) { // TODO 2011-06-21, Piotr Buczek: loading less for deletion would probably be faster + + // first load by codes to get the ids dataSetTable.loadByDataSetCodes(dataSetCodes, false, false); + + // get recursively all datasets that are contained and contained + List<TechId> ids = + daoFactory.getDataDAO().listContainedDataSetsRecursively( + TechId.createList(dataSetTable.getDataSets())); + + dataSetTable.loadByIds(ids); + List<DataPE> dataSets = dataSetTable.getDataSets(); + Map<DataSetTypePE, List<DataPE>> groupedDataSets = new LinkedHashMap<DataSetTypePE, List<DataPE>>(); for (DataPE dataSet : dataSets) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java index 09728111c4e..f7c446be98d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java @@ -119,16 +119,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO { assert deletion != null; - LinkedHashSet<TechId> allIds = new LinkedHashSet<TechId>(); - // cascade deletion of contained datasets - List<TechId> containedDataSetIds = dataSetIds; - - while (allIds.addAll(containedDataSetIds)) - { - containedDataSetIds = getDataDAO().listContainedDataSets(containedDataSetIds); - } - - List<TechId> allIdsAsList = new ArrayList<TechId>(allIds); + List<TechId> allIdsAsList = getDataDAO().listContainedDataSetsRecursively(dataSetIds); checkForNonDeletableDataSets(allIdsAsList); TrashBatchOperation batchOperation = diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDataDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDataDAO.java index 7189bd2c786..b828488fdd7 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDataDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDataDAO.java @@ -143,6 +143,12 @@ public interface IDataDAO extends IGenericDAO<DataPE> /** Returns ids of contained data sets for a given collection of containers. */ public List<TechId> listContainedDataSets(final Collection<TechId> containerIds); + /** + * Returs ids of contained data sets, and of datasets contained in those datasets etc. Also + * includes the input ids. + */ + public List<TechId> listContainedDataSetsRecursively(final Collection<TechId> containersIds); + /** * Delete data sets with given ids by specified registrator with specified reason. */ diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java index e50182a7141..d3059c07b3f 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java @@ -21,6 +21,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -1117,4 +1119,22 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple return transformNumbers2TechIdList(totalResults); } + + public List<TechId> listContainedDataSetsRecursively(Collection<TechId> containersIds) + { + LinkedHashSet<TechId> allIds = new LinkedHashSet<TechId>(); + // cascade deletion of contained datasets + List<TechId> containedDataSetIds = new LinkedList<TechId>(); + + containedDataSetIds.addAll(containersIds); + + while (allIds.addAll(containedDataSetIds)) + { + containedDataSetIds = listContainedDataSets(containedDataSetIds); + } + + return new ArrayList<TechId>(allIds); + + } + } -- GitLab