Browse Source

Add size to Resource info; switch length task to use Resources

instead of files so that it can report lengths for zipfilesets.


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277427 13f79535-47bb-0310-9956-ffa450edef68
master
Matthew Jason Benson 20 years ago
parent
commit
4122b8a95f
6 changed files with 138 additions and 48 deletions
  1. +25
    -0
      src/etc/testcases/taskdefs/length.xml
  2. +1
    -1
      src/main/org/apache/tools/ant/DirectoryScanner.java
  3. +35
    -20
      src/main/org/apache/tools/ant/taskdefs/Length.java
  4. +72
    -26
      src/main/org/apache/tools/ant/types/Resource.java
  5. +2
    -1
      src/main/org/apache/tools/ant/types/ZipScanner.java
  6. +3
    -0
      src/testcases/org/apache/tools/ant/taskdefs/LengthTest.java

+ 25
- 0
src/etc/testcases/taskdefs/length.xml View File

@@ -2,6 +2,7 @@
<property name="dir" location="lengthtestdir" /> <property name="dir" location="lengthtestdir" />
<property name="dir.a" location="${dir}/a" /> <property name="dir.a" location="${dir}/a" />
<property name="dir.b" location="${dir}/b" /> <property name="dir.b" location="${dir}/b" />
<property name="zipfile" location="lengthtest.zip" />


<target name="init"> <target name="init">
<mkdir dir="${dir.a}" /> <mkdir dir="${dir.a}" />
@@ -116,8 +117,32 @@
</fail> </fail>
</target> </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"> <target name="cleanup">
<delete dir="${dir}" /> <delete dir="${dir}" />
<delete file="${zipfile}" />
</target> </target>


</project> </project>

+ 1
- 1
src/main/org/apache/tools/ant/DirectoryScanner.java View File

@@ -1349,7 +1349,7 @@ public class DirectoryScanner
public Resource getResource(String name) { public Resource getResource(String name) {
File f = FILE_UTILS.resolveFile(basedir, name); File f = FILE_UTILS.resolveFile(basedir, name);
return new Resource(name, f.exists(), f.lastModified(), return new Resource(name, f.exists(), f.lastModified(),
f.isDirectory());
f.isDirectory(), f.length());
} }


/** /**


+ 35
- 20
src/main/org/apache/tools/ant/taskdefs/Length.java View File

@@ -29,6 +29,7 @@ import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.types.FileSet; 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.types.EnumeratedAttribute;
import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.util.FileUtils;


@@ -147,16 +148,29 @@ public class Length extends Task {
} }


private void handleFilesets(Handler h) { 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++) { for (int i = 0; i < filesets.size(); i++) {
FileSet fs = (FileSet) (filesets.get(i)); FileSet fs = (FileSet) (filesets.get(i));
DirectoryScanner ds = fs.getDirectoryScanner(getProject()); DirectoryScanner ds = fs.getDirectoryScanner(getProject());
File basedir = fs.getDir(getProject());
String[] f = ds.getIncludedFiles(); String[] f = ds.getIncludedFiles();
for (int j = 0; j < f.length; j++) { 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(); 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 */ /** EnumeratedAttribute operation mode */
public static class FileMode extends EnumeratedAttribute { public static class FileMode extends EnumeratedAttribute {
static final String[] MODES = new String[] {EACH, ALL}; static final String[] MODES = new String[] {EACH, ALL};
@@ -201,7 +206,7 @@ public class Length extends Task {
this.ps = ps; this.ps = ps;
} }


protected abstract void handle(File f);
protected abstract void handle(Resource r);


void complete() { void complete() {
ps.close(); ps.close();
@@ -212,11 +217,16 @@ public class Length extends Task {
EachHandler(PrintStream ps) { EachHandler(PrintStream ps) {
super(ps); super(ps);
} }
protected void handle(File f) {
ps.print(f);
protected void handle(Resource r) {
ps.print(r.getName());
ps.print(" : "); ps.print(" : ");
//when writing to the log, we'll see what's happening: //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) { AllHandler(PrintStream ps) {
super(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() { void complete() {
ps.print(length); ps.print(length);


+ 72
- 26
src/main/org/apache/tools/ant/types/Resource.java View File

@@ -17,28 +17,32 @@
package org.apache.tools.ant.types; 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 * 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 * @since Ant 1.5.2
*/ */
public class Resource implements Cloneable, Comparable { public class Resource implements Cloneable, Comparable {
/** Constant unknown size */
public static final long UNKNOWN_SIZE = -1;

private String name = null; private String name = null;
private boolean exists = true; private boolean exists = true;
private long lastmodified = 0; private long lastmodified = 0;
private boolean directory = false; private boolean directory = false;
private long size = UNKNOWN_SIZE;


/** /**
* default constructor
* Default constructor.
*/ */
public Resource() { public Resource() {
} }


/** /**
* only sets the name.
* Only sets the name.
* *
* <p>This is a dummy, used for not existing resources.</p> * <p>This is a dummy, used for not existing resources.</p>
* *
@@ -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 * @param name relative path of the resource. Expects
* &quot;/&quot; to be used as the directory separator. * &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) { public Resource(String name, boolean exists, long lastmodified) {
this(name, exists, lastmodified, false); this(name, exists, lastmodified, false);
} }


/** /**
* Sets the name, lastmodified flag, exists flag, and directory flag.
*
* @param name relative path of the resource. Expects * @param name relative path of the resource. Expects
* &quot;/&quot; to be used as the directory separator. * &quot;/&quot; to be used as the directory separator.
* @param exists if true the resource exists * @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, public Resource(String name, boolean exists, long lastmodified,
boolean directory) { 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.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 * root directory of its fileset or the recorded path of a zip
* entry. * entry.
* *
@@ -86,13 +109,14 @@ public class Resource implements Cloneable, Comparable {
* adm/resource.txt.</p> * adm/resource.txt.</p>
* *
* <p>&quot;/&quot; will be used as the directory separator.</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() { public String getName() {
return name; return name;
} }


/** /**
* Set the name of this Resource.
* @param name relative path of the resource. Expects * @param name relative path of the resource. Expects
* &quot;/&quot; to be used as the directory separator. * &quot;/&quot; 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() { public boolean isExists() {
return exists; return exists;
@@ -110,33 +134,33 @@ public class Resource implements Cloneable, Comparable {


/** /**
* Set the exists attribute. * Set the exists attribute.
* @param exists if true, this resource exists
* @param exists if true, this resource exists.
*/ */
public void setExists(boolean exists) { public void setExists(boolean exists) {
this.exists = 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 * @return 0 if the resource does not exist to mirror the behavior
* of {@link java.io.File File}. * of {@link java.io.File File}.
*/ */
public long getLastModified() { public long getLastModified() {
return !exists || lastmodified < 0 ? 0 : lastmodified;
return !exists || lastmodified < 0 ? 0L : lastmodified;
} }


/** /**
* Set the last modification attribute. * 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) { public void setLastModified(long lastmodified) {
this.lastmodified = 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() { public boolean isDirectory() {
return directory; return directory;
@@ -144,14 +168,34 @@ public class Resource implements Cloneable, Comparable {


/** /**
* Set the directory attribute. * 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) { public void setDirectory(boolean directory) {
this.directory = 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() { public Object clone() {
try { 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 * @since Ant 1.6
*/ */
public int compareTo(Object other) { public int compareTo(Object other) {
@@ -176,4 +221,5 @@ public class Resource implements Cloneable, Comparable {
Resource r = (Resource) other; Resource r = (Resource) other;
return getName().compareTo(r.getName()); return getName().compareTo(r.getName());
} }

} }

+ 2
- 1
src/main/org/apache/tools/ant/types/ZipScanner.java View File

@@ -226,7 +226,8 @@ public class ZipScanner extends DirectoryScanner {
myentries.put(new String(entry.getName()), myentries.put(new String(entry.getName()),
new Resource(entry.getName(), true, new Resource(entry.getName(), true,
entry.getTime(), entry.getTime(),
entry.isDirectory()));
entry.isDirectory(),
entry.getSize()));
} }
} finally { } finally {
if (zf != null) { if (zf != null) {


+ 3
- 0
src/testcases/org/apache/tools/ant/taskdefs/LengthTest.java View File

@@ -71,4 +71,7 @@ public class LengthTest extends BuildFileTest {
executeTarget("testImmutable"); executeTarget("testImmutable");
} }


public void testZipFileSet() {
executeTarget("testZipFileSet");
}
} }

Loading…
Cancel
Save