diff --git a/WHATSNEW b/WHATSNEW index 8224bb61c..079dba9bf 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -234,6 +234,9 @@ Other changes: * will invoke oldjavah on JDK 1.4.2. Bugzilla Report 18667. +* A new 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 =================================== diff --git a/docs/manual/CoreTypes/selectors.html b/docs/manual/CoreTypes/selectors.html index 605ce0377..0fe8e0bf8 100755 --- a/docs/manual/CoreTypes/selectors.html +++ b/docs/manual/CoreTypes/selectors.html @@ -56,6 +56,8 @@ the include and exclude elements of a patternset.
  • <present> - Select files that either do or do not exist in some other location +
  • <containsregexp> - Select + files that match a regular expression
  • <size> - Select files that are larger or smaller than a particular number of bytes. @@ -445,7 +447,40 @@ 1.5 release.

    + +

    Regular Expression Selector

    +

    The <containsregexp> 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 expression attribute. +

    + + + + + + + + + + + + +
    AttributeDescriptionRequired
    expressionSpecifies the regular expression that must + match true in every fileYes
    + +

    Here is an example of how to use the regular expression Selector:

    + +
    +<fileset dir="${doc.path}" includes="*.txt">
    +    <containsregexp expression="[4-6]\.[0-9]"/>
    +</fileset>
    +
    + +

    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). + +

    Size Selector

    diff --git a/src/main/org/apache/tools/ant/taskdefs/Delete.java b/src/main/org/apache/tools/ant/taskdefs/Delete.java index 9f237b51d..b51a3b326 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Delete.java +++ b/src/main/org/apache/tools/ant/taskdefs/Delete.java @@ -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.Project; 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; @@ -410,6 +411,14 @@ public class Delete extends MatchingTask { 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); + } /** * Delete the file(s). diff --git a/src/main/org/apache/tools/ant/taskdefs/MatchingTask.java b/src/main/org/apache/tools/ant/taskdefs/MatchingTask.java index 113f578c8..0273e8407 100644 --- a/src/main/org/apache/tools/ant/taskdefs/MatchingTask.java +++ b/src/main/org/apache/tools/ant/taskdefs/MatchingTask.java @@ -63,6 +63,7 @@ import org.apache.tools.ant.Task; 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; @@ -407,6 +408,13 @@ public abstract class MatchingTask extends Task implements SelectorContainer { 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); + } /** * Accessor for the implict fileset. diff --git a/src/main/org/apache/tools/ant/types/AbstractFileSet.java b/src/main/org/apache/tools/ant/types/AbstractFileSet.java index c460a4722..097bcbf25 100644 --- a/src/main/org/apache/tools/ant/types/AbstractFileSet.java +++ b/src/main/org/apache/tools/ant/types/AbstractFileSet.java @@ -76,6 +76,7 @@ import org.apache.tools.ant.types.selectors.NoneSelector; 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; @@ -624,6 +625,13 @@ public abstract class AbstractFileSet extends DataType implements Cloneable, public void addDepend(DependSelector selector) { appendSelector(selector); } + + /** + * add a regular expression selector entry on the selector list + */ + public void addContainsRegexp(ContainsRegexpSelector selector) { + appendSelector(selector); + } /** * Returns included files as a list of semicolon-separated filenames diff --git a/src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java b/src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java index 700caebf2..b8ee8c5f9 100644 --- a/src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java +++ b/src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java @@ -290,6 +290,13 @@ public abstract class BaseSelectorContainer extends BaseSelector public void addDifferent(DifferentSelector selector) { appendSelector(selector); } + + /** + * add a regular expression selector entry on the selector list + */ + public void addContainsRegexp(ContainsRegexpSelector selector) { + appendSelector(selector); + } } diff --git a/src/main/org/apache/tools/ant/types/selectors/ContainsRegexpSelector.java b/src/main/org/apache/tools/ant/types/selectors/ContainsRegexpSelector.java new file mode 100644 index 000000000..54c1db847 --- /dev/null +++ b/src/main/org/apache/tools/ant/types/selectors/ContainsRegexpSelector.java @@ -0,0 +1,184 @@ +/* + * 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 apache@apache.org. + * + * 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 + * . + */ + +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 Jay van der Meer + * @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); + } + } + } +} + diff --git a/src/main/org/apache/tools/ant/types/selectors/SelectorContainer.java b/src/main/org/apache/tools/ant/types/selectors/SelectorContainer.java index dc6c1715d..58095bdc6 100644 --- a/src/main/org/apache/tools/ant/types/selectors/SelectorContainer.java +++ b/src/main/org/apache/tools/ant/types/selectors/SelectorContainer.java @@ -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 @@ public interface SelectorContainer { * 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); }