From 7ff3c59ac3775c4489a78a61a7024a4b57c77bc6 Mon Sep 17 00:00:00 2001
From: kaloyane <kaloyane>
Date: Thu, 24 Mar 2011 12:24:15 +0000
Subject: [PATCH] [LMS-2159] Unit test for HierarchicalStorageUpdater bug

SVN: 20487
---
 .../store-root/1/ds1/{original => }/f1.png    | Bin
 .../plugins/HierarchicalStorageUpdater.java   |  50 +++++++++---------
 .../HierarchicalStorageUpdaterTest.java       |  13 +++--
 3 files changed, 32 insertions(+), 31 deletions(-)
 rename datastore_server/resource/test-data/HierarchicalStorageUpdaterTest/store-root/1/ds1/{original => }/f1.png (100%)

diff --git a/datastore_server/resource/test-data/HierarchicalStorageUpdaterTest/store-root/1/ds1/original/f1.png b/datastore_server/resource/test-data/HierarchicalStorageUpdaterTest/store-root/1/ds1/f1.png
similarity index 100%
rename from datastore_server/resource/test-data/HierarchicalStorageUpdaterTest/store-root/1/ds1/original/f1.png
rename to datastore_server/resource/test-data/HierarchicalStorageUpdaterTest/store-root/1/ds1/f1.png
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/HierarchicalStorageUpdater.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/HierarchicalStorageUpdater.java
index 841594cee55..094cc2c3713 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/HierarchicalStorageUpdater.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/HierarchicalStorageUpdater.java
@@ -315,7 +315,7 @@ public class HierarchicalStorageUpdater implements IDataStoreLockingMaintenanceT
                 {
                     toDelete = parent;
                     parent = toDelete.getParentFile();
-                    toDelete.delete();
+                    delete(toDelete);
                 } else
                 {
                     break;
@@ -326,40 +326,38 @@ public class HierarchicalStorageUpdater implements IDataStoreLockingMaintenanceT
 
     private static void deleteWithSymbolicLinks(File toDelete)
     {
-        if (FileUtilities.isSymbolicLink(toDelete))
+        if (toDelete.isDirectory())
         {
-            toDelete.delete();
-            return;
+            for (File file : toDelete.listFiles())
+            {
+                // all these files should be symbolic links to a dataset directory.
+                // We cannot delete recursively here, it would remove the original files.
+                boolean ok = delete(file);
+                if (ok == false)
+                {
+                    operationLog.error("Cannot delete the file: " + file.getPath());
+                }
+            }
         }
 
-        if (toDelete.isDirectory() == false)
-        {
-                operationLog.error("Directory structure is different than expected. File '"
-                        + toDelete.getPath() + "' should be a directory. It will not be cleared.");
-            return;
-        }
+        delete(toDelete);
+    }
 
-        for (File file : toDelete.listFiles())
+    private static boolean delete(File file)
+    {
+        if (FileUtilities.isSymbolicLink(file) || file.isDirectory())
         {
-            // all these files should be symbolic links to a dataset directory.
-            // We cannot delete recursively here, it would remove the original files.
-            if (false == FileUtilities.isSymbolicLink(file))
-            {
-                operationLog.error(file.getPath()
-                        + " is not a symbolic link and will not be deleted.");
-                return;
-            }
-            boolean ok = file.delete();
-            if (ok == false)
-            {
-                operationLog.error("Cannot delete the file: " + file.getPath());
-            }
+            operationLog.info("Deleting " + file.getAbsolutePath());
+            return file.delete();
+        } else
+        {
+            operationLog.error(file.getPath() + " is not a symbolic link and will not be deleted.");
+            return false;
         }
 
-        // delete the folder in the end
-        toDelete.delete();
     }
 
+
     /**
      * Creates the soft links for files with paths defined in <code>linkMappings</code> {@link Map}.
      */
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/HierarchicalStorageUpdaterTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/HierarchicalStorageUpdaterTest.java
index 1d7b15b4f0d..ac9a216d38d 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/HierarchicalStorageUpdaterTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/HierarchicalStorageUpdaterTest.java
@@ -143,7 +143,7 @@ public class HierarchicalStorageUpdaterTest extends AbstractFileSystemTestCase
     }
 
 
-    private HierarchicalStorageUpdater createUpdater(boolean linkFromFirstChild)
+    private HierarchicalStorageUpdater createUpdater(boolean reconfiguredExecution)
     {
         final String pluginName = "hierarchical-storage-updater";
         final String pluginPrefix = pluginName + ".";
@@ -156,10 +156,13 @@ public class HierarchicalStorageUpdaterTest extends AbstractFileSystemTestCase
                 .getAbsolutePath());
 
         Properties properties = new Properties();
-        properties.put(HierarchicalStorageUpdater.LINK_SOURCE_SUBFOLDER + "."
-                + DATASET_TYPE, "original");
-        properties.put(HierarchicalStorageUpdater.LINK_FROM_FIRST_CHILD + "." + DATASET_TYPE, ""
-                + linkFromFirstChild);
+        if (reconfiguredExecution)
+        {
+            properties.put(HierarchicalStorageUpdater.LINK_SOURCE_SUBFOLDER + "." + DATASET_TYPE,
+                    "original");
+            properties.put(HierarchicalStorageUpdater.LINK_FROM_FIRST_CHILD + "." + DATASET_TYPE,
+                    "" + true);
+        }
 
         HierarchicalStorageUpdater updater = new HierarchicalStorageUpdater();
         updater.setUp(pluginName, properties);
-- 
GitLab