From d48a27d478776ff4f38afbf2a192faccc56f8c4a Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 11 Dec 2012 06:56:11 +0000
Subject: [PATCH] SP-428, BIS-287: parent-children of samples and data sets
 locked. More tests.

SVN: 27904
---
 .../server/dataaccess/db/AbstractDAO.java     |  3 +-
 .../generic/server/dataaccess/db/DataDAO.java |  2 ++
 .../server/dataaccess/db/SampleDAO.java       |  2 +-
 .../openbis/systemtest/SystemTestCase.java    | 13 ++++++++
 .../api/v1/GeneralInformationServiceTest.java | 12 -------
 .../RegistrationTest.java                     | 31 +++++++++++++++++++
 6 files changed, 49 insertions(+), 14 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
index c43ab9b8b9a..ada85279dd8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
@@ -368,7 +368,8 @@ public abstract class AbstractDAO extends HibernateDaoSupport
 
     protected void lockEntity(IIdHolder entityOrNull)
     {
-        if (entityOrNull != null && entityOrNull.getId() != null)
+        if (entityOrNull != null && entityOrNull.getId() != null
+                && getSession().contains(entityOrNull))
         {
             getHibernateTemplate().lock(entityOrNull, LockMode.PESSIMISTIC_WRITE);
         }
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 97653da7852..ea5efbf2909 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
@@ -655,6 +655,8 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple
         lockEntity(data.getExperiment());
         lockEntity(data.tryGetSample());
         lockEntity(data.getContainer());
+        lockEntities(data.getParents());
+        lockEntities(data.getChildren());
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
index 9579800e6c6..b897b9a6b6a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
@@ -88,7 +88,7 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE>
         }
         lockEntity(sample.getExperiment());
         lockEntity(sample.getContainer());
-        // lockEntities(sample.getParents());
+        lockEntities(sample.getParents());
         hibernateTemplate.saveOrUpdate(sample);
         if (doLog && operationLog.isInfoEnabled())
         {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
index c19d3f3b1a1..85b9c847607 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
@@ -46,6 +46,7 @@ import ch.systemsx.cisd.openbis.generic.server.ICommonServerForInternalUse;
 import ch.systemsx.cisd.openbis.generic.server.util.TestInitializer;
 import ch.systemsx.cisd.openbis.generic.shared.IETLLIMSService;
 import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifierHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeWithRegistration;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Grantee;
@@ -374,6 +375,18 @@ public abstract class SystemTestCase extends AbstractTransactionalTestNGSpringCo
         AssertJUnit.fail("No property " + key + " found in " + propertyCodes);
     }
 
+    protected void assertEntities(String expectedEntities,
+            List<? extends IIdentifierHolder> entities)
+    {
+        List<String> identifiers = new ArrayList<String>();
+        for (IIdentifierHolder entity : entities)
+        {
+            identifiers.add(entity.getIdentifier());
+        }
+        Collections.sort(identifiers);
+        assertEquals(expectedEntities, identifiers.toString());
+    }
+
     protected List<PropertyHistory> getMaterialPropertiesHistory(long materialID)
     {
         List<PropertyHistory> list =
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
index aed30e07734..f5bebf62c72 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
@@ -64,7 +64,6 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchCl
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SpaceWithProjectsAndRoleAssignments;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.metaproject.MetaprojectIdentifierId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifierHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
@@ -1293,17 +1292,6 @@ public class GeneralInformationServiceTest extends SystemTestCase
         sessionToken = generalInformationService.tryToAuthenticateForAllServices("observer", "a");
     }
 
-    private void assertEntities(String expectedEntities, List<? extends IIdentifierHolder> entities)
-    {
-        List<String> identifiers = new ArrayList<String>();
-        for (IIdentifierHolder entity : entities)
-        {
-            identifiers.add(entity.getIdentifier());
-        }
-        // Collections.sort(identifiers);
-        assertEquals(expectedEntities, identifiers.toString());
-    }
-
     private interface IToStringDelegate<T>
     {
         String toString(T t);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/perform_entity_operations/RegistrationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/perform_entity_operations/RegistrationTest.java
index d4485af9a26..ad568625a84 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/perform_entity_operations/RegistrationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/perform_entity_operations/RegistrationTest.java
@@ -62,6 +62,37 @@ import ch.systemsx.cisd.openbis.systemtest.SystemTestCase;
  */
 public class RegistrationTest extends SystemTestCase
 {
+    @Test
+    public void testCreateChildrenForAnExistingSampleWithBatchSize1()
+    {
+        Sample parentSample =
+                genericServer.getSampleInfo(systemSessionToken, new TechId(1)).getParent();
+        AtomicEntityOperationDetailsBuilder builder = new AtomicEntityOperationDetailsBuilder();
+        SampleType sampleType = new SampleType();
+        sampleType.setCode("CELL_PLATE");
+        parentSample.setSampleType(sampleType);
+        NewSample childSample1 = new NewSample();
+        childSample1.setIdentifier("/TEST-SPACE/PARENT_OF_TWO_CHILD_1");
+        childSample1.setSampleType(sampleType);
+        childSample1.setParents(parentSample.getIdentifier());
+        builder.sample(childSample1);
+        NewSample childSample2 = new NewSample();
+        childSample2.setIdentifier("/TEST-SPACE/PARENT_OF_TWO_CHILD_2");
+        childSample2.setSampleType(sampleType);
+        childSample2.setParents(parentSample.getIdentifier());
+        builder.sample(childSample2);
+        builder.batchSize(1);
+
+        etlService.performEntityOperations(systemSessionToken, builder.getDetails());
+
+        List<Sample> children =
+                commonServer.listSamples(systemSessionToken,
+                        ListSampleCriteria.createForParent(new TechId(parentSample)));
+
+        assertEntities("[/TEST-SPACE/PARENT_OF_TWO_CHILD_1, /TEST-SPACE/PARENT_OF_TWO_CHILD_2]",
+                children);
+    }
+
     @Test
     public void testCreateSampleWithTwoAttachments()
     {
-- 
GitLab