From bd3129bdb937e23c84a8893d924753d2f6135664 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Thu, 19 Mar 2015 13:12:33 +0000
Subject: [PATCH] SSDM-1621: ExperimentBOTest fixed.

SVN: 33696
---
 .../business/bo/AbstractBusinessObject.java   | 25 ++++++++++++----
 .../server/business/bo/ExperimentBO.java      |  2 +-
 .../generic/server/business/bo/SampleBO.java  |  2 +-
 .../DataSetTypeWithoutExperimentChecker.java  |  7 ++++-
 .../server/business/bo/ExperimentBOTest.java  | 29 +++++++++++++++----
 5 files changed, 51 insertions(+), 14 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
index 423ca746236..c08c58e991d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
@@ -29,6 +30,7 @@ import org.apache.commons.lang.StringUtils;
 import org.hibernate.SessionFactory;
 import org.springframework.dao.DataAccessException;
 
+import ch.systemsx.cisd.common.collection.CollectionUtils;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.business.IDataStoreServiceFactory;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.util.DataSetTypeWithoutExperimentChecker;
@@ -731,18 +733,29 @@ abstract class AbstractBusinessObject implements IDAOFactory
         }
     }
     
-    protected void checkSampleWithoutDatasets(IDataDAO dataDAO, SamplePE sample)
+    protected void checkSampleWithoutDatasets(SamplePE sample)
     {
         List<DataPE> dataSets = getDataDAO().listDataSets(sample);
+        String sampleIdentifier = sample.getIdentifier();
+        checkDataSetsDoNotNeedAnExperiment(sampleIdentifier, dataSets);
+    }
+
+    private void checkDataSetsDoNotNeedAnExperiment(String sampleIdentifier, List<DataPE> dataSets)
+    {
+        List<String> dataSetsNeedingExperiment = new ArrayList<String>();
         for (DataPE dataSet : dataSets)
         {
+            String dataSetTypeCode = dataSet.getDataSetType().getCode();
+            if (dataSetTypeChecker.isDataSetTypeWithoutExperiment(dataSetTypeCode) == false)
+            {
+                dataSetsNeedingExperiment.add(dataSet.getCode());
+            }
         }
-        if (hasDatasets2(dataDAO, sample))
+        if (dataSetsNeedingExperiment.isEmpty() == false)
         {
-            throw UserFailureException
-                    .fromTemplate(
-                            "Operation cannot be performed, because some datasets have been already produced for the sample '%s'.",
-                            sample.getSampleIdentifier());
+            throw new UserFailureException("Operation cannot be performed, because the sample "
+                    + sampleIdentifier + " has the following datasets which need an experiment: "
+                    + CollectionUtils.abbreviate(dataSetsNeedingExperiment, 10));
         }
     }
     
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
index ccafafc89c1..0484f767014 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
@@ -517,7 +517,7 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
     {
         for (SamplePE sample : samples)
         {
-            checkSampleWithoutDatasets(getDataDAO(), sample);
+            checkSampleWithoutDatasets(sample);
 
             relationshipService.unassignSampleFromExperiment(session, sample);
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
index 7706876db03..e3142b829b6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
@@ -239,7 +239,7 @@ public final class SampleBO extends AbstractSampleBusinessObject implements ISam
         checkAvailable(sample);
         checkSpaceSample(sample);
         checkSampleUnused(sample);
-        checkSampleWithoutDatasets(getDataDAO(), sample);
+        checkSampleWithoutDatasets(sample);
 
         this.relationshipService.assignSampleToExperiment(session, sample, experiment);
         try
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/DataSetTypeWithoutExperimentChecker.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/DataSetTypeWithoutExperimentChecker.java
index fc9d912efb0..a104cd35731 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/DataSetTypeWithoutExperimentChecker.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/DataSetTypeWithoutExperimentChecker.java
@@ -41,7 +41,12 @@ public class DataSetTypeWithoutExperimentChecker
 
     public DataSetTypeWithoutExperimentChecker(Properties properties)
     {
-        regularExpressions = properties.getProperty(PROPERTY_KEY);
+        this(properties.getProperty(PROPERTY_KEY));
+    }
+
+    public DataSetTypeWithoutExperimentChecker(String regularExpressions)
+    {
+        this.regularExpressions = regularExpressions;
         if (StringUtils.isNotBlank(regularExpressions))
         {
             String[] splittedRegexes = regularExpressions.split(",");
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBOTest.java
index e81e36b1be7..d8017e33892 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBOTest.java
@@ -36,6 +36,7 @@ import org.testng.annotations.Test;
 import ch.rinn.restrictions.Friend;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.business.ManagerTestTool;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.util.DataSetTypeWithoutExperimentChecker;
 import ch.systemsx.cisd.openbis.generic.server.util.TimeIntervalChecker;
 import ch.systemsx.cisd.openbis.generic.shared.CommonTestUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -43,6 +44,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityPropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
@@ -93,7 +96,7 @@ public final class ExperimentBOTest extends AbstractBOTest
     private final ExperimentBO createExperimentBO()
     {
         return new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, relationshipService,
-                managedPropertyEvaluatorFactory, null);
+                managedPropertyEvaluatorFactory, new DataSetTypeWithoutExperimentChecker("NE.*"));
     }
 
     @BeforeMethod
@@ -811,7 +814,7 @@ public final class ExperimentBOTest extends AbstractBOTest
         context.assertIsSatisfied();
     }
 
-    @Test(expectedExceptionsMessageRegExp = ".*datasets.*", expectedExceptions = UserFailureException.class)
+    @Test
     public void testUpdateByRemovingASampleWithDataSets()
     {
         ExperimentIdentifier identifier = CommonTestUtils.createExperimentIdentifier();
@@ -826,7 +829,15 @@ public final class ExperimentBOTest extends AbstractBOTest
         prepareRemoveSamplesFromExperiment(experiment, true, "S1");
         ExperimentBO experimentBO = loadExperiment(identifier, experiment);
 
-        experimentBO.update(update);
+        try
+        {
+            experimentBO.update(update);
+            fail("UserFailureException expected");
+        } catch (UserFailureException ex)
+        {
+            assertEquals("Operation cannot be performed, because the sample /S1 has the "
+                    + "following datasets which need an experiment: [DS1]", ex.getMessage());
+        }
 
         context.assertIsSatisfied();
     }
@@ -901,11 +912,19 @@ public final class ExperimentBOTest extends AbstractBOTest
                         SamplePE sample = createSampleWithCode(sampleCode);
                         will(returnValue(sample));
 
-                        one(dataDAO).hasDataSet(sample);
-                        will(returnValue(samplesHaveDataSets));
+                        one(dataDAO).listDataSets(sample);
                         if (samplesHaveDataSets)
                         {
+                            DataPE dataPE = new DataPE();
+                            dataPE.setCode("DS1");
+                            DataSetTypePE dataSetType = new DataSetTypePE();
+                            dataSetType.setCode("A");
+                            dataPE.setDataSetType(dataSetType);
+                            will(returnValue(Arrays.asList(dataPE)));
                             break;
+                        } else
+                        {
+                            will(returnValue(Arrays.asList()));
                         }
                         one(relationshipService).unassignSampleFromExperiment(EXAMPLE_SESSION,
                                 sample);
-- 
GitLab