diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java index 57b3b504399a48d573854cfa90b6d3f056626e40..73d10113f360b1419ea7f4713469f3a5f67f9498 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java @@ -653,7 +653,7 @@ public abstract class AbstractArchiverProcessingPlugin extends AbstractDatastore return tempFolder; } - private IShareFinder getShareFinder() + protected IShareFinder getShareFinder() { Properties props = PropertyParametersUtil.extractSingleSectionProperties(properties, SHARE_FINDER_KEY, diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/IMultiDataSetFileOperationsManager.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/IMultiDataSetFileOperationsManager.java index f42e67431610241b8821cbe9bfe97d5436658471..4c5302b0833df1c1bfb91f384cbd9e0c90029f9b 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/IMultiDataSetFileOperationsManager.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/IMultiDataSetFileOperationsManager.java @@ -20,6 +20,7 @@ import java.util.List; import ch.systemsx.cisd.common.exceptions.Status; import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContent; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation; import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; /** @@ -42,4 +43,6 @@ public interface IMultiDataSetFileOperationsManager */ IHierarchicalContent getContainerAsHierarchicalContent(String containerPath); + Status restoreDataSetsFromContainerInFinalDestination(String containerPath, + List<? extends IDatasetLocation> dataSetLocations); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverShareFinder.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverShareFinder.java new file mode 100644 index 0000000000000000000000000000000000000000..6bf6ed7b4e202940b1618ca8d438a8e367252dab --- /dev/null +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverShareFinder.java @@ -0,0 +1,57 @@ +/* + * Copyright 2014 ETH Zuerich, CISD + * + * 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.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver; + +import java.util.List; + +import ch.systemsx.cisd.openbis.dss.generic.shared.IShareFinder; +import ch.systemsx.cisd.openbis.dss.generic.shared.utils.Share; +import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO; + +/** + * @author Jakub Straszewski + */ +public class MultiDataSetArchiverShareFinder implements IShareFinder +{ + private Share share; + + public MultiDataSetArchiverShareFinder() + { + } + + @Override + public Share tryToFindShare(SimpleDataSetInformationDTO dataSet, List<Share> shares) + { + if (share == null) + { + share = tryToFindShare(shares); + } + return share; + } + + public Share tryToFindShare(List<Share> shares) + { + for (Share sh : shares) + { + if (sh.isUnarchivingScratchShare()) + { + return sh; + } + } + throw new IllegalArgumentException("Could not find proper share"); + } +} diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetFileOperationsManager.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetFileOperationsManager.java index f86b35a62b393a7fff726c30b4d86c0739ac8a19..51f8311faddbb11d87c39e1a83412693ea58f84b 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetFileOperationsManager.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetFileOperationsManager.java @@ -44,6 +44,7 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.IPathCopierF import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.ISshCommandExecutorFactory; import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation; import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; /** @@ -141,14 +142,15 @@ public class MultiDataSetFileOperationsManager extends AbstractDataSetFileOperat return success ? Status.OK : Status.createError("Couldn't delete archive container '" + containerPath); } - public Status restoreDataSetsFromContainerInFinalDestination(String containerPath, String unarchivingShareId, - List<DatasetDescription> dataSetDescriptions) + @Override + public Status restoreDataSetsFromContainerInFinalDestination(String containerPath, + List<? extends IDatasetLocation> dataSetLocations) { HashMap<String, File> dataSetToLocation = new HashMap<String, File>(); - for (DatasetDescription datasetDescription : dataSetDescriptions) + for (IDatasetLocation dataSetLocation : dataSetLocations) { - File location = getDirectoryProvider().getDataSetDirectory(unarchivingShareId, datasetDescription.getDataSetLocation()); - dataSetToLocation.put(datasetDescription.getDataSetCode(), location); + File location = getDirectoryProvider().getDataSetDirectory(dataSetLocation); + dataSetToLocation.put(dataSetLocation.getDataSetCode(), location); } File stageArchiveContainerFile = new File(getFinalArchive().getDestination(), containerPath); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDatasetArchiver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDatasetArchiver.java index 11fcd67a9b04555c62d8aea9ffac861e66d96d94..b4134f3fe8c43f0ad6685aa1632bdd388e903bb1 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDatasetArchiver.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDatasetArchiver.java @@ -43,6 +43,7 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.dat import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.dataaccess.MultiDatasetArchiverDBTransaction; import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.dataaccess.MultiDatasetArchiverDataSourceUtil; import ch.systemsx.cisd.openbis.dss.generic.shared.ArchiverTaskContext; +import ch.systemsx.cisd.openbis.dss.generic.shared.IShareFinder; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet; @@ -88,13 +89,9 @@ public class MultiDatasetArchiver extends AbstractArchiverProcessingPlugin public static final Long DEFAULT_MAXIMUM_CONTAINER_SIZE_IN_BYTES = 80L * 1024 * 1024 * 1024; - private IMultiDatasetArchiverDBTransaction transaction; + private transient IMultiDatasetArchiverDBTransaction transaction; - private IMultiDataSetArchiverReadonlyQueryDAO readonlyQuery; - - public static final String UNARCHIVING_SHARE_ID = "unarchiving-share-id"; - - private final String unarchivingShareId; + private transient IMultiDataSetArchiverReadonlyQueryDAO readonlyQuery; public MultiDatasetArchiver(Properties properties, File storeRoot) { @@ -102,7 +99,6 @@ public class MultiDatasetArchiver extends AbstractArchiverProcessingPlugin this.minimumContainerSize = PropertyUtils.getLong(properties, MINIMUM_CONTAINER_SIZE_IN_BYTES, DEFAULT_MINIMUM_CONTAINER_SIZE_IN_BYTES); this.maximumContainerSize = PropertyUtils.getLong(properties, MAXIMUM_CONTAINER_SIZE_IN_BYTES, DEFAULT_MAXIMUM_CONTAINER_SIZE_IN_BYTES); this.fileOperationsFactory = new FileOperationsManagerFactory(properties); - this.unarchivingShareId = PropertyUtils.getMandatoryProperty(properties, UNARCHIVING_SHARE_ID); } @Override @@ -329,40 +325,35 @@ public class MultiDatasetArchiver extends AbstractArchiverProcessingPlugin } @Override - protected DatasetProcessingStatuses doUnarchive(List<DatasetDescription> parameterDataSets, ArchiverTaskContext context) + protected IShareFinder getShareFinder() { - List<String> dataSetCodes = translateToDataSetCodes(parameterDataSets); - long containerId = assertAllDataSetsInTheSameContainer(dataSetCodes); - List<PhysicalDataSet> dataSets = translateToPhysicalDataSets(dataSetCodes); - assertNoAvailableDatasets(dataSets); + return new MultiDataSetArchiverShareFinder(); + } - for (PhysicalDataSet physicalDataSet : dataSets) + @Override + protected DatasetProcessingStatuses doUnarchive(List<DatasetDescription> parameterDataSets, ArchiverTaskContext context) + { + for (DatasetDescription dataSet : parameterDataSets) { - String dataSetCode = physicalDataSet.getCode(); - - String shareId = getShareIdManager().getShareId(dataSetCode); - if (shareId.equals(unarchivingShareId) == false) - { - getService().updateShareIdAndSize(dataSetCode, unarchivingShareId, physicalDataSet.getSize()); - getShareIdManager().setShareId(dataSetCode, unarchivingShareId); - } - + context.getUnarchivingPreparation().prepareForUnarchiving(dataSet); } - MultiDataSetArchiverContainerDTO container = getReadonlyQuery().getContainerForId(containerId); + List<String> dataSetCodes = translateToDataSetCodes(parameterDataSets); + long containerId = assertAllDataSetsInTheSameContainer(dataSetCodes); + assertNoAvailableDatasets(dataSetCodes); - ((MultiDataSetFileOperationsManager) getFileOperations()).restoreDataSetsFromContainerInFinalDestination( - container.getPath(), + MultiDataSetArchiverContainerDTO container = getReadonlyQuery().getContainerForId(containerId); - unarchivingShareId, parameterDataSets); + getFileOperations().restoreDataSetsFromContainerInFinalDestination(container.getPath(), parameterDataSets); DatasetProcessingStatuses result = new DatasetProcessingStatuses(); result.addResult(parameterDataSets, Status.OK, Operation.UNARCHIVE); return result; } - private void assertNoAvailableDatasets(List<PhysicalDataSet> dataSets) + private void assertNoAvailableDatasets(List<String> dataSetCodes) { + List<PhysicalDataSet> dataSets = translateToPhysicalDataSets(dataSetCodes); for (PhysicalDataSet physicalDataSet : dataSets) { if (physicalDataSet.isAvailable()) diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDatasetArchiverTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDatasetArchiverTest.java index 5cdbc941cf584cdf2173c9ef8d41c6b9ee2fcab8..213155e3822902702859bbd806267acb6df87df1 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDatasetArchiverTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDatasetArchiverTest.java @@ -20,7 +20,6 @@ import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archi import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDataSetFileOperationsManager.STAGING_DESTINATION_KEY; import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDatasetArchiver.MAXIMUM_CONTAINER_SIZE_IN_BYTES; import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDatasetArchiver.MINIMUM_CONTAINER_SIZE_IN_BYTES; -import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDatasetArchiver.UNARCHIVING_SHARE_ID; import java.io.BufferedReader; import java.io.File; @@ -320,7 +319,6 @@ public class MultiDatasetArchiverTest extends AbstractFileSystemTestCase properties = new Properties(); properties.setProperty(STAGING_DESTINATION_KEY, staging.getAbsolutePath()); properties.setProperty(FINAL_DESTINATION_KEY, archive.getAbsolutePath()); - properties.setProperty(UNARCHIVING_SHARE_ID, "2"); directoryProvider = new MockDataSetDirectoryProvider(store, share.getName(), shareIdManager); archiverContext = new ArchiverTaskContext(directoryProvider, hierarchicalContentProvider); experiment = new ExperimentBuilder().identifier(EXPERIMENT_IDENTIFIER).type("MET").getExperiment();