You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by mb...@apache.org on 2004/12/14 18:56:35 UTC

cvs commit: ant/src/testcases/org/apache/tools/ant/taskdefs TouchTest.java

mbenson     2004/12/14 09:56:35

  Modified:    .        WHATSNEW
               docs/manual/CoreTasks touch.html
               src/main/org/apache/tools/ant/util FileUtils.java
               src/main/org/apache/tools/ant/taskdefs Touch.java
               src/etc/testcases/taskdefs touch.xml
               src/testcases/org/apache/tools/ant/taskdefs TouchTest.java
  Log:
  touch gets nested mapper plus verbose, mkdirs, and pattern attributes.
  
  Revision  Changes    Path
  1.697     +15 -0     ant/WHATSNEW
  
  Index: WHATSNEW
  ===================================================================
  RCS file: /home/cvs/ant/WHATSNEW,v
  retrieving revision 1.696
  retrieving revision 1.697
  diff -u -r1.696 -r1.697
  --- WHATSNEW	13 Dec 2004 20:02:23 -0000	1.696
  +++ WHATSNEW	14 Dec 2004 17:56:30 -0000	1.697
  @@ -102,6 +102,21 @@
   
   * Added isfileselected condition.
   
  +* Overloaded FileUtils.createNewFile with a boolean mkdirs attribute
  +  to create nonexistent parent directories.
  +
  +* Added support to the touch task for a mkdirs attribute to create
  +  nonexistent parent directories before touching new files.
  +
  +* Added support to the touch task for a pattern attribute to allow
  +  alternate datetime formats.
  +
  +* Added support to the touch task to map touched files using a nested
  +  mapper element.
  +
  +* Added support to the touch task for a verbose attribute to suppress
  +  logging of new file creation.
  +
   Changes from Ant 1.6.2 to current Ant 1.6 CVS version
   =====================================================
   
  
  
  
  1.12      +40 -13    ant/docs/manual/CoreTasks/touch.html
  
  Index: touch.html
  ===================================================================
  RCS file: /home/cvs/ant/docs/manual/CoreTasks/touch.html,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- touch.html	9 Feb 2004 21:50:05 -0000	1.11
  +++ touch.html	14 Dec 2004 17:56:34 -0000	1.12
  @@ -14,8 +14,6 @@
   can also work a <a href="../CoreTypes/fileset.html">Fileset</a> (which
   also includes directories)
   or a <a href="../CoreTypes/filelist.html">Filelist</a> (since Ant 1.6).</p>
  -<p>For JDK 1.1 only the creation of new files with a modification time
  -of now works, all other cases will emit a warning.</p>
   <h3>Parameters</h3>
   <table border="1" cellpadding="2" cellspacing="0">
     <tr>
  @@ -25,26 +23,49 @@
     </tr>
     <tr>
       <td valign="top">file</td>
  -    <td valign="top">the name of the file</td>
  -    <td valign="top" align="center">unless a nested fileset element
  -       or a nested filelist element
  -       has been specified.</td>
  +    <td valign="top">The name of the file.</td>
  +    <td valign="top" align="center">Unless a nested fileset element
  +       or a nested filelist element has been specified.</td>
     </tr>
     <tr>
       <td valign="top">millis</td>
  -    <td valign="top">specifies the new modification time of the file
  -       in milliseconds since midnight Jan 1 1970</td>
  -    <td valign="top" align="center">No</td>
  +    <td valign="top">Specifies the new modification time of the file
  +       in milliseconds since midnight Jan 1 1970.</td>
  +    <td valign="center" align="center" rowspan="2">No--datetime takes
  +       precedence, however if both are omitted the current time is assumed.</td>
     </tr>
     <tr>
       <td valign="top">datetime</td>
  -    <td valign="top">specifies the new modification time of the file
  -       in the format MM/DD/YYYY HH:MM AM_or_PM or MM/DD/YYYY HH:MM:SS AM_or_PM.</td>
  +    <td valign="top">Specifies the new modification time of the file.</td>
  +  </tr>
  +  <tr>
  +    <td valign="top">pattern</td>
  +    <td valign="top">SimpleDateFormat-compatible pattern string.
  +       Defaults to MM/DD/YYYY HH:MM AM_or_PM or MM/DD/YYYY HH:MM:SS AM_or_PM.
  +       <b>Since Ant 1.6.3</b></td>
       <td valign="top" align="center">No</td>
     </tr>
  +  <tr>
  +    <td valign="top">mkdirs</td>
  +    <td valign="top">Whether to create nonexistent parent
  +       directories when touching new files. <b>Since Ant 1.6.3</b></td>
  +    <td valign="top" align="center">No, default <i>false</i>.</td>
  +  </tr>
  +  <tr>
  +    <td valign="top">verbose</td>
  +    <td valign="top">Whether to log the creation of new files.
  +       <b>Since Ant 1.6.3</b></td>
  +    <td valign="top" align="center">No, default <i>true</i>.</td>
  +  </tr>
   </table>
  -<p>If both <code>millis</code> and <code>datetime</code> are omitted
  -the current time is assumed.</p>
  +<h3>Parameters specified as nested elements</h3>
  +<p><b>Since Ant 1.6.3,</b> a nested <a href="../CoreTypes/mapper.html">
  +    mapper</a> can be specified.  Files specified via nested
  +    <code>fileset</code>s, <code>filelist</code>s, or the <code>file</code>
  +    attribute are mapped using the specified mapper.  For each file mapped,
  +    the resulting files are touched.  If the original file exists its
  +    timestamp will be used.  Otherwise the task settings (<code>millis</code>,
  +    <code>datetime</code>) take effect.</p>
   <h3>Examples</h3>
   <pre>  &lt;touch file=&quot;myfile&quot;/&gt;</pre>
   <p>creates <code>myfile</code> if it doesn't exist and changes the
  @@ -63,6 +84,12 @@
   modification time to Jun, 28 2000 2:02:17 pm (14:02:17 for those used to 24
   hour times), if the filesystem allows a precision of one second - a
   time close to it otherwise.</p>
  +<pre>  &lt;touch file=&quot;foo&quot;&gt;
  +    &lt;mapper type=&quot;glob&quot; from=&quot;foo&quot; to=&quot;bar&quot; /&gt;
  +  &lt;/touch&gt;
  +</pre>
  +<p>creates <code>bar</code> if it doesn't exist and changes the
  +modification time to that of <code>foo</code>.</p>
   <hr>
   <p align="center">Copyright &copy; 2000-2001,2003-2004 The Apache Software Foundation. All rights
   Reserved.</p>
  
  
  
  1.78      +18 -1     ant/src/main/org/apache/tools/ant/util/FileUtils.java
  
  Index: FileUtils.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/util/FileUtils.java,v
  retrieving revision 1.77
  retrieving revision 1.78
  diff -u -r1.77 -r1.78
  --- FileUtils.java	11 Dec 2004 22:43:04 -0000	1.77
  +++ FileUtils.java	14 Dec 2004 17:56:34 -0000	1.78
  @@ -1097,6 +1097,23 @@
        * @since Ant 1.5
        */
       public boolean createNewFile(File f) throws IOException {
  +        return createNewFile(f, false);
  +    }
  +
  +    /**
  +     * Create a new file, optionally creating parent directories.
  +     *
  +     * @param f the file to be created.
  +     * @param mkdirs <code>boolean</code> whether to create parent directories.
  +     * @return true if the file did not exist already.
  +     * @throws IOException on error.
  +     * @since Ant 1.6.3
  +     */
  +    public boolean createNewFile(File f, boolean mkdirs) throws IOException {
  +        File parent = f.getParentFile();
  +        if (mkdirs && !(parent.exists())) {
  +            parent.mkdirs();
  +        }
           return f.createNewFile();
       }
   
  
  
  
  1.41      +198 -86   ant/src/main/org/apache/tools/ant/taskdefs/Touch.java
  
  Index: Touch.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Touch.java,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- Touch.java	9 Mar 2004 16:48:06 -0000	1.40
  +++ Touch.java	14 Dec 2004 17:56:34 -0000	1.41
  @@ -21,26 +21,26 @@
   import java.io.IOException;
   import java.text.DateFormat;
   import java.text.ParseException;
  +import java.text.SimpleDateFormat;
  +import java.util.Date;
   import java.util.Locale;
   import java.util.Vector;
   import org.apache.tools.ant.BuildException;
   import org.apache.tools.ant.DirectoryScanner;
   import org.apache.tools.ant.Project;
   import org.apache.tools.ant.Task;
  +import org.apache.tools.ant.types.Mapper;
   import org.apache.tools.ant.types.FileSet;
   import org.apache.tools.ant.types.FileList;
   import org.apache.tools.ant.util.FileUtils;
  +import org.apache.tools.ant.util.FileNameMapper;
   import org.apache.tools.ant.util.JavaEnvUtils;
   
   /**
    * Touch a file and/or fileset(s) and/or filelist(s);
    * corresponds to the Unix touch command.
    *
  - * <p>If the file to touch doesn't exist, an empty one is
  - * created. </p>
  - *
  - * <p>Note: Setting the modification time of files is not supported in
  - * JDK 1.1.</p>
  + * <p>If the file to touch doesn't exist, an empty one is created.</p>
    *
    * @since Ant 1.1
    *
  @@ -48,13 +48,48 @@
    */
   public class Touch extends Task {
   
  +    private interface DateFormatFactory {
  +        DateFormat getPrimaryFormat();
  +        DateFormat getFallbackFormat();
  +    }
  +
  +    private static final DateFormatFactory DEFAULT_DF_FACTORY
  +        = new DateFormatFactory() {
  +        /*
  +         * The initial version used DateFormat.SHORT for the
  +         * time format, which ignores seconds.  If we want
  +         * seconds as well, we need DateFormat.MEDIUM, which
  +         * in turn would break all old build files.
  +         *
  +         * First try to parse with DateFormat.SHORT and if
  +         * that fails with MEDIUM - throw an exception if both
  +         * fail.
  +         */
  +        public DateFormat getPrimaryFormat() {
  +            return DateFormat.getDateTimeInstance(DateFormat.SHORT,
  +                DateFormat.SHORT, Locale.US);
  +        }
  +        public DateFormat getFallbackFormat() {
  +            return DateFormat.getDateTimeInstance(DateFormat.SHORT,
  +                DateFormat.MEDIUM, Locale.US);
  +        }
  +    };
  +
       private File file;
       private long millis = -1;
       private String dateTime;
       private Vector filesets = new Vector();
       private Vector filelists = new Vector();
       private FileUtils fileUtils;
  +    private boolean dateTimeConfigured;
  +    private boolean mkdirs;
  +    private boolean verbose = true;
  +    private FileNameMapper fileNameMapper = null;
  +    private DateFormatFactory dfFactory = DEFAULT_DF_FACTORY;
   
  +    /**
  +     * Construct a new <code>Touch</code> task.
  +     */
       public Touch() {
           fileUtils = FileUtils.newFileUtils();
       }
  @@ -62,122 +97,179 @@
       /**
        * Sets a single source file to touch.  If the file does not exist
        * an empty file will be created.
  +     * @param file the <code>File</code> to touch.
        */
       public void setFile(File file) {
           this.file = file;
       }
   
       /**
  -     * the new modification time of the file
  -     * in milliseconds since midnight Jan 1 1970.
  -     * Optional, default=now
  +     * Set the new modification time of file(s) touched
  +     * in milliseconds since midnight Jan 1 1970. Optional, default=now.
  +     * @param millis the <code>long</code> timestamp to use.
        */
       public void setMillis(long millis) {
           this.millis = millis;
       }
   
       /**
  -     * the new modification time of the file
  +     * Set the new modification time of file(s) touched
        * in the format &quot;MM/DD/YYYY HH:MM AM <i>or</i> PM&quot;
        * or &quot;MM/DD/YYYY HH:MM:SS AM <i>or</i> PM&quot;.
  -     * Optional, default=now
  +     * Optional, default=now.
  +     * @param dateTime the <code>String</code> date in the specified format.
        */
       public void setDatetime(String dateTime) {
  +        if (this.dateTime != null) {
  +            log("Resetting datetime attribute to " + dateTime, Project.MSG_VERBOSE);
  +        }
           this.dateTime = dateTime;
  +        dateTimeConfigured = false;
  +    }
  +
  +    /**
  +     * Set whether nonexistent parent directories should be created
  +     * when touching new files.
  +     * @param mkdirs <code>boolean</code> whether to create parent directories.
  +     * @since Ant 1.6.3
  +     */
  +    public void setMkdirs(boolean mkdirs) {
  +        this.mkdirs = mkdirs;
  +    }
  +
  +    /**
  +     * Set whether the touch task will report every file it creates;
  +     * defaults to <code>true</code>.
  +     * @param verbose <code>boolean</code> flag.
  +     * @since Ant 1.6.3
  +     */
  +    public void setVerbose(boolean verbose) {
  +        this.verbose = verbose;
  +    }
  +
  +    /**
  +     * Set the format of the datetime attribute.
  +     * @param pattern the <code>SimpleDateFormat</code>-compatible format pattern.
  +     * @since Ant 1.6.3
  +     */
  +    public void setPattern(final String pattern) {
  +        dfFactory = new DateFormatFactory() {
  +            public DateFormat getPrimaryFormat() {
  +                return new SimpleDateFormat(pattern);
  +            }
  +            public DateFormat getFallbackFormat() {
  +                return null;
  +            }
  +        };
  +    }
  +
  +    /**
  +     * Add a <code>Mapper</code>.
  +     * @param mapper the <code>Mapper</code> to add.
  +     * @since Ant 1.6.3
  +     */
  +    public void addMapper(Mapper mapper) {
  +        add(mapper.getImplementation());
  +    }
  +
  +    /**
  +     * Add a <code>FileNameMapper</code>.
  +     * @param mapper the <code>FileNameMapper</code> to add.
  +     * @since Ant 1.6.3
  +     */
  +    public void add(FileNameMapper fileNameMapper) {
  +        if (this.fileNameMapper != null) {
  +            throw new BuildException( "Only one mapper may be added to the "
  +                + getTaskName() + " task.");
  +        }
  +        this.fileNameMapper = fileNameMapper;
       }
   
       /**
  -     * Add a set of files to touch
  +     * Add a set of files to touch.
  +     * @param set the <code>Fileset</code> to add.
        */
       public void addFileset(FileSet set) {
           filesets.addElement(set);
       }
   
       /**
  -     * Add a filelist to touch
  +     * Add a filelist to touch.
  +     * @param list the <code>Filelist</code> to add.
        */
       public void addFilelist(FileList list) {
           filelists.addElement(list);
       }
   
       /**
  -     * Execute the touch operation.
  +     * Check that this task has been configured properly.
  +     * @throws <code>BuildException</code> if configuration errors are detected.
  +     * @since Ant 1.6.3
        */
  -    public void execute() throws BuildException {
  -        long savedMillis = millis;
  -
  -        if (file == null && filesets.size() == 0 && filelists.size() == 0) {
  -            throw
  -                new BuildException("Specify at least one source - a file, filelist or "
  -                                   + "a fileset.");
  +    protected synchronized void checkConfiguration() {
  +        if (file == null && filesets.size() + filelists.size() == 0) {
  +            throw new BuildException("Specify at least one source"
  +                                   + "--a file, filelist or a fileset.");
           }
  -
           if (file != null && file.exists() && file.isDirectory()) {
               throw new BuildException("Use a fileset to touch directories.");
           }
  -
  -        try {
  -            if (dateTime != null) {
  -                /*
  -                 * The initial version used DateFormat.SHORT for the
  -                 * time format, which ignores seconds.  If we want
  -                 * seconds as well, we need DateFormat.MEDIUM, which
  -                 * in turn would break all old build files.
  -                 *
  -                 * First try to parse with DateFormat.SHORT and if
  -                 * that fails with MEDIUM - throw an exception if both
  -                 * fail.
  -                 */
  -                DateFormat df =
  -                    DateFormat.getDateTimeInstance(DateFormat.SHORT,
  -                                                   DateFormat.SHORT,
  -                                                   Locale.US);
  -                try {
  -                    setMillis(df.parse(dateTime).getTime());
  -                } catch (ParseException pe) {
  -                    df =
  -                        DateFormat.getDateTimeInstance(DateFormat.SHORT,
  -                                                       DateFormat.MEDIUM,
  -                                                       Locale.US);
  +        if (dateTime != null && !dateTimeConfigured) {
  +            long workmillis = millis;
  +            DateFormat df = dfFactory.getPrimaryFormat();
  +            ParseException pe = null;
  +            try {
  +                workmillis = df.parse(dateTime).getTime();
  +            } catch (ParseException peOne) {
  +                df = dfFactory.getFallbackFormat();
  +                if (df == null) {
  +                    pe = peOne;
  +                } else {
                       try {
  -                        setMillis(df.parse(dateTime).getTime());
  -                    } catch (ParseException pe2) {
  -                        throw new BuildException(pe2.getMessage(), pe,
  -                                                 getLocation());
  +                        workmillis = df.parse(dateTime).getTime();
  +                    } catch (ParseException peTwo) {
  +                        pe = peTwo;
                       }
                   }
  -
  -                if (millis < 0) {
  -                    throw new BuildException("Date of " + dateTime
  -                                             + " results in negative "
  -                                             + "milliseconds value "
  -                                             + "relative to epoch "
  -                                             + "(January 1, 1970, "
  -                                             + "00:00:00 GMT).");
  -                }
               }
  -
  -            touch();
  -        } finally {
  -            millis = savedMillis;
  +            if (pe != null) {
  +                throw new BuildException(pe.getMessage(), pe, getLocation());
  +            }
  +            if (workmillis < 0) {
  +                throw new BuildException("Date of " + dateTime
  +                                         + " results in negative "
  +                                         + "milliseconds value "
  +                                         + "relative to epoch "
  +                                         + "(January 1, 1970, "
  +                                         + "00:00:00 GMT).");
  +            }
  +            log("Setting millis to " + workmillis + " from datetime attribute",
  +                ((millis < 0) ? Project.MSG_DEBUG : Project.MSG_VERBOSE));
  +            setMillis(workmillis);
  +            //only set if successful to this point:
  +            dateTimeConfigured = true;
           }
       }
   
       /**
  -     * Does the actual work; assumes everything has been checked by now.
  +     * Execute the touch operation.
  +     * @throws <code>BuildException</code> if an error occurs.
        */
  -    protected void touch() throws BuildException {
  +    public void execute() {
  +        checkConfiguration();
  +        touch();
  +    }
   
  -        boolean resetMillis = false;
  -        if (millis < 0) {
  -            resetMillis = true;
  -            millis = System.currentTimeMillis();
  -        }
  +    /**
  +     * Does the actual work; assumes everything has been checked by now.
  +     * @throws <code>BuildException</code> if an error occurs.
  +     */
  +    protected void touch() {
  +        long defaultTimestamp = getTimestamp();
   
           if (file != null) {
  -            touch(file);
  +            touch(fileUtils.getParentFile(file), file.getName(), defaultTimestamp);
           }
  -
           // deal with the filesets
           for (int i = 0; i < filesets.size(); i++) {
               FileSet fs = (FileSet) filesets.elementAt(i);
  @@ -188,14 +280,12 @@
               String[] srcDirs = ds.getIncludedDirectories();
   
               for (int j = 0; j < srcFiles.length; j++) {
  -                touch(new File(fromDir, srcFiles[j]));
  +                touch(fromDir, srcFiles[j], defaultTimestamp);
               }
  -
               for (int j = 0; j < srcDirs.length; j++) {
  -                touch(new File(fromDir, srcDirs[j]));
  +                touch(fromDir, srcDirs[j], defaultTimestamp);
               }
           }
  -
           // deal with the filelists
           for (int i = 0; i < filelists.size(); i++) {
               FileList fl = (FileList) filelists.elementAt(i);
  @@ -204,36 +294,58 @@
               String[] srcFiles = fl.getFiles(getProject());
   
               for (int j = 0; j < srcFiles.length; j++) {
  -                touch(new File(fromDir, srcFiles[j]));
  +                touch(fromDir, srcFiles[j], defaultTimestamp);
               }
           }
  -
  -        if (resetMillis) {
  -            millis = -1;
  -        }
       }
   
       /**
  -     * touch a single file with the current timestamp (this.millis)
  +     * Touch a single file with the current timestamp (this.millis). This method
  +     * does not interact with any nested mappers and remains for reasons of
  +     * backwards-compatibility only.
        * @param file file to touch
        * @throws BuildException
  +     * @deprecated
        */
  -    protected void touch(File file) throws BuildException {
  +    protected void touch(File file) {
  +        touch(file, getTimestamp());
  +    }
  +
  +    private long getTimestamp() {
  +        return (millis < 0) ? System.currentTimeMillis() : millis;
  +    }
  +
  +    private void touch(File fromDir, String filename, long defaultTimestamp) {
  +        File file = fileUtils.resolveFile(fromDir, filename);
  +        if (fileNameMapper == null) {
  +            touch(file, defaultTimestamp);
  +        } else {
  +            String[] mapped = fileNameMapper.mapFileName(filename);
  +            if (mapped != null && mapped.length > 0) {
  +                long modTime = (file.exists()) ? file.lastModified() : defaultTimestamp;
  +                for (int i = 0; i < mapped.length ; i++) {
  +                    touch(getProject().resolveFile(mapped[i]), modTime);
  +                }
  +            }
  +        }
  +    }
  +
  +    private void touch(File file, long modTime) {
           if (!file.exists()) {
  -            log("Creating " + file, Project.MSG_INFO);
  +            log("Creating " + file,
  +                ((verbose) ? Project.MSG_INFO : Project.MSG_VERBOSE));
               try {
  -                fileUtils.createNewFile(file);
  +                fileUtils.createNewFile(file, mkdirs);
               } catch (IOException ioe) {
                   throw new BuildException("Could not create " + file, ioe,
                                            getLocation());
               }
           }
  -
           if (!file.canWrite()) {
               throw new BuildException("Can not change modification date of "
                                        + "read-only file " + file);
           }
  -        fileUtils.setFileLastModified(file, millis);
  +        fileUtils.setFileLastModified(file, modTime);
       }
   
   }
  
  
  
  1.4       +77 -5     ant/src/etc/testcases/taskdefs/touch.xml
  
  Index: touch.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/touch.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- touch.xml	8 Feb 2004 20:48:01 -0000	1.3
  +++ touch.xml	14 Dec 2004 17:56:35 -0000	1.4
  @@ -1,16 +1,24 @@
   <?xml version="1.0"?>
   <project default="cleanup" basedir=".">
   
  +  <property name="mappermillis" value="1072224000000" />
  +  
  +  <selector id="map.selector">
  +    <date millis="${mappermillis}" />
  +  </selector>
  +
     <target name="cleanup">
  -    <delete file="touchtest" />
  +    <delete>
  +      <fileset dir="." includes="touchtest*" />
  +    </delete>
     </target>
   
     <target name="noSeconds">
  -    <touch file="touchtest" datetime="2003/06/24 2:20 pm"/>
  +    <touch file="touchtest" datetime="06/24/2003 2:20 pm"/>
     </target>
   
     <target name="seconds">
  -    <touch file="touchtest" datetime="2003/06/24 2:20:12 pm"/>
  +    <touch file="touchtest" datetime="06/24/2003 2:20:12 pm"/>
     </target>
   
     <target name="testNow">
  @@ -45,5 +53,69 @@
       </touch>
     </target>
   
  -  
  -</project>
  \ No newline at end of file
  +  <target name="testMappedFileset">
  +    <touch file="touchtest" millis="${mappermillis}" />
  +    <touch>
  +      <fileset file="touchtest" />
  +      <compositemapper>
  +        <globmapper from="*" to="*foo" />
  +        <globmapper from="*" to="*bar" />
  +      </compositemapper>
  +    </touch>
  +
  +    <fail>
  +      <condition>
  +        <not>
  +          <and>
  +            <isfileselected file="touchtest">
  +              <selector refid="map.selector" />
  +            </isfileselected>
  +            <isfileselected file="touchtestfoo">
  +              <selector refid="map.selector" />
  +            </isfileselected>
  +            <isfileselected file="touchtestbar">
  +              <selector refid="map.selector" />
  +            </isfileselected>
  +          </and>
  +        </not>
  +      </condition>
  +    </fail>
  +
  +  </target>
  +
  +  <target name="testMappedFilelist">
  +    <touch millis="${mappermillis}">
  +      <filelist dir="." files="idonotexist" />
  +      <mergemapper to="touchtest" />
  +    </touch>
  +
  +    <fail>
  +      <condition>
  +        <not>
  +          <isfileselected file="touchtest">
  +            <selector refid="map.selector" />
  +          </isfileselected>
  +        </not>
  +      </condition>
  +    </fail>
  +
  +  </target>
  +
  +  <target name="testGoodPattern">
  +    <touch file="touchtest" datetime="06242003142012foo" pattern="MMddyyyyHHmmss'foo'" />
  +    <fail>
  +      <condition>
  +        <not>
  +          <isfileselected file="touchtest">
  +            <date millis="1056482412000" />
  +          </isfileselected>
  +        </not>
  +      </condition>
  +    </fail>
  +  </target>
  +
  +  <target name="testBadPattern">
  +    <touch file="touchtest" datetime="06242003142012foo" pattern="MMddyyyyHHmmss'bar'" />
  +  </target>
  +
  +</project>
  
  
  
  1.9       +32 -3     ant/src/testcases/org/apache/tools/ant/taskdefs/TouchTest.java
  
  Index: TouchTest.java
  ===================================================================
  RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/TouchTest.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- TouchTest.java	7 Dec 2004 09:10:38 -0000	1.8
  +++ TouchTest.java	14 Dec 2004 17:56:35 -0000	1.9
  @@ -103,6 +103,35 @@
       }
   
       /**
  +     * test the mapped file set
  +     */
  +    public void testMappedFileset() {
  +        executeTarget("testMappedFileset");
  +    }
  +
  +    /**
  +     * test the mapped file list
  +     */
  +    public void testMappedFilelist() {
  +        executeTarget("testMappedFilelist");
  +    }
  +
  +    /**
  +     * test the pattern attribute
  +     */
  +    public void testGoodPattern() {
  +        executeTarget("testGoodPattern");
  +    }
  +
  +    /**
  +     * test the pattern attribute again
  +     */
  +    public void testBadPattern() {
  +        expectBuildExceptionContaining("testBadPattern",
  +            "No parsing exception thrown", "Unparseable");
  +    }
  +
  +    /**
        * run a target to touch the test file; verify the timestamp is as expected
        * @param targetName
        * @param timestamp
  @@ -110,7 +139,7 @@
       private void touchFile(String targetName, long timestamp) {
           executeTarget(targetName);
           long time = getTargetTime();
  -        assertTimesNearlyMatch(timestamp,time);
  +        assertTimesNearlyMatch(timestamp, time);
       }
   
       /**
  @@ -130,7 +159,7 @@
        * @param range
        */
       private void assertTimesNearlyMatch(long timestamp, long time, long range) {
  -        assertTrue("Time "+timestamp+" is not within "+range+" ms of "+time,
  -                Math.abs(time-timestamp)<=range);
  +        assertTrue("Time " + timestamp + " is not within " + range + " ms of "
  +            + time, (Math.abs(time - timestamp) <= range));
       }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org