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