diff --git a/src/etc/testcases/taskdefs/length.xml b/src/etc/testcases/taskdefs/length.xml index e9faf919a..b0ab47f24 100644 --- a/src/etc/testcases/taskdefs/length.xml +++ b/src/etc/testcases/taskdefs/length.xml @@ -2,6 +2,7 @@ + @@ -116,8 +117,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/org/apache/tools/ant/DirectoryScanner.java b/src/main/org/apache/tools/ant/DirectoryScanner.java index bd68775a0..e3b90b068 100644 --- a/src/main/org/apache/tools/ant/DirectoryScanner.java +++ b/src/main/org/apache/tools/ant/DirectoryScanner.java @@ -1349,7 +1349,7 @@ public class DirectoryScanner 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()); } /** diff --git a/src/main/org/apache/tools/ant/taskdefs/Length.java b/src/main/org/apache/tools/ant/taskdefs/Length.java index 5aacd89c6..7bf2c4a10 100755 --- a/src/main/org/apache/tools/ant/taskdefs/Length.java +++ b/src/main/org/apache/tools/ant/taskdefs/Length.java @@ -29,6 +29,7 @@ import org.apache.tools.ant.Project; 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 @@ public class Length extends Task { } 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 @@ public class Length extends Task { 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 @@ public class Length extends Task { this.ps = ps; } - protected abstract void handle(File f); + protected abstract void handle(Resource r); void complete() { ps.close(); @@ -212,11 +217,16 @@ public class Length extends Task { 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 @@ public class Length extends Task { 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); diff --git a/src/main/org/apache/tools/ant/types/Resource.java b/src/main/org/apache/tools/ant/types/Resource.java index 47d2e952f..b4f9964f6 100644 --- a/src/main/org/apache/tools/ant/types/Resource.java +++ b/src/main/org/apache/tools/ant/types/Resource.java @@ -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. * *

This is a dummy, used for not existing resources.

* @@ -50,18 +54,20 @@ public class Resource implements Cloneable, Comparable { } /** - * sets the name, lastmodified flag, and exists flag + * Sets the name, lastmodified flag, and exists flag. * * @param name relative path of the resource. Expects * "/" 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 * "/" to be used as the directory separator. * @param exists if true the resource exists @@ -70,14 +76,31 @@ public class Resource implements Cloneable, Comparable { */ 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 + * "/" 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 @@ public class Resource implements Cloneable, Comparable { * adm/resource.txt.

* *

"/" will be used as the directory separator.

- * @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 * "/" to be used as the directory separator. */ @@ -101,8 +125,8 @@ public class Resource implements Cloneable, Comparable { } /** - * 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 @@ public class Resource implements Cloneable, Comparable { /** * 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 {@link 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 @@ public class Resource implements Cloneable, Comparable { /** * 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 @@ public class Resource implements Cloneable, Comparable { } /** - * 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 @@ public class Resource implements Cloneable, Comparable { Resource r = (Resource) other; return getName().compareTo(r.getName()); } + } diff --git a/src/main/org/apache/tools/ant/types/ZipScanner.java b/src/main/org/apache/tools/ant/types/ZipScanner.java index bbcf3bc02..aeda8454c 100644 --- a/src/main/org/apache/tools/ant/types/ZipScanner.java +++ b/src/main/org/apache/tools/ant/types/ZipScanner.java @@ -226,7 +226,8 @@ public class ZipScanner extends DirectoryScanner { myentries.put(new String(entry.getName()), new Resource(entry.getName(), true, entry.getTime(), - entry.isDirectory())); + entry.isDirectory(), + entry.getSize())); } } finally { if (zf != null) { diff --git a/src/testcases/org/apache/tools/ant/taskdefs/LengthTest.java b/src/testcases/org/apache/tools/ant/taskdefs/LengthTest.java index d9470125c..e9b741c99 100755 --- a/src/testcases/org/apache/tools/ant/taskdefs/LengthTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/LengthTest.java @@ -71,4 +71,7 @@ public class LengthTest extends BuildFileTest { executeTarget("testImmutable"); } + public void testZipFileSet() { + executeTarget("testZipFileSet"); + } }