Here is the new patch to add a regular expression selector as a core task, instead of the one I submitted Wednesday that just updated ContainsSelector.
I was thinking I should also do a test case. I have gotten lost trying to find what's needed. I'm sure these questions have been answered before but so far I have not had much luck finding a howto for doing a test case. I have looked at the others similar in /testcases/org/apache/tools/ant/types/selectors for example the ContainsSelector. Where is the input file for that test, how do I drive a specific test case? Thanks. Jay van der Meer
--- AbstractFileSet.java 2003-04-08 10:24:06.000000000 -0500 +++ /cdrive/apache-ant-1.5.3/src/main/org/apache/tools/ant/types/AbstractFileSet.java 2003-04-10 19:56:22.000000000 -0500 @@ -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; @@ -624,5 +625,12 @@ public void addDepend(DependSelector selector) { appendSelector(selector); } + + /** + * add a regular expression selector entry on the selector list + */ + public void addContainsRegexp(ContainsRegexpSelector selector) { + appendSelector(selector); + } }
--- MatchingTask.java 2003-04-08 10:24:07.000000000 -0500 +++ /cdrive/apache-ant-1.5.3/src/main/org/apache/tools/ant/taskdefs/MatchingTask.java 2003-04-10 20:05:51.000000000 -0500 @@ -396,6 +396,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); + } /** * Accessor for the implict fileset.
--- SelectorContainer.java 2003-04-08 10:24:18.000000000 -0500 +++ /cdrive/apache-ant-1.5.3/src/main/org/apache/tools/ant/types/selectors/SelectorContainer.java 2003-04-10 19:53:30.000000000 -0500 @@ -178,6 +178,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); }
--- selectors.html 2003-04-08 10:24:19.000000000 -0500 +++ /cdrive/apache-ant-1.5.3/docs/manual/CoreTypes/selectors.html 2003-04-10 21:37:11.000000000 -0500 @@ -54,6 +54,8 @@ the include and exclude elements of a patternset. <li><a href="#presentselect"><present></a> - Select files that either do or do not exist in some other location + <li><a href="#regexpselect"><containsregexp></a> - Select + files that match a regular expression <li><a href="#sizeselect"><size></a> - Select files that are larger or smaller than a particular number of bytes. </ul> @@ -371,7 +373,40 @@ 1.5 release. </p> + <a name="regexpselect"></a> + <h4>Regular Expression Selector</h4> + <p>The <code><containsregexp></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> +<fileset dir="${doc.path}" includes="*.txt"> + <containsregexp expression="[4-6]\.[0-9]"/> +</fileset> +</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>
/* * The Apache Software License, Version 1.1 * * Copyright (c) 2002 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.File; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.FileInputStream; import java.io.IOException; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.Parameter; import org.apache.tools.ant.BuildException; 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 1.5 */ 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); } } } }
--- BaseSelectorContainer.java 2003-04-08 10:24:04.000000000 -0500 +++ /cdrive/apache-ant-1.5.3/src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java 2003-04-10 19:51:10.000000000 -0500 @@ -287,6 +287,13 @@ public void addDepend(DependSelector selector) { appendSelector(selector); } + + /** + * add a regular expression selector entry on the selector list + */ + public void addContainsRegexp(ContainsRegexpSelector selector) { + appendSelector(selector); + } }
--- Delete.java 2003-04-08 10:24:02.000000000 -0500 +++ /cdrive/apache-ant-1.5.3/src/main/org/apache/tools/ant/taskdefs/Delete.java 2003-04-10 20:06:37.000000000 -0500 @@ -72,6 +72,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.SizeSelector; @@ -410,6 +411,14 @@ 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).