diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/OperationsExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/OperationsExecutor.java index 99bbb7ea8d1a4271ca553f92634cbfd8858d875a..e9460055feaae8680b07550b10da96505a498515 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/OperationsExecutor.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/OperationsExecutor.java @@ -414,9 +414,9 @@ public class OperationsExecutor implements IOperationsExecutor private void executeDeletions(List<? extends IOperation> operations, Map<IOperation, IOperationResult> resultMap, IOperationContext context) { - resultMap.putAll(deleteDataSetsExecutor.execute(context, operations)); - resultMap.putAll(deleteSamplesExecutor.execute(context, operations)); resultMap.putAll(deleteExperimentsExecutor.execute(context, operations)); + resultMap.putAll(deleteSamplesExecutor.execute(context, operations)); + resultMap.putAll(deleteDataSetsExecutor.execute(context, operations)); resultMap.putAll(deleteProjectsExecutor.execute(context, operations)); resultMap.putAll(deleteSpacesExecutor.execute(context, operations)); resultMap.putAll(deleteMaterialsExecutor.execute(context, operations)); diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/MixedExecuteOperationsTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/MixedExecuteOperationsTest.java new file mode 100644 index 0000000000000000000000000000000000000000..bf2f5281930d39269826e8a62849bd023b3012b7 --- /dev/null +++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/MixedExecuteOperationsTest.java @@ -0,0 +1,214 @@ +/* + * Copyright 2017 ETH Zuerich, SIS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.ethz.sis.openbis.systemtest.asapi.v3; + +import static junit.framework.Assert.assertNotNull; +import static org.testng.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.testng.annotations.Test; + +import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.operation.IOperation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.create.CreateDataSetsOperation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.create.DataSetCreation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.delete.DataSetDeletionOptions; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.delete.DeleteDataSetsOperation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.delete.DeleteDataSetsOperationResult; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.fetchoptions.DataSetFetchOptions; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.DataSetPermId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.datastore.id.DataStorePermId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.deletion.id.IDeletionId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.IEntityTypeId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.Material; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.create.CreateMaterialsOperation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.create.MaterialCreation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.delete.DeleteMaterialsOperation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.delete.MaterialDeletionOptions; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.fetchoptions.MaterialFetchOptions; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.id.IMaterialId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.id.MaterialPermId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.operation.SynchronousOperationExecutionOptions; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.operation.SynchronousOperationExecutionResults; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.create.CreateSamplesOperation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.create.SampleCreation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.delete.DeleteSamplesOperation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.delete.DeleteSamplesOperationResult; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.delete.SampleDeletionOptions; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleFetchOptions; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.ISampleId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.ISpaceId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.create.CreateVocabularyTermsOperation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.create.VocabularyTermCreation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.delete.DeleteVocabularyTermsOperation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.delete.VocabularyTermDeletionOptions; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.fetchoptions.VocabularyTermFetchOptions; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.id.IVocabularyId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.id.IVocabularyTermId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.id.VocabularyPermId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.id.VocabularyTermPermId; + +/** + * + * + * @author Franz-Josef Elmer + */ +public class MixedExecuteOperationsTest extends AbstractOperationExecutionTest +{ + private static final String PROPERTY_TYPE = "ORGANISM"; + private static final String MATERIAL_TYPE = "BACTERIUM"; + private static final EntityTypePermId MATERIAL_TYPE_ID = new EntityTypePermId(MATERIAL_TYPE); + private static final VocabularyPermId VOCABULARY_ID = new VocabularyPermId(PROPERTY_TYPE); + + @Test + public void testReplaceVocabularyTermForMaterialProperty() + { + String sessionToken = v3api.login(TEST_USER, PASSWORD); + long time = System.currentTimeMillis(); + List<IOperation> operations = new ArrayList<IOperation>(); + + // create new material and two new vocabulary terms, one is a property value of the created material + VocabularyTermCreation vt1 = new VocabularyTermCreation(); + vt1.setCode("ORG-" + time); + vt1.setVocabularyId(VOCABULARY_ID); + IVocabularyTermId id1 = getId(vt1); + VocabularyTermCreation vt2 = new VocabularyTermCreation(); + vt2.setCode("ORG-" + time + "_2"); + vt2.setVocabularyId(VOCABULARY_ID); + IVocabularyTermId id2 = getId(vt2); + operations.add(new CreateVocabularyTermsOperation(vt1, vt2)); + MaterialCreation materialCreation = new MaterialCreation(); + materialCreation.setCode("BAC-" + time); + materialCreation.setTypeId(MATERIAL_TYPE_ID); + materialCreation.setProperty(PROPERTY_TYPE, vt1.getCode()); + materialCreation.setProperty("description", "test"); + IMaterialId materialId = getId(materialCreation); + operations.add(new CreateMaterialsOperation(materialCreation)); + execute(sessionToken, operations); + assertEquals(getMaterial(sessionToken, materialId).getProperty(PROPERTY_TYPE), vt1.getCode()); + + // Delete first vocabulary term and replace it by the second one + operations.clear(); + VocabularyTermDeletionOptions termDeletionOptions = createVocabularyTermDeletionOptions(); + termDeletionOptions.replace(id1, id2); + operations.add(new DeleteVocabularyTermsOperation(Arrays.asList(id1), termDeletionOptions)); + execute(sessionToken, operations); + assertEquals(getMaterial(sessionToken, materialId).getProperty(PROPERTY_TYPE), vt2.getCode()); + + // Delete both vocabulary terms and the material + operations.clear(); + operations.add(new DeleteVocabularyTermsOperation(Arrays.asList(id1, id2), createVocabularyTermDeletionOptions())); + MaterialDeletionOptions materialDeletionOptions = new MaterialDeletionOptions(); + materialDeletionOptions.setReason("test material deletion"); + operations.add(new DeleteMaterialsOperation(Arrays.asList(materialId), materialDeletionOptions)); + execute(sessionToken, operations); + assertEquals(v3api.getVocabularyTerms(sessionToken, Arrays.asList(id1, id2), new VocabularyTermFetchOptions()).size(), 0); + assertEquals(v3api.getMaterials(sessionToken, Arrays.asList(materialId), new MaterialFetchOptions()).size(), 0); + + v3api.logout(sessionToken); + } + + @Test + public void testDeleteSampleWithDataSet() + { + String sessionToken = v3api.login(TEST_USER, PASSWORD); + long time = System.currentTimeMillis(); + List<IOperation> operations = new ArrayList<IOperation>(); + + // Create a sample with a data set + SampleCreation sampleCreation = new SampleCreation(); + sampleCreation.setTypeId(new EntityTypePermId("NORMAL")); + sampleCreation.setCode("S-" + time); + sampleCreation.setSpaceId(new SpacePermId("CISD")); + ISampleId sampleId = getId(sampleCreation); + operations.add(new CreateSamplesOperation(sampleCreation)); + DataSetCreation dataSetCreation = new DataSetCreation(); + dataSetCreation.setDataStoreId(new DataStorePermId("STANDARD")); + dataSetCreation.setTypeId(new EntityTypePermId("CONTAINER_TYPE")); + dataSetCreation.setCode("DS-" + time); + dataSetCreation.setSampleId(sampleId); + DataSetPermId dataSetPermId = new DataSetPermId(dataSetCreation.getCode()); + operations.add(new CreateDataSetsOperation(dataSetCreation)); + execute(sessionToken, operations); + + // Delete sample and data set + operations.clear(); + DataSetDeletionOptions dataSetDeletionOptions = new DataSetDeletionOptions(); + dataSetDeletionOptions.setReason("test data set deletion"); + operations.add(new DeleteDataSetsOperation(Arrays.asList(dataSetPermId), dataSetDeletionOptions)); + SampleDeletionOptions sampleDeletionOptions = new SampleDeletionOptions(); + sampleDeletionOptions.setReason("Test sample deletion"); + operations.add(new DeleteSamplesOperation(Arrays.asList(sampleId), sampleDeletionOptions)); + SynchronousOperationExecutionResults executionResults = execute(sessionToken, operations); + DeleteDataSetsOperationResult opResult1 = (DeleteDataSetsOperationResult) executionResults.getResults().get(0); + IDeletionId delId1 = opResult1.getDeletionId(); + DeleteSamplesOperationResult opResult2 = (DeleteSamplesOperationResult) executionResults.getResults().get(1); + IDeletionId delId2 = opResult2.getDeletionId(); + assertEquals(v3api.getSamples(sessionToken, Arrays.asList(sampleId), new SampleFetchOptions()).size(), 0); + assertEquals(v3api.getDataSets(sessionToken, Arrays.asList(dataSetPermId), new DataSetFetchOptions()).size(), 0); + + // Clear trash + assertEquals(delId1, null); + assertNotNull(delId2); + v3api.confirmDeletions(sessionToken, Arrays.asList(delId1, delId2)); + + v3api.logout(sessionToken); + } + + private ISampleId getId(SampleCreation sampleCreation) + { + ISpaceId spaceId = sampleCreation.getSpaceId(); + return new SampleIdentifier("/" + ((SpacePermId) spaceId).getPermId() + "/" + sampleCreation.getCode()); + } + + private IMaterialId getId(MaterialCreation materialCreation) + { + IEntityTypeId typeId = materialCreation.getTypeId(); + return new MaterialPermId(materialCreation.getCode(), ((EntityTypePermId) typeId).getPermId()); + } + + private IVocabularyTermId getId(VocabularyTermCreation vt) + { + IVocabularyId vocabularyId = vt.getVocabularyId(); + return new VocabularyTermPermId(vt.getCode(), ((VocabularyPermId) vocabularyId).getPermId()); + } + + private VocabularyTermDeletionOptions createVocabularyTermDeletionOptions() + { + VocabularyTermDeletionOptions termDeletionOptions = new VocabularyTermDeletionOptions(); + termDeletionOptions.setReason("test vocabulary term deletion"); + return termDeletionOptions; + } + + private Material getMaterial(String sessionToken, IMaterialId materialId) + { + MaterialFetchOptions materialFetchOptions = new MaterialFetchOptions(); + materialFetchOptions.withProperties(); + return v3api.getMaterials(sessionToken, Arrays.asList(materialId), materialFetchOptions).get(materialId); + } + + private SynchronousOperationExecutionResults execute(String sessionToken, List<IOperation> operations) + { + SynchronousOperationExecutionOptions options = new SynchronousOperationExecutionOptions(); + return (SynchronousOperationExecutionResults) v3api.executeOperations(sessionToken, operations, options); + } +}