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 aa8cf903755b9be9900a414bee49d8d65a21f784..c363f25562baa512f17efe396bc0c8ce283992f1 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 @@ -49,11 +49,11 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; 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; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE; import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE; import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE; import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; @@ -117,7 +117,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO IDatasetLister datasetLister = boFactory.createDatasetLister(session); final Set<TechId> experimentIds = new HashSet<TechId>(); final Set<TechId> sampleIds = new HashSet<TechId>(); - for (AbstractExternalData dataSet : datasetLister.listByDatasetIds(TechId.asLongs(dataSetIds), DATA_SET_FETCH_OPTIONS)) + for (AbstractExternalData dataSet : listDataSets(datasetLister, dataSetIds)) { Sample sample = dataSet.getSample(); if (sample != null) @@ -134,13 +134,13 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO trashDataSets(trashManager, dataSetIds, true, new IDataSetFilter() { @Override - public List<TechId> filter(List<DataPE> dataSets) + public List<TechId> filter(List<AbstractExternalData> dataSets) { List<TechId> filtered = new ArrayList<TechId>(); - for (DataPE dataSet : dataSets) + for (AbstractExternalData dataSet : dataSets) { - SamplePE sample = dataSet.tryGetSample(); - ExperimentPE experiment = dataSet.getExperiment(); + Sample sample = dataSet.getSample(); + Experiment experiment = dataSet.getExperiment(); if (contains(sampleIds, sample) || contains(experimentIds, experiment)) { filtered.add(new TechId(dataSet)); @@ -215,12 +215,12 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO private static interface IDataSetFilter { - public List<TechId> filter(List<DataPE> dataSets); + public List<TechId> filter(List<AbstractExternalData> dataSets); } private static interface IIdHolderProvider { - public IIdHolder getIdHolder(DataPE dataSet); + public IIdHolder getIdHolder(AbstractExternalData dataSet); } private static final class DataSetFilter implements IDataSetFilter @@ -234,10 +234,10 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO } @Override - public List<TechId> filter(List<DataPE> dataSets) + public List<TechId> filter(List<AbstractExternalData> dataSets) { List<TechId> deletableDataSets = new ArrayList<TechId>(); - for (DataPE dataSet : dataSets) + for (AbstractExternalData dataSet : dataSets) { IIdHolder entity = idHolderProvider.getIdHolder(dataSet); if (entity != null && ids.contains(entity.getId())) @@ -261,12 +261,11 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO IDatasetLister datasetLister = boFactory.createDatasetLister(session); List<TechId> allDeletables = DataSetUtils.getAllDeletableComponentsRecursively(dataSetIds, isOriginalDeletion, datasetLister, this); - IDataSetTable dataSetTable = boFactory.createDataSetTable(session); - dataSetTable.loadByIds(allDeletables); - checkForNonDeletableDataSets(dataSetTable.getNonDeletableExternalDataSets()); + List<AbstractExternalData> dataSets = listDataSets(datasetLister, allDeletables); + checkForNonDeletableDataSets(dataSets); if (filterOrNull != null) { - allDeletables = filterOrNull.filter(dataSetTable.getDataSets()); + allDeletables = filterOrNull.filter(dataSets); } List<TechId> deletableOriginals = new ArrayList<TechId>(dataSetIds); deletableOriginals.retainAll(allDeletables); @@ -278,24 +277,28 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO trashManager.addTrashOperation(EntityKind.DATA_SET, allDeletables, false); } - private void checkForNonDeletableDataSets(List<ExternalDataPE> unavailableDataSets) + private void checkForNonDeletableDataSets(List<AbstractExternalData> dataSets) { - if (unavailableDataSets.isEmpty()) - { - return; - } Map<DataSetArchivingStatus, List<String>> statusToCodesMap = new TreeMap<DataSetArchivingStatus, List<String>>(); - for (ExternalDataPE dataSet : unavailableDataSets) + for (AbstractExternalData dataSet : dataSets) { - final DataSetArchivingStatus status = dataSet.getStatus(); - List<String> codes = statusToCodesMap.get(status); - if (codes == null) + if (dataSet instanceof PhysicalDataSet) { - codes = new ArrayList<String>(); - statusToCodesMap.put(status, codes); + PhysicalDataSet physicalDataSet = (PhysicalDataSet) dataSet; + DataSetArchivingStatus archivingStatus = physicalDataSet.getStatus(); + if (archivingStatus.isDeletable() == false) + { + List<String> codes = statusToCodesMap.get(archivingStatus); + if (codes == null) + { + codes = new ArrayList<String>(); + statusToCodesMap.put(archivingStatus, codes); + } + codes.add(dataSet.getCode()); + + } } - codes.add(dataSet.getCode()); } StringBuilder builder = new StringBuilder(); @@ -305,9 +308,12 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO builder.append("\n Status: ").append(entry.getKey()).append(", data sets: "); builder.append(entry.getValue()); } - throw new UserFailureException( - "Deletion not possible because the following data sets are not deletable:" - + builder); + if (builder.length() > 0) + { + throw new UserFailureException( + "Deletion not possible because the following data sets are not deletable:" + + builder); + } } private Set<TechId> trashSampleDependentComponents(TrashOperationsManager trashManager, @@ -352,9 +358,9 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO new IIdHolderProvider() { @Override - public IIdHolder getIdHolder(DataPE dataSet) + public IIdHolder getIdHolder(AbstractExternalData dataSet) { - return dataSet.tryGetSample(); + return dataSet.getSample(); } })); } @@ -396,7 +402,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO new IIdHolderProvider() { @Override - public IIdHolder getIdHolder(DataPE dataSet) + public IIdHolder getIdHolder(AbstractExternalData dataSet) { return dataSet.getExperiment(); } @@ -416,8 +422,8 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO addIds(allRelatedDataSets, containerIds); Set<Long> eIds = new LinkedHashSet<Long>(TechId.asLongs(experimentIds)); Set<Long> sIds = new LinkedHashSet<Long>(TechId.asLongs(sampleIdes)); - List<AbstractExternalData> relatedDataSets - = datasetLister.listByDatasetIds(new ArrayList<Long>(allRelatedDataSets), DATA_SET_FETCH_OPTIONS); + List<Long> ids = new ArrayList<Long>(allRelatedDataSets); + List<AbstractExternalData> relatedDataSets = listDataSets(datasetLister, TechId.createList(ids)); StringBuilder builder = new StringBuilder(); int numberOfForeignDataSets = 0; for (AbstractExternalData relatedDataSet : relatedDataSets) @@ -481,6 +487,11 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO } } + private List<AbstractExternalData> listDataSets(IDatasetLister datasetLister, List<TechId> dataSetIds) + { + return datasetLister.listByDatasetIds(TechId.asLongs(dataSetIds), DATA_SET_FETCH_OPTIONS); + } + @Override public void revertDeletion(TechId deletionId) { diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/entitygraph/Utils.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/entitygraph/Utils.java index 461510f48bc32610fd5047e7ff3817fcb6752c9a..09b425c71eea67bd3389a2560fb3c88ad54949a1 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/entitygraph/Utils.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/entitygraph/Utils.java @@ -102,6 +102,7 @@ public class Utils Long id = dataSetNode.getId(); data.setId(id); data.setCode(dataSetNode.getCode()); + data.setStatus(dataSetNode.isDeletable() ? DataSetArchivingStatus.AVAILABLE : DataSetArchivingStatus.ARCHIVE_PENDING); ExperimentNode experimentNode; SampleNode sampleNode = dataSetNode.getSample(); if (sampleNode != null)