From df73abb814422cd9b83d6995cde2a67d55615ded Mon Sep 17 00:00:00 2001
From: jakubs <jakubs>
Date: Wed, 27 Jun 2012 12:13:30 +0000
Subject: [PATCH] SP-169 BIS-90 refactoring of recovery storage algorithms

SVN: 25895
---
 ...aSetStoragePrecommitRecoveryAlgorithm.java | 53 ++++++-------------
 .../DataSetStorageRecoveryAlgorithm.java      | 53 +++++++++++++++++--
 ...DataSetStorageStoredRecoveryAlgorithm.java | 46 ++++++----------
 ...aSetStorageRecoveryAlgorithmWithState.java | 36 +++++++++++++
 4 files changed, 115 insertions(+), 73 deletions(-)
 create mode 100644 datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/IDataSetStorageRecoveryAlgorithmWithState.java

diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStoragePrecommitRecoveryAlgorithm.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStoragePrecommitRecoveryAlgorithm.java
index 5f23841b9a1..63a70f7323b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStoragePrecommitRecoveryAlgorithm.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStoragePrecommitRecoveryAlgorithm.java
@@ -26,16 +26,16 @@ import ch.systemsx.cisd.etlserver.IDataStoreStrategy;
 import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional;
 import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional.IStorageProcessorTransaction;
 import ch.systemsx.cisd.etlserver.registrator.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState;
-import ch.systemsx.cisd.etlserver.registrator.AbstractNoFileDataSetStorageAlgorithm;
 import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithm;
 import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithm.DataSetStoragePaths;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind;
 
 /**
  * @author jakubs
  */
 public class DataSetStoragePrecommitRecoveryAlgorithm<T extends DataSetInformation> implements
-        Serializable
+        Serializable, IDataSetStorageRecoveryAlgorithmWithState<T>
 {
 
     private static final long serialVersionUID = 1L;
@@ -46,29 +46,17 @@ public class DataSetStoragePrecommitRecoveryAlgorithm<T extends DataSetInformati
 
     private final File markerFile;
 
-    private boolean isContainer;
-
-    /**
-     * simplified constructor for container algorithm
-     * 
-     * @param dataSetInformation
-     * @param dataStoreStrategyKey
-     * @param incomingDataSetFile
-     * @param stagingDirectory
-     * @param preCommitDirectory
-     * @param dataStoreCode
-     */
     public DataSetStoragePrecommitRecoveryAlgorithm(T dataSetInformation,
             DataStoreStrategyKey dataStoreStrategyKey, File incomingDataSetFile,
-            File stagingDirectory, File preCommitDirectory, String dataStoreCode)
+            File stagingDirectory, File preCommitDirectory, String dataStoreCode,
+            DataSetKind dataSetKind)
     {
         this.recoveryAlgorithm =
                 new DataSetStorageRecoveryAlgorithm<T>(dataSetInformation, dataStoreStrategyKey,
                         incomingDataSetFile, stagingDirectory, preCommitDirectory, dataStoreCode,
-                        null);
+                        null, dataSetKind);
         this.markerFile = null;
         this.transaction = null;
-        this.isContainer = true;
     }
 
     public DataSetStoragePrecommitRecoveryAlgorithm(T dataSetInformation,
@@ -80,33 +68,15 @@ public class DataSetStoragePrecommitRecoveryAlgorithm<T extends DataSetInformati
         this.recoveryAlgorithm =
                 new DataSetStorageRecoveryAlgorithm<T>(dataSetInformation, dataStoreStrategyKey,
                         incomingDataSetFile, stagingDirectory, preCommitDirectory, dataStoreCode,
-                        dataSetStoragePaths);
+                        dataSetStoragePaths, DataSetKind.EXTERNAL);
         this.transaction = transaction;
         this.markerFile = markerFile;
-        this.isContainer = false;
     }
 
     public DataSetStorageAlgorithm<T> recoverDataSetStorageAlgorithm(
             OmniscientTopLevelDataSetRegistratorState state)
     {
-        IDataStoreStrategy dataStoreStrategy =
-                state.getDataStrategyStore().getDataStoreStrategy(
-                        recoveryAlgorithm.getDataStoreStrategyKey());
-
-        IMailClient mailClient = state.getGlobalState().getMailClient();
-        IFileOperations fileOperations = state.getFileOperations();
-
-        IStorageProcessorTransactional storageProcessor = state.getStorageProcessor();
-
-        if (isContainer)
-        {
-            return new AbstractNoFileDataSetStorageAlgorithm<T>(dataStoreStrategy, storageProcessor,
-                    fileOperations, mailClient, recoveryAlgorithm);
-        } else
-        {
-            return new DataSetStorageAlgorithm<T>(dataStoreStrategy, storageProcessor,
-                    fileOperations, mailClient, this);
-        }
+        return recoveryAlgorithm.recoverDataSetStorageAlgorithm(state, this);
     }
 
     public IStorageProcessorTransaction getTransaction()
@@ -188,4 +158,13 @@ public class DataSetStoragePrecommitRecoveryAlgorithm<T extends DataSetInformati
         return recoveryAlgorithm;
     }
 
+    @Override
+    public DataSetStorageAlgorithm<T> createExternalDataSetStorageAlgorithm(
+            IDataStoreStrategy dataStoreStrategy, IStorageProcessorTransactional storageProcessor,
+            IFileOperations fileOperations, IMailClient mailClient)
+    {
+        return DataSetStorageAlgorithm.createFromPrecommittedRecoveryAlgorithm(dataStoreStrategy,
+                storageProcessor, fileOperations, mailClient, this);
+    }
+
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStorageRecoveryAlgorithm.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStorageRecoveryAlgorithm.java
index 626168c5eac..bfccfec030e 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStorageRecoveryAlgorithm.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStorageRecoveryAlgorithm.java
@@ -19,13 +19,19 @@ package ch.systemsx.cisd.etlserver.registrator.recovery;
 import java.io.File;
 import java.io.Serializable;
 
+import ch.systemsx.cisd.common.filesystem.IFileOperations;
+import ch.systemsx.cisd.common.mail.IMailClient;
 import ch.systemsx.cisd.etlserver.DataStoreStrategyKey;
+import ch.systemsx.cisd.etlserver.IDataStoreStrategy;
+import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional;
+import ch.systemsx.cisd.etlserver.registrator.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState;
+import ch.systemsx.cisd.etlserver.registrator.ContainerDataSetStorageAlgorithm;
 import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithm;
+import ch.systemsx.cisd.etlserver.registrator.LinkDataSetStorageAlgorithm;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind;
 
 /**
- * 
- *
  * @author jakubs
  */
 public class DataSetStorageRecoveryAlgorithm<T extends DataSetInformation> implements Serializable
@@ -45,11 +51,13 @@ public class DataSetStorageRecoveryAlgorithm<T extends DataSetInformation> imple
     private final T dataSetInformation;
 
     private final DataSetStorageAlgorithm.DataSetStoragePaths dataSetStoragePaths;
-    
+
+    private final DataSetKind dataSetKind;
+
     public DataSetStorageRecoveryAlgorithm(T dataSetInformation,
             DataStoreStrategyKey dataStoreStrategyKey, File incomingDataSetFile,
             File stagingDirectory, File preCommitDirectory, String dataStoreCode,
-            DataSetStorageAlgorithm.DataSetStoragePaths dataSetStoragePaths)
+            DataSetStorageAlgorithm.DataSetStoragePaths dataSetStoragePaths, DataSetKind dataSetKind)
     {
         this.dataSetInformation = dataSetInformation;
 
@@ -61,6 +69,8 @@ public class DataSetStorageRecoveryAlgorithm<T extends DataSetInformation> imple
         this.dataStoreCode = dataStoreCode;
 
         this.dataSetStoragePaths = dataSetStoragePaths;
+
+        this.dataSetKind = dataSetKind;
     }
 
     public String getDataSetCode()
@@ -97,9 +107,42 @@ public class DataSetStorageRecoveryAlgorithm<T extends DataSetInformation> imple
     {
         return dataStoreCode;
     }
-    
+
     public DataSetStorageAlgorithm.DataSetStoragePaths getDataSetStoragePaths()
     {
         return dataSetStoragePaths;
     }
+
+    public DataSetKind getDataSetKind()
+    {
+        return dataSetKind;
+    }
+
+    public DataSetStorageAlgorithm<T> recoverDataSetStorageAlgorithm(
+            OmniscientTopLevelDataSetRegistratorState state,
+            IDataSetStorageRecoveryAlgorithmWithState<T> algorithm)
+    {
+        IDataStoreStrategy dataStoreStrategy =
+                state.getDataStrategyStore().getDataStoreStrategy(getDataStoreStrategyKey());
+
+        IMailClient mailClient = state.getGlobalState().getMailClient();
+        IFileOperations fileOperations = state.getFileOperations();
+
+        IStorageProcessorTransactional storageProcessor = state.getStorageProcessor();
+
+        switch (getDataSetKind())
+        {
+            case CONTAINER:
+                return new ContainerDataSetStorageAlgorithm<T>(dataStoreStrategy, storageProcessor,
+                        fileOperations, mailClient, this);
+            case LINK:
+                return new LinkDataSetStorageAlgorithm<T>(dataStoreStrategy, storageProcessor,
+                        fileOperations, mailClient, this);
+            case EXTERNAL:
+                return algorithm.createExternalDataSetStorageAlgorithm(dataStoreStrategy,
+                        storageProcessor, fileOperations, mailClient);
+            default:
+                throw new IllegalStateException("Unknown data set kind " + getDataSetKind());
+        }
+    }
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStorageStoredRecoveryAlgorithm.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStorageStoredRecoveryAlgorithm.java
index d2649add44b..5c5e518a60e 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStorageStoredRecoveryAlgorithm.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStorageStoredRecoveryAlgorithm.java
@@ -25,28 +25,21 @@ import ch.systemsx.cisd.etlserver.DataStoreStrategyKey;
 import ch.systemsx.cisd.etlserver.IDataStoreStrategy;
 import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional;
 import ch.systemsx.cisd.etlserver.registrator.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState;
-import ch.systemsx.cisd.etlserver.registrator.AbstractNoFileDataSetStorageAlgorithm;
 import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithm;
 import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithm.DataSetStoragePaths;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind;
 
 /**
  * @author jakubs
  */
 public class DataSetStorageStoredRecoveryAlgorithm<T extends DataSetInformation> implements
-        Serializable
+        Serializable, IDataSetStorageRecoveryAlgorithmWithState<T>
 {
     private static final long serialVersionUID = 1L;
 
     private DataSetStorageRecoveryAlgorithm<T> recoveryAlgorithm;
 
-    private boolean isContainer;
-
-    public boolean isContainer()
-    {
-        return isContainer;
-    }
-
     public DataSetStorageStoredRecoveryAlgorithm(T dataSetInformation,
             DataStoreStrategyKey dataStoreStrategyKey, File incomingDataSetFile,
             File stagingDirectory, File preCommitDirectory, String dataStoreCode,
@@ -55,41 +48,24 @@ public class DataSetStorageStoredRecoveryAlgorithm<T extends DataSetInformation>
         recoveryAlgorithm =
                 new DataSetStorageRecoveryAlgorithm<T>(dataSetInformation, dataStoreStrategyKey,
                         incomingDataSetFile, stagingDirectory, preCommitDirectory, dataStoreCode,
-                        dataSetStoragePaths);
-        isContainer = false;
+                        dataSetStoragePaths, DataSetKind.EXTERNAL);
     }
 
     public DataSetStorageStoredRecoveryAlgorithm(T dataSetInformation,
             DataStoreStrategyKey dataStoreStrategyKey, File incomingDataSetFile,
-            File stagingDirectory, File preCommitDirectory, String dataStoreCode)
+            File stagingDirectory, File preCommitDirectory, String dataStoreCode,
+            DataSetKind dataSetKind)
     {
         recoveryAlgorithm =
                 new DataSetStorageRecoveryAlgorithm<T>(dataSetInformation, dataStoreStrategyKey,
                         incomingDataSetFile, stagingDirectory, preCommitDirectory, dataStoreCode,
-                        null);
-        isContainer = true;
+                        null, dataSetKind);
     }
 
     public DataSetStorageAlgorithm<T> recoverDataSetStorageAlgorithm(
             OmniscientTopLevelDataSetRegistratorState state)
     {
-        IDataStoreStrategy dataStoreStrategy =
-                state.getDataStrategyStore().getDataStoreStrategy(getDataStoreStrategyKey());
-
-        IMailClient mailClient = state.getGlobalState().getMailClient();
-        IFileOperations fileOperations = state.getFileOperations();
-
-        IStorageProcessorTransactional storageProcessor = state.getStorageProcessor();
-
-        if (isContainer)
-        {
-            return new AbstractNoFileDataSetStorageAlgorithm<T>(dataStoreStrategy, storageProcessor,
-                    fileOperations, mailClient, recoveryAlgorithm);
-        } else
-        {
-            return new DataSetStorageAlgorithm<T>(dataStoreStrategy, storageProcessor,
-                    fileOperations, mailClient, this);
-        }
+        return recoveryAlgorithm.recoverDataSetStorageAlgorithm(state, this);
     }
 
     public DataSetStorageRecoveryAlgorithm<T> getRecoveryAlgorithm()
@@ -161,4 +137,12 @@ public class DataSetStorageStoredRecoveryAlgorithm<T extends DataSetInformation>
         return recoveryAlgorithm.getDataSetStoragePaths();
     }
 
+    @Override
+    public DataSetStorageAlgorithm<T> createExternalDataSetStorageAlgorithm(
+            IDataStoreStrategy dataStoreStrategy, IStorageProcessorTransactional storageProcessor,
+            IFileOperations fileOperations, IMailClient mailClient)
+    {
+        return DataSetStorageAlgorithm.createFromStoredRecoveryAlgorithm(dataStoreStrategy,
+                storageProcessor, fileOperations, mailClient, this);
+    }
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/IDataSetStorageRecoveryAlgorithmWithState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/IDataSetStorageRecoveryAlgorithmWithState.java
new file mode 100644
index 00000000000..992699c3492
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/IDataSetStorageRecoveryAlgorithmWithState.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012 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.etlserver.registrator.recovery;
+
+import ch.systemsx.cisd.common.filesystem.IFileOperations;
+import ch.systemsx.cisd.common.mail.IMailClient;
+import ch.systemsx.cisd.etlserver.IDataStoreStrategy;
+import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional;
+import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithm;
+import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
+
+/**
+ * 
+ *
+ * @author Jakub Straszewski
+ */
+public interface IDataSetStorageRecoveryAlgorithmWithState<T extends DataSetInformation>
+{
+    DataSetStorageAlgorithm<T> createExternalDataSetStorageAlgorithm(
+            IDataStoreStrategy dataStoreStrategy, IStorageProcessorTransactional storageProcessor,
+            IFileOperations fileOperations, IMailClient mailClient);
+}
-- 
GitLab