mbenson     2005/01/21 14:15:46

  Modified:    src/etc/testcases/taskdefs length.xml
               src/main/org/apache/tools/ant/taskdefs Length.java
               src/main/org/apache/tools/ant DirectoryScanner.java
               src/main/org/apache/tools/ant/types Resource.java
                        ZipScanner.java
               src/testcases/org/apache/tools/ant/taskdefs LengthTest.java
  Log:
  Add size to Resource info; switch length task to use Resources
  instead of files so that it can report lengths for zipfilesets.
  
  Revision  Changes    Path
  1.4       +25 -0     ant/src/etc/testcases/taskdefs/length.xml
  
  Index: length.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/length.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- length.xml        11 Jan 2005 15:36:20 -0000      1.3
  +++ length.xml        21 Jan 2005 22:15:45 -0000      1.4
  @@ -2,6 +2,7 @@
     <property name="dir" location="lengthtestdir" />
     <property name="dir.a" location="${dir}/a" />
     <property name="dir.b" location="${dir}/b" />
  +  <property name="zipfile" location="lengthtest.zip" />
   
     <target name="init">
       <mkdir dir="${dir.a}" />
  @@ -116,8 +117,32 @@
       </fail>
     </target>
   
  +  <target name="testZipFileSet" depends="init">
  +    <zip destfile="${zipfile}">
  +      <fileset file="${foo}" />
  +      <fileset file="${bar}" />
  +    </zip>
  +    <length property="length.zipfile1">
  +      <zipfileset src="${zipfile}" />
  +    </length>
  +    <length property="length.zipfile2">
  +      <zipfileset src="${zipfile}" includes="bar" />
  +    </length>
  +    <fail>
  +      <condition>
  +        <not>
  +          <and>
  +            <equals arg1="6" arg2="${length.zipfile1}" />
  +            <equals arg1="3" arg2="${length.zipfile2}" />
  +          </and>
  +        </not>
  +      </condition>
  +    </fail>
  +  </target>
  +
     <target name="cleanup">
       <delete dir="${dir}" />
  +    <delete file="${zipfile}" />
     </target>
   
   </project>
  
  
  
  1.7       +35 -20    ant/src/main/org/apache/tools/ant/taskdefs/Length.java
  
  Index: Length.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Length.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- Length.java       11 Jan 2005 15:45:22 -0000      1.6
  +++ Length.java       21 Jan 2005 22:15:45 -0000      1.7
  @@ -29,6 +29,7 @@
   import org.apache.tools.ant.BuildException;
   import org.apache.tools.ant.DirectoryScanner;
   import org.apache.tools.ant.types.FileSet;
  +import org.apache.tools.ant.types.Resource;
   import org.apache.tools.ant.types.EnumeratedAttribute;
   import org.apache.tools.ant.util.FileUtils;
   
  @@ -147,16 +148,29 @@
       }
   
       private void handleFilesets(Handler h) {
  -        HashSet included = new HashSet(filesets.size() * 10);
  +        HashSet included = new HashSet(filesets.size());
           for (int i = 0; i < filesets.size(); i++) {
               FileSet fs = (FileSet) (filesets.get(i));
               DirectoryScanner ds = fs.getDirectoryScanner(getProject());
  -            File basedir = fs.getDir(getProject());
               String[] f = ds.getIncludedFiles();
               for (int j = 0; j < f.length; j++) {
  -                File file = FileUtils.getFileUtils().resolveFile(basedir, 
f[j]);
  -                if (included.add(file)) {
  -                    h.handle(file);
  +                Resource r = ds.getResource(f[j]);
  +                if (!r.isExists()) {
  +                    log(r.getName() + " does not exist", Project.MSG_ERR);
  +                } else if (r.isDirectory()) {
  +                    log(r.getName() + " is a directory; length unspecified",
  +                        Project.MSG_ERR);
  +                } else {
  +                    //clone the Resource and alter path
  +                    File basedir = ds.getBasedir();
  +                    if (basedir != null) {
  +                        r = (Resource) (r.clone());
  +                        r.setName(FileUtils.getFileUtils().resolveFile(
  +                            basedir, r.getName()).getAbsolutePath());
  +                    }
  +                    if (included.add(r.getName())) {
  +                        h.handle(r);
  +                    }
                   }
               }
           }
  @@ -165,15 +179,6 @@
           h.complete();
       }
   
  -    private static long getLength(File f) {
  -        //should be an existing file
  -        if (!(f.isFile())) {
  -            throw new BuildException("The absolute pathname " + f
  -                + " does not denote an existing file.");
  -        }
  -        return f.length();
  -    }
  -
       /** EnumeratedAttribute operation mode */
       public static class FileMode extends EnumeratedAttribute {
           static final String[] MODES = new String[] {EACH, ALL};
  @@ -201,7 +206,7 @@
               this.ps = ps;
           }
   
  -        protected abstract void handle(File f);
  +        protected abstract void handle(Resource r);
   
           void complete() {
               ps.close();
  @@ -212,11 +217,16 @@
           EachHandler(PrintStream ps) {
               super(ps);
           }
  -        protected void handle(File f) {
  -            ps.print(f);
  +        protected void handle(Resource r) {
  +            ps.print(r.getName());
               ps.print(" : ");
               //when writing to the log, we'll see what's happening:
  -            ps.println(getLength(f));
  +            long size = r.getSize();
  +            if (size == Resource.UNKNOWN_SIZE) {
  +                ps.println("unknown");
  +            } else {
  +                ps.println(size);
  +            }
          }
       }
   
  @@ -225,8 +235,13 @@
           AllHandler(PrintStream ps) {
               super(ps);
           }
  -        protected synchronized void handle(File f) {
  -            length += getLength(f);
  +        protected synchronized void handle(Resource r) {
  +            long size = r.getSize();
  +            if (size == Resource.UNKNOWN_SIZE) {
  +                log("Size unknown for " + r.getName(), Project.MSG_WARN);
  +            } else {
  +                length += size;
  +            }
           }
           void complete() {
               ps.print(length);
  
  
  
  1.80      +1 -1      ant/src/main/org/apache/tools/ant/DirectoryScanner.java
  
  Index: DirectoryScanner.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/DirectoryScanner.java,v
  retrieving revision 1.79
  retrieving revision 1.80
  diff -u -r1.79 -r1.80
  --- DirectoryScanner.java     20 Jan 2005 14:35:15 -0000      1.79
  +++ DirectoryScanner.java     21 Jan 2005 22:15:46 -0000      1.80
  @@ -1349,7 +1349,7 @@
       public Resource getResource(String name) {
           File f = FILE_UTILS.resolveFile(basedir, name);
           return new Resource(name, f.exists(), f.lastModified(),
  -                            f.isDirectory());
  +                            f.isDirectory(), f.length());
       }
   
       /**
  
  
  
  1.11      +72 -26    ant/src/main/org/apache/tools/ant/types/Resource.java
  
  Index: Resource.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/types/Resource.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- Resource.java     7 Jan 2005 15:00:46 -0000       1.10
  +++ Resource.java     21 Jan 2005 22:15:46 -0000      1.11
  @@ -17,28 +17,32 @@
   package org.apache.tools.ant.types;
   
   /**
  - * describes a File or a ZipEntry
  + * Describes a File or a ZipEntry.
    *
  - * this class is meant to be used by classes needing to record path
  + * This class is meant to be used by classes needing to record path
    * and date/time information about a file, a zip entry or some similar
  - * resource (URL, archive in a version control repository, ...)
  + * resource (URL, archive in a version control repository, ...).
    *
    * @since Ant 1.5.2
    */
   public class Resource implements Cloneable, Comparable {
  +    /** Constant unknown size */
  +    public static final long UNKNOWN_SIZE = -1;
  +
       private String name = null;
       private boolean exists = true;
       private long lastmodified = 0;
       private boolean directory = false;
  +    private long size = UNKNOWN_SIZE;
   
       /**
  -     * default constructor
  +     * Default constructor.
        */
       public Resource() {
       }
   
       /**
  -     * only sets the name.
  +     * Only sets the name.
        *
        * <p>This is a dummy, used for not existing resources.</p>
        *
  @@ -50,18 +54,20 @@
       }
   
       /**
  -     * sets the name, lastmodified flag, and exists flag
  +     * Sets the name, lastmodified flag, and exists flag.
        *
        * @param name relative path of the resource.  Expects
        * &quot;/&quot; to be used as the directory separator.
  -     * @param exists if true, this resource exists
  -     * @param lastmodified the last modification time of this resource
  +     * @param exists if true, this resource exists.
  +     * @param lastmodified the last modification time of this resource.
        */
       public Resource(String name, boolean exists, long lastmodified) {
           this(name, exists, lastmodified, false);
       }
   
       /**
  +     * Sets the name, lastmodified flag, exists flag, and directory flag.
  +     *
        * @param name relative path of the resource.  Expects
        * &quot;/&quot; to be used as the directory separator.
        * @param exists if true the resource exists
  @@ -70,14 +76,31 @@
        */
       public Resource(String name, boolean exists, long lastmodified,
                       boolean directory) {
  +        this(name, exists, lastmodified, directory, UNKNOWN_SIZE);
  +    }
  +
  +    /**
  +     * Sets the name, lastmodified flag, exists flag, directory flag, and 
size.
  +     *
  +     * @param name relative path of the resource.  Expects
  +     * &quot;/&quot; to be used as the directory separator.
  +     * @param exists if true the resource exists
  +     * @param lastmodified the last modification time of the resource
  +     * @param directory    if true, this resource is a directory
  +     * @param size the size of this resource.
  +     */
  +    public Resource(String name, boolean exists, long lastmodified,
  +                    boolean directory, long size) {
           this.name = name;
  -        this.exists = exists;
  -        this.lastmodified = lastmodified;
  -        this.directory = directory;
  +        setName(name);
  +        setExists(exists);
  +        setLastModified(lastmodified);
  +        setDirectory(directory);
  +        setSize(size);
       }
   
       /**
  -     * name attribute will contain the path of a file relative to the
  +     * Name attribute will contain the path of a file relative to the
        * root directory of its fileset or the recorded path of a zip
        * entry.
        *
  @@ -86,13 +109,14 @@
        * adm/resource.txt.</p>
        *
        * <p>&quot;/&quot; will be used as the directory separator.</p>
  -     * @return the name of this resource
  +     * @return the name of this resource.
        */
       public String getName() {
           return name;
       }
   
       /**
  +     * Set the name of this Resource.
        * @param name relative path of the resource.  Expects
        * &quot;/&quot; to be used as the directory separator.
        */
  @@ -101,8 +125,8 @@
       }
   
       /**
  -     * The exists attribute tells whether a file exists
  -     * @return true if this resource exists
  +     * The exists attribute tells whether a file exists.
  +     * @return true if this resource exists.
        */
       public boolean isExists() {
           return exists;
  @@ -110,33 +134,33 @@
   
       /**
        * Set the exists attribute.
  -     * @param exists if true, this resource exists
  +     * @param exists if true, this resource exists.
        */
       public void setExists(boolean exists) {
           this.exists = exists;
       }
   
       /**
  -     * tells the modification time in milliseconds since 01.01.1970 of
  +     * Tells the modification time in milliseconds since 01.01.1970 .
        *
        * @return 0 if the resource does not exist to mirror the behavior
        * of [EMAIL PROTECTED] java.io.File File}.
        */
       public long getLastModified() {
  -        return !exists || lastmodified < 0 ? 0 : lastmodified;
  +        return !exists || lastmodified < 0 ? 0L : lastmodified;
       }
   
       /**
        * Set the last modification attribute.
  -     * @param lastmodified the modification time in milliseconds since 
01.01.1970
  +     * @param lastmodified the modification time in milliseconds since 
01.01.1970.
        */
       public void setLastModified(long lastmodified) {
           this.lastmodified = lastmodified;
       }
   
       /**
  -     * tells if the resource is a directory
  -     * @return boolean flag indicating if the resource is a directory
  +     * Tells if the resource is a directory.
  +     * @return boolean flag indicating if the resource is a directory.
        */
       public boolean isDirectory() {
           return directory;
  @@ -144,14 +168,34 @@
   
       /**
        * Set the directory attribute.
  -     * @param directory if true, this resource is a directory
  +     * @param directory if true, this resource is a directory.
        */
       public void setDirectory(boolean directory) {
           this.directory = directory;
       }
   
       /**
  -     * @return copy of this
  +     * Set the size of this Resource.
  +     * @param size the size, as a long.
  +     * @since Ant 1.7
  +     */
  +    public void setSize(long size) {
  +        this.size = (size > UNKNOWN_SIZE) ? size : UNKNOWN_SIZE;
  +    }
  +
  +    /**
  +     * Get the size of this Resource.
  +     * @return the size, as a long, 0 if the Resource does not exist (for
  +     *         compatibility with java.io.File), or UNKNOWN_SIZE if not 
known.
  +     * @since Ant 1.7
  +     */
  +    public long getSize() {
  +        return (exists) ? size : 0L;
  +    }
  +
  +    /**
  +     * Clone this Resource.
  +     * @return copy of this.
        */
       public Object clone() {
           try {
  @@ -163,9 +207,10 @@
       }
   
       /**
  -     * delegates to a comparison of names.
  -     * @param other the object to compare to
  -     * @return true if this object's name is the same as the other object's 
name
  +     * Delegates to a comparison of names.
  +     * @param other the object to compare to.
  +     * @return a negative integer, zero, or a positive integer as this 
Resource
  +     *         is less than, equal to, or greater than the specified 
Resource.
        * @since Ant 1.6
        */
       public int compareTo(Object other) {
  @@ -176,4 +221,5 @@
           Resource r = (Resource) other;
           return getName().compareTo(r.getName());
       }
  +
   }
  
  
  
  1.27      +2 -1      ant/src/main/org/apache/tools/ant/types/ZipScanner.java
  
  Index: ZipScanner.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/types/ZipScanner.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- ZipScanner.java   9 Mar 2004 16:48:41 -0000       1.26
  +++ ZipScanner.java   21 Jan 2005 22:15:46 -0000      1.27
  @@ -226,7 +226,8 @@
                   myentries.put(new String(entry.getName()),
                                 new Resource(entry.getName(), true,
                                              entry.getTime(),
  -                                           entry.isDirectory()));
  +                                           entry.isDirectory(),
  +                                           entry.getSize()));
               }
           } finally {
               if (zf != null) {
  
  
  
  1.5       +3 -0      
ant/src/testcases/org/apache/tools/ant/taskdefs/LengthTest.java
  
  Index: LengthTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/LengthTest.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- LengthTest.java   11 Jan 2005 15:36:21 -0000      1.4
  +++ LengthTest.java   21 Jan 2005 22:15:46 -0000      1.5
  @@ -71,4 +71,7 @@
           executeTarget("testImmutable");
       }
   
  +    public void testZipFileSet() {
  +        executeTarget("testZipFileSet");
  +    }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to