diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainedExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainedExecutor.java index 145cd88521eb8092e0e0076f81269488ad58abbc..424243e17b6c5d0670b71cdc7ccbd894117609ab 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainedExecutor.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainedExecutor.java @@ -24,6 +24,7 @@ import ch.ethz.sis.openbis.generic.server.api.v3.executor.IOperationContext; import ch.ethz.sis.openbis.generic.server.api.v3.executor.entity.AbstractSetEntityToManyRelationExecutor; import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.DataSetCreation; import ch.ethz.sis.openbis.generic.shared.api.v3.dto.id.dataset.IDataSetId; +import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE; /** @@ -45,9 +46,18 @@ public class SetDataSetContainedExecutor extends AbstractSetEntityToManyRelation { context.pushContextDescription("set contained for dataset " + container.getCode()); - for (DataPE aContained : contained) + if (false == contained.isEmpty()) { - relationshipService.assignDataSetToContainer(context.getSession(), aContained, container); + if (false == container.isContainer()) + { + throw new UserFailureException("Data set " + container.getCode() + + " is not of a container type therefore cannot have contained data sets."); + } + + for (DataPE aContained : contained) + { + relationshipService.assignDataSetToContainer(context.getSession(), aContained, container); + } } context.popContextDescription(); diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainerExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainerExecutor.java index 23e158dd7fd18f808d573eeaded2c60c1a5a4247..1faf3cddbc77475cca806388dde8235c60a9ddb6 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainerExecutor.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainerExecutor.java @@ -24,6 +24,7 @@ import ch.ethz.sis.openbis.generic.server.api.v3.executor.IOperationContext; import ch.ethz.sis.openbis.generic.server.api.v3.executor.entity.AbstractSetEntityToManyRelationExecutor; import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.DataSetCreation; import ch.ethz.sis.openbis.generic.shared.api.v3.dto.id.dataset.IDataSetId; +import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE; /** @@ -47,6 +48,11 @@ public class SetDataSetContainerExecutor extends AbstractSetEntityToManyRelation for (DataPE container : containers) { + if (false == container.isContainer()) + { + throw new UserFailureException("Data set " + container.getCode() + + " is not of a container type therefore cannot be set as a container of data set " + contained.getCode() + "."); + } relationshipService.assignDataSetToContainer(context.getSession(), contained, container); } diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateDataSetTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateDataSetTest.java index 43cde23180a0ba6b4a2394a2300d499c611e813f..26f6f07fb340f7ecb2d62a6f727769dcd157ee33 100644 --- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateDataSetTest.java +++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateDataSetTest.java @@ -581,12 +581,32 @@ public class CreateDataSetTest extends AbstractDataSetTest } @Test - public void testCreateWithContainers() + public void testCreateWithContainersThatAreNonContainerDataSets() + { + final String sessionToken = v3api.login(TEST_USER, PASSWORD); + + final DataSetCreation creation = physicalDataSetCreation(); + creation.setContainerIds(Collections.singletonList(new DataSetPermId("20081105092159111-1"))); + + assertUserFailureException(new IDelegatedAction() + { + + @Override + public void execute() + { + v3api.createDataSets(sessionToken, Arrays.asList(creation)); + } + }, "Data set 20081105092159111-1 is not of a container type therefore cannot be set as a container of data set " + + creation.getCode().toUpperCase() + "."); + } + + @Test + public void testCreateWithContainersThatAreContainerDataSets() { String sessionToken = v3api.login(TEST_USER, PASSWORD); DataSetCreation creation = physicalDataSetCreation(); - creation.setContainerIds(Collections.singletonList(new DataSetPermId("20081105092159111-1"))); + creation.setContainerIds(Collections.singletonList(new DataSetPermId("20110509092359990-10"))); DataSetFetchOptions fo = new DataSetFetchOptions(); fo.withContainers(); @@ -594,7 +614,7 @@ public class CreateDataSetTest extends AbstractDataSetTest DataSet dataSet = createDataSet(sessionToken, creation, fo); assertEquals(dataSet.getCode(), creation.getCode().toUpperCase()); - assertDataSetCodes(dataSet.getContainers(), "20081105092159111-1"); + assertDataSetCodes(dataSet.getContainers(), "20110509092359990-10"); } @Test @@ -602,9 +622,9 @@ public class CreateDataSetTest extends AbstractDataSetTest { final String sessionToken = v3api.login(TEST_USER, PASSWORD); - final DataSetCreation creation1 = physicalDataSetCreation(); - final DataSetCreation creation2 = physicalDataSetCreation(); - final DataSetCreation creation3 = physicalDataSetCreation(); + final DataSetCreation creation1 = containerDataSetCreation(); + final DataSetCreation creation2 = containerDataSetCreation(); + final DataSetCreation creation3 = containerDataSetCreation(); creation2.setContainerIds(Collections.singletonList(creation1.getCreationId())); creation3.setContainerIds(Collections.singletonList(creation2.getCreationId())); @@ -625,7 +645,7 @@ public class CreateDataSetTest extends AbstractDataSetTest { final String sessionToken = v3api.loginAs(TEST_USER, PASSWORD, TEST_SPACE_USER); - final IDataSetId containerId = new DataSetPermId("20081105092159111-1"); + final IDataSetId containerId = new DataSetPermId("20110509092359990-10"); final DataSetCreation creation = physicalDataSetCreation(); creation.setExperimentId(new ExperimentIdentifier("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST")); creation.setContainerIds(Collections.singletonList(containerId)); @@ -641,11 +661,11 @@ public class CreateDataSetTest extends AbstractDataSetTest } @Test - public void testCreateWithContained() + public void testCreateWithContainedForContainerDataSet() { String sessionToken = v3api.login(TEST_USER, PASSWORD); - DataSetCreation creation = physicalDataSetCreation(); + DataSetCreation creation = containerDataSetCreation(); creation.setContainedIds(Collections.singletonList(new DataSetPermId("20081105092159111-1"))); DataSetFetchOptions fo = new DataSetFetchOptions(); @@ -657,14 +677,32 @@ public class CreateDataSetTest extends AbstractDataSetTest assertDataSetCodes(dataSet.getContained(), "20081105092159111-1"); } + @Test + public void testCreateWithContainedForNonContainerDataSet() + { + final String sessionToken = v3api.login(TEST_USER, PASSWORD); + + final DataSetCreation creation = physicalDataSetCreation(); + creation.setContainedIds(Collections.singletonList(new DataSetPermId("20081105092159111-1"))); + + assertUserFailureException(new IDelegatedAction() + { + @Override + public void execute() + { + createDataSet(sessionToken, creation, new DataSetFetchOptions()); + } + }, "Data set " + creation.getCode().toUpperCase() + " is not of a container type therefore cannot have contained data sets."); + } + @Test public void testCreateWithContainedCircularDependency() { final String sessionToken = v3api.login(TEST_USER, PASSWORD); - final DataSetCreation creation1 = physicalDataSetCreation(); - final DataSetCreation creation2 = physicalDataSetCreation(); - final DataSetCreation creation3 = physicalDataSetCreation(); + final DataSetCreation creation1 = containerDataSetCreation(); + final DataSetCreation creation2 = containerDataSetCreation(); + final DataSetCreation creation3 = containerDataSetCreation(); creation2.setContainedIds(Collections.singletonList(creation1.getCreationId())); creation3.setContainedIds(Collections.singletonList(creation2.getCreationId())); @@ -686,7 +724,7 @@ public class CreateDataSetTest extends AbstractDataSetTest final String sessionToken = v3api.loginAs(TEST_USER, PASSWORD, TEST_SPACE_USER); final IDataSetId containedId = new DataSetPermId("20081105092159111-1"); - final DataSetCreation creation = physicalDataSetCreation(); + final DataSetCreation creation = containerDataSetCreation(); creation.setExperimentId(new ExperimentIdentifier("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST")); creation.setContainedIds(Collections.singletonList(containedId)); @@ -1477,6 +1515,19 @@ public class CreateDataSetTest extends AbstractDataSetTest return creation; } + private DataSetCreation containerDataSetCreation() + { + String code = UUID.randomUUID().toString(); + + DataSetCreation creation = new DataSetCreation(); + creation.setCode(code); + creation.setTypeId(new EntityTypePermId("CONTAINER_TYPE")); + creation.setExperimentId(new ExperimentIdentifier("/CISD/NEMO/EXP1")); + creation.setDataStoreId(new DataStorePermId("STANDARD")); + creation.setCreationId(new CreationId(code)); + return creation; + } + private DataSetCreation linkDataSetCreation() { String code = UUID.randomUUID().toString(); diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapDataSetTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapDataSetTest.java index 9cf0308b3233360cf85824de18728f24f8ce52b9..45961a327e6fb471ebc4509e2e54406f33b718b7 100644 --- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapDataSetTest.java +++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapDataSetTest.java @@ -510,7 +510,7 @@ public class MapDataSetTest extends AbstractDataSetTest } @Test - public void testMapWithExternalDataForPhysicalDataSet() + public void testMapWithPhysicalDataForPhysicalDataSet() { String sessionToken = v3api.login(TEST_USER, PASSWORD); @@ -564,7 +564,7 @@ public class MapDataSetTest extends AbstractDataSetTest } @Test - public void testMapWithExternalDataForContainerDataSet() + public void testMapWithPhysicalDataForContainerDataSet() { String sessionToken = v3api.login(TEST_USER, PASSWORD);