bodewig     2003/04/14 00:53:08

  Modified:    .        WHATSNEW
               docs/manual/CoreTypes selectors.html
               src/main/org/apache/tools/ant/taskdefs Delete.java
                        MatchingTask.java
               src/main/org/apache/tools/ant/types AbstractFileSet.java
               src/main/org/apache/tools/ant/types/selectors
                        BaseSelectorContainer.java SelectorContainer.java
  Added:       src/main/org/apache/tools/ant/types/selectors
                        ContainsRegexpSelector.java
  Log:
  Add a new containsregexp selector.
  
  Submitted by: Jay van der Meer <jvandermeer2 at comcast dot net>
  
  Revision  Changes    Path
  1.395     +3 -0      ant/WHATSNEW
  
  Index: WHATSNEW
  ===================================================================
  RCS file: /home/cvs/ant/WHATSNEW,v
  retrieving revision 1.394
  retrieving revision 1.395
  diff -u -r1.394 -r1.395
  --- WHATSNEW  10 Apr 2003 06:49:01 -0000      1.394
  +++ WHATSNEW  14 Apr 2003 07:53:06 -0000      1.395
  @@ -234,6 +234,9 @@
   
   * <javah> will invoke oldjavah on JDK 1.4.2.  Bugzilla Report 18667.
   
  +* A new <containsregexp> selector has been added, that selects files
  +  if their content matches a certain regular expression.
  +
   Changes from Ant 1.5.2 to Ant 1.5.3
   ===================================
   
  
  
  
  1.10      +35 -0     ant/docs/manual/CoreTypes/selectors.html
  
  Index: selectors.html
  ===================================================================
  RCS file: /home/cvs/ant/docs/manual/CoreTypes/selectors.html,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- selectors.html    19 Feb 2003 09:23:19 -0000      1.9
  +++ selectors.html    14 Apr 2003 07:53:07 -0000      1.10
  @@ -56,6 +56,8 @@
           the include and exclude elements of a patternset.
         <li><a href="#presentselect">&lt;present&gt;</a> - Select
           files that either do or do not exist in some other location
  +      <li><a href="#regexpselect">&lt;containsregexp&gt;</a> - Select
  +        files that match a regular expression
         <li><a href="#sizeselect">&lt;size&gt;</a> - Select files
           that are larger or smaller than a particular number of bytes.
       </ul>
  @@ -445,7 +447,40 @@
         1.5 release.
       </p>
   
  +    <a name="regexpselect"></a>
  +    <h4>Regular Expression Selector</h4>
   
  +    <p>The <code>&lt;containsregexp&gt;</code> tag in a FileSet limits
  +    the files defined by that fileset to only those which contain a
  +    match to the regular expression specified by the <code>expression</code> 
attribute.
  +    </p>
  +
  +    <table border="1" cellpadding="2" cellspacing="0">
  +      <tr>
  +        <td valign="top"><b>Attribute</b></td>
  +        <td valign="top"><b>Description</b></td>
  +        <td align="center" valign="top"><b>Required</b></td>
  +      </tr>
  +      <tr>
  +        <td valign="top">expression</td>
  +        <td valign="top">Specifies the regular expression that must 
  +        match true in every file</td>
  +        <td valign="top" align="center">Yes</td>
  +      </tr>
  +    </table>
  +
  +    <p>Here is an example of how to use the regular expression Selector:</p>
  +
  +    <blockquote><pre>
  +&lt;fileset dir=&quot;${doc.path}&quot; includes=&quot;*.txt&quot;&gt;
  +    &lt;containsregexp expression=&quot;[4-6]\.[0-9]&quot;/&gt;
  +&lt;/fileset&gt;
  +</pre></blockquote>
  +
  +    <p>Selects all the text files that match the regular expression 
  +    (have a 4,5 or 6 followed by a period and a number from 0 to 9).
  +
  +    
       <a name="sizeselect"></a>
       <h4>Size Selector</h4>
   
  
  
  
  1.38      +10 -1     ant/src/main/org/apache/tools/ant/taskdefs/Delete.java
  
  Index: Delete.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Delete.java,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- Delete.java       10 Feb 2003 14:13:34 -0000      1.37
  +++ Delete.java       14 Apr 2003 07:53:07 -0000      1.38
  @@ -1,7 +1,7 @@
   /*
    * The Apache Software License, Version 1.1
    *
  - * Copyright (c) 2000-2002 The Apache Software Foundation.  All rights 
  + * Copyright (c) 2000-2003 The Apache Software Foundation.  All rights 
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -62,6 +62,7 @@
   import org.apache.tools.ant.types.FileSet;
   import org.apache.tools.ant.types.PatternSet;
   import org.apache.tools.ant.types.selectors.AndSelector;
  +import org.apache.tools.ant.types.selectors.ContainsRegexpSelector;
   import org.apache.tools.ant.types.selectors.ContainsSelector;
   import org.apache.tools.ant.types.selectors.DateSelector;
   import org.apache.tools.ant.types.selectors.DependSelector;
  @@ -409,6 +410,14 @@
       public void addDepend(DependSelector selector) {
           usedMatchingTask = true;
           super.addDepend(selector);
  +    }
  +    
  +    /**
  +     * add a regular expression selector entry on the selector list
  +     */
  +    public void addContainsRegexp(ContainsRegexpSelector selector) {
  +        usedMatchingTask = true;
  +        super.addContainsRegexp(selector);
       }
   
       /**
  
  
  
  1.34      +8 -0      
ant/src/main/org/apache/tools/ant/taskdefs/MatchingTask.java
  
  Index: MatchingTask.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/MatchingTask.java,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- MatchingTask.java 9 Apr 2003 12:46:17 -0000       1.33
  +++ MatchingTask.java 14 Apr 2003 07:53:07 -0000      1.34
  @@ -63,6 +63,7 @@
   import org.apache.tools.ant.types.FileSet;
   import org.apache.tools.ant.types.PatternSet;
   import org.apache.tools.ant.types.selectors.AndSelector;
  +import org.apache.tools.ant.types.selectors.ContainsRegexpSelector;
   import org.apache.tools.ant.types.selectors.ContainsSelector;
   import org.apache.tools.ant.types.selectors.DateSelector;
   import org.apache.tools.ant.types.selectors.DependSelector;
  @@ -406,6 +407,13 @@
        */
       public void addDepend(DependSelector selector) {
           fileset.addDepend(selector);
  +    }
  +    
  +    /**
  +     * add a regular expression selector entry on the selector list
  +     */
  +    public void addContainsRegexp(ContainsRegexpSelector selector) {
  +        fileset.addContainsRegexp(selector);
       }
   
       /**
  
  
  
  1.17      +8 -0      
ant/src/main/org/apache/tools/ant/types/AbstractFileSet.java
  
  Index: AbstractFileSet.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/types/AbstractFileSet.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- AbstractFileSet.java      10 Mar 2003 07:36:45 -0000      1.16
  +++ AbstractFileSet.java      14 Apr 2003 07:53:07 -0000      1.17
  @@ -76,6 +76,7 @@
   import org.apache.tools.ant.types.selectors.NotSelector;
   import org.apache.tools.ant.types.selectors.OrSelector;
   import org.apache.tools.ant.types.selectors.PresentSelector;
  +import org.apache.tools.ant.types.selectors.ContainsRegexpSelector;
   import org.apache.tools.ant.types.selectors.SelectSelector;
   import org.apache.tools.ant.types.selectors.SelectorContainer;
   import org.apache.tools.ant.types.selectors.SelectorScanner;
  @@ -622,6 +623,13 @@
        * add a depends selector entry on the selector list
        */
       public void addDepend(DependSelector selector) {
  +        appendSelector(selector);
  +    }
  +    
  +    /**
  +     * add a regular expression selector entry on the selector list
  +     */
  +    public void addContainsRegexp(ContainsRegexpSelector selector) {
           appendSelector(selector);
       }
   
  
  
  
  1.7       +7 -0      
ant/src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java
  
  Index: BaseSelectorContainer.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- BaseSelectorContainer.java        10 Feb 2003 14:14:35 -0000      1.6
  +++ BaseSelectorContainer.java        14 Apr 2003 07:53:07 -0000      1.7
  @@ -290,6 +290,13 @@
       public void addDifferent(DifferentSelector selector) {
           appendSelector(selector);
       }
  +    
  +    /**
  +     * add a regular expression selector entry on the selector list
  +     */
  +    public void addContainsRegexp(ContainsRegexpSelector selector) {
  +        appendSelector(selector);
  +    }
   
   }
   
  
  
  
  1.5       +6 -1      
ant/src/main/org/apache/tools/ant/types/selectors/SelectorContainer.java
  
  Index: SelectorContainer.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/types/selectors/SelectorContainer.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- SelectorContainer.java    10 Feb 2003 14:14:35 -0000      1.4
  +++ SelectorContainer.java    14 Apr 2003 07:53:07 -0000      1.5
  @@ -1,7 +1,7 @@
   /*
    * The Apache Software License, Version 1.1
    *
  - * Copyright (c) 2002 The Apache Software Foundation.  All rights
  + * Copyright (c) 2002-2003 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -172,6 +172,11 @@
        * add a depends selector entry on the selector list
        */
       public void addDepend(DependSelector selector);
  +    
  +    /**
  +     * add a regular expression selector entry on the selector list
  +     */
  +    public void addContainsRegexp(ContainsRegexpSelector selector);
   
   }
   
  
  
  
  1.1                  
ant/src/main/org/apache/tools/ant/types/selectors/ContainsRegexpSelector.java
  
  Index: ContainsRegexpSelector.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * 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 "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
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.tools.ant.types.selectors;
  
  import java.io.BufferedReader;
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.IOException;
  import java.io.InputStreamReader;
  
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.types.Parameter;
  import org.apache.tools.ant.types.RegularExpression;
  import org.apache.tools.ant.util.regexp.Regexp;
  
  /**
   * Selector that filters files based on a regular expression.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">Jay van der Meer</a>
   * @since Ant 1.6
   */
  public class ContainsRegexpSelector extends BaseExtendSelector {
  
      private String userProvidedExpression = null;
      private RegularExpression myRegExp = null;
      private Regexp myExpression = null;
      public final static String EXPRESSION_KEY = "expression";
  
      public ContainsRegexpSelector() {
      }
  
      public String toString() {
          StringBuffer buf = new StringBuffer("{containsregexpselector 
expression: ");
          buf.append(userProvidedExpression);
          buf.append("}");
          return buf.toString();
      }
  
      /**
       * The regular expression used to search the file.
       *
       * @param regular expression that must match a line in the file to
       * be selected.
       */
      public void setExpression(String theexpression) {
          this.userProvidedExpression = theexpression;
      }
  
      /**
       * When using this as a custom selector, this method will be called.
       * It translates each parameter into the appropriate setXXX() call.
       *
       * @param parameters the complete set of parameters for this selector
       */
      public void setParameters(Parameter[] parameters) {
          super.setParameters(parameters);
          if (parameters != null) {
              for (int i = 0; i < parameters.length; i++) {
                  String paramname = parameters[i].getName();
                  if (EXPRESSION_KEY.equalsIgnoreCase(paramname)) {
                      setExpression(parameters[i].getValue());
                  } else {
                      setError("Invalid parameter " + paramname);
                  }
              }
          }
      }
  
      /**
       * Checks that an expression was specified.
       *
       */
      public void verifySettings() {
          if (userProvidedExpression == null) {
              setError("The expression attribute is required");
          }
      }
  
      /**
       * Tests a regular expression against each line of text in the file.
       *
       * @param basedir the base directory the scan is being done from
       * @param filename is the name of the file to check
       * @param file is a java.io.File object the selector can use
       * @return whether the file should be selected or not
       */
      public boolean isSelected(File basedir, String filename, File file) {
          String teststr = null;
          BufferedReader in = null;
          
          // throw BuildException on error
          
          validate();
  
          if (file.isDirectory()) {
              return true;
          }
          
          if (myRegExp == null) {
              myRegExp = new RegularExpression();
              myRegExp.setPattern(userProvidedExpression);
              myExpression = myRegExp.getRegexp(getProject());
          }
  
          try {
                in = new BufferedReader(new InputStreamReader(
                      new FileInputStream(file)));
                      
                teststr = in.readLine();
                
                while (teststr != null) {
                
                    if (myExpression.matches(teststr) == true) {
                        return true;
                    }
                    teststr = in.readLine();
                }
                
                return false;
          } catch (IOException ioe) {
              throw new BuildException("Could not read file " + filename);
          } finally {
              try {
                  in.close();
              } catch (Exception e) {
                  throw new BuildException("Could not close file " + filename);
              }
          }
      }
  }
  
  
  
  

Reply via email to