diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java index 7a04ddbd043cca7341a0dd4df3a55abfa9f166af..e29fc214e745a6ebbbfba2158a06966dc3127df6 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java @@ -18,7 +18,6 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.EnumSet; import java.util.HashSet; import java.util.LinkedHashSet; @@ -47,7 +46,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder; 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.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria; @@ -124,7 +122,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO if (sample != null) { sampleIds.add(new TechId(sample)); - } else if (dataSet.getExperiment() != null) + } if (dataSet.getExperiment() != null) { experimentIds.add(new TechId(dataSet.getExperiment())); } @@ -166,7 +164,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO trashManager.addTrashOperation(EntityKind.EXPERIMENT, experimentIds, true); Set<TechId> eIds = new LinkedHashSet<TechId>(experimentIds); Set<TechId> dependentSampleIds = trashExperimentDependentSamples(trashManager, eIds); - assertSampleDeletionBusinessRules(eIds, dependentSampleIds); + assertSampleDeletionBusinessRules(eIds, dependentSampleIds, dependentSampleIds); trashExperimentDependentDataSets(trashManager, eIds, dependentSampleIds); trashManager.trash(); } @@ -177,6 +175,18 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO assert deletion != null; TrashOperationsManager trashManager = new TrashOperationsManager(deletion, getDeletionDAO()); + Set<TechId> allSampleIds + = trashSamples(trashManager, sampleIds, CascadeSampleDependentComponents.TRUE, true); + Set<TechId> dependentSampleIds = new HashSet<TechId>(allSampleIds); + dependentSampleIds.removeAll(sampleIds); + Set<TechId> experimentsOfSamples = getExperimentsOfSamples(sampleIds); + assertSampleDeletionBusinessRules(experimentsOfSamples, new HashSet<TechId>(sampleIds), dependentSampleIds); + trashSampleDependentDataSets(trashManager, experimentsOfSamples, allSampleIds); + trashManager.trash(); + } + + private Set<TechId> getExperimentsOfSamples(List<TechId> sampleIds) + { Set<TechId> experimentIds = new HashSet<TechId>(); ISampleLister sampleLister = boFactory.createSampleLister(session); List<Sample> samples = sampleLister.list(new ListOrSearchSampleCriteria(TechId.asLongs(sampleIds))); @@ -187,15 +197,16 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO { experimentIds.add(new TechId(experiment)); } + Sample container = sample.getContainer(); + if (container != null) + { + + } } - Set<TechId> allSampleIds = trashSamples(trashManager, experimentIds, - sampleIds, CascadeSampleDependentComponents.TRUE, true); - assertSampleDeletionBusinessRules(experimentIds, allSampleIds); - trashSampleDependentDataSets(trashManager, allSampleIds); - trashManager.trash(); + return experimentIds; } - - private Set<TechId> trashSamples(TrashOperationsManager trashManager, Set<TechId> experimentIds, + + private Set<TechId> trashSamples(TrashOperationsManager trashManager, final List<TechId> sampleIds, final CascadeSampleDependentComponents cascadeType, boolean isOriginalDeletion) { assert deletion != null; @@ -205,7 +216,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO if (cascadeType == CascadeSampleDependentComponents.TRUE) { - allSampleIds.addAll(trashSampleDependentComponents(trashManager, experimentIds, sampleIds)); + allSampleIds.addAll(trashSampleDependentComponents(trashManager, sampleIds)); } return allSampleIds; } @@ -278,10 +289,10 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO if (nonDeletable > 0) { dataSetIds.removeAll(deletableOriginals); - throw new UserFailureException("The following related data sets couldn't be deleted " - + "because they are contained in data sets outside the deletion set: " - + Code.extractCodes(datasetLister.listByDatasetIds(TechId.asLongs(dataSetIds), - EnumSet.of(DataSetFetchOption.BASIC)))); +// throw new UserFailureException("The following related data sets couldn't be deleted " +// + "because they are contained in data sets outside the deletion set: " +// + Code.extractCodes(datasetLister.listByDatasetIds(TechId.asLongs(dataSetIds), +// EnumSet.of(DataSetFetchOption.BASIC)))); } trashManager.addTrashOperation(EntityKind.DATA_SET, allDeletables, false); } @@ -320,7 +331,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO } private Set<TechId> trashSampleDependentComponents(TrashOperationsManager trashManager, - Set<TechId> experimentIds, List<TechId> sampleIds) + List<TechId> sampleIds) { final ISampleDAO sampleDAO = getSampleDAO(); @@ -337,10 +348,11 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO BatchOperationExecutor.executeInBatches(batchOperation); // We have a business rule that there is just 1 level of components and using this here // improves performance. - return trashSamples(trashManager, experimentIds, batchOperation.getResults(), CascadeSampleDependentComponents.FALSE, false); + return trashSamples(trashManager, batchOperation.getResults(), CascadeSampleDependentComponents.FALSE, false); } - private void trashSampleDependentDataSets(TrashOperationsManager trashManager, Set<TechId> sampleIds) + private void trashSampleDependentDataSets(TrashOperationsManager trashManager, + Set<TechId> experimentsOfSamples, Set<TechId> sampleIds) { AbstractQueryBatchOperation batchOperation = new AbstractQueryBatchOperation(EntityKind.DATA_SET, new ArrayList<TechId>(sampleIds), @@ -355,7 +367,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO }; BatchOperationExecutor.executeInBatches(batchOperation); List<TechId> dataSetIds = batchOperation.getResults(); - assertDataSetDeletionBusinessRules(Collections.<TechId>emptySet(), sampleIds, dataSetIds); + assertDataSetDeletionBusinessRules(experimentsOfSamples, sampleIds, dataSetIds); trashDataSets(trashManager, dataSetIds, false, new DataSetFilter(sampleIds, new IIdHolderProvider() { @@ -381,7 +393,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO }; BatchOperationExecutor.executeInBatches(batchOperation); List<TechId> sampleIds = batchOperation.getResults(); - return trashSamples(trashManager, experimentIds, sampleIds, CascadeSampleDependentComponents.TRUE, false); + return trashSamples(trashManager, sampleIds, CascadeSampleDependentComponents.TRUE, false); } private void trashExperimentDependentDataSets(TrashOperationsManager trashManager, Set<TechId> experimentIds, @@ -411,10 +423,10 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO })); } - private void assertSampleDeletionBusinessRules(Set<TechId> experimentIds, Set<TechId> sampleIds) + private void assertSampleDeletionBusinessRules(Set<TechId> experimentIds, Set<TechId> originalSampleIds, Set<TechId> sampleIds) { Set<Long> eIds = new LinkedHashSet<Long>(TechId.asLongs(experimentIds)); - Set<Long> sIds = new LinkedHashSet<Long>(TechId.asLongs(sampleIds)); + Set<Long> sIds = new LinkedHashSet<Long>(TechId.asLongs(originalSampleIds)); ISampleLister sampleLister = boFactory.createSampleLister(session); List<Sample> samples = sampleLister.list(new ListOrSearchSampleCriteria(TechId.asLongs(sampleIds))); StringBuilder builder = new StringBuilder(); @@ -430,7 +442,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO { if (eIds.contains(experiment.getId()) == false) { - addTo(builder, "belongs to experiment", sample, experiment); + addTo(builder, "belongs to the experiment", sample, experiment); numberOfForeignSamples++; } } @@ -439,7 +451,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO { if (sIds.contains(container.getId()) == false) { - addTo(builder, "is a component of sample", sample, container); + addTo(builder, "is a component of the sample", sample, container); numberOfForeignSamples++; } } @@ -453,8 +465,9 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO private void addTo(StringBuilder builder, String entityDescription, Sample sample, IIdentifierHolder outsider) { builder.append("The sample " + sample.getIdentifier() + " " + entityDescription + " " - + outsider.getIdentifier() + " is outside the deletion set.\n"); + + outsider.getIdentifier() + " which is outside the deletion set.\n"); } + private void assertDataSetDeletionBusinessRules(Set<TechId> experimentIds, Set<TechId> sampleIdes, List<TechId> dataSetIds) { @@ -509,7 +522,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO { String findOriginalDataSet = findOriginalDataSet(containerIds, dataSet); builder.append("The data set " + findOriginalDataSet + " is a component of the data set " - + dataSet.getCode() + " which belongs to " + entityDescription + " outside the deletion set.\n"); + + dataSet.getCode() + " which belongs to the " + entityDescription + " which is outside the deletion set.\n"); } private String findOriginalDataSet(Map<Long, Set<Long>> relations, AbstractExternalData dataSet) @@ -620,6 +633,14 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO { return "trash"; } + + @Override + public String toString() + { + return getOperationName() + (isOriginalDeletion ? " original " : " dependent ") + entityKind + + " " + getEntityName() + " " + entityIds; + } + } private abstract static class AbstractQueryBatchOperation implements IBatchOperation<TechId> diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityDeletionTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityDeletionTest.java index 5e76e16e505afbea767f1ae98ac66ddb7666884e..2101db3b6b179b18718f3795a44e218d92868514 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityDeletionTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityDeletionTest.java @@ -83,6 +83,19 @@ public class EntityDeletionTest extends BaseTest assertUnmodifiedAndUndeleted(g); } + @Test + public final void testTrashExperimentWithSampleWhichIsAComponentOfASpaceSample() + { + EntityGraphGenerator g = parseAndCreateGraph("E1, samples: S2\n" + + "S1, components: S2\n"); + + failTrashExperiment(g.e(1), createExpectedErrorMessage(g.s(2), g.s(1))); + + assertEquals("E1, samples: S2\n" + + "S1, components: S2\n", renderGraph(g)); + assertUnmodifiedAndUndeleted(g); + } + @Test public final void testTrashExperimentWithSamplesAndDataSetsAndNoExternalLinks() { @@ -125,7 +138,7 @@ public class EntityDeletionTest extends BaseTest + "S1, data sets: DS1\n" + "DS1, components: DS2\n"); - failTrashExperiment(g.e(2), g.ds(2), g.ds(1), g.s(1)); + failTrashExperiment(g.e(2), createExpectedErrorMessage(g.ds(2), g.ds(1), g.s(1))); assertEquals("E1, samples: S1, data sets: DS1\n" + "E2, data sets: DS2\n" @@ -184,7 +197,7 @@ public class EntityDeletionTest extends BaseTest + "DS2, components: DS3\n" ); - failTrashExperiment(g.e(1), g.ds(2), g.ds(1), g.e(2)); + failTrashExperiment(g.e(1), createExpectedErrorMessage(g.ds(2), g.ds(1), g.e(2))); assertEquals("E1, samples: S1, data sets: DS2 DS3\n" + "E2, data sets: DS1\n" @@ -249,6 +262,19 @@ public class EntityDeletionTest extends BaseTest assertUnmodifiedAndUndeleted(g); } + @Test + public final void testTrashComponentSample() + { + EntityGraphGenerator g = parseAndCreateGraph("S1, components: S2\n"); + + deleteSamples(g.s(2)); + + assertEquals("", renderGraph(g)); + assertDeleted(g.s(2)); + assertModified(g.s(1)); + assertUnmodifiedAndUndeleted(g); + } + @Test public final void testTrashSampleWithAComponentWithAContainerDataSetWithAComponentDataSetOfFirstSample() { @@ -286,7 +312,7 @@ public class EntityDeletionTest extends BaseTest + "S1, components: S2\n" + "S2, data sets: DS1\n"); - failTrashSample(g.s(1), g.s(2), g.e(1)); + failTrashSample(g.s(1), createExpectedErrorMessage(g.s(2), g.e(1))); assertEquals("E1, samples: S2, data sets: DS1\n" + "S1, components: S2\n" @@ -309,6 +335,21 @@ public class EntityDeletionTest extends BaseTest assertUnmodifiedAndUndeleted(g); } + @Test + public final void testTrashExperimentSampleWhichIsAComponentOfASpaceSample() + { + EntityGraphGenerator g = parseAndCreateGraph("E1, samples: S2\n" + + "S1, components: S2\n"); + + deleteSamples(g.s(2)); + + assertEquals("", renderGraph(g)); + assertModified(g.e(1)); + assertModified(g.s(1)); + assertDeleted(g.s(2)); + assertUnmodifiedAndUndeleted(g); + } + @Test public final void testTrashSampleWithComponentWithDataSetWithComponentOfAnotherSample() { @@ -317,7 +358,7 @@ public class EntityDeletionTest extends BaseTest + "S3, data sets: DS1[NECT]\n" + "DS1[NECT], components: DS2[NET]\n"); - failTrashSample(g.s(1), g.ds(2), g.ds(1), g.s(3)); + failTrashSample(g.s(1), createExpectedErrorMessage(g.ds(2), g.ds(1), g.s(3))); assertEquals("S1, components: S2\n" + "S2, data sets: DS2[NET]\n" @@ -334,7 +375,7 @@ public class EntityDeletionTest extends BaseTest + "S2, data sets: DS2[NET]\n" + "DS1, components: DS2[NET]\n"); - failTrashSample(g.s(1), g.ds(2), g.ds(1), g.e(1)); + failTrashSample(g.s(1), createExpectedErrorMessage(g.ds(2), g.ds(1), g.e(1))); assertEquals("E1, data sets: DS1\n" + "S1, components: S2\n" @@ -352,7 +393,7 @@ public class EntityDeletionTest extends BaseTest + "DS2[NECT], components: DS4[NECT]\n" + "DS4[NECT], components: DS5[NET] DS6[NET]\n"); - failTrashSample(g.s(1), g.ds(4), g.ds(2), g.s(2)); + failTrashSample(g.s(1), createExpectedErrorMessage(g.ds(4), g.ds(2), g.s(2))); assertEquals("S1, data sets: DS1[NECT] DS3[NET] DS4[NECT] DS5[NET] DS6[NET]\n" + "S2, data sets: DS2[NECT]\n" @@ -392,6 +433,38 @@ public class EntityDeletionTest extends BaseTest assertUnmodifiedAndUndeleted(g); } + @Test + public final void testTrashDataSetOfAContainerWhichBelongingToSameExperiment() + { + EntityGraphGenerator g = parseAndCreateGraph("E1, data sets: DS1 DS2\n" + + "DS1, components: DS2\n"); + + deleteDataSets(g.ds(2)); + + assertEquals("E1, data sets: DS1\n", renderGraph(g)); + assertModified(g.e(1)); + assertModified(g.ds(1)); + assertDeleted(g.ds(2)); + assertUnmodifiedAndUndeleted(g); + } + + @Test + public final void testTrashDataSetOfAContainerWhichBelongingToSameExperimentButDifferentSample() + { + EntityGraphGenerator g = parseAndCreateGraph("E1, samples: S1, data sets: DS1 DS2\n" + + "S1, data sets: DS2\n" + + "DS1, components: DS2\n"); + + deleteDataSets(g.ds(2)); + + assertEquals("E1, samples: S1, data sets: DS1\n", renderGraph(g)); + assertModified(g.e(1)); + assertModified(g.s(1)); + assertModified(g.ds(1)); + assertDeleted(g.ds(2)); + assertUnmodifiedAndUndeleted(g); + } + @Test public void testTrashDataSetsWithDataSetInAContainer() { @@ -426,8 +499,7 @@ public class EntityDeletionTest extends BaseTest assertUnmodifiedAndUndeleted(g); } - private void failTrashExperiment(ExperimentNode experimentNode, DataSetNode originalDataSet, - DataSetNode relatedDataSet, EntityNode outsiderNode) + private void failTrashExperiment(ExperimentNode experimentNode, String expectedErrorMessage) { try { @@ -435,11 +507,12 @@ public class EntityDeletionTest extends BaseTest fail("UserFailureException expected"); } catch (UserFailureException ex) { - assertExceptionMessage(originalDataSet, relatedDataSet, outsiderNode, ex); + assertEquals(expectedErrorMessage, + ex.getMessage()); } } - private void failTrashSample(SampleNode sampleNode, SampleNode relatedSample, EntityNode outsiderNode) + private void failTrashSample(SampleNode sampleNode, String expectedErrorMessage) { try { @@ -447,50 +520,28 @@ public class EntityDeletionTest extends BaseTest fail("UserFailureException expected"); } catch (UserFailureException ex) { - assertEquals("The sample " + entityGraphManager.getSample(relatedSample).getIdentifier() - + " belongs to " + renderOutsider(outsiderNode) + " is outside the deletion set.", - ex.getMessage()); - } - } - - private void failTrashSample(SampleNode sampleNode, DataSetNode originalDataSet, - DataSetNode relatedDataSet, EntityNode outsiderNode) - { - try - { - deleteSamples(sampleNode); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertExceptionMessage(originalDataSet, relatedDataSet, outsiderNode, ex); + assertEquals(expectedErrorMessage, ex.getMessage()); } } - private void assertExceptionMessage(DataSetNode originalDataSet, DataSetNode relatedDataSet, - EntityNode outsiderNode, UserFailureException ex) + private String render(EntityNode entityNode) { - assertEquals("The data set " + entityGraphManager.getDataSetCodeOrNull(originalDataSet) - + " is a component of the data set " + entityGraphManager.getDataSetCodeOrNull(relatedDataSet) - + " which belongs to " + renderOutsider(outsiderNode) + " outside the deletion set.", - ex.getMessage()); - } - - private String renderOutsider(EntityNode outsiderNode) - { - String outsiderType; - String outsiderIdentifier; - if (outsiderNode instanceof ExperimentNode) + String type; + String identifier; + if (entityNode instanceof ExperimentNode) + { + type = "experiment"; + identifier = entityGraphManager.getExperimentIdentifierOrNull((ExperimentNode) entityNode); + } else if (entityNode instanceof SampleNode) { - outsiderType = "experiment"; - outsiderIdentifier = entityGraphManager.getExperimentIdentifierOrNull((ExperimentNode) outsiderNode); + type = "sample"; + identifier = entityGraphManager.getSample((SampleNode) entityNode).getIdentifier(); } else { - outsiderType = "sample"; - outsiderIdentifier = entityGraphManager.getSample((SampleNode) outsiderNode).getIdentifier(); + type = "data set"; + identifier = entityGraphManager.getDataSetCodeOrNull((DataSetNode) entityNode); } - String outsider = outsiderType + " " - + outsiderIdentifier; - return outsider; + return type + " " + identifier; } private void deleteExperiments(ExperimentNode...experimentNodes) @@ -528,6 +579,23 @@ public class EntityDeletionTest extends BaseTest return create(aSession().withInstanceRole(RoleCode.ADMIN)); } + protected String createExpectedErrorMessage(SampleNode relatedSample, EntityNode outsiderNode) + { + String relation = outsiderNode instanceof ExperimentNode ? "belongs to" : "is a component of"; + return "The sample " + entityGraphManager.getSample(relatedSample).getIdentifier() + + " " + relation + " the " + render(outsiderNode) + " which is outside the deletion set."; + } + + protected String createExpectedErrorMessage(EntityNode originalNode, EntityNode relatedEntity, EntityNode outsiderNode) + { + return "The " + render(originalNode) + + " is a component of the " + render(relatedEntity) + + " which belongs to the " + render(outsiderNode) + " which is outside the deletion set."; + } + + /** + * Trashes specified experiments for specified user session token. + */ protected void deleteExperiments(List<String> experimentIdentifiers, String userSessionToken) { List<ExperimentIdentifier> identifiers = new ArrayList<ExperimentIdentifier>(); @@ -539,12 +607,18 @@ public class EntityDeletionTest extends BaseTest commonServer.deleteExperiments(userSessionToken, experimentIds, "test", DeletionType.TRASH); } + /** + * Trashes specified samples for specified user session token. + */ protected void deleteSamples(List<String> samplePermIds, String userSessionToken) { Sample[] samples = loadSamples(samplePermIds); commonServer.deleteSamples(userSessionToken, TechId.createList(Arrays.asList(samples)), "test", DeletionType.TRASH); } + /** + * Trashes specified data sets for specified user session token. + */ protected void deleteDataSets(List<String> dataSetCodes, String userSessionToken) { commonServer.deleteDataSets(userSessionToken, dataSetCodes, "test", DeletionType.TRASH, true); diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadOptimisticLockingTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadOptimisticLockingTestCase.java index 61f123f205c186a1978b5c5e08f408a84059ec47..1c8c6c618e451163f47e13f42c296ad1760bbb85 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadOptimisticLockingTestCase.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadOptimisticLockingTestCase.java @@ -16,6 +16,8 @@ package ch.systemsx.cisd.openbis.systemtest.optimistic_locking; +import java.lang.reflect.Method; + import org.springframework.transaction.annotation.Transactional; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; @@ -40,8 +42,15 @@ public class MultiThreadOptimisticLockingTestCase extends PersistentSystemTestCa } @AfterMethod - public void deleteSpaces() + public void deleteSpaces(Method m) { - toolBox.deleteSpaces(); + try + { + toolBox.deleteSpaces(); + } catch (Throwable t) + { + throw new Error(m.getName() + "() : ", t); + } } + } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java index 98764816a85488f952e55e0524df44d2e6c177ca..4a0b2af29db2ccc3abb94033928ac9008d61f79c 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java @@ -22,7 +22,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; import ch.systemsx.cisd.common.shared.basic.string.CommaSeparatedListBuilder; import ch.systemsx.cisd.openbis.generic.server.util.TimeIntervalChecker; @@ -37,6 +39,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Grantee; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; @@ -65,6 +68,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifi import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifierFactory; import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer; @@ -145,8 +149,9 @@ public class ToolBox private void deleteSpace(Space space) { - trashExperiments(space); + trashDataSets(space); trashSamples(space); + trashExperiments(space); emptyTrashCan(); deleteProjects(space); commonServer.deleteSpaces(systemSessionToken, Arrays.asList(new TechId(space.getId())), @@ -174,6 +179,50 @@ public class ToolBox } private void trashSamples(Space space) + { + List<TechId> sampleIds = listSampleIds(space); + commonServer.deleteSamples(systemSessionToken, sampleIds, "cleanup", + DeletionType.TRASH); + } + + private void trashExperiments(Space space) + { + commonServer.deleteExperiments(systemSessionToken, listExperimentIds(space), + "cleanup", DeletionType.TRASH); + } + + private void trashDataSets(Space space) + { + Set<String> codes = new HashSet<String>(); + for (TechId id : listExperimentIds(space)) + { + List<AbstractExternalData> dataSets = etlService.listDataSetsByExperimentID(systemSessionToken, id); + for (AbstractExternalData dataSet : dataSets) + { + codes.add(dataSet.getCode()); + } + } + List<TechId> sampleIds = listSampleIds(space); + for (TechId id : sampleIds) + { + List<AbstractExternalData> dataSets = etlService.listDataSetsBySampleID(systemSessionToken, id, true); + for (AbstractExternalData dataSet : dataSets) + { + codes.add(dataSet.getCode()); + } + } + List<String> dataSetCodes = new ArrayList<String>(codes); + commonServer.deleteDataSets(systemSessionToken, dataSetCodes, "cleanup", DeletionType.TRASH, true); + } + + private List<TechId> listExperimentIds(Space space) + { + ExperimentType experimentType = new ExperimentTypeBuilder().code(EXPERIMENT_TYPE_CODE).getExperimentType(); + SpaceIdentifier spaceIdentifier = new SpaceIdentifierFactory(space.getIdentifier()).createIdentifier(); + return TechId.createList(commonServer.listExperiments(systemSessionToken, experimentType, spaceIdentifier)); + } + + private List<TechId> listSampleIds(Space space) { ListSampleCriteria criteria = new ListSampleCriteria(); criteria.setSampleType(SampleType.createAllSampleType(Collections.<SampleType> emptyList(), @@ -182,19 +231,7 @@ public class ToolBox criteria.setIncludeSpace(true); criteria.setIncludeInstance(false); criteria.setExcludeWithoutExperiment(false); - List<Sample> samples = commonServer.listSamples(systemSessionToken, criteria); - commonServer.deleteSamples(systemSessionToken, TechId.createList(samples), "cleanup", - DeletionType.TRASH); - } - - private void trashExperiments(Space space) - { - List<Experiment> experiments = - commonServer.listExperiments(systemSessionToken, - new ExperimentTypeBuilder().code(EXPERIMENT_TYPE_CODE).getExperimentType(), - new SpaceIdentifierFactory(space.getIdentifier()).createIdentifier()); - commonServer.deleteExperiments(systemSessionToken, TechId.createList(experiments), - "cleanup", DeletionType.TRASH); + return TechId.createList(commonServer.listSamples(systemSessionToken, criteria)); } public void createInstanceAdmin(String userId)