From 4359cfa23dac5a2c424c5e786b65d33c892e36a4 Mon Sep 17 00:00:00 2001
From: tpylak <tpylak>
Date: Thu, 10 Feb 2011 14:06:00 +0000
Subject: [PATCH] LMS-2033 from Sekhar: allow to open many transactions

SVN: 19878
---
 .../DataSetRegistrationDetails.java           |  5 ++
 .../DataSetRegistrationService.java           | 56 ++++++++++---------
 2 files changed, 36 insertions(+), 25 deletions(-)

diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationDetails.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationDetails.java
index b869ab0225b..bc884f697cb 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationDetails.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationDetails.java
@@ -64,6 +64,11 @@ public class DataSetRegistrationDetails<T extends DataSetInformation> implements
     }
 
     public LocatorType getLocatorType(File incomingDataSetPath)
+    {
+        return getLocatorType();
+    }
+
+    public LocatorType getLocatorType()
     {
         return new LocatorType(LocatorType.DEFAULT_LOCATOR_TYPE_CODE);
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java
index 23ad0281138..1a83fdee2e6 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java
@@ -57,9 +57,9 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements
     private final File stagingDirectory;
 
     /**
-     * The currently live child transaction.
+     * All transactions ever created on this service.
      */
-    private DataSetRegistrationTransaction<T> liveTransactionOrNull;
+    private final ArrayList<DataSetRegistrationTransaction<T>> transactions;
 
     /**
      * A data set that will be created but might not yet exist.
@@ -106,6 +106,8 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements
         {
             stagingDirectory = new File(stagingDirString);
         }
+
+        transactions = new ArrayList<DataSetRegistrationTransaction<T>>();
     }
 
     public OmniscientTopLevelDataSetRegistratorState getRegistratorContext()
@@ -147,18 +149,16 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements
     public IDataSetRegistrationTransaction transaction(File dataSetFile,
             IDataSetRegistrationDetailsFactory<T> detailsFactory)
     {
-        // If a transaction is hanging around, commit it before starting a new one
-        commitExtantTransaction();
-
         File workingDirectory = dataSetFile.getParentFile();
 
         // Clone this service for the transaction to keep them independent
-        liveTransactionOrNull =
+        DataSetRegistrationTransaction<T> transaction =
                 new DataSetRegistrationTransaction<T>(registrator.getGlobalState()
                         .getStoreRootDir(), workingDirectory, stagingDirectory, this,
                         detailsFactory);
 
-        return liveTransactionOrNull;
+        transactions.add(transaction);
+        return transaction;
     }
 
     /**
@@ -167,7 +167,7 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements
     public void commit()
     {
         // If a transaction is hanging around, commit it
-        commitExtantTransaction();
+        commitExtantTransactions();
 
         for (DataSetRegistrationAlgorithm registrationAlgorithm : dataSetRegistrations)
         {
@@ -181,7 +181,7 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements
      */
     public void abort()
     {
-        rollbackExtantTransaction();
+        rollbackExtantTransactions();
         dataSetRegistrations.clear();
     }
 
@@ -221,21 +221,27 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements
     /**
      * If a transaction is hanging around, commit it
      */
-    private void commitExtantTransaction()
+    private void commitExtantTransactions()
     {
-        if (null != liveTransactionOrNull
-                && false == liveTransactionOrNull.isCommittedOrRolledback())
+        for (DataSetRegistrationTransaction<T> transaction : transactions)
         {
-            // Commit the existing transaction
-            liveTransactionOrNull.commit();
+            if (false == transaction.isCommittedOrRolledback())
+            {
+                // Commit the existing transaction
+                transaction.commit();
+            }
         }
     }
 
-    private void rollbackExtantTransaction()
+    private void rollbackExtantTransactions()
     {
-        if (null != liveTransactionOrNull)
+        for (DataSetRegistrationTransaction<T> transaction : transactions)
         {
-            liveTransactionOrNull.rollback();
+            if (false == transaction.isCommittedOrRolledback())
+            {
+                // Rollback the existing transaction
+                transaction.rollback();
+            }
         }
     }
 
@@ -260,15 +266,15 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements
 
         DataSetRegistrationAlgorithmState state =
                 new DataSetRegistrationAlgorithmState(incomingDataSetFile,
-                        globalState.getOpenBisService(),
-                        cleanAfterwardsAction, registratorContext.getPreRegistrationAction(),
+                        globalState.getOpenBisService(), cleanAfterwardsAction,
+                        registratorContext.getPreRegistrationAction(),
                         registratorContext.getPostRegistrationAction(),
-                        details.getDataSetInformation(),
-                        dataStoreStrategy, details, registratorContext.getStorageProcessor(),
-                        registratorContext.getFileOperations(),
-                        globalState.getDataSetValidator(), globalState.getMailClient(),
-                        globalState.isDeleteUnidentified(), registratorContext.getRegistrationLock(),
-                        globalState.getDssCode(), globalState.isNotifySuccessfulRegistration());
+                        details.getDataSetInformation(), dataStoreStrategy, details,
+                        registratorContext.getStorageProcessor(),
+                        registratorContext.getFileOperations(), globalState.getDataSetValidator(),
+                        globalState.getMailClient(), globalState.isDeleteUnidentified(),
+                        registratorContext.getRegistrationLock(), globalState.getDssCode(),
+                        globalState.isNotifySuccessfulRegistration());
         return new DataSetRegistrationAlgorithm(state, this,
                 new DefaultApplicationServerRegistrator(registrator,
                         details.getDataSetInformation()));
-- 
GitLab