Worked around Windows FS problems in IndexedRelationsSearcherBase 24/1824/1
authorTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Fri, 8 Jun 2018 22:35:29 +0000 (01:35 +0300)
committerTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Fri, 8 Jun 2018 22:35:29 +0000 (01:35 +0300)
See https://blogs.msdn.microsoft.com/oldnewthing/20120907-00/?p=6663/

gitlab #19

Change-Id: Ia12c848aa75836597121eadec05061ea23bb1240

bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/DatabaseIndexing.java
bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/IndexedRelationsSearcherBase.java
bundles/org.simantics.utils/src/org/simantics/utils/FileUtils.java

index b429eb49a77d7d254be6599ced45bd39b68d3ef6..bf7293e50dfaf9162f3fa10133738750bfba15ad 100644 (file)
@@ -199,7 +199,7 @@ public final class DatabaseIndexing {
             // Make sure that index-base is a valid directory
             if (LOGGER.isDebugEnabled())
                 LOGGER.debug(indexBase + " is not a directory! Removing it.");
-            FileUtils.delete(indexBase);
+            FileUtils.emptyDirectory(indexBase);
             Files.createDirectories(indexBase);
             return;
         }
index 74d3299018553d1d37f3539ee5fd91cdd6f77dd6..1d5001c64ec15f728cfee967f19d75dcc2123dbb 100644 (file)
@@ -624,7 +624,7 @@ abstract public class IndexedRelationsSearcherBase {
                     mon.subTask("Erasing previous index");
                     if (getLogger().isDebugEnabled())
                         getLogger().debug("Erasing previous index {}", indexPath.toAbsolutePath());
-                    FileUtils.delete(indexPath);
+                    FileUtils.emptyDirectory(indexPath);
                 }
             }
     
index 6ae209c9ac0cc8c9d0ffaa962d7f11768f693846..44a3dfcf5731b9ff2c9334959a66e3463416f283 100644 (file)
@@ -970,6 +970,20 @@ public class FileUtils {
         deleteWithFilter(path, null);
     }
 
+    /**
+     * Empties the specified directory but does not delete the directory itself.
+     * If a non-directory path is given, it is simply deleted.
+     * 
+     * @param path
+     * @throws IOException
+     */
+    public static void emptyDirectory(Path path) throws IOException {
+        if (Files.isDirectory(path))
+            Files.walkFileTree(path, new EmptyDirectoryVisitor());
+        else
+            Files.deleteIfExists(path);
+    }
+
     public static void copy(Path from, Path to) throws IOException {
         Files.walkFileTree(from, new CopyDirectoriesVisitor(from, to));
     }
@@ -987,12 +1001,7 @@ public class FileUtils {
             if (filter != null && !filter.test(file)) {
                 return FileVisitResult.CONTINUE;
             }
-            if (Files.exists(file)) {
-                Files.delete(file);
-            }
-            if (Files.exists(file)) {
-                throw new IOException("Could not delete file " + file.toAbsolutePath().toString());
-            }
+            Files.deleteIfExists(file);
             return FileVisitResult.CONTINUE;
         }
         
@@ -1003,15 +1012,36 @@ public class FileUtils {
             if (filter != null && !filter.test(dir)) {
                 return FileVisitResult.CONTINUE;
             }
-            if (Files.exists(dir)) {
-                Files.delete(dir);
-            }
-            if (Files.exists(dir))
-                throw new IOException("Could not delete file " + dir.toAbsolutePath().toString());
+            Files.deleteIfExists(dir);
             return FileVisitResult.CONTINUE;
         }
     }
-    
+
+    private static class EmptyDirectoryVisitor extends SimpleFileVisitor<Path> {
+        int depth = 0;
+
+        @Override
+        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+            Files.deleteIfExists(file);
+            return FileVisitResult.CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+            ++depth;
+            return FileVisitResult.CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+            if (exc != null)
+                throw exc;
+            if (--depth > 0)
+                Files.deleteIfExists(dir);
+            return FileVisitResult.CONTINUE;
+        }
+    }
+
     public static class CopyDirectoriesVisitor extends SimpleFileVisitor<Path> {
         
         private final Path fromPath;