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 c43ab9b8b9a0312d60f034324a865a5b9eda9292..ada85279dd80c45c51ef3f49af6f9d0dc286047d 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 97653da7852442e493cfd44c9bc62a41a17d7b2a..ea5efbf290938795fe1ca167fc1ec155d6984261 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 9579800e6c6429c36554ddbd6f7dac28cf4d064c..b897b9a6b6a1048a31e0f40605f52871129edd76 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 c19d3f3b1a14cac04ba7a8c6a18863cf48cf4c93..85b9c847607b9aef679e5ab67a3c1f15ce62d542 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 aed30e07734b0097a3932472723c8a9f3b7706e4..f5bebf62c72511e4a44d2dd3c23a530563e9b134 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 d4485af9a261a580c9792050bcad762d2175c6c4..ad568625a84a73d4b7f02d3f6f1bc2dbdf798119 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() {