From 1709f6c61c05efeba281e3c354326538d0e1d92c Mon Sep 17 00:00:00 2001
From: jakubs <jakubs>
Date: Mon, 3 Nov 2014 16:52:09 +0000
Subject: [PATCH] SSDM-1081 refactor unarchiving to use share finder.

SVN: 32712
---
 .../AbstractArchiverProcessingPlugin.java     |  2 +-
 .../IMultiDataSetFileOperationsManager.java   |  3 +
 .../MultiDataSetArchiverShareFinder.java      | 57 +++++++++++++++++++
 .../MultiDataSetFileOperationsManager.java    | 12 ++--
 .../archiver/MultiDatasetArchiver.java        | 45 ++++++---------
 .../archiver/MultiDatasetArchiverTest.java    |  2 -
 6 files changed, 86 insertions(+), 35 deletions(-)
 create mode 100644 datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverShareFinder.java

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 57b3b504399..73d10113f36 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 f42e6743161..4c5302b0833 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 00000000000..6bf6ed7b4e2
--- /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 f86b35a62b3..51f8311fadd 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 11fcd67a9b0..b4134f3fe8c 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 5cdbc941cf5..213155e3822 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();
-- 
GitLab