From 67be489e26ba59cfb79d33f458eb8398d60ba2df Mon Sep 17 00:00:00 2001
From: jakubs <jakubs>
Date: Wed, 21 Mar 2012 16:32:00 +0000
Subject: [PATCH] LMS-2843: add update of experiment for contained dataset. Fix
 the test

SVN: 24771
---
 .../generic/server/AbstractServer.java        | 29 ++++++++++++++----
 .../generic/server/business/bo/DataBO.java    | 24 ++++++++++++++-
 .../server/business/bo/TrashBOTest.java       | 30 +++++++------------
 3 files changed, 56 insertions(+), 27 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 e9b2bad4bd5..cc5154ca87d 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
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.server;
 
 import java.io.StringWriter;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
@@ -227,15 +228,19 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp
         // 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()));
+        List<DataPE> dataSets = dataSetTable.getDataSets();
 
-        dataSetTable.loadByIds(ids);
+        if (atLeastOneOfDataSetsIsContainer(dataSets))
+        {
+            // get recursively all datasets that are contained and contained
+            List<TechId> ids =
+                    daoFactory.getDataDAO().listContainedDataSetsRecursively(
+                            TechId.createList(dataSetTable.getDataSets()));
 
-        List<DataPE> dataSets = dataSetTable.getDataSets();
+            dataSetTable.loadByIds(ids);
 
+            dataSets = dataSetTable.getDataSets();
+        }
         Map<DataSetTypePE, List<DataPE>> groupedDataSets =
                 new LinkedHashMap<DataSetTypePE, List<DataPE>>();
         for (DataPE dataSet : dataSets)
@@ -257,6 +262,18 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp
         }
     }
 
+    private boolean atLeastOneOfDataSetsIsContainer(Collection<DataPE> dataSets)
+    {
+        for (DataPE dataSet : dataSets)
+        {
+            if (dataSet.isContainer())
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private final RoleAssignmentPE createRoleAssigment(final PersonPE registrator,
             final PersonPE person, final RoleCode roleCode)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java
index 480113c622a..014314cfe81 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
@@ -794,7 +795,28 @@ public class DataBO extends AbstractDataSetBusinessObject implements IDataBO
     {
         assert experimentIdentifier != null;
         ExperimentPE experiment = getExperimentByIdentifier(experimentIdentifier);
-        data.setExperiment(experiment);
+        if (data.getExperiment() == null || data.getExperiment().getId() != experiment.getId())
+        {
+            if (data.isContainer())
+            {
+                updateExperimentForAllContainedDataSets(experiment);
+            } else
+            {
+                data.setExperiment(experiment);
+            }
+        }
+    }
+
+    private void updateExperimentForAllContainedDataSets(ExperimentPE experiment)
+    {
+        List<TechId> listIds = Collections.singletonList(TechId.create(data));
+        listIds = getDataDAO().listContainedDataSetsRecursively(listIds);
+
+        for (TechId techId : listIds)
+        {
+            DataPE dataObject = getDataDAO().getByTechId(techId);
+            dataObject.setExperiment(experiment);
+        }
     }
 
     private ExperimentPE getExperimentByIdentifier(final ExperimentIdentifier identifier)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBOTest.java
index 382333d281e..a8492ea89ee 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBOTest.java
@@ -17,7 +17,6 @@
 package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 
@@ -194,8 +193,8 @@ public final class TrashBOTest extends AbstractBOTest
                     one(dataDAO).listDataSetIdsByExperimentIds(experimentIds);
                     will(returnValue(dataSetIds));
 
-                    one(dataDAO).listContainedDataSets(with(dsIdsMatcher));
-                    will(returnValue(Collections.emptyList()));
+                    one(dataDAO).listContainedDataSetsRecursively(with(dsIdsMatcher));
+                    will(returnValue(dataSetIds));
 
                     oneOf(deletionDAO).trash(with(same(EntityKind.DATA_SET)), with(dsIdsMatcher),
                             with(same(deletion)));
@@ -239,8 +238,8 @@ public final class TrashBOTest extends AbstractBOTest
                     one(dataDAO).listDataSetIdsByExperimentIds(experimentIds);
                     will(returnValue(dataSetIds));
 
-                    one(dataDAO).listContainedDataSets(with(dataSetIdsMatcher));
-                    will(returnValue(Collections.emptyList()));
+                    one(dataDAO).listContainedDataSetsRecursively(with(dataSetIdsMatcher));
+                    will(returnValue(dataSetIds));
 
                     one(deletionDAO).trash(with(same(EntityKind.DATA_SET)),
                             with(dataSetIdsMatcher), with(same(deletion)));
@@ -316,12 +315,8 @@ public final class TrashBOTest extends AbstractBOTest
                     RecordingMatcher<List<TechId>> dataSetIdsMatcher =
                             new RecordingMatcher<List<TechId>>();
 
-                    final List<TechId> containedDataSetIds = TechId.createList(71, 73);
-                    one(dataDAO).listContainedDataSets(with(dataSetIdsMatcher));
-                    will(returnValue(containedDataSetIds));
-
-                    one(dataDAO).listContainedDataSets(with(dataSetIdsMatcher));
-                    will(returnValue(Collections.emptyList()));
+                    one(dataDAO).listContainedDataSetsRecursively(with(dataSetIdsMatcher));
+                    will(returnValue(TechId.createList(70, 71, 72, 73)));
 
                     one(deletionDAO).trash(with(same(EntityKind.DATA_SET)),
                             with(dataSetIdsMatcher), with(same(deletion)));
@@ -346,11 +341,8 @@ public final class TrashBOTest extends AbstractBOTest
                     one(dataSetTable).getNonDeletableExternalDataSets();
                     will(returnValue(Arrays.asList()));
 
-                    one(dataDAO).listContainedDataSets(dataSetIds);
-                    will(returnValue(containedIds));
-
-                    one(dataDAO).listContainedDataSets(containedIds);
-                    will(returnValue(Collections.emptyList()));
+                    one(dataDAO).listContainedDataSetsRecursively(dataSetIds);
+                    will(returnValue(allIds));
 
                     one(deletionDAO).trash(EntityKind.DATA_SET, allIds, deletion);
                     will(returnValue(allIds.size()));
@@ -376,11 +368,9 @@ public final class TrashBOTest extends AbstractBOTest
                     dataSet.setStatus(DataSetArchivingStatus.ARCHIVE_PENDING);
                     will(returnValue(Arrays.asList(dataSet)));
 
-                    one(dataDAO).listContainedDataSets(dataSetIds);
-                    will(returnValue(containedIds));
+                    one(dataDAO).listContainedDataSetsRecursively(dataSetIds);
+                    will(returnValue(allIds));
 
-                    one(dataDAO).listContainedDataSets(containedIds);
-                    will(returnValue(Collections.emptyList()));
                 }
             });
 
-- 
GitLab