antoine 2003/05/25 04:40:55
Modified: docs/manual/CoreTypes selectors.html src/main/org/apache/tools/ant/types AbstractFileSet.java src/main/org/apache/tools/ant/types/selectors BaseSelectorContainer.java . WHATSNEW Added: src/main/org/apache/tools/ant/types/selectors TypeSelector.java src/testcases/org/apache/tools/ant/types/selectors TypeSelectorTest.java Log: new selector <type> allowing to sort files only or directories only can be extended to support selecting - is file readable - is file writeable - file exists - file is hidden PR: 20222 Submitted by: Jeff Turner (jefft at apache dot org) Revision Changes Path 1.13 +49 -0 ant/docs/manual/CoreTypes/selectors.html Index: selectors.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTypes/selectors.html,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- selectors.html 25 May 2003 09:43:53 -0000 1.12 +++ selectors.html 25 May 2003 11:40:54 -0000 1.13 @@ -60,6 +60,8 @@ 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. + <li><a href="#typeselect"><type></a> - Select files + that are either regular files or directories. </ul> <a name="containsselect"></a> @@ -541,6 +543,53 @@ </pre></blockquote> <p>Selects all JAR files that are larger than 4096 bytes.</p> + + <a name="typeselect"></a> + <h4>Type Selector</h4> + + <p>The <code><type></code> tag selects files of a certain type: + directory or regular.</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">type</td> + <td valign="top">The type of file which should be tested for. + Acceptable values are: + <ul> + <li>file - regular files</li> + <li>dir - directories</li> + </ul> + </td> + <td valign="top" align="center">Yes</td> + </tr> + </table> + + <p>Here is an example of how to use the Type Selector to select only + directories in <code>${src}</code></p> + + <blockquote><pre> +<fileset dir="${src}"> + <type type="dir"/> +</fileset> +</pre></blockquote> + + <p>The Type Selector is often used in conjunction with other selectors. + For example, to select files that also exist in a <code>template</code> + directory, but avoid selecting empty directories, use: + +<blockquote><pre> +<fileset dir="${src}"> + <and> + <present targetdir="template"/> + <type type="file"/> + </and> +</fileset> +</pre></blockquote> <a name="selectcontainers"></a> 1.19 +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.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- AbstractFileSet.java 25 May 2003 09:07:18 -0000 1.18 +++ AbstractFileSet.java 25 May 2003 11:40:54 -0000 1.19 @@ -72,6 +72,7 @@ import org.apache.tools.ant.types.selectors.FileSelector; import org.apache.tools.ant.types.selectors.DifferentSelector; import org.apache.tools.ant.types.selectors.FilenameSelector; +import org.apache.tools.ant.types.selectors.TypeSelector; import org.apache.tools.ant.types.selectors.MajoritySelector; import org.apache.tools.ant.types.selectors.NoneSelector; import org.apache.tools.ant.types.selectors.NotSelector; @@ -596,6 +597,13 @@ * add a selector filename entry on the selector list */ public void addFilename(FilenameSelector selector) { + appendSelector(selector); + } + + /** + * add a selector type entry on the selector list + */ + public void addType(TypeSelector selector) { appendSelector(selector); } 1.8 +8 -1 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.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- BaseSelectorContainer.java 14 Apr 2003 07:53:07 -0000 1.7 +++ BaseSelectorContainer.java 25 May 2003 11:40:54 -0000 1.8 @@ -290,7 +290,14 @@ public void addDifferent(DifferentSelector selector) { appendSelector(selector); } - + + /** + * adds a type selector to the selector list + */ + public void addType(TypeSelector selector) { + appendSelector(selector); + } + /** * add a regular expression selector entry on the selector list */ 1.1 ant/src/main/org/apache/tools/ant/types/selectors/TypeSelector.java Index: TypeSelector.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2002-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.IOException; import org.apache.tools.ant.types.EnumeratedAttribute; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.Parameter; /** * Selector that selects a certain kind of file: directory or regular. * * @author <a href="mailto:[EMAIL PROTECTED]">Jeff Turner</a> * @since 1.6 */ public class TypeSelector extends BaseExtendSelector { private String type = null; public final static String TYPE_KEY = "type"; public TypeSelector() { } public String toString() { StringBuffer buf = new StringBuffer("{typeselector type: "); buf.append(type); buf.append("}"); return buf.toString(); } /** * Set the type of file to require. */ public void setType(FileType fileTypes) { this.type = fileTypes.getValue(); } /** * 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 (TYPE_KEY.equalsIgnoreCase(paramname)) { FileType type = new FileType(); type.setValue(parameters[i].getValue()); setType(type); } else { setError("Invalid parameter " + paramname); } } } } /** * Checks to make sure all settings are kosher. In this case, it * means that the pattern attribute has been set. * */ public void verifySettings() { if (type == null) { setError("The type attribute is required"); } } /** * The heart of the matter. This is where the selector gets to decide * on the inclusion of a file in a particular fileset. * * @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) { // throw BuildException on error validate(); if (file.isDirectory()) { return type.equals(FileType.DIR); } else return type.equals(FileType.FILE); } /** * Enumerated attribute with the values for types of file */ public static class FileType extends EnumeratedAttribute { public static final String FILE="file"; public static final String DIR="dir"; public String[] getValues() { return new String[] {FILE, DIR}; } } } 1.1 ant/src/testcases/org/apache/tools/ant/types/selectors/TypeSelectorTest.java Index: TypeSelectorTest.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2000-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 org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.BuildFileTest; import org.apache.tools.ant.types.Parameter; import org.apache.tools.ant.util.JavaEnvUtils; import java.text.SimpleDateFormat; import java.text.ParsePosition; import java.util.Date; import junit.framework.TestCase; import junit.framework.AssertionFailedError; /** * Tests Type Selectors. * * @author <a href="mailto:[EMAIL PROTECTED]">Bruce Atherton</a> * @author <a href="mailto:[EMAIL PROTECTED]">Antoine Levy-Lambert</a> */ public class TypeSelectorTest extends BaseSelectorTest { public TypeSelectorTest(String name) { super(name); } /** * Factory method from base class. This is overriden in child * classes to return a specific Selector class. */ public BaseSelector getInstance() { return new TypeSelector(); } /** * Test the code that validates the selector. */ public void testValidate() { TypeSelector s = (TypeSelector)getInstance(); try { s.isSelected(basedir,filenames[0],files[0]); fail("TypeSelector did not check for required fields"); } catch (BuildException be1) { assertEquals("The type attribute is required" , be1.getMessage()); } } /** * Tests to make sure that the selector is selecting files correctly. */ public void testSelectionBehaviour() { TypeSelector s; String results; TypeSelector.FileType directory = new TypeSelector.FileType(); directory.setValue("dir"); TypeSelector.FileType file = new TypeSelector.FileType(); file.setValue("file"); try { makeBed(); s = (TypeSelector)getInstance(); s.setType(directory); results = selectionString(s); assertEquals("TFFFFFFFFFFT", results); s = (TypeSelector)getInstance(); s.setType(file); results = selectionString(s); assertEquals("FTTTTTTTTTTF", results); } finally { cleanupBed(); } } } 1.427 +5 -3 ant/WHATSNEW Index: WHATSNEW =================================================================== RCS file: /home/cvs/ant/WHATSNEW,v retrieving revision 1.426 retrieving revision 1.427 diff -u -r1.426 -r1.427 --- WHATSNEW 25 May 2003 09:49:53 -0000 1.426 +++ WHATSNEW 25 May 2003 11:40:54 -0000 1.427 @@ -137,11 +137,10 @@ Report 19953. * <different> selector : make ignoreFileTimes effectively default to true - and fix a bug in the comparison of timestamps. Bugzilla Report 20205 + and fix a bug in the comparison of timestamps. Bugzilla Report 20205. * <different> selector can now be nested directly under a fileset - Bugzilla Report 20220. Documentation of the different selector - + Bugzilla Report 20220. Other changes: -------------- @@ -372,6 +371,9 @@ * <copy>/<move>'s failonerror attribute can now also be used to continue the build if an I/O error caused a problem. Bugzilla Report 12999. + +* new selector <type/> allowing to select only files or only directories. + Bugzilla Report 20222. Changes from Ant 1.5.2 to Ant 1.5.3 ===================================