From 805c69cbf378205406659a3680f80eb48cb90c6f Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 17 Jan 2020 12:48:41 +0100 Subject: [Symlink] Don't follow symlinks when deleting old link source --- .../org/openslx/taskmanager/tasks/Symlink.java | 24 +++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/openslx/taskmanager/tasks/Symlink.java b/src/main/java/org/openslx/taskmanager/tasks/Symlink.java index 7a6a3bd..44919fc 100644 --- a/src/main/java/org/openslx/taskmanager/tasks/Symlink.java +++ b/src/main/java/org/openslx/taskmanager/tasks/Symlink.java @@ -59,7 +59,7 @@ public class Symlink extends AbstractTask @Override protected boolean execute() { - FileUtils.deleteQuietly( new File( linkname ) ); + deleteRecursiveIfExists( new File( linkname ) ); if ( this.target != null ) { try { Files.createSymbolicLink( Paths.get( this.linkname ), Paths.get( this.target ) ); @@ -71,6 +71,28 @@ public class Symlink extends AbstractTask return true; } + /** + * Recursively deletes `item`, which may be a directory. + * Symbolic links will be deleted instead of their referents. + * Returns a boolean indicating whether `item` still exists. + * http://stackoverflow.com/questions/8666420 + */ + public static boolean deleteRecursiveIfExists( File item ) + { + if ( !item.exists() ) + return true; + boolean ret = true; + if ( !Files.isSymbolicLink( item.toPath() ) && item.isDirectory() ) { + File[] subitems = item.listFiles(); + for ( File subitem : subitems ) { + if ( !deleteRecursiveIfExists( subitem ) ) { + ret = false; + } + } + } + return item.delete() && ret; + } + /** * Output - contains additional status data of this task */ -- cgit v1.2.3-55-g7522