I thought they felt wrong too so I have implemented FilterSets.

Moved all the code from around to a new FilterSet type.
(out or project/filter task etc)

Is backwards compatible with the filter task but has deprecation warnings.

Can also use the filtersets to process the logs coming out of compilers. :)
(when copying sources and then compiling one needs to have the error messages 
appearing in 
the right place.)
eg copy srcs from source tree to build/src
compile but error message are relative to build/src not source/home so...

<javac
  srcdir="build/src"...>
 <filterset>
  <filter token="build/src" value="source/home"/>
 </filterset>
</javac>

now error messages are relative to source/home after filtering :)

On 9 Mar 2001, at 8:57, Barrie Treloar wrote:

> On 8 Mar 2001, Stefan Bodewig wrote:
> 
> > >From the Ant2 wish list:
> > 
> > | * make usage of particular filters/filtersets explicit in copy tasks
Done.

use them like this...

<copy blah>
 <filterset>
   <filter token="blah" value="foo"/>
</filterset>
</copy>

Also can use attribute filtersfile in filterset but not nested element yet.

Am a little tired now so will do the documentation tomorrow.

Michael

p.s. This also includes the conditional patch I supplied earlier for the Exit 
task.

? ConditionalExit.patch
? test.xml
? FilterSet.patch
? lib/jakarta-ant-1.3-optional.jar
? src/main/org/apache/tools/ant/types/FilterSet.java
Index: build.xml
===================================================================
RCS file: /home/cvs/jakarta-ant/build.xml,v
retrieving revision 1.142
diff -c -r1.142 build.xml
*** build.xml   2001/03/09 11:45:11     1.142
--- build.xml   2001/03/14 13:00:40
***************
*** 181,186 ****
--- 181,187 ----
        <exclude name="${optional.package}/NetRexxC.java" 
unless="netrexx.present" />
        <exclude name="${optional.package}/XslpLiaison.java" 
unless="xslp.present" />
        <exclude name="${optional.package}/XalanLiaison.java" 
unless="xalan.present" />
+       <exclude name="${optional.package}/TraXLiaison.java" 
unless="xalan.present" />
        <exclude name="${optional.package}/ejb/Ejbc*.java" 
unless="ejb.ejbc.present" />
        <exclude name="${optional.package}/ejb/DDCreator*.java" 
unless="ejb.DDCreator.present" />
        <exclude name="${optional.package}/ejb/WLRun.java" 
unless="ejb.wls.present" />
***************
*** 207,222 ****
        </fileset>
      </copy>
  
-     <filter token="VERSION" value="${version}" />
-     <filter token="DATE" value="${TODAY}" />
-     <filter token="TIME" value="${TSTAMP}" />
      <copy    todir="${build.classes}" 
!              overwrite="true"
!              filtering="on">
        <fileset dir="${java.dir}">
          <include name="**/version.txt" />
          <include name="**/defaultManifest.mf" />
        </fileset>
      </copy>
  
      <copy todir="${build.classes}/${optional.package}/junit">
--- 208,224 ----
        </fileset>
      </copy>
  
      <copy    todir="${build.classes}" 
!              overwrite="true">
        <fileset dir="${java.dir}">
          <include name="**/version.txt" />
          <include name="**/defaultManifest.mf" />
        </fileset>
+       <filterset>
+         <filter token="VERSION" value="${version}" />
+         <filter token="DATE" value="${TODAY}" />
+         <filter token="TIME" value="${TSTAMP}" />
+       </filterset>
      </copy>
  
      <copy todir="${build.classes}/${optional.package}/junit">
Index: src/main/org/apache/tools/ant/IntrospectionHelper.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/IntrospectionHelper.java,v
retrieving revision 1.13
diff -c -r1.13 IntrospectionHelper.java
*** src/main/org/apache/tools/ant/IntrospectionHelper.java      2001/01/20 
13:41:56     1.13
--- src/main/org/apache/tools/ant/IntrospectionHelper.java      2001/03/14 
13:04:20
***************
*** 227,233 ****
              as.set(p, element, value);
          } catch (IllegalAccessException ie) {
              // impossible as getMethods should only return public methods
!             throw new BuildException(ie);
          } catch (InvocationTargetException ite) {
              Throwable t = ite.getTargetException();
              if (t instanceof BuildException) {
--- 227,235 ----
              as.set(p, element, value);
          } catch (IllegalAccessException ie) {
              // impossible as getMethods should only return public methods
!             throw new BuildException( "Impossible as getMethods should only 
return public methods " + 
!                     attributeName + 
!                     ": Actuall does happen if you have a public method on a 
private inner class", ie );
          } catch (InvocationTargetException ite) {
              Throwable t = ite.getTargetException();
              if (t instanceof BuildException) {
Index: src/main/org/apache/tools/ant/Project.java
===================================================================
RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/Project.java,v
retrieving revision 1.55
diff -c -r1.55 Project.java
*** src/main/org/apache/tools/ant/Project.java  2001/03/13 14:15:21     1.55
--- src/main/org/apache/tools/ant/Project.java  2001/03/14 13:04:20
***************
*** 54,59 ****
--- 54,61 ----
  
  package org.apache.tools.ant;
  
+ import org.apache.tools.ant.types.FilterSet;
+ 
  import java.io.*;
  import java.util.*;
  import java.text.*;
***************
*** 68,73 ****
--- 70,76 ----
   * file paths at runtime as well as defining various project properties.
   *
   * @author [EMAIL PROTECTED]
+  * @author    <A href="[EMAIL PROTECTED]">Michael McCallum</A>
   */
  
  public class Project {
***************
*** 90,98 ****
      public static final String JAVA_1_2 = "1.2";
      public static final String JAVA_1_3 = "1.3";
  
-     public static final String TOKEN_START = "@";
-     public static final String TOKEN_END = "@";
- 
      private String name;
  
      private Hashtable properties = new Hashtable();
--- 93,98 ----
***************
*** 102,108 ****
      private Hashtable dataClassDefinitions = new Hashtable();
      private Hashtable taskClassDefinitions = new Hashtable();
      private Hashtable targets = new Hashtable();
!     private Hashtable filters = new Hashtable();
      private File baseDir;
  
      private Vector listeners = new Vector();
--- 102,108 ----
      private Hashtable dataClassDefinitions = new Hashtable();
      private Hashtable taskClassDefinitions = new Hashtable();
      private Hashtable targets = new Hashtable();
!     private FilterSet globalFilterSet = null;
      private File baseDir;
  
      private Vector listeners = new Vector();
***************
*** 296,310 ****
          return name;
      }
  
!     public void addFilter(String token, String value) {
          if (token == null) return;
!         log("Setting token to filter: " + token + " -> "
              + value, MSG_DEBUG);
!         this.filters.put(token, value);
!     }
! 
!     public Hashtable getFilters() {
!         return filters;
      }
  
      // match basedir attribute in xml
--- 296,310 ----
          return name;
      }
  
!     public void addFilter(String token, String value, Task task) {
          if (token == null) return;
!         log("DEPRECATED user filterset - Setting token to filter: " + token + 
" -> "
              + value, MSG_DEBUG);
!         if( globalFilterSet == null ) {
!           globalFilterSet = new FilterSet( task );
!         }
!         this.globalFilterSet.addFilter( token, value );
!         
      }
  
      // match basedir attribute in xml
***************
*** 694,703 ****
       *
       * @throws IOException 
       */
!     public void copyFile(String sourceFile, String destFile, boolean 
filtering,
                           boolean overwrite, boolean preserveLastModified)
          throws IOException {
!         copyFile(new File(sourceFile), new File(destFile), filtering, 
                   overwrite, preserveLastModified);
      }
  
--- 694,703 ----
       *
       * @throws IOException 
       */
!     public void copyFile(String sourceFile, String destFile, FilterSet 
filterSet, boolean filtering,
                           boolean overwrite, boolean preserveLastModified)
          throws IOException {
!         copyFile(new File(sourceFile), new File(destFile), filterSet, 
filtering, 
                   overwrite, preserveLastModified);
      }
  
***************
*** 731,737 ****
       */
      public void copyFile(File sourceFile, File destFile, boolean filtering,
                           boolean overwrite) throws IOException {
!         copyFile(sourceFile, destFile, filtering, overwrite, false);
      }
  
      /**
--- 731,737 ----
       */
      public void copyFile(File sourceFile, File destFile, boolean filtering,
                           boolean overwrite) throws IOException {
!         copyFile(sourceFile, destFile, null, filtering, overwrite, false);
      }
  
      /**
***************
*** 743,749 ****
       *
       * @throws IOException 
       */
!     public void copyFile(File sourceFile, File destFile, boolean filtering,
                           boolean overwrite, boolean preserveLastModified)
          throws IOException {
          
--- 743,749 ----
       *
       * @throws IOException 
       */
!     public void copyFile(File sourceFile, File destFile, FilterSet filterSet, 
boolean filtering,
                           boolean overwrite, boolean preserveLastModified)
          throws IOException {
          
***************
*** 759,765 ****
                  parent.mkdirs();
              }
  
!             if (filtering) {
                  BufferedReader in = new BufferedReader(new 
FileReader(sourceFile));
                  BufferedWriter out = new BufferedWriter(new 
FileWriter(destFile));
  
--- 759,770 ----
                  parent.mkdirs();
              }
  
!             // this should be removed along with globalFilter set when 
deprecation is final.
!             if( filtering ) {
!               filterSet = globalFilterSet;
!             }
!             
!             if ( filterSet != null && filterSet.hasFilters() ) {
                  BufferedReader in = new BufferedReader(new 
FileReader(sourceFile));
                  BufferedWriter out = new BufferedWriter(new 
FileWriter(destFile));
  
***************
*** 770,776 ****
                      if (line.length() == 0) {
                          out.newLine();
                      } else {
!                         newline = replace(line, filters);
                          out.write(newline);
                          out.newLine();
                      }
--- 775,781 ----
                      if (line.length() == 0) {
                          out.newLine();
                      } else {
!                         newline = filterSet.replaceTokens( line );
                          out.write(newline);
                          out.newLine();
                      }
***************
*** 839,889 ****
          } catch (Throwable other) {
              throw new BuildException("Exception setting the modification time 
"
                                       + "of " + file, other);
-         }
-     }
- 
-     /**
-      * Does replacement on the given string using the given token table.
-      *
-      * @returns the string with the token replaced.
-      */
-     private String replace(String s, Hashtable tokens) {
-         int index = s.indexOf(TOKEN_START);
- 
-         if (index > -1) {
-             try {
-                 StringBuffer b = new StringBuffer();
-                 int i = 0;
-                 String token = null;
-                 String value = null;
- 
-                 do {
-                     int endIndex = s.indexOf(TOKEN_END, 
-                                              index + TOKEN_START.length() + 
1);
-                     if (endIndex == -1) {
-                         break;
-                     }
-                     token = s.substring(index + TOKEN_START.length(), 
endIndex);
-                     b.append(s.substring(i, index));
-                     if (tokens.containsKey(token)) {
-                         value = (String) tokens.get(token);
-                         log("Replacing: " + TOKEN_START + token + TOKEN_END + 
" -> " + value, MSG_VERBOSE);
-                         b.append(value);
-                         i = index + TOKEN_START.length() + token.length() + 
TOKEN_END.length();
-                     } else {
-                         // just append TOKEN_START and search further
-                         b.append(TOKEN_START);
-                         i = index + TOKEN_START.length();
-                     }
-                 } while ((index = s.indexOf(TOKEN_START, i)) > -1);
- 
-                 b.append(s.substring(i));
-                 return b.toString();
-             } catch (StringIndexOutOfBoundsException e) {
-                 return s;
-             }
-         } else {
-             return s;
          }
      }
  
--- 844,849 ----
Index: src/main/org/apache/tools/ant/taskdefs/Copy.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Copy.java,v
retrieving revision 1.14
diff -c -r1.14 Copy.java
*** src/main/org/apache/tools/ant/taskdefs/Copy.java    2001/01/22 21:15:09     
1.14
--- src/main/org/apache/tools/ant/taskdefs/Copy.java    2001/03/14 13:04:21
***************
*** 73,78 ****
--- 73,79 ----
   *
   * @author Glenn McAllister <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
   * @author <a href="mailto:[EMAIL PROTECTED]">Stefan Bodewig</a>
+  * @author    <A href="[EMAIL PROTECTED]">Michael McCallum</A>
   */
  public class Copy extends Task {
      protected File file = null;     // the source file 
***************
*** 91,96 ****
--- 92,98 ----
      protected Hashtable dirCopyMap = new Hashtable();
  
      protected Mapper mapperElement = null;
+     protected FilterSet filterSet = null;
  
      /**
       * Sets a single source file to copy.
***************
*** 124,133 ****
--- 126,153 ----
       * Sets filtering.
       */
      public void setFiltering(boolean filtering) {
+         log( "*** DEPRECATED use filtersets instead", Project.MSG_ERR ); 
          this.filtering = filtering;
      }
  
      /**
+      * Maybe creates a nested classpath element.
+      */
+     public FilterSet createFilterset() {
+         if (filterSet == null) {
+           filterSet = new FilterSet( this );
+         }
+         return filterSet;
+     }
+     
+     /**
+      * Set the a filter
+      */
+     public FilterSet getFilterSet() {
+       return filterSet;
+     }
+     
+     /**
       * Overwrite any existing destination file(s).
       */
      public void setOverwrite(boolean overwrite) {
***************
*** 333,340 ****
                      log("Copying " + fromFile + " to " + toFile, verbosity);
                      
                      project.copyFile(fromFile, 
!                                      toFile, 
!                                      filtering, 
                                       forceOverwrite,
                                       preserveLastModified);
                  } catch (IOException ioe) {
--- 353,361 ----
                      log("Copying " + fromFile + " to " + toFile, verbosity);
                      
                      project.copyFile(fromFile, 
!                                      toFile,
!                                      filterSet,
!                                      filtering,
                                       forceOverwrite,
                                       preserveLastModified);
                  } catch (IOException ioe) {
Index: src/main/org/apache/tools/ant/taskdefs/Exit.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Exit.java,v
retrieving revision 1.2
diff -c -r1.2 Exit.java
*** src/main/org/apache/tools/ant/taskdefs/Exit.java    2001/01/03 14:18:30     
1.2
--- src/main/org/apache/tools/ant/taskdefs/Exit.java    2001/03/14 13:04:22
***************
*** 55,79 ****
  package org.apache.tools.ant.taskdefs;
  
  import org.apache.tools.ant.*;
  
  /**
   * Just exit the active build, giving an additional message 
   * if available.
   *
   * @author Nico Seessle <[EMAIL PROTECTED]>
   */
  public class Exit extends Task { 
!     private String message;
      
!     public void setMessage(String value) { 
!         this.message = value;
      }
!     
      public void execute() throws BuildException {
!         if (message != null && message.length() > 0) { 
!             throw new BuildException(message);
!         } else {
!             throw new BuildException("No message");
          }
      }
  }
--- 55,138 ----
  package org.apache.tools.ant.taskdefs;
  
  import org.apache.tools.ant.*;
+ import java.util.Enumeration;
+ import java.util.Hashtable;
  
  /**
   * Just exit the active build, giving an additional message 
   * if available.
+  * 
+  * Can supply conditional properties.
+  * With an <Strong>if</Strong> the task will exit if the property is set.
+  * With an <Strong>unless</Strong> the task will exit if the property is not 
set.
   *
   * @author Nico Seessle <[EMAIL PROTECTED]>
+  * @author <A href="mailto:[EMAIL PROTECTED]">Michael McCallum</A>
   */
  public class Exit extends Task { 
! 
!     /** The message to display. */
!     private String message_;
! 
!     /** The if value. Will exit if this value is set. */
!     private String ifProperty_;
! 
!     /** The unless value. Will exit if this value is not set. */
!     private String unlessProperty_;
      
!     /** Test to see if the given property is set.
!     * Returns true if we should exit. That is when there is an if condition 
and the property is set.
!     * @param property The property to test.
!     * @return true if we should fail of false if we should continue. */
!     private boolean testIfProperty( String property ) {
!       // if its not set return true as we dont know if we should continue.
!       if ( property == null || property.length() == 0 ) {
!         return true;
!       }
!       return project.getProperty( property ) != null;
      }
! 
!     /** Test to see if the given property is set.
!     * Returns true if we should exit. That is when there is an unless 
condition and the property is not set.
!     * @param property The property to test. 
!     * @return true if we should fail of false if we should continue. */
!     private boolean testUnlessProperty( String property ) {
!       // if its not set return true as we dont know if we should continue.
!       if ( property == null || property.length() == 0 ) {
!         return true;
!       }
!       return project.getProperty( property ) == null;
!     }
! 
!     /** Set the message to display when executed. */
!     public void setMessage( String value ) { 
!       this.message_ = value;
!     }
! 
!     /** Set the if property. Will exit if this value is set.
!     * @param value The if value for conditional exiting. */
!     public void setIf( String value ) {
!       this.ifProperty_ = value;
!     }
! 
!     /** Set the unless property. Will exit if this value is not set.
!     * @param value The unless value for conditional exiting. */
!     public void setUnless( String value ) { 
!       this.unlessProperty_ = value;
!     }
! 
!     /** Execute this task. This will exit and print a message if the 
following conditions are met...
!     * if value is set.
!     * unless value is not set. */
      public void execute() throws BuildException {
!       if ( testUnlessProperty( unlessProperty_ ) && testIfProperty( 
ifProperty_ ) ) {
!         if ( message_ != null && message_.length() > 0 ) { 
!           throw new BuildException(message_);
!         } 
!         else {
!           throw new BuildException("No message");
          }
+       }
      }
+ 
  }
Index: src/main/org/apache/tools/ant/taskdefs/Filter.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Filter.java,v
retrieving revision 1.8
diff -c -r1.8 Filter.java
*** src/main/org/apache/tools/ant/taskdefs/Filter.java  2001/01/03 14:18:30     
1.8
--- src/main/org/apache/tools/ant/taskdefs/Filter.java  2001/03/14 13:04:22
***************
*** 9,36 ****
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
!  *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
!  *    notice, this list of conditions and the following disclaimer in
!  *    the documentation and/or other materials provided with the
!  *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
!  *    any, must include the following acknowlegement:
!  *       "This product includes software developed by the
!  *        Apache Software Foundation (http://www.apache.org/)."
!  *    Alternately, this acknowlegement may appear in the software itself,
!  *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Ant", and "Apache Software
!  *    Foundation" must not be used to endorse or promote products derived
!  *    from this software without prior written permission. For written
!  *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
!  *    nor may "Apache" appear in their names without prior written
!  *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
--- 9,36 ----
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
!  * notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
!  * notice, this list of conditions and the following disclaimer in
!  * the documentation and/or other materials provided with the
!  * distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
!  * any, must include the following acknowlegement:
!  * "This product includes software developed by the
!  * Apache Software Foundation (http://www.apache.org/)."
!  * Alternately, this acknowlegement may appear in the software itself,
!  * if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Ant", and "Apache Software
!  * Foundation" must not be used to endorse or promote products derived
!  * from this software without prior written permission. For written
!  * permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
!  * nor may "Apache" appear in their names without prior written
!  * permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
***************
*** 54,133 ****
  
  package org.apache.tools.ant.taskdefs;
  
! import java.util.Enumeration;
! import java.util.Properties;
  import java.io.File;
  import java.io.FileInputStream;
  
! import org.apache.tools.ant.*;
  
  /**
!  * This task sets a token filter that is used by the file copy methods
!  * of the project to do token substitution, or sets mutiple tokens by
!  * reading these from a file.
!  *
!  * @author Stefano Mazzocchi <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
!  * @author Gero Vermaas <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
   */
  public class Filter extends Task {
  
!     private String token;
!     private String value;
!     private File filtersFile;
!     
!     public void setToken(String token) {
!         this.token = token;
!     }
  
!     public void setValue(String value) {
!         this.value = value;
      }
  
!     public void setFiltersfile(File filtersFile) {
!         this.filtersFile = filtersFile;
      }
  
!     public void execute() throws BuildException {
!         boolean isFiltersFromFile = filtersFile != null && token == null && 
value == null;
!         boolean isSingleFilter = filtersFile == null && token != null && 
value != null;
!         
!         if (!isFiltersFromFile && !isSingleFilter) {
!             throw new BuildException("both token and value parameters, or 
only a filtersFile parameter is required", location);
!         }
!         
!         if (isSingleFilter) {
!             project.addFilter(token, value);
!         }
!         
!         if (isFiltersFromFile) {
!             readFilters();
!         }
!     }
!     
!     protected void readFilters() throws BuildException {
!         log("Reading filters from " + filtersFile, Project.MSG_VERBOSE);
!         FileInputStream in = null;
!         try {
!             Properties props = new Properties();
!             in = new FileInputStream(filtersFile);
!             props.load(in);
! 
!             Project proj = getProject();
! 
!             Enumeration enum = props.propertyNames();
!             while (enum.hasMoreElements()) {
!                 String strPropName = (String)enum.nextElement();
!                 String strValue = props.getProperty(strPropName);
!                 proj.addFilter(strPropName, strValue);
!             }
!         } catch (Exception e) {
!             throw new BuildException("Could not read filters from file: " + 
filtersFile);
!         } finally {
!             if (in != null) {
!                 try {
!                     in.close();
!                 } catch (java.io.IOException ioex) {}
!             }
!         }
      }
  }
--- 54,139 ----
  
  package org.apache.tools.ant.taskdefs;
  
! // java io
  import java.io.File;
  import java.io.FileInputStream;
+ 
+ // java util
+ import java.util.Enumeration;
+ import java.util.Properties;
+ 
+ // ant core
+ import org.apache.tools.ant.BuildException;
+ import org.apache.tools.ant.Task;
  
! // ant types
! import org.apache.tools.ant.types.FilterSet;
  
  /**
!  * This task sets a token filter that is used by the file copy methods of the
!  * project to do token substitution, or sets mutiple tokens by reading these
!  * from a file.
!  *
!  * @author    Stefano Mazzocchi <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
!  * @author    Gero Vermaas <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
!  * @author    <A href="[EMAIL PROTECTED]">Michael McCallum</A>
   */
  public class Filter extends Task {
  
!   private String token;
!   private String value;
!   private File filtersFile;
! 
!   /**
!    * Sets the Token attribute of the Filter object
!    *
!    * @param token  The new Token value
!    */
!   public void setToken( String token ) {
!     this.token = token;
!   }
! 
!   /**
!    * Sets the Value attribute of the Filter object
!    *
!    * @param value  The new Value value
!    */
!   public void setValue( String value ) {
!     this.value = value;
!   }
! 
!   /**
!    * Sets the Filtersfile attribute of the Filter object
!    *
!    * @param filtersFile  The new Filtersfile value
!    */
!   public void setFiltersfile( File filtersFile ) {
!     this.filtersFile = filtersFile;
!   }
! 
!   /**
!    * Description of the Method
!    *
!    * @exception BuildException  Description of Exception
!    */
!   public void execute()
!     throws BuildException {
!     boolean isFiltersFromFile = filtersFile != null && token == null && value 
== null;
!     boolean isSingleFilter = filtersFile == null && token != null && value != 
null;
  
!     if( !isFiltersFromFile && !isSingleFilter ) {
!       throw new BuildException( "both token and value parameters, or only a 
filtersFile parameter is required", location );
      }
  
!     FilterSet filterSet = new FilterSet( this );
!     if( isSingleFilter ) {
!       filterSet.addFilter( token, value );
      }
  
!     if( isFiltersFromFile ) {
!       filterSet.readFiltersFromFile( filtersFile );
      }
+   }
+ 
  }
+ 
Index: src/main/org/apache/tools/ant/taskdefs/Javac.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Javac.java,v
retrieving revision 1.64
diff -c -r1.64 Javac.java
*** src/main/org/apache/tools/ant/taskdefs/Javac.java   2001/01/12 14:08:50     
1.64
--- src/main/org/apache/tools/ant/taskdefs/Javac.java   2001/03/14 13:04:22
***************
*** 93,98 ****
--- 93,99 ----
   * @author Robin Green <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
   * @author <a href="mailto:[EMAIL PROTECTED]">Stefan Bodewig</a> 
   * @author <a href="mailto:[EMAIL PROTECTED]">J D Glanville</a>
+  * @author    <A href="[EMAIL PROTECTED]">Michael McCallum</A>
   */
  
  public class Javac extends MatchingTask {
***************
*** 112,117 ****
--- 113,119 ----
      private String target;
      private Path bootclasspath;
      private Path extdirs;
+     private FilterSet filterSet;
      private boolean includeAntRuntime = true;
      private boolean includeJavaRuntime = false;
  
***************
*** 161,166 ****
--- 163,185 ----
       */
      public File getDestdir() {
          return destDir;
+     }
+     
+     /**
+      * Maybe creates a nested classpath element.
+      */
+     public FilterSet createFilterset() {
+         if (filterSet == null) {
+           filterSet = new FilterSet( this );
+         }
+         return filterSet;
+     }
+     
+     /**
+      * Set the a filter
+      */
+     public FilterSet getFilterSet() {
+       return filterSet;
      }
  
      /**
Index: src/main/org/apache/tools/ant/taskdefs/LogOutputStream.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/LogOutputStream.java,v
retrieving revision 1.3
diff -c -r1.3 LogOutputStream.java
*** src/main/org/apache/tools/ant/taskdefs/LogOutputStream.java 2001/01/03 
14:18:30     1.3
--- src/main/org/apache/tools/ant/taskdefs/LogOutputStream.java 2001/03/14 
13:04:22
***************
*** 56,61 ****
--- 56,62 ----
  
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.Task;
+ import org.apache.tools.ant.types.FilterSet;
  
  import java.io.IOException;
  import java.io.OutputStream;
***************
*** 70,75 ****
--- 71,77 ----
   * of data written to the stream.
   *
   * @author [EMAIL PROTECTED]
+  * @author <A href="[EMAIL PROTECTED]">Michael McCallum</A>
   */
  public class LogOutputStream extends OutputStream {
  
***************
*** 79,84 ****
--- 81,102 ----
      private Task task;
      private int level = Project.MSG_INFO;
  
+     /** The set of filters applied to the lines that are logged. */
+     private FilterSet filterSet_ = null;
+ 
+     /**
+      * Creates a new instance of this class with a set of filters.
+      *
+      * @param task the task for whom to log
+      * @param level loglevel used to log data written to this stream.
+      * @param filterSet The filterset to process the logged lines with.
+      */
+     public LogOutputStream(Task task, int level, FilterSet filterSet ) {
+         this.task = task;
+         this.level = level;
+         filterSet_ = filterSet;
+     }
+     
      /**
       * Creates a new instance of this class.
       *
***************
*** 90,96 ****
          this.level = level;
      }
  
- 
      /**
       * Write the data to the buffer and flush the buffer, if a line
       * separator is detected.
--- 108,113 ----
***************
*** 129,135 ****
       * @param line the line to log.
       */
      protected void processLine(String line, int level) {
!         task.log(line, level);
      }
  
  
--- 146,157 ----
       * @param line the line to log.
       */
      protected void processLine(String line, int level) {
!       if( filterSet_ == null ) {
!         task.log( line, level );
!       }
!       else {
!         task.log( filterSet_.processLineStart( line ), level);
!       }
      }
  
  
Index: src/main/org/apache/tools/ant/taskdefs/LogStreamHandler.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/LogStreamHandler.java,v
retrieving revision 1.2
diff -c -r1.2 LogStreamHandler.java
*** src/main/org/apache/tools/ant/taskdefs/LogStreamHandler.java        
2001/01/03 14:18:30     1.2
--- src/main/org/apache/tools/ant/taskdefs/LogStreamHandler.java        
2001/03/14 13:04:22
***************
*** 56,61 ****
--- 56,62 ----
  
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.Task;
+ import org.apache.tools.ant.types.FilterSet;
  
  import java.io.OutputStream;
  import java.io.InputStream;
***************
*** 64,69 ****
--- 65,71 ----
   * Logs standard output and error of a subprocess to the log system of ant.
   *
   * @author [EMAIL PROTECTED]
+  * @author <A href="[EMAIL PROTECTED]">Michael McCallum</A>
   */
  public class LogStreamHandler extends PumpStreamHandler {
  
***************
*** 77,82 ****
--- 79,96 ----
      public LogStreamHandler(Task task, int outlevel, int errlevel) {
          super(new LogOutputStream(task, outlevel),
                new LogOutputStream(task, errlevel));
+     }
+ 
+     /**
+      * Creates a new instance of this class.
+      *
+      * @param task the task for whom to log
+      * @param outlevel the loglevel used to log standard output
+      * @param errlevel the loglevel used to log standard error
+      * @param filterSet A set of filters to be applied to all lines being 
logged on this stream.
+      */
+     public LogStreamHandler(Task task, int outlevel, int errlevel, FilterSet 
filterSet ) {
+         super( new LogOutputStream( task, outlevel, filterSet ), new 
LogOutputStream( task, errlevel, filterSet ) );
      }
  
  }
Index: 
src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java,v
retrieving revision 1.3
diff -c -r1.3 DefaultCompilerAdapter.java
*** 
src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java    
    2001/03/09 16:07:56     1.3
--- 
src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java    
    2001/03/14 13:04:23
***************
*** 69,74 ****
--- 69,75 ----
   * @author Robin Green <a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>
   * @author <a href="mailto:[EMAIL PROTECTED]">Stefan Bodewig</a> 
   * @author <a href="mailto:[EMAIL PROTECTED]">J D Glanville</a>
+  * @author <A href="[EMAIL PROTECTED]">Michael McCallum</A>
   */
  public abstract class DefaultCompilerAdapter implements CompilerAdapter {
  
***************
*** 93,98 ****
--- 94,102 ----
      protected boolean includeAntRuntime;
      protected boolean includeJavaRuntime;
  
+     /** Filters to be applied to the output of the compiler. */
+     protected FilterSet filterSet;
+ 
      protected File[] compileList;
      protected static String lSep = System.getProperty("line.separator");
      protected Javac attributes;
***************
*** 116,121 ****
--- 120,126 ----
          location = attributes.getLocation();
          includeAntRuntime = attributes.getIncludeantruntime();
          includeJavaRuntime = attributes.getIncludejavaruntime();
+         filterSet = attributes.getFilterSet();
      }
  
      public Javac getJavac() {
***************
*** 335,341 ****
              try {
                  Execute exe = new Execute(new LogStreamHandler(attributes, 
                                                                 
Project.MSG_INFO,
!                                                                
Project.MSG_WARN));
                  exe.setAntRun(project);
                  exe.setWorkingDirectory(project.getBaseDir());
                  exe.setCommandline(commandArray);
--- 340,347 ----
              try {
                  Execute exe = new Execute(new LogStreamHandler(attributes, 
                                                                 
Project.MSG_INFO,
!                                                                
Project.MSG_WARN,
!                                                                filterSet));
                  exe.setAntRun(project);
                  exe.setWorkingDirectory(project.getBaseDir());
                  exe.setCommandline(commandArray);
Index: src/main/org/apache/tools/ant/types/defaults.properties
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/types/defaults.properties,v
retrieving revision 1.2
diff -c -r1.2 defaults.properties
*** src/main/org/apache/tools/ant/types/defaults.properties     2000/11/17 
10:00:58     1.2
--- src/main/org/apache/tools/ant/types/defaults.properties     2001/03/14 
13:04:46
***************
*** 1,4 ****
! path=org.apache.tools.ant.types.Path
! fileset=org.apache.tools.ant.types.FileSet
! patternset=org.apache.tools.ant.types.PatternSet
! mapper=org.apache.tools.ant.types.Mapper
--- 1,5 ----
! path=org.apache.tools.ant.types.Path
! fileset=org.apache.tools.ant.types.FileSet
! patternset=org.apache.tools.ant.types.PatternSet
! mapper=org.apache.tools.ant.types.Mapper
! filterset=org.apache.tools.ant.types.FilterSet

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

Reply via email to