From a56e7cc13e63ea8edc9c86f92076c7e94c635cd3 Mon Sep 17 00:00:00 2001
From: jakubs <jakubs>
Date: Thu, 22 Mar 2012 12:24:13 +0000
Subject: [PATCH] LMS-2843: update the logic of setting experiment for
 contained datasets

SVN: 24773
---
 .../generic/server/business/bo/DataBO.java    | 29 +++---------
 .../openbis/generic/shared/dto/DataPE.java    | 11 +++++
 .../generic/shared/dto/ExperimentPE.java      |  9 ----
 .../server/business/bo/DataBOTest.java        |  4 ++
 .../dataaccess/db/ExperimentDAOTest.java      | 45 +++++++++++++++++++
 5 files changed, 67 insertions(+), 31 deletions(-)

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 014314cfe81..d907300e208 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,7 +19,6 @@ 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;
@@ -783,11 +782,10 @@ public class DataBO extends AbstractDataSetBusinessObject implements IDataBO
             throw createWrongSampleException(newSample,
                     "the new sample is not connected to any experiment");
         }
+
         // move dataset to the experiment if needed
-        if (experiment.equals(data.getExperiment()) == false)
-        {
-            data.setExperiment(experiment);
-        }
+        updateExperiment(experiment);
+
         data.setSample(newSample);
     }
 
@@ -795,27 +793,14 @@ public class DataBO extends AbstractDataSetBusinessObject implements IDataBO
     {
         assert experimentIdentifier != null;
         ExperimentPE experiment = getExperimentByIdentifier(experimentIdentifier);
-        if (data.getExperiment() == null || data.getExperiment().getId() != experiment.getId())
-        {
-            if (data.isContainer())
-            {
-                updateExperimentForAllContainedDataSets(experiment);
-            } else
-            {
-                data.setExperiment(experiment);
-            }
-        }
+        updateExperiment(experiment);
     }
 
-    private void updateExperimentForAllContainedDataSets(ExperimentPE experiment)
+    private void updateExperiment(ExperimentPE experiment)
     {
-        List<TechId> listIds = Collections.singletonList(TechId.create(data));
-        listIds = getDataDAO().listContainedDataSetsRecursively(listIds);
-
-        for (TechId techId : listIds)
+        if (experiment.equals(data.getExperiment()) == false)
         {
-            DataPE dataObject = getDataDAO().getByTechId(techId);
-            dataObject.setExperiment(experiment);
+            data.setExperiment(experiment);
         }
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
index 2d4ef864d1f..3df8444bbc3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
@@ -523,6 +523,17 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
         if (experiment != null)
         {
             experiment.addDataSet(this);
+
+            if (containedDataSets != null)
+            {
+                for (DataPE contained : containedDataSets)
+                {
+                    if (false == contained.equals(this))
+                    {
+                        contained.setExperiment(experiment);
+                    }
+                }
+            }
         }
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
index 617be0267ef..b7f946c701a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
@@ -374,15 +374,6 @@ public class ExperimentPE extends AttachmentHolderPE implements
         this.dataSets = dataSets;
     }
 
-    public final void setDataSets(final List<DataPE> dataSets)
-    {
-        getExperimentDataSets().clear();
-        for (final DataPE child : dataSets)
-        {
-            addDataSet(child);
-        }
-    }
-
     public void addDataSet(final DataPE child)
     {
         final ExperimentPE parent = child.getExperiment();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBOTest.java
index 3093d0e7d38..1fccfc08a9f 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBOTest.java
@@ -576,6 +576,7 @@ public class DataBOTest extends AbstractBOTest
     {
         final ExperimentPE experiment = new ExperimentPE();
         experiment.setCode(EXPERIMENT_IDENTIFIER.getExperimentCode());
+        experiment.setProject(ManagerTestTool.EXAMPLE_PROJECT);
 
         final ExternalDataPE dataSet = createExternalData(null, experiment);
         DataSetUpdatesDTO dataSetUpdatesDTO =
@@ -603,6 +604,7 @@ public class DataBOTest extends AbstractBOTest
     {
         final ExperimentPE experiment = new ExperimentPE();
         experiment.setCode(EXPERIMENT_IDENTIFIER.getExperimentCode());
+        experiment.setProject(ManagerTestTool.EXAMPLE_PROJECT);
 
         final ExternalDataPE dataSet = createExternalData(null, experiment);
         DataSetUpdatesDTO dataSetUpdatesDTO =
@@ -638,6 +640,7 @@ public class DataBOTest extends AbstractBOTest
     {
         final ExperimentPE experiment = new ExperimentPE();
         experiment.setCode(EXPERIMENT_IDENTIFIER.getExperimentCode());
+        experiment.setProject(ManagerTestTool.EXAMPLE_PROJECT);
 
         final DataPE dataSet = createDataSet(null, experiment);
         DataSetUpdatesDTO dataSetUpdatesDTO =
@@ -674,6 +677,7 @@ public class DataBOTest extends AbstractBOTest
     {
         final ExperimentPE experiment = new ExperimentPE();
         experiment.setCode(EXPERIMENT_IDENTIFIER.getExperimentCode());
+        experiment.setProject(ManagerTestTool.EXAMPLE_PROJECT);
 
         final DataPE dataSet = createDataSet(null, experiment);
         DataSetUpdatesDTO dataSetUpdatesDTO =
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAOTest.java
index c5eaeca7aa5..16b615cc7c5 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAOTest.java
@@ -25,6 +25,7 @@ import static org.testng.AssertJUnit.fail;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
 
 import junit.framework.Assert;
@@ -36,6 +37,7 @@ import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.DynamicPropertyEvaluationOperation;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.DynamicPropertyEvaluationScheduler;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IExperimentDAO;
 import ch.systemsx.cisd.openbis.generic.shared.CommonTestUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -417,6 +419,49 @@ public class ExperimentDAOTest extends AbstractDAOTest
         Assert.assertFalse(modificationTimestamp.equals(experimentFound.getModificationDate()));
     }
 
+    public final void testChangeContainerExperimentUpdatesContainedElements()
+    {
+        // get data
+        IDataDAO dao = daoFactory.getDataDAO();
+
+        ExperimentPE exp = daoFactory.getExperimentDAO().getByTechId(new TechId(8));
+
+        ExperimentPE exp22 = daoFactory.getExperimentDAO().getByTechId(new TechId(22));
+
+        assertEquals("EXP-REUSE", exp.getCode());
+        assertEquals("EXP-Y", exp22.getCode());
+
+        DataPE container = dao.tryToFindDataSetByCode("20110509092359990-10");
+
+        List<TechId> containedIds =
+                dao.listContainedDataSetsRecursively(Collections.singleton(TechId.create(container)));
+
+        assertEquals(3, containedIds.size());
+
+        List<DataPE> contained = new LinkedList<DataPE>();
+        for (TechId techId : containedIds)
+        {
+            contained.add(dao.getByTechId(techId));
+        }
+
+        // change experiment for container
+        container.setExperiment(exp22);
+
+        // assert the contained datasets have experiment updated
+        for (DataPE data : contained)
+        {
+            assertEquals(exp22, data.getExperiment());
+        }
+
+        // revert to original state
+        container.setExperiment(exp);
+
+        for (DataPE data : contained)
+        {
+            assertEquals(exp, data.getExperiment());
+        }
+    }
+
     @Test
     public void testCreateExperimentsOfDifferentTypes() throws Exception
     {
-- 
GitLab