From 53de9d3e75778327a0bc38314e86f97fa4f1f861 Mon Sep 17 00:00:00 2001
From: kaloyane <kaloyane>
Date: Tue, 15 Mar 2011 15:00:09 +0000
Subject: [PATCH] [LMS-2087] integration tested with rsync archiver

SVN: 20335
---
 ...DeletionPostProcessingMaintenanceTask.java |  2 +-
 .../DeleteFromArchiveMaintenanceTask.java     |  1 +
 .../server/business/bo/ExternalDataTable.java | 45 +++++++++++++++----
 3 files changed, 39 insertions(+), 9 deletions(-)

diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/AbstractDataSetDeletionPostProcessingMaintenanceTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/AbstractDataSetDeletionPostProcessingMaintenanceTask.java
index 6f63864adb6..9b7860c9edb 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/AbstractDataSetDeletionPostProcessingMaintenanceTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/AbstractDataSetDeletionPostProcessingMaintenanceTask.java
@@ -44,7 +44,7 @@ public abstract class AbstractDataSetDeletionPostProcessingMaintenanceTask imple
     protected static final Logger operationLog =
             LogFactory.getLogger(LogCategory.OPERATION, AbstractDataSetDeletionPostProcessingMaintenanceTask.class);
 
-    protected static final String DELAY_AFTER_DELETION = "delay-after-deletion";
+    protected static final String DELAY_AFTER_DELETION = "delay-after-user-deletion";
 
     protected final IEncapsulatedOpenBISService openBISService;
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DeleteFromArchiveMaintenanceTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DeleteFromArchiveMaintenanceTask.java
index de6d85a9978..349e2a607b2 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DeleteFromArchiveMaintenanceTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DeleteFromArchiveMaintenanceTask.java
@@ -61,6 +61,7 @@ public class DeleteFromArchiveMaintenanceTask extends
             try
             {
                 String statusFileContent = FileUtilities.loadToString(lastSeenEventIdFile);
+                statusFileContent = statusFileContent.trim();
                 result = Long.parseLong(statusFileContent);
             } catch (Exception ex)
             {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExternalDataTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExternalDataTable.java
index 3aac41784c3..16f94b17232 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExternalDataTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExternalDataTable.java
@@ -225,22 +225,47 @@ public final class ExternalDataTable extends AbstractExternalDataBusinessObject
     public void deleteLoadedDataSets(String reason)
     {
         assertDatasetsAreDeletable(externalData);
-        Map<DataStorePE, List<ExternalDataPE>> map = groupDataSetsByDataStores();
-        assertDataSetsAreKnown(map);
-        for (Map.Entry<DataStorePE, List<ExternalDataPE>> entry : map.entrySet())
+
+        Map<DataStorePE, List<ExternalDataPE>> allToBeDeleted = groupDataSetsByDataStores();
+        Map<DataStorePE, List<ExternalDataPE>> availableDatasets =
+                filterAvailableDatasets(allToBeDeleted);
+
+        assertDataSetsAreKnown(availableDatasets);
+        for (Map.Entry<DataStorePE, List<ExternalDataPE>> entry : allToBeDeleted.entrySet())
         {
             DataStorePE dataStore = entry.getKey();
-            List<ExternalDataPE> dataSets = entry.getValue();
+            List<ExternalDataPE> allDataSets = entry.getValue();
             // delete locally from DB
-            for (ExternalDataPE dataSet : dataSets)
+            for (ExternalDataPE dataSet : allDataSets)
             {
                 deleteDataSetLocally(dataSet, reason);
             }
-            // delete remotely from Data Store
-            deleteDataSets(dataStore, createDatasetDescriptions(dataSets));
+            // delete remotely from Data Store (only executed for available datasets)
+            List<ExternalDataPE> available = availableDatasets.get(dataStore);
+            deleteDataSets(dataStore, createDatasetDescriptions(available));
         }
     }
 
+    private Map<DataStorePE, List<ExternalDataPE>> filterAvailableDatasets(
+            Map<DataStorePE, List<ExternalDataPE>> map)
+    {
+        Map<DataStorePE, List<ExternalDataPE>> result =
+                new HashMap<DataStorePE, List<ExternalDataPE>>();
+        for (Map.Entry<DataStorePE, List<ExternalDataPE>> entry : map.entrySet())
+        {
+            ArrayList<ExternalDataPE> available = new ArrayList<ExternalDataPE>();
+            for (ExternalDataPE data : entry.getValue())
+            {
+                if (data.getStatus().isAvailable())
+                {
+                    available.add(data);
+                }
+            }
+            result.put(entry.getKey(), available);
+        }
+        return result;
+    }
+
     private void deleteDataSetLocally(ExternalDataPE dataSet, String reason)
             throws UserFailureException
     {
@@ -343,7 +368,11 @@ public final class ExternalDataTable extends AbstractExternalDataBusinessObject
         List<String> unknownDataSets = new ArrayList<String>();
         for (ExternalDataPE dataSet : externalData)
         {
-            if (knownLocations.contains(dataSet.getLocation()) == false)
+            if (dataSet.getStatus() == DataSetArchivingStatus.ARCHIVED)
+            {
+                // archived datasets are currently not available in the data store
+                // but can be deleted
+            } else if (knownLocations.contains(dataSet.getLocation()) == false)
             {
                 unknownDataSets.add(dataSet.getCode());
             }
-- 
GitLab