Author: bodewig
Date: Wed Sep 28 11:48:41 2005
New Revision: 292251

URL: http://svn.apache.org/viewcvs?rev=292251&view=rev
Log:
resource collection support for apply and friends

Modified:
    ant/core/trunk/docs/manual/CoreTasks/apply.html
    ant/core/trunk/docs/manual/CoreTasks/chmod.html
    ant/core/trunk/docs/manual/OptionalTasks/attrib.html
    ant/core/trunk/docs/manual/OptionalTasks/chgrp.html
    ant/core/trunk/docs/manual/OptionalTasks/chown.html
    ant/core/trunk/src/etc/testcases/taskdefs/exec/apply.xml
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java
    
ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ExecuteOnTest.java

Modified: ant/core/trunk/docs/manual/CoreTasks/apply.html
URL: 
http://svn.apache.org/viewcvs/ant/core/trunk/docs/manual/CoreTasks/apply.html?rev=292251&r1=292250&r2=292251&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/CoreTasks/apply.html (original)
+++ ant/core/trunk/docs/manual/CoreTasks/apply.html Wed Sep 28 11:48:41 2005
@@ -16,12 +16,16 @@
 <p>Executes a system command. When the <i>os</i> attribute is specified, then
 the command is only executed when Ant is run on one of the specified operating
 systems.</p>
-<p>The files and/or directories of a number of
+
+<p>The files and/or directories of a number of <a
+href="../CoreTypes/resources.html#collection">Resource Collection</a>s
+&ndash; including but not restricted to
  <a href="../CoreTypes/fileset.html">FileSet</a>s,
  <a href="../CoreTypes/dirset.html">DirSet</a>s
  (<em>since&nbsp;Ant&nbsp;1.6</em>) or
  <a href="../CoreTypes/filelist.html">FileList</a>s
  (<em>since&nbsp;Ant&nbsp;1.6</em>)
+&ndash;
  are passed as arguments to the system command.</p>
 <p>If you specify a nested <a href="../CoreTypes/mapper.html">mapper</a>,
 the timestamp of each source file is compared to the timestamp of a
@@ -283,6 +287,12 @@
 <p>You can use any number of nested <code>&lt;dirset&gt;</code>
 elements to define the directories for this task and refer to
 <code>&lt;dirset&gt;</code>s defined elsewhere.</p>
+
+<h4>Any other <a href="../CoreTypes/resources.html#collection">Resource
+Collection</a></h4>
+<p><em>since Ant 1.7</em></p> 
+<p>You can use any number of nested resource collections.</p>
+
 <h4>mapper</h4>
 <p>A single <code>&lt;mapper&gt;</code> specifies the target files relative
 to the <code>dest</code> attribute for dependency checking. If the
@@ -385,6 +395,17 @@
 <code>&lt;outputmapper&gt;</code> nested in a <code>&lt;redirector&gt;</code>, 
which in turn is
 nested beneath this <code>&lt;apply&gt;</code> instance.  This allows us to 
perform
 dependency checking against output files--the target files in this case.
+<blockquote><pre>
+&lt;apply executable="ls" parallel="true"
+       force="true" dest="${basedir}" append="true" type="both"&gt;
+  &lt;path&gt;
+    &lt;pathelement path="${env.PATH}"/&gt;
+  &lt;/path&gt;
+  &lt;identitymapper/&gt;
+&lt;/apply&gt;
+</pre></blockquote>
+Applies the "ls" executable to all directories in the PATH, effectively
+listing all executables that are available on the PATH.
 
 <hr><p align="center">Copyright &copy; 2000-2005 The Apache Software 
Foundation. All rights
 Reserved.</p>

Modified: ant/core/trunk/docs/manual/CoreTasks/chmod.html
URL: 
http://svn.apache.org/viewcvs/ant/core/trunk/docs/manual/CoreTasks/chmod.html?rev=292251&r1=292250&r2=292251&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/CoreTasks/chmod.html (original)
+++ ant/core/trunk/docs/manual/CoreTasks/chmod.html Wed Sep 28 11:48:41 2005
@@ -26,6 +26,10 @@
 <p>Starting with Ant 1.6, this task also supports nested <a
 href="../CoreTypes/filelist.html">filelist</a>s.</p>
 
+<p>Starting with Ant 1.7, this task supports arbitrary <a
+href="../CoreTypes/resources.html#collection">Resource Collection</a>s
+as nested elements.</p>
+
 <p>By default this task will use a single invocation of the underlying
 chmod command.  If you are working on a large number of files this may
 result in a command line that is too long for your operating system.

Modified: ant/core/trunk/docs/manual/OptionalTasks/attrib.html
URL: 
http://svn.apache.org/viewcvs/ant/core/trunk/docs/manual/OptionalTasks/attrib.html?rev=292251&r1=292250&r2=292251&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/OptionalTasks/attrib.html (original)
+++ ant/core/trunk/docs/manual/OptionalTasks/attrib.html Wed Sep 28 11:48:41 
2005
@@ -23,6 +23,10 @@
 nested <code>&lt;fileset&gt;</code>, <code>&lt;dirset&gt;</code> and 
 <code>&lt;filelist&gt;</code> elements.</p>
 
+<p>Starting with Ant 1.7, this task supports arbitrary <a
+href="../CoreTypes/resources.html#collection">Resource Collection</a>s
+as nested elements.</p>
+
 <p>By default this task will use a single invocation of the underlying
 attrib command.  If you are working on a large number of files this
 may result in a command line that is too long for your operating

Modified: ant/core/trunk/docs/manual/OptionalTasks/chgrp.html
URL: 
http://svn.apache.org/viewcvs/ant/core/trunk/docs/manual/OptionalTasks/chgrp.html?rev=292251&r1=292250&r2=292251&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/OptionalTasks/chgrp.html (original)
+++ ant/core/trunk/docs/manual/OptionalTasks/chgrp.html Wed Sep 28 11:48:41 2005
@@ -23,6 +23,10 @@
 nested <code>&lt;fileset&gt;</code>, <code>&lt;dirset&gt;</code> and 
 <code>&lt;filelist&gt;</code> elements.</p>
 
+<p>Starting with Ant 1.7, this task supports arbitrary <a
+href="../CoreTypes/resources.html#collection">Resource Collection</a>s
+as nested elements.</p>
+
 <p>By default this task will use a single invocation of the underlying
 chgrp command.  If you are working on a large number of files this may
 result in a command line that is too long for your operating system.

Modified: ant/core/trunk/docs/manual/OptionalTasks/chown.html
URL: 
http://svn.apache.org/viewcvs/ant/core/trunk/docs/manual/OptionalTasks/chown.html?rev=292251&r1=292250&r2=292251&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/OptionalTasks/chown.html (original)
+++ ant/core/trunk/docs/manual/OptionalTasks/chown.html Wed Sep 28 11:48:41 2005
@@ -23,6 +23,9 @@
 nested <code>&lt;fileset&gt;</code>, <code>&lt;dirset&gt;</code> and 
 <code>&lt;filelist&gt;</code> elements.</p>
 
+<p>Starting with Ant 1.7, this task supports arbitrary <a
+href="../CoreTypes/resources.html#collection">Resource Collection</a>s
+as nested elements.</p>
 
 <p>By default this task will use a single invocation of the underlying
 chown command.  If you are working on a large number of files this may

Modified: ant/core/trunk/src/etc/testcases/taskdefs/exec/apply.xml
URL: 
http://svn.apache.org/viewcvs/ant/core/trunk/src/etc/testcases/taskdefs/exec/apply.xml?rev=292251&r1=292250&r2=292251&view=diff
==============================================================================
--- ant/core/trunk/src/etc/testcases/taskdefs/exec/apply.xml (original)
+++ ant/core/trunk/src/etc/testcases/taskdefs/exec/apply.xml Wed Sep 28 
11:48:41 2005
@@ -31,6 +31,17 @@
                 <isset property="echo.exe.executable"/>
             </or>
         </condition>
+
+        <!-- UNIX -->
+        <available file="ls" filepath="${env.PATH}" property="ls.executable"/>
+        <!-- CYGWIN -->
+        <available file="ls.exe" filepath="${env.PATH}" 
property="ls.exe.executable"/>
+        <condition property="ls.can.run">
+            <or>
+                <isset property="ls.executable"/>
+                <isset property="ls.exe.executable"/>
+            </or>
+        </condition>
     </target>
 
     <target name="xyz">
@@ -394,6 +405,7 @@
 
         <ekko outputproperty="foo" />
         <ekko outputproperty="bar" force="true" />
+
         <fail>
             <condition>
                 <not>
@@ -426,6 +438,26 @@
           </or>
         </condition>
       </fail>
+    </target>
+
+    <target name="lsPath" depends="init" if="ls.can.run">
+      <apply executable="ls" parallel="false" outputproperty="foo"
+             force="true" dest="${basedir}" append="true" type="both">
+        <path>
+          <pathelement path="${env.PATH}"/>
+        </path>
+        <identitymapper/>
+      </apply>
+    </target>
+
+    <target name="lsPathParallel" depends="init" if="ls.can.run">
+      <apply executable="ls" parallel="true" outputproperty="foo"
+             force="true" dest="${basedir}" append="true" type="both">
+        <path>
+          <pathelement path="${env.PATH}"/>
+        </path>
+        <identitymapper/>
+      </apply>
     </target>
 
     <target name="cleanup">

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java
URL: 
http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java?rev=292251&r1=292250&r2=292251&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java 
(original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java Wed 
Sep 28 11:48:41 2005
@@ -20,6 +20,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.Hashtable;
+import java.util.Iterator;
 import java.util.Vector;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.DirectoryScanner;
@@ -31,6 +32,10 @@
 import org.apache.tools.ant.types.FileList;
 import org.apache.tools.ant.types.FileSet;
 import org.apache.tools.ant.types.Mapper;
+import org.apache.tools.ant.types.Resource;
+import org.apache.tools.ant.types.ResourceCollection;
+import org.apache.tools.ant.types.resources.FileResource;
+import org.apache.tools.ant.types.resources.Union;
 import org.apache.tools.ant.util.FileNameMapper;
 import org.apache.tools.ant.util.SourceFileScanner;
 
@@ -43,13 +48,20 @@
  */
 public class ExecuteOn extends ExecTask {
 
+    // filesets has been protected so we need to keep that even after
+    // switching to resource collections.  In fact, they will still
+    // get a different treatment form the other resource collections
+    // even in execute since we have some subtle special features like
+    // switching type to "dir" when we encounter a DirSet that would
+    // be more difficult to achieve otherwise.
+
     protected Vector filesets = new Vector(); // contains AbstractFileSet
                                               // (both DirSet and FileSet)
-    private Vector filelists = new Vector();
+    private Union resources = new Union();
     private boolean relative = false;
     private boolean parallel = false;
     private boolean forwardSlash = false;
-    protected String type = "file";
+    protected String type = FileDirBoth.FILE;
     protected Commandline.Marker srcFilePos = null;
     private boolean skipEmpty = false;
     protected Commandline.Marker targetFilePos = null;
@@ -91,7 +103,18 @@
      * @param list the FileList to add.
      */
     public void addFilelist(FileList list) {
-        filelists.addElement(list);
+       add(list);
+    }
+
+    /**
+     * Add a collection of resources upon which to operate.
+     * @param rc resource collection to add.
+     * @since Ant 1.7
+     */
+    public void add(ResourceCollection rc) {
+       if (rc instanceof FileSet)
+           throw new BuildException("Huh?");
+       resources.add(rc);
     }
 
     /**
@@ -273,8 +296,8 @@
             log("!! execon is deprecated. Use apply instead. !!");
         }
         super.checkConfiguration();
-        if (filesets.size() == 0 && filelists.size() == 0) {
-            throw new BuildException("no filesets and no filelists specified",
+        if (filesets.size() == 0 && resources.size() == 0) {
+            throw new BuildException("no resources specified",
                                      getLocation());
         }
         if (targetFilePos != null && mapperElement == null) {
@@ -326,19 +349,19 @@
                 String currentType = type;
                 AbstractFileSet fs = (AbstractFileSet) filesets.elementAt(i);
                 if (fs instanceof DirSet) {
-                    if (!"dir".equals(type)) {
+                    if (!FileDirBoth.DIR.equals(type)) {
                         log("Found a nested dirset but type is " + type + ". "
                             + "Temporarily switching to type=\"dir\" on the"
                             + " assumption that you really did mean"
                             + " <dirset> not <fileset>.", Project.MSG_DEBUG);
-                        currentType = "dir";
+                        currentType = FileDirBoth.DIR;
                     }
                 }
                 File base = fs.getDir(getProject());
 
                 DirectoryScanner ds = fs.getDirectoryScanner(getProject());
 
-                if (!"dir".equals(currentType)) {
+                if (!FileDirBoth.DIR.equals(currentType)) {
                     String[] s = getFiles(base, ds);
                     for (int j = 0; j < s.length; j++) {
                         totalFiles++;
@@ -346,7 +369,7 @@
                         baseDirs.addElement(base);
                     }
                 }
-                if (!"file".equals(currentType)) {
+                if (!FileDirBoth.FILE.equals(currentType)) {
                     String[] s = getDirs(base, ds);
                     for (int j = 0; j < s.length; j++) {
                         totalDirs++;
@@ -356,9 +379,9 @@
                 }
                 if (fileNames.size() == 0 && skipEmpty) {
                     int includedCount
-                        = ((!"dir".equals(currentType))
+                        = ((!FileDirBoth.DIR.equals(currentType))
                         ? ds.getIncludedFilesCount() : 0)
-                        + ((!"file".equals(currentType))
+                        + ((!FileDirBoth.FILE.equals(currentType))
                         ? ds.getIncludedDirsCount() : 0);
 
                     log("Skipping fileset for directory " + base + ". It is "
@@ -392,68 +415,67 @@
                     baseDirs.removeAllElements();
                 }
             }
-            for (int i = 0; i < filelists.size(); i++) {
-                FileList list = (FileList) filelists.elementAt(i);
-                File base = list.getDir(getProject());
-                String[] names = getFilesAndDirs(list);
-
-                for (int j = 0; j < names.length; j++) {
-                    File f = new File(base, names[j]);
-                    if ((!ignoreMissing) || (f.isFile() && !"dir".equals(type))
-                        || (f.isDirectory() && !"file".equals(type))) {
+       
+           Iterator iter = resources.iterator();
+           while (iter.hasNext()) {
+               Resource res = (Resource) iter.next();
+
+               if (!res.isExists() && ignoreMissing) {
+                   continue;
+               }
+
+               File base = null;
+               String name = res.getName();
+               if (res instanceof FileResource) {
+                   FileResource fr = (FileResource) res;
+                   base = fr.getBaseDir();
+                   if (base == null) {
+                       name = fr.getFile().getAbsolutePath();
+                   }
+               }
+
+               if (restrict(new String[] {name}, base).length == 0) {
+                   continue;
+               }
+
+               if ((!res.isDirectory() || !res.isExists())
+                   && !FileDirBoth.DIR.equals(type)) {
+                   totalFiles++;
+               } else if (res.isDirectory() && !FileDirBoth.FILE.equals(type)) 
{
+                   totalDirs++;
+               } else {
+                   continue;
+               }
 
-                        if (ignoreMissing || f.isFile()) {
-                            totalFiles++;
-                        } else {
-                            totalDirs++;
-                        }
-                        fileNames.addElement(names[j]);
-                        baseDirs.addElement(base);
-                    }
-                }
-                if (fileNames.size() == 0 && skipEmpty) {
-                    DirectoryScanner ds = new DirectoryScanner();
-                    ds.setBasedir(base);
-                    ds.setIncludes(list.getFiles(getProject()));
-                    ds.scan();
-                    int includedCount
-                        = ds.getIncludedFilesCount() + 
ds.getIncludedDirsCount();
+               baseDirs.add(base);
+               fileNames.add(name);
 
-                    log("Skipping filelist for directory " + base + ". It is "
-                        + ((includedCount > 0) ? "up to date." : "empty."),
-                        Project.MSG_INFO);
-                    continue;
-                }
                 if (!parallel) {
-                    String[] s = new String[fileNames.size()];
-                    fileNames.copyInto(s);
-                    for (int j = 0; j < s.length; j++) {
-                        String[] command = getCommandline(s[j], base);
-                        log(Commandline.describeCommand(command),
-                            Project.MSG_VERBOSE);
-                        exe.setCommandline(command);
-
-                        if (redirectorElement != null) {
-                            setupRedirector();
-                            redirectorElement.configure(redirector, s[j]);
-                        }
-                        if (redirectorElement != null || haveExecuted) {
-                            // need to reset the stream handler to restart
-                            // reading of pipes;
-                            // go ahead and do it always w/ nested redirectors
-                            exe.setStreamHandler(redirector.createHandler());
-                        }
-                        runExecute(exe);
-                        haveExecuted = true;
-                    }
-                    fileNames.removeAllElements();
-                    baseDirs.removeAllElements();
-                }
+                   String[] command = getCommandline(name, base);
+                   log(Commandline.describeCommand(command),
+                       Project.MSG_VERBOSE);
+                   exe.setCommandline(command);
+
+                   if (redirectorElement != null) {
+                       setupRedirector();
+                       redirectorElement.configure(redirector, name);
+                   }
+                   if (redirectorElement != null || haveExecuted) {
+                       // need to reset the stream handler to restart
+                       // reading of pipes;
+                       // go ahead and do it always w/ nested redirectors
+                       exe.setStreamHandler(redirector.createHandler());
+                   }
+                   runExecute(exe);
+                   haveExecuted = true;
+                   fileNames.removeAllElements();
+                   baseDirs.removeAllElements();
+               }
             }
             if (parallel && (fileNames.size() > 0 || !skipEmpty)) {
                 runParallel(exe, fileNames, baseDirs);
                 haveExecuted = true;
-            }
+           }
             if (haveExecuted) {
                 log("Applied " + cmdl.getExecutable() + " to "
                     + totalFiles + " file"
@@ -697,11 +719,13 @@
      * for the type attribute.
      */
     public static class FileDirBoth extends EnumeratedAttribute {
+       public static final String FILE = "file";
+       public static final String DIR = "dir";
         /**
          * @see EnumeratedAttribute#getValues
          */
         public String[] getValues() {
-            return new String[] {"file", "dir", "both"};
+            return new String[] {FILE, DIR, "both"};
         }
     }
 }

Modified: 
ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ExecuteOnTest.java
URL: 
http://svn.apache.org/viewcvs/ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ExecuteOnTest.java?rev=292251&r1=292250&r2=292251&view=diff
==============================================================================
--- 
ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ExecuteOnTest.java 
(original)
+++ 
ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ExecuteOnTest.java 
Wed Sep 28 11:48:41 2005
@@ -31,6 +31,7 @@
 public class ExecuteOnTest extends BuildFileTest {
     private static final String BUILD_PATH = 
"src/etc/testcases/taskdefs/exec/";
     private static final String BUILD_FILE = BUILD_PATH + "apply.xml";
+    private static final String LINE_SEP = 
System.getProperty("line.separator");
     
     public ExecuteOnTest(String name) {
         super(name);
@@ -560,6 +561,26 @@
 
     public void testNoDest() {
         executeTarget("testNoDest");
+    }
+
+    public void testLsPath() {
+       testLsPath("lsPath");
+    }
+
+    public void testLsPathParallel() {
+       testLsPath("lsPathParallel");
+    }
+
+    private void testLsPath(String target) {
+        executeTarget(target);
+        if (getProject().getProperty("ls.can.run") == null) {
+            return;
+        }
+       String foo = getProject().getProperty("foo");
+       assertNotNull(foo);
+       int indNoExt = foo.indexOf("ls" + LINE_SEP);
+       int indExe = foo.indexOf("ls.exe" + LINE_SEP);
+       assertTrue(indNoExt >= 0 || indExe >= 0);
     }
 
     //borrowed from TokenFilterTest



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to