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">&lt;size&gt;</a> - Select files
           that are larger or smaller than a particular number of bytes.
  +      <li><a href="#typeselect">&lt;type&gt;</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>&lt;type&gt;</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>
  +&lt;fileset dir=&quot;${src}&quot;&gt;
  +  &lt;type type="dir"/>
  +&lt;/fileset&gt;
  +</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>
  +&lt;fileset dir="${src}">
  +    &lt;and>
  +        &lt;present targetdir="template"/>
  +        &lt;type type="file"/>
  +    &lt;/and>
  +&lt;/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
   ===================================
  
  
  

Reply via email to