[MSHARED-64] FileSetManager.delete() does not delete empty directories if they contained symlink that was deleted

git-svn-id: https://svn.apache.org/repos/asf/maven/shared/trunk@694311 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/maven/shared/model/fileset/util/FileSetManager.java b/src/main/java/org/apache/maven/shared/model/fileset/util/FileSetManager.java
index 8043bd2..ca60886 100644
--- a/src/main/java/org/apache/maven/shared/model/fileset/util/FileSetManager.java
+++ b/src/main/java/org/apache/maven/shared/model/fileset/util/FileSetManager.java
@@ -37,6 +37,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -450,7 +451,7 @@
             excludes.removeAll( includedDirsAndSymlinks );
         }
 
-        excludeParentDirectoriesOfExcludedPaths( excludedDirs, includes );
+        excludeParentDirectoriesOfExcludedPaths( excludes, includes );
 
         includes.addAll( linksForDeletion );
 
@@ -510,7 +511,7 @@
             excludes.removeAll( includedFilesAndSymlinks );
         }
 
-        excludeParentDirectoriesOfExcludedPaths( excludedFiles, includes );
+        excludeParentDirectoriesOfExcludedPaths( excludes, includes );
 
         includes.addAll( linksForDeletion );
 
@@ -526,11 +527,11 @@
      * @param deletablePaths The relative paths to files/directories which are scheduled for deletion, must not be
      *            <code>null</code>.
      */
-    private void excludeParentDirectoriesOfExcludedPaths( String excludedPaths[], Set deletablePaths )
+    private void excludeParentDirectoriesOfExcludedPaths( Collection excludedPaths, Set deletablePaths )
     {
-        for ( int i = 0; i < excludedPaths.length; i++ )
+        for ( Iterator it = excludedPaths.iterator(); it.hasNext(); )
         {
-            String path = excludedPaths[i];
+            String path = (String) it.next();
 
             String parentPath = new File( path ).getParent();
 
@@ -553,7 +554,7 @@
             }
         }
 
-        if ( excludedPaths.length > 0 )
+        if ( !excludedPaths.isEmpty() )
         {
             if ( messages != null && messages.isDebugEnabled() )
             {
diff --git a/src/test/java/org/apache/maven/shared/model/fileset/util/FileSetUtilsTest.java b/src/test/java/org/apache/maven/shared/model/fileset/util/FileSetUtilsTest.java
index 9de6001..48f8251 100644
--- a/src/test/java/org/apache/maven/shared/model/fileset/util/FileSetUtilsTest.java
+++ b/src/test/java/org/apache/maven/shared/model/fileset/util/FileSetUtilsTest.java
@@ -280,29 +280,55 @@
     }
 
     /**
-     * @param from
-     * @param to
+     * @throws Exception if any
+     */
+    public void testDeleteDontFollowSymlinksButDeleteThem()
+        throws Exception
+    {
+        File directory = setupTestDirectory( "testDeleteDontFollowSymlinksButDeleteThem" );
+
+        createSymlink( new File( directory, "excluded" ), new File( directory, "dir0/dirlink" ) );
+        createSymlink( new File( directory, "excluded.txt" ), new File( directory, "dir1/filelink" ) );
+
+        FileSet set = new FileSet();
+        set.setDirectory( directory.getPath() );
+        set.addExclude( "*excluded*" );
+        set.setFollowSymlinks( false );
+
+        FileSetManager fileSetManager = new FileSetManager();
+
+        fileSetManager.delete( set );
+
+        Assert.assertTrue( "excluded file has been deleted", new File( directory, "excluded.txt" ).exists() );
+        Assert.assertTrue( "excluded directory has been deleted", new File( directory, "excluded" ).exists() );
+        Assert.assertFalse( "included directory has not been deleted", new File( directory, "dir0" ).exists() );
+        Assert.assertFalse( "included directory has not been deleted", new File( directory, "dir1" ).exists() );
+    }
+
+    /**
+     * @param target The target file/directory of the symlink, must not be <code>null</code>.
+     * @param link The link to create, must not be <code>null</code>.
      * @return
      * @throws InterruptedException
      * @throws CommandLineException
      */
-    private boolean createSymlink( File from, File to )
+    private boolean createSymlink( File target, File link )
         throws InterruptedException, CommandLineException
     {
-        if ( to.exists() )
+        if ( link.exists() )
         {
-            to.delete();
+            link.delete();
         }
 
         Commandline cli = new Commandline();
         cli.setExecutable( "ln" );
-        cli.createArg().setLine( "-s" );
-        cli.createArg().setLine( from.getPath() );
-        cli.createArg().setLine( to.getPath() );
+        cli.createArg().setValue( "-s" );
+        cli.createArg().setValue( target.getPath() );
+        cli.createArg().setValue( link.getPath() );
 
         int result = cli.execute().waitFor();
 
-        linkFiles.add( to );
+        linkFiles.add( link );
 
         return result == 0;
     }
diff --git a/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/dir0/dummy.txt b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/dir0/dummy.txt
new file mode 100644
index 0000000..b93cdcf
--- /dev/null
+++ b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/dir0/dummy.txt
@@ -0,0 +1 @@
+The Resources Plugin won't copy empty directories...
\ No newline at end of file
diff --git a/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/dir1/dummy.txt b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/dir1/dummy.txt
new file mode 100644
index 0000000..b93cdcf
--- /dev/null
+++ b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/dir1/dummy.txt
@@ -0,0 +1 @@
+The Resources Plugin won't copy empty directories...
\ No newline at end of file
diff --git a/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/excluded.txt b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/excluded.txt
new file mode 100644
index 0000000..240ac76
--- /dev/null
+++ b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/excluded.txt
@@ -0,0 +1 @@
+Serves as the target for a symlink and should not be deleted.
\ No newline at end of file
diff --git a/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/excluded/dummy.txt b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/excluded/dummy.txt
new file mode 100644
index 0000000..b93cdcf
--- /dev/null
+++ b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/excluded/dummy.txt
@@ -0,0 +1 @@
+The Resources Plugin won't copy empty directories...
\ No newline at end of file