You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by mb...@apache.org on 2005/12/22 21:57:50 UTC

svn commit: r358627 - /ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java

Author: mbenson
Date: Thu Dec 22 12:57:47 2005
New Revision: 358627

URL: http://svn.apache.org/viewcvs?rev=358627&view=rev
Log:
fixed fileset deletion slowdown.  Bugzilla 37297.

Modified:
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java?rev=358627&r1=358626&r2=358627&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java Thu Dec 22 12:57:47 2005
@@ -18,20 +18,23 @@
 package org.apache.tools.ant.taskdefs;
 
 import java.io.File;
+import java.util.Arrays;
 import java.util.Vector;
 import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.Comparator;
 
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.taskdefs.condition.Os;
-import org.apache.tools.ant.types.Path;
 import org.apache.tools.ant.types.FileSet;
 import org.apache.tools.ant.types.PatternSet;
 import org.apache.tools.ant.types.ResourceCollection;
 import org.apache.tools.ant.types.resources.Sort;
 import org.apache.tools.ant.types.resources.Restrict;
-import org.apache.tools.ant.types.resources.BCFileSet;
+import org.apache.tools.ant.types.resources.Resources;
 import org.apache.tools.ant.types.resources.FileResource;
+import org.apache.tools.ant.types.resources.FileResourceIterator;
 import org.apache.tools.ant.types.resources.comparators.Reverse;
 import org.apache.tools.ant.types.resources.comparators.FileSystem;
 import org.apache.tools.ant.types.resources.comparators.ResourceComparator;
@@ -74,6 +77,29 @@
     private static final ResourceComparator REVERSE_FILESYSTEM = new Reverse(new FileSystem());
     private static final ResourceSelector EXISTS = new Exists();
 
+    private static class ReverseDirs implements ResourceCollection {
+        static final Comparator REVERSE = new Comparator() {
+            public int compare(Object foo, Object bar) {
+                return ((Comparable) foo).compareTo(bar) * -1;
+            }
+        };
+        File basedir;
+        String[] dirs;
+        ReverseDirs(File basedir, String[] dirs) {
+            this.basedir = basedir;
+            this.dirs = dirs;
+            Arrays.sort(this.dirs, REVERSE);
+            //ArrayList al = new ArrayList(Arrays.asList(dirs));
+            //Collections.reverse(al);
+            //this.dirs = (String[]) (al.toArray(new String[dirs.length]));
+        }
+        public Iterator iterator() {
+            return new FileResourceIterator(basedir, dirs);
+        }
+        public boolean isFilesystemOnly() { return true; }
+        public int size() { return dirs.length; }
+    }
+
     protected File file = null;
     protected File dir = null;
     protected Vector filesets = new Vector();
@@ -85,7 +111,7 @@
     private boolean quiet = false;
     private boolean failonerror = true;
     private boolean deleteOnExit = false;
-    private Vector rcs = new Vector();
+    private Resources rcs = null;
 
     /**
      * Set the name of a single file to be removed.
@@ -177,6 +203,10 @@
      * @param rc the filesystem-only ResourceCollection.
      */
     public void add(ResourceCollection rc) {
+        if (rc == null) {
+            return;
+        }
+        rcs = (rcs == null) ? new Resources() : rcs;
         rcs.add(rc);
     }
 
@@ -467,7 +497,7 @@
                 + "Use a nested fileset element instead.");
         }
 
-        if (file == null && dir == null && filesets.size() == 0 && rcs.size() == 0) {
+        if (file == null && dir == null && filesets.size() == 0 && rcs == null) {
             throw new BuildException("At least one of the file or dir "
                                      + "attributes, or a nested resource collection, "
                                      + "must be set.");
@@ -489,14 +519,7 @@
                     log("Deleting: " + file.getAbsolutePath());
 
                     if (!delete(file)) {
-                        String message = "Unable to delete file "
-                            + file.getAbsolutePath();
-                        if (failonerror) {
-                            throw new BuildException(message);
-                        } else {
-                            log(message, quiet ? Project.MSG_VERBOSE
-                                               : Project.MSG_WARN);
-                        }
+                        handle("Unable to delete file " + file.getAbsolutePath());
                     }
                 }
             } else {
@@ -521,50 +544,80 @@
             }
             removeDir(dir);
         }
-        Path p = new Path(getProject());
-        p.addAll(rcs);
+        Resources resourcesToDelete = new Resources();
+        resourcesToDelete.setProject(getProject());
+        Resources filesetDirs = new Resources();
+        filesetDirs.setProject(getProject());
+
         for (int i = 0; i < filesets.size(); i++) {
             FileSet fs = (FileSet) filesets.get(i);
-            p.add(includeEmpty ? new BCFileSet(fs) : fs);
+            resourcesToDelete.add(fs);
+            if (includeEmpty) {
+              filesetDirs.add(new ReverseDirs(fs.getDir(),
+                  fs.getDirectoryScanner().getIncludedDirectories()));
+            }
         }
         if (usedMatchingTask && dir != null) {
             //add the files from the default fileset:
             FileSet implicit = getImplicitFileSet();
-            p.add(includeEmpty ? new BCFileSet(implicit) : implicit);
+            resourcesToDelete.add(implicit);
+            if (includeEmpty) {
+              filesetDirs.add(new ReverseDirs(dir,
+                  implicit.getDirectoryScanner().getIncludedDirectories()));
+            }
+        }
+        resourcesToDelete.add(filesetDirs);
+        if (rcs != null) {
+            // sort first to files, then dirs
+            Restrict exists = new Restrict();
+            exists.add(EXISTS);
+            exists.add(rcs);
+            Sort s = new Sort();
+            s.add(REVERSE_FILESYSTEM);
+            s.add(exists);
+            resourcesToDelete.add(s);
         }
-        Restrict exists = new Restrict();
-        exists.add(EXISTS);
-        exists.add(p);
-        // delete the files in the resource collections; sort to files, then dirs
-        Sort s = new Sort();
-        s.add(REVERSE_FILESYSTEM);
-        s.add(exists);
-        String errorMessage = null;
         try {
-            for (Iterator iter = s.iterator(); iter.hasNext();) {
-                FileResource r = (FileResource) iter.next();
-                if (!(r.isDirectory()) || r.getFile().list().length == 0) {
-                    log("Deleting " + r, verbosity);
-                    if (!delete(r.getFile())) {
-                        errorMessage = "Unable to delete "
-                            + (r.isDirectory() ? "directory " : "file ") + r;
+            if (resourcesToDelete.isFilesystemOnly()) {
+                for (Iterator iter = resourcesToDelete.iterator(); iter.hasNext();) {
+                    FileResource r = (FileResource) iter.next();
+                    // nonexistent resources could only occur if we already
+                    // deleted something from a fileset:
+                    if (!r.isExists()) {
+                        continue;
+                    }
+                    if (!(r.isDirectory()) || r.getFile().list().length == 0) {
+                        log("Deleting " + r, verbosity);
+                        if (!delete(r.getFile()) && failonerror) {
+                            handle("Unable to delete "
+                                + (r.isDirectory() ? "directory " : "file ") + r);
+                        }
                     }
                 }
+            } else {
+                 handle(getTaskName() + " handles only filesystem resources");
             }
         } catch (Exception e) {
-            errorMessage = e.getMessage();
-        }
-        if (errorMessage != null) {
-            if (failonerror) {
-                throw new BuildException(errorMessage);
-            }
-            log(errorMessage, quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
+            handle(e);
         }
     }
 
 //************************************************************************
 //  protected and private methods
 //************************************************************************
+
+    private void handle(String msg) {
+        handle(new BuildException(msg));
+    }
+
+    private void handle(Exception e) {
+        if (failonerror) {
+            throw (e instanceof BuildException)
+                ? (BuildException) e : new BuildException(e);
+        }
+        log(e.getMessage(), quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
+    }
+
     /**
      * Accommodate Windows bug encountered in both Sun and IBM JDKs.
      * Others possible. If the delete does not work, call System.gc(),
@@ -613,27 +666,13 @@
             } else {
                 log("Deleting " + f.getAbsolutePath(), verbosity);
                 if (!delete(f)) {
-                    String message = "Unable to delete file "
-                        + f.getAbsolutePath();
-                    if (failonerror) {
-                        throw new BuildException(message);
-                    } else {
-                        log(message,
-                            quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
-                    }
+                    handle("Unable to delete file " + f.getAbsolutePath());
                 }
             }
         }
         log("Deleting directory " + d.getAbsolutePath(), verbosity);
         if (!delete(d)) {
-            String message = "Unable to delete directory "
-                + dir.getAbsolutePath();
-            if (failonerror) {
-                throw new BuildException(message);
-            } else {
-                log(message,
-                    quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
-            }
+            handle("Unable to delete directory " + dir.getAbsolutePath());
         }
     }
 
@@ -652,14 +691,7 @@
                 File f = new File(d, files[j]);
                 log("Deleting " + f.getAbsolutePath(), verbosity);
                 if (!delete(f)) {
-                    String message = "Unable to delete file "
-                        + f.getAbsolutePath();
-                    if (failonerror) {
-                        throw new BuildException(message);
-                    } else {
-                        log(message,
-                            quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
-                    }
+                    handle("Unable to delete file " + f.getAbsolutePath());
                 }
             }
         }
@@ -672,14 +704,8 @@
                 if (dirFiles == null || dirFiles.length == 0) {
                     log("Deleting " + currDir.getAbsolutePath(), verbosity);
                     if (!delete(currDir)) {
-                        String message = "Unable to delete directory "
-                                + currDir.getAbsolutePath();
-                        if (failonerror) {
-                            throw new BuildException(message);
-                        } else {
-                            log(message,
-                                quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
-                        }
+                        handle("Unable to delete directory "
+                                + currDir.getAbsolutePath());
                     } else {
                         dirCount++;
                     }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Re: svn commit: r358627 - /ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java

Posted by Matt Benson <gu...@yahoo.com>.
:) sorry, fixed!

--- "Alexey N. Solofnenko" <a....@mdl.com>
wrote:

> After the change <delete failonerror="no"> started
> to fail again if any 
> inner fileset directory does not exist:
> 
>     <delete failonerror="no" includeEmptyDirs="yes">
>       <fileset dir="already/deleted/dir"/>
>     </delete>
> 
> - Alexey.
> 
> mbenson@apache.org wrote:
> > Author: mbenson
> > Date: Thu Dec 22 12:57:47 2005
> > New Revision: 358627
> >
> > URL:
> http://svn.apache.org/viewcvs?rev=358627&view=rev
> > Log:
> > fixed fileset deletion slowdown.  Bugzilla 37297.
> >
> > Modified:
> >    
>
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java
> >
> > Modified:
>
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java
> > URL:
>
http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java?rev=358627&r1=358626&r2=358627&view=diff
> >
>
==============================================================================
> > ---
>
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java
> (original)
> > +++
>
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java
> Thu Dec 22 12:57:47 2005
> > @@ -18,20 +18,23 @@
> >  package org.apache.tools.ant.taskdefs;
> >  
> >  import java.io.File;
> > +import java.util.Arrays;
> >  import java.util.Vector;
> >  import java.util.Iterator;
> > +import java.util.ArrayList;
> > +import java.util.Comparator;
> >  
> >  import org.apache.tools.ant.Project;
> >  import org.apache.tools.ant.BuildException;
> >  import
> org.apache.tools.ant.taskdefs.condition.Os;
> > -import org.apache.tools.ant.types.Path;
> >  import org.apache.tools.ant.types.FileSet;
> >  import org.apache.tools.ant.types.PatternSet;
> >  import
> org.apache.tools.ant.types.ResourceCollection;
> >  import org.apache.tools.ant.types.resources.Sort;
> >  import
> org.apache.tools.ant.types.resources.Restrict;
> > -import
> org.apache.tools.ant.types.resources.BCFileSet;
> > +import
> org.apache.tools.ant.types.resources.Resources;
> >  import
> org.apache.tools.ant.types.resources.FileResource;
> > +import
>
org.apache.tools.ant.types.resources.FileResourceIterator;
> >  import
>
org.apache.tools.ant.types.resources.comparators.Reverse;
> >  import
>
org.apache.tools.ant.types.resources.comparators.FileSystem;
> >  import
>
org.apache.tools.ant.types.resources.comparators.ResourceComparator;
> > @@ -74,6 +77,29 @@
> >      private static final ResourceComparator
> REVERSE_FILESYSTEM = new Reverse(new FileSystem());
> >      private static final ResourceSelector EXISTS
> = new Exists();
> >  
> > +    private static class ReverseDirs implements
> ResourceCollection {
> > +        static final Comparator REVERSE = new
> Comparator() {
> > +            public int compare(Object foo, Object
> bar) {
> > +                return ((Comparable)
> foo).compareTo(bar) * -1;
> > +            }
> > +        };
> > +        File basedir;
> > +        String[] dirs;
> > +        ReverseDirs(File basedir, String[] dirs)
> {
> > +            this.basedir = basedir;
> > +            this.dirs = dirs;
> > +            Arrays.sort(this.dirs, REVERSE);
> > +            //ArrayList al = new
> ArrayList(Arrays.asList(dirs));
> > +            //Collections.reverse(al);
> > +            //this.dirs = (String[])
> (al.toArray(new String[dirs.length]));
> > +        }
> > +        public Iterator iterator() {
> > +            return new
> FileResourceIterator(basedir, dirs);
> > +        }
> > +        public boolean isFilesystemOnly() {
> return true; }
> > +        public int size() { return dirs.length; }
> > +    }
> > +
> >      protected File file = null;
> >      protected File dir = null;
> >      protected Vector filesets = new Vector();
> > @@ -85,7 +111,7 @@
> >      private boolean quiet = false;
> >      private boolean failonerror = true;
> >      private boolean deleteOnExit = false;
> > -    private Vector rcs = new Vector();
> > +    private Resources rcs = null;
> >  
> >      /**
> >       * Set the name of a single file to be
> removed.
> > @@ -177,6 +203,10 @@
> >       * @param rc the filesystem-only
> ResourceCollection.
> >       */
> >      public void add(ResourceCollection rc) {
> > +        if (rc == null) {
> > +            return;
> > +        }
> > +        rcs = (rcs == null) ? new Resources() :
> rcs;
> >          rcs.add(rc);
> >      }
> >  
> > @@ -467,7 +497,7 @@
> >                  + "Use a nested fileset element
> instead.");
> >          }
> >  
> > -        if (file == null && dir == null &&
> filesets.size() == 0 && rcs.size() == 0) {
> > +        if (file == null && dir == null &&
> filesets.size() == 0 && rcs == null) {
> >              throw new BuildException("At least
> one of the file or dir "
> >                                       +
> "attributes, or a nested resource collection, "
> >                                       + "must be
> set.");
> > @@ -489,14 +519,7 @@
> >                      log("Deleting: " +
> file.getAbsolutePath());
> >  
> >                      if (!delete(file)) {
> > -                        String message = "Unable
> to delete file "
> > -                            +
> file.getAbsolutePath();
> > -                        if (failonerror) {
> > -                            throw new
> BuildException(message);
> > -                        } else {
> > -                            log(message, quiet ?
> Project.MSG_VERBOSE
> > -                                               :
> Project.MSG_WARN);
> > -                        }
> > +                        handle("Unable to delete
> file " + file.getAbsolutePath());
> >                      }
> >                  }
> >              } else {
> > @@ -521,50 +544,80 @@
> >              }
> >              removeDir(dir);
> >          }
> > -        Path p = new Path(getProject());
> > -        p.addAll(rcs);
> > +        Resources resourcesToDelete = new
> Resources();
> > +       
> resourcesToDelete.setProject(getProject());
> > +        Resources filesetDirs = new Resources();
> > +        filesetDirs.setProject(getProject());
> > +
> >          for (int i = 0; i < filesets.size(); i++)
> {
> >              FileSet fs = (FileSet)
> filesets.get(i);
> > -            p.add(includeEmpty ? new
> BCFileSet(fs) : fs);
> > +            resourcesToDelete.add(fs);
> > +            if (includeEmpty) {
> > +              filesetDirs.add(new
> ReverseDirs(fs.getDir(),
> > +                 
> fs.getDirectoryScanner().getIncludedDirectories()));
> > +            }
> >          }
> 
=== message truncated ===



		
__________________________________________ 
Yahoo! DSL – Something to write home about. 
Just $16.99/mo. or less. 
dsl.yahoo.com 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Re: svn commit: r358627 - /ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java

Posted by "Alexey N. Solofnenko" <a....@mdl.com>.
After the change <delete failonerror="no"> started to fail again if any 
inner fileset directory does not exist:

    <delete failonerror="no" includeEmptyDirs="yes">
      <fileset dir="already/deleted/dir"/>
    </delete>

- Alexey.

mbenson@apache.org wrote:
> Author: mbenson
> Date: Thu Dec 22 12:57:47 2005
> New Revision: 358627
>
> URL: http://svn.apache.org/viewcvs?rev=358627&view=rev
> Log:
> fixed fileset deletion slowdown.  Bugzilla 37297.
>
> Modified:
>     ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java
>
> Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java
> URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java?rev=358627&r1=358626&r2=358627&view=diff
> ==============================================================================
> --- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java (original)
> +++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java Thu Dec 22 12:57:47 2005
> @@ -18,20 +18,23 @@
>  package org.apache.tools.ant.taskdefs;
>  
>  import java.io.File;
> +import java.util.Arrays;
>  import java.util.Vector;
>  import java.util.Iterator;
> +import java.util.ArrayList;
> +import java.util.Comparator;
>  
>  import org.apache.tools.ant.Project;
>  import org.apache.tools.ant.BuildException;
>  import org.apache.tools.ant.taskdefs.condition.Os;
> -import org.apache.tools.ant.types.Path;
>  import org.apache.tools.ant.types.FileSet;
>  import org.apache.tools.ant.types.PatternSet;
>  import org.apache.tools.ant.types.ResourceCollection;
>  import org.apache.tools.ant.types.resources.Sort;
>  import org.apache.tools.ant.types.resources.Restrict;
> -import org.apache.tools.ant.types.resources.BCFileSet;
> +import org.apache.tools.ant.types.resources.Resources;
>  import org.apache.tools.ant.types.resources.FileResource;
> +import org.apache.tools.ant.types.resources.FileResourceIterator;
>  import org.apache.tools.ant.types.resources.comparators.Reverse;
>  import org.apache.tools.ant.types.resources.comparators.FileSystem;
>  import org.apache.tools.ant.types.resources.comparators.ResourceComparator;
> @@ -74,6 +77,29 @@
>      private static final ResourceComparator REVERSE_FILESYSTEM = new Reverse(new FileSystem());
>      private static final ResourceSelector EXISTS = new Exists();
>  
> +    private static class ReverseDirs implements ResourceCollection {
> +        static final Comparator REVERSE = new Comparator() {
> +            public int compare(Object foo, Object bar) {
> +                return ((Comparable) foo).compareTo(bar) * -1;
> +            }
> +        };
> +        File basedir;
> +        String[] dirs;
> +        ReverseDirs(File basedir, String[] dirs) {
> +            this.basedir = basedir;
> +            this.dirs = dirs;
> +            Arrays.sort(this.dirs, REVERSE);
> +            //ArrayList al = new ArrayList(Arrays.asList(dirs));
> +            //Collections.reverse(al);
> +            //this.dirs = (String[]) (al.toArray(new String[dirs.length]));
> +        }
> +        public Iterator iterator() {
> +            return new FileResourceIterator(basedir, dirs);
> +        }
> +        public boolean isFilesystemOnly() { return true; }
> +        public int size() { return dirs.length; }
> +    }
> +
>      protected File file = null;
>      protected File dir = null;
>      protected Vector filesets = new Vector();
> @@ -85,7 +111,7 @@
>      private boolean quiet = false;
>      private boolean failonerror = true;
>      private boolean deleteOnExit = false;
> -    private Vector rcs = new Vector();
> +    private Resources rcs = null;
>  
>      /**
>       * Set the name of a single file to be removed.
> @@ -177,6 +203,10 @@
>       * @param rc the filesystem-only ResourceCollection.
>       */
>      public void add(ResourceCollection rc) {
> +        if (rc == null) {
> +            return;
> +        }
> +        rcs = (rcs == null) ? new Resources() : rcs;
>          rcs.add(rc);
>      }
>  
> @@ -467,7 +497,7 @@
>                  + "Use a nested fileset element instead.");
>          }
>  
> -        if (file == null && dir == null && filesets.size() == 0 && rcs.size() == 0) {
> +        if (file == null && dir == null && filesets.size() == 0 && rcs == null) {
>              throw new BuildException("At least one of the file or dir "
>                                       + "attributes, or a nested resource collection, "
>                                       + "must be set.");
> @@ -489,14 +519,7 @@
>                      log("Deleting: " + file.getAbsolutePath());
>  
>                      if (!delete(file)) {
> -                        String message = "Unable to delete file "
> -                            + file.getAbsolutePath();
> -                        if (failonerror) {
> -                            throw new BuildException(message);
> -                        } else {
> -                            log(message, quiet ? Project.MSG_VERBOSE
> -                                               : Project.MSG_WARN);
> -                        }
> +                        handle("Unable to delete file " + file.getAbsolutePath());
>                      }
>                  }
>              } else {
> @@ -521,50 +544,80 @@
>              }
>              removeDir(dir);
>          }
> -        Path p = new Path(getProject());
> -        p.addAll(rcs);
> +        Resources resourcesToDelete = new Resources();
> +        resourcesToDelete.setProject(getProject());
> +        Resources filesetDirs = new Resources();
> +        filesetDirs.setProject(getProject());
> +
>          for (int i = 0; i < filesets.size(); i++) {
>              FileSet fs = (FileSet) filesets.get(i);
> -            p.add(includeEmpty ? new BCFileSet(fs) : fs);
> +            resourcesToDelete.add(fs);
> +            if (includeEmpty) {
> +              filesetDirs.add(new ReverseDirs(fs.getDir(),
> +                  fs.getDirectoryScanner().getIncludedDirectories()));
> +            }
>          }
>          if (usedMatchingTask && dir != null) {
>              //add the files from the default fileset:
>              FileSet implicit = getImplicitFileSet();
> -            p.add(includeEmpty ? new BCFileSet(implicit) : implicit);
> +            resourcesToDelete.add(implicit);
> +            if (includeEmpty) {
> +              filesetDirs.add(new ReverseDirs(dir,
> +                  implicit.getDirectoryScanner().getIncludedDirectories()));
> +            }
> +        }
> +        resourcesToDelete.add(filesetDirs);
> +        if (rcs != null) {
> +            // sort first to files, then dirs
> +            Restrict exists = new Restrict();
> +            exists.add(EXISTS);
> +            exists.add(rcs);
> +            Sort s = new Sort();
> +            s.add(REVERSE_FILESYSTEM);
> +            s.add(exists);
> +            resourcesToDelete.add(s);
>          }
> -        Restrict exists = new Restrict();
> -        exists.add(EXISTS);
> -        exists.add(p);
> -        // delete the files in the resource collections; sort to files, then dirs
> -        Sort s = new Sort();
> -        s.add(REVERSE_FILESYSTEM);
> -        s.add(exists);
> -        String errorMessage = null;
>          try {
> -            for (Iterator iter = s.iterator(); iter.hasNext();) {
> -                FileResource r = (FileResource) iter.next();
> -                if (!(r.isDirectory()) || r.getFile().list().length == 0) {
> -                    log("Deleting " + r, verbosity);
> -                    if (!delete(r.getFile())) {
> -                        errorMessage = "Unable to delete "
> -                            + (r.isDirectory() ? "directory " : "file ") + r;
> +            if (resourcesToDelete.isFilesystemOnly()) {
> +                for (Iterator iter = resourcesToDelete.iterator(); iter.hasNext();) {
> +                    FileResource r = (FileResource) iter.next();
> +                    // nonexistent resources could only occur if we already
> +                    // deleted something from a fileset:
> +                    if (!r.isExists()) {
> +                        continue;
> +                    }
> +                    if (!(r.isDirectory()) || r.getFile().list().length == 0) {
> +                        log("Deleting " + r, verbosity);
> +                        if (!delete(r.getFile()) && failonerror) {
> +                            handle("Unable to delete "
> +                                + (r.isDirectory() ? "directory " : "file ") + r);
> +                        }
>                      }
>                  }
> +            } else {
> +                 handle(getTaskName() + " handles only filesystem resources");
>              }
>          } catch (Exception e) {
> -            errorMessage = e.getMessage();
> -        }
> -        if (errorMessage != null) {
> -            if (failonerror) {
> -                throw new BuildException(errorMessage);
> -            }
> -            log(errorMessage, quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
> +            handle(e);
>          }
>      }
>  
>  //************************************************************************
>  //  protected and private methods
>  //************************************************************************
> +
> +    private void handle(String msg) {
> +        handle(new BuildException(msg));
> +    }
> +
> +    private void handle(Exception e) {
> +        if (failonerror) {
> +            throw (e instanceof BuildException)
> +                ? (BuildException) e : new BuildException(e);
> +        }
> +        log(e.getMessage(), quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
> +    }
> +
>      /**
>       * Accommodate Windows bug encountered in both Sun and IBM JDKs.
>       * Others possible. If the delete does not work, call System.gc(),
> @@ -613,27 +666,13 @@
>              } else {
>                  log("Deleting " + f.getAbsolutePath(), verbosity);
>                  if (!delete(f)) {
> -                    String message = "Unable to delete file "
> -                        + f.getAbsolutePath();
> -                    if (failonerror) {
> -                        throw new BuildException(message);
> -                    } else {
> -                        log(message,
> -                            quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
> -                    }
> +                    handle("Unable to delete file " + f.getAbsolutePath());
>                  }
>              }
>          }
>          log("Deleting directory " + d.getAbsolutePath(), verbosity);
>          if (!delete(d)) {
> -            String message = "Unable to delete directory "
> -                + dir.getAbsolutePath();
> -            if (failonerror) {
> -                throw new BuildException(message);
> -            } else {
> -                log(message,
> -                    quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
> -            }
> +            handle("Unable to delete directory " + dir.getAbsolutePath());
>          }
>      }
>  
> @@ -652,14 +691,7 @@
>                  File f = new File(d, files[j]);
>                  log("Deleting " + f.getAbsolutePath(), verbosity);
>                  if (!delete(f)) {
> -                    String message = "Unable to delete file "
> -                        + f.getAbsolutePath();
> -                    if (failonerror) {
> -                        throw new BuildException(message);
> -                    } else {
> -                        log(message,
> -                            quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
> -                    }
> +                    handle("Unable to delete file " + f.getAbsolutePath());
>                  }
>              }
>          }
> @@ -672,14 +704,8 @@
>                  if (dirFiles == null || dirFiles.length == 0) {
>                      log("Deleting " + currDir.getAbsolutePath(), verbosity);
>                      if (!delete(currDir)) {
> -                        String message = "Unable to delete directory "
> -                                + currDir.getAbsolutePath();
> -                        if (failonerror) {
> -                            throw new BuildException(message);
> -                        } else {
> -                            log(message,
> -                                quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
> -                        }
> +                        handle("Unable to delete directory "
> +                                + currDir.getAbsolutePath());
>                      } else {
>                          dirCount++;
>                      }
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
> For additional commands, e-mail: dev-help@ant.apache.org
>   

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org