Hi everybody,
 
I got lock this week with Ant trying to execute something on a list of file ..
I found no way actually to decompose a FileSet and I had to go thru an execon on a batch file that calls ant on the same build.xml (yuuk !).
 
example: put an ejb.properties in the root of each of your ejb bean, call antcallon that will seek those files ant execute a the deploy target giving it the path to the ejb.properties files that it found.
 
I give you here the documentation and the code I did (or merge from antcall and execon).
 
Please tell me what you think about it, and sorry in advance if it is completely irrelevant because I just joined this mailing list.
 
Guillaume BINET.
 

AntCallOn

Description

Call repetitively target enumerating one by one the files contained in filesets.

The files and/or directories of a number of FileSets are passed in a specified property to the system command. At least one nested <fileset> is required.

Parameters

Attribute Description Required
target the target you want to call Yes
property the property in which you want to pass the current file Yes
type One of file, dir or both. If set to file, only the names of plain files will be sent to the command. If set to dir, only the names of directories are considered. No, default is file

Parameters specified as nested elements

fileset

You can use any number of nested <fileset> elements to define the files for this task and refer to <fileset>s defined elsewhere.

Examples

<antcallon target="deploy" property="currPropFile">
  <fileset dir="/sources">
    <patternset>
      <include name="**/ejb.properties" />
    </patternset>
  </fileset>
</execon>
<!-- ... -->
<target name="deploy">

<property file="${currPropFile}"/>
<!-- execute something according to the given properties set in the current ejb.properties -->
</target>
 

invokes deploy for all files below /sources that are named ebj.properties adding the absolute filenames and passes it thru the property currPropFile.


 
package org.apache.tools.ant.taskdefs;
import org.apache.tools.ant.*;
import org.apache.tools.ant.types.*;
import java.util.Vector;
import java.io.File;
import java.io.IOException;
public class AntCallOn extends Task
{
   protected Vector filesets = new Vector();
   protected String type = "file";
   private Ant callee;
   private String subTarget;
   private String propertyToSet;
   /**
    * Adds a set of files (nested fileset attribute).
    */
   public void addFileset(FileSet set)
   {
      filesets.addElement(set);
   }
   /**
     * Shall the command work only on files, directories or both?
     */
   public void setType(FileDirBoth type)
   {
      this.type = type.getValue();
   }
   // The setter for the "property" attribute
   public void setProperty(String propertyName)
   {
      this.propertyToSet = propertyName;
   }
   protected void checkConfiguration()
   {
      if( subTarget == null )
      {
         throw new BuildException("Attribute target is required.",
                                  location);
      }
      if( filesets.size() == 0 )
      {
         throw new BuildException("no filesets specified", location);
      }
      if( subTarget == null )
      {
         throw new BuildException("Attribute target is required.",
                                  location);
      }
   }
   /**
    * Enumerated attribute with the values "file", "dir" and "both"
    * for the type attribute. 
    */
   public static class FileDirBoth extends EnumeratedAttribute
   {
      public String[] getValues()
      {
         return new String[] {"file", "dir", "both"};
      }
   }
   public void init()
   {
     
   }
   public void execute()
   {
           
      checkConfiguration();
      Vector v = new Vector();
      for( int i=0; i<filesets.size(); i++ )
      {
         FileSet fs = (FileSet) filesets.elementAt(i);
         DirectoryScanner ds = fs.getDirectoryScanner(project);
 
         if( !"dir".equals(type) )
         {
            String[] s = ds.getIncludedFiles();
            for( int j=0; j<s.length; j++ )
            {
               v.addElement(new File(fs.getDir(project), s[j]).getAbsolutePath());
            }
         }
 
         if( !"file".equals(type) )
         {
            String[] s = ds.getIncludedDirectories();
            for( int j=0; j<s.length; j++ )
            {
               v.addElement(new File(fs.getDir(project), s[j]).getAbsolutePath());
            }
         }
      }
      String[] s = new String[v.size()];
      v.copyInto(s);
      for( int i=0; i<s.length; i++ )
      {
         project.setProperty(propertyToSet,s[i]);
        
         callee = (Ant) project.createTask("ant");
         callee.setOwningTarget(target);
         callee.setTaskName(getTaskName());
         callee.setLocation(location);
         callee.init();callee.setDir(project.getBaseDir());
         callee.setAntfile(project.getProperty("ant.file"));
         callee.setTarget(subTarget);
         callee.execute();
      }
    
   }
   public void setTarget(String target)
   {
      subTarget = target;
   }
}