From 373244244247f7faf0e0641a32e1e6175c7498ee Mon Sep 17 00:00:00 2001 From: Antoine Levy-Lambert Date: Sun, 25 May 2003 11:40:54 +0000 Subject: [PATCH] new selector 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) git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274617 13f79535-47bb-0310-9956-ffa450edef68 --- WHATSNEW | 8 +- docs/manual/CoreTypes/selectors.html | 49 ++++++ .../tools/ant/types/AbstractFileSet.java | 8 + .../selectors/BaseSelectorContainer.java | 9 +- .../ant/types/selectors/TypeSelector.java | 159 ++++++++++++++++++ .../ant/types/selectors/TypeSelectorTest.java | 139 +++++++++++++++ 6 files changed, 368 insertions(+), 4 deletions(-) create mode 100644 src/main/org/apache/tools/ant/types/selectors/TypeSelector.java create mode 100644 src/testcases/org/apache/tools/ant/types/selectors/TypeSelectorTest.java diff --git a/WHATSNEW b/WHATSNEW index aae25f6c8..43d5de8f5 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -137,11 +137,10 @@ Fixed bugs: Report 19953. * 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. * selector can now be nested directly under a fileset - Bugzilla Report 20220. Documentation of the different selector - + Bugzilla Report 20220. Other changes: -------------- @@ -373,6 +372,9 @@ Other changes: continue the build if an I/O error caused a problem. Bugzilla Report 12999. +* new selector allowing to select only files or only directories. + Bugzilla Report 20222. + 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 5870d6993..3cde061c3 100755 --- a/docs/manual/CoreTypes/selectors.html +++ b/docs/manual/CoreTypes/selectors.html @@ -60,6 +60,8 @@ files that match a regular expression
  • <size> - Select files that are larger or smaller than a particular number of bytes. +
  • <type> - Select files + that are either regular files or directories. @@ -542,6 +544,53 @@

    Selects all JAR files that are larger than 4096 bytes.

    + +

    Type Selector

    + +

    The <type> tag selects files of a certain type: + directory or regular.

    + + + + + + + + + + + + +
    AttributeDescriptionRequired
    typeThe type of file which should be tested for. + Acceptable values are: +
      +
    • file - regular files
    • +
    • dir - directories
    • +
    +
    Yes
    + +

    Here is an example of how to use the Type Selector to select only + directories in ${src}

    + +
    +<fileset dir="${src}">
    +  <type type="dir"/>
    +</fileset>
    +
    + +

    The Type Selector is often used in conjunction with other selectors. + For example, to select files that also exist in a template + directory, but avoid selecting empty directories, use: + +

    +<fileset dir="${src}">
    +    <and>
    +        <present targetdir="template"/>
    +        <type type="file"/>
    +    </and>
    +</fileset>
    +
    +

    Selector Containers

    diff --git a/src/main/org/apache/tools/ant/types/AbstractFileSet.java b/src/main/org/apache/tools/ant/types/AbstractFileSet.java index 87b0023a8..274fb2470 100644 --- a/src/main/org/apache/tools/ant/types/AbstractFileSet.java +++ b/src/main/org/apache/tools/ant/types/AbstractFileSet.java @@ -72,6 +72,7 @@ import org.apache.tools.ant.types.selectors.ExtendSelector; 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; @@ -599,6 +600,13 @@ public abstract class AbstractFileSet extends DataType implements Cloneable, appendSelector(selector); } + /** + * add a selector type entry on the selector list + */ + public void addType(TypeSelector selector) { + appendSelector(selector); + } + /** * add an extended selector entry on the selector list */ 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 b8ee8c5f9..81ab28937 100644 --- a/src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java +++ b/src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java @@ -290,7 +290,14 @@ public abstract class BaseSelectorContainer extends BaseSelector 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 */ diff --git a/src/main/org/apache/tools/ant/types/selectors/TypeSelector.java b/src/main/org/apache/tools/ant/types/selectors/TypeSelector.java new file mode 100644 index 000000000..3bf008ffa --- /dev/null +++ b/src/main/org/apache/tools/ant/types/selectors/TypeSelector.java @@ -0,0 +1,159 @@ +/* + * 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 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.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 Jeff Turner + * @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}; + } + } + + +} diff --git a/src/testcases/org/apache/tools/ant/types/selectors/TypeSelectorTest.java b/src/testcases/org/apache/tools/ant/types/selectors/TypeSelectorTest.java new file mode 100644 index 000000000..398b59a02 --- /dev/null +++ b/src/testcases/org/apache/tools/ant/types/selectors/TypeSelectorTest.java @@ -0,0 +1,139 @@ +/* + * 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 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 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 Bruce Atherton + * @author Antoine Levy-Lambert + */ +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(); + } + + } + +}