mbenson 2005/04/07 15:22:26 Modified: docs/manual/CoreTasks length.html conditions.html src/main/org/apache/tools/ant/taskdefs Length.java src/testcases/org/apache/tools/ant/taskdefs LengthTest.java src/etc/testcases/taskdefs length.xml Log: Remove "strip-duplicates" behavior from; add condition behavior to, Length task. Revision Changes Path 1.3 +16 -3 ant/docs/manual/CoreTasks/length.html Index: length.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/length.html,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- length.html 7 Mar 2005 18:09:09 -0000 1.2 +++ length.html 7 Apr 2005 22:22:25 -0000 1.3 @@ -11,7 +11,8 @@ <h2>Length</h2> <h3>Description</h3> <p>Display or set a property containing length information for - a string, a file, or one or more nested filesets.</p> + a string, a file, or one or more nested filesets. Can also + be used as a condition. <b>Since Ant 1.6.3</b></p> <h3>Parameters</h3> <table border="1" cellpadding="2" cellspacing="0"> <tr> @@ -22,7 +23,8 @@ <tr> <td valign="top">property</td> <td valign="top">The property to set. If omitted - the length is written to the log.</td> + the results are written to the log. Ignored when + processing as a condition.</td> <td valign="top" align="center">No</td> </tr> <tr> @@ -40,7 +42,7 @@ <td valign="top">File length mode; when "all" the resulting value is the sum of all included files' lengths; when "each" the task outputs the absolute path and length of each included file, - one per line.</td> + one per line. Ignored when processing as a condition.</td> <td valign="top" align="center">No; default is "all"</td> </tr> <tr> @@ -48,6 +50,17 @@ <td valign="top">Whether to trim when operating on a string.</td> <td valign="top" align="center">No; only valid when string is set</td> </tr> + <tr> + <td valign="top">length</td> + <td valign="top">Comparison length for processing as a condition.</td> + <td valign="top" align="center">Yes, in condition mode</td> + </tr> + <tr> + <td valign="top">when</td> + <td valign="top">Comparison type: "equal", "greater", "less" + for use when operating as a condition.</td> + <td valign="top" align="center">No; default is "equal"</td> + </tr> </table> <h3>Parameters specified as nested elements</h3> <h4>fileset</h4><p>You can include files via nested 1.34 +17 -0 ant/docs/manual/CoreTasks/conditions.html Index: conditions.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/conditions.html,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- conditions.html 10 Mar 2005 23:20:02 -0000 1.33 +++ conditions.html 7 Apr 2005 22:22:25 -0000 1.34 @@ -605,6 +605,23 @@ <p> Probe for the maven repository being reachable using the hostname, ten second timeout.. </p> + +<h4>length</h4> +<p>This condition is a facet of the <a href="length.html">Length</a> task. + It is used to test the length of a string or one or more files. + <b>Since Ant 1.6.3</b> +</p> + +Verify a string is of a certain length: +<pre> +<length string=" foo " trim="true" length="3"/> +</pre> + +Verify a file is not empty: +<pre> +<length file="foo" when="greater" length="0"/> +</pre> + <hr> <p align="center">Copyright © 2001-2005 Apache Software Foundation. All rights Reserved.</p> 1.9 +113 -28 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.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- Length.java 4 Feb 2005 22:13:43 -0000 1.8 +++ Length.java 7 Apr 2005 22:22:26 -0000 1.9 @@ -22,33 +22,39 @@ import java.io.OutputStream; import java.io.ByteArrayOutputStream; import java.util.Vector; -import java.util.HashSet; +import java.util.Iterator; import org.apache.tools.ant.Task; import org.apache.tools.ant.Project; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; +import org.apache.tools.ant.taskdefs.condition.Condition; 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; /** - * Gets lengths: of files, byte size; of strings, length (optionally trimmed). + * Gets lengths: of files/resources, byte size; of strings, length (optionally trimmed). * The task is overloaded in this way for semantic reasons, much like Available. * @since Ant 1.6.3 */ -public class Length extends Task { +public class Length extends Task implements Condition { private static final String ALL = "all"; private static final String EACH = "each"; private static final String STRING = "string"; + private static final String LENGTH_REQUIRED + = "Use of the Length condition requires that the length attribute be set."; + private String property; private String string; private Boolean trim; - private Vector filesets; private String mode = ALL; + private When when = When.EQUAL; + private Long length; + private Vector filesets; /** * The property in which the length will be stored. @@ -73,11 +79,31 @@ * @param fs the <code>FileSet</code> to add. */ public synchronized void add(FileSet fs) { + if (fs == null) { + return; + } filesets = (filesets == null) ? new Vector() : filesets; filesets.add(fs); } /** + * Set the target count number for use as a Condition. + * @param ell the long length to compare with. + */ + public synchronized void setLength(long ell) { + length = new Long(ell); + } + + /** + * Set the comparison criteria for use as a Condition: + * "equal", "greater", "less". Default is "equal". + * @param w EnumeratedAttribute When. + */ + public synchronized void setWhen(When w) { + when = w; + } + + /** * Set the execution mode for working with files. * @param m the <code>FileMode</code> to use. */ @@ -103,6 +129,14 @@ } /** + * Learn whether strings will be trimmed. + * @return boolean trim setting. + */ + public boolean getTrim() { + return trim != null && trim.booleanValue(); + } + + /** * Execute the length task. */ public void execute() { @@ -112,16 +146,40 @@ : (OutputStream) new LogOutputStream(this, Project.MSG_INFO)); if (STRING.equals(mode)) { - ps.print(((trim != null && trim.booleanValue()) - ? string.trim() : string).length()); + ps.print(getLength(string, getTrim())); ps.close(); } else if (EACH.equals(mode)) { - handleFilesets(new EachHandler(ps)); + handleResources(new EachHandler(ps)); } else if (ALL.equals(mode)) { - handleFilesets(new AllHandler(ps)); + handleResources(new AllHandler(ps)); } } + /** + * Fulfill the condition contract. + * @return true if the condition is true. + * @throws BuildException if an error occurs. + */ + public boolean eval() { + validate(); + if (length == null) { + throw new BuildException(LENGTH_REQUIRED); + } + Long ell = null; + if (STRING.equals(mode)) { + ell = new Long(getLength(string, getTrim())); + } else { + ConditionHandler h = new ConditionHandler(); + handleResources(h); + ell = new Long(h.getLength()); + } + int w = when.getIndex(); + int comp = ell.compareTo(length); + return (w == 0 && comp == 0) + || (w == 1 && comp > 0) + || (w == 2 && comp < 0); + } + private void validate() { if (string != null) { if (filesets != null && filesets.size() > 0) { @@ -130,9 +188,9 @@ } if (!(STRING.equals(mode))) { throw new BuildException("the mode attribute is for use" - + " with the file length function"); + + " with the file/resource length function"); } - } else if (filesets != null && filesets.size() > 0) { + } else if (filesets != null) { if (!(EACH.equals(mode) || ALL.equals(mode))) { throw new BuildException("invalid mode setting for" + " file length function: \"" + mode + "\""); @@ -147,10 +205,9 @@ } } - private void handleFilesets(Handler h) { - HashSet included = new HashSet(filesets.size()); - for (int i = 0; i < filesets.size(); i++) { - FileSet fs = (FileSet) (filesets.get(i)); + private void handleResources(Handler h) { + for (Iterator i = filesets.iterator(); i.hasNext();) { + FileSet fs = (FileSet) i.next(); DirectoryScanner ds = fs.getDirectoryScanner(getProject()); String[] f = ds.getIncludedFiles(); for (int j = 0; j < f.length; j++) { @@ -161,24 +218,22 @@ log(r.getName() + " is a directory; length unspecified", Project.MSG_ERR); } else { - //clone the Resource and alter path + //force a full 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); - } + String s = FileUtils.getFileUtils().resolveFile( + basedir, r.getName()).getAbsolutePath(); + h.handle(new Resource(s, true, + r.getLastModified(), false, r.getSize())); } } } - included.clear(); - included = null; h.complete(); } + private static long getLength(String s, boolean t) { + return (t ? s.trim() : s).length(); + } + /** EnumeratedAttribute operation mode */ public static class FileMode extends EnumeratedAttribute { static final String[] MODES = new String[] {EACH, ALL}; @@ -193,6 +248,25 @@ } + /** + * EnumeratedAttribute for the when attribute. + */ + public static class When extends EnumeratedAttribute { + private static final String[] VALUES + = new String[] {"equal", "greater", "less"}; + + private static final When EQUAL = new When("equal"); + + public When() { + } + public When(String value) { + setValue(value); + } + public String[] getValues() { + return VALUES; + } + } + private class PropertyOutputStream extends ByteArrayOutputStream { public void close() { getProject().setNewProperty( @@ -231,7 +305,7 @@ } private class AllHandler extends Handler { - long length = 0L; + long accum = 0L; AllHandler(PrintStream ps) { super(ps); } @@ -240,12 +314,23 @@ if (size == Resource.UNKNOWN_SIZE) { log("Size unknown for " + r.getName(), Project.MSG_WARN); } else { - length += size; + accum += size; } } void complete() { - ps.print(length); + ps.print(accum); super.complete(); } } + + private class ConditionHandler extends AllHandler { + ConditionHandler() { + super(null); + } + void complete() { + } + long getLength() { + return accum; + } + } } 1.6 +45 -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.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- LengthTest.java 21 Jan 2005 22:15:46 -0000 1.5 +++ LengthTest.java 7 Apr 2005 22:22:26 -0000 1.6 @@ -37,26 +37,66 @@ executeTarget("testEach"); } + public void testEachCondition() { + executeTarget("testEachCondition"); + } + public void testAll() { executeTarget("testAll"); } + public void testAllCondition() { + executeTarget("testAllCondition"); + } + public void testFile() { executeTarget("testFile"); } + public void testFileCondition() { + executeTarget("testFileCondition"); + } + public void testBoth() { executeTarget("testBoth"); } + public void testBothCondition() { + executeTarget("testBothCondition"); + } + public void testDupes() { executeTarget("testDupes"); } + public void testDupesCondition() { + executeTarget("testDupesCondition"); + } + public void testString() { executeTarget("testString"); } + public void testStringCondition() { + executeTarget("testStringCondition"); + } + + public void testTrimString() { + executeTarget("testTrimString"); + } + + public void testTrimStringCondition() { + executeTarget("testTrimStringCondition"); + } + + public void testNoTrimString() { + executeTarget("testNoTrimString"); + } + + public void testNoTrimStringCondition() { + executeTarget("testNoTrimStringCondition"); + } + public void testStringFile() { expectBuildExceptionContaining("testStringFile", "should fail", "incompatible"); @@ -74,4 +114,9 @@ public void testZipFileSet() { executeTarget("testZipFileSet"); } + + public void testZipFileSetCondition() { + executeTarget("testZipFileSetCondition"); + } + } 1.5 +142 -2 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.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- length.xml 21 Jan 2005 22:15:45 -0000 1.4 +++ length.xml 7 Apr 2005 22:22:26 -0000 1.5 @@ -35,6 +35,27 @@ </fail> </target> + <target name="testEachCondition" depends="init"> + <length mode="each" property="length.each"> + <fileset id="fs" dir="${dir}" /> + </length> + <length string="${foo}${bar}........${line.separator}" + property="length.expected" /> + <fail> + <!-- test that both files are represented, and that the + output is the expected length; do not assume order. --> + <condition> + <not> + <and> + <contains string="${length.each}" substring="${foo} : 3" /> + <contains string="${length.each}" substring="${bar} : 3" /> + <length string="${length.each}" length="${length.expected}" /> + </and> + </not> + </condition> + </fail> + </target> + <target name="testAll" depends="init"> <length property="length.all"> <fileset id="foo" file="${dir.a}/foo" /> @@ -49,6 +70,19 @@ </fail> </target> + <target name="testAllCondition" depends="init"> + <fail> + <condition> + <not> + <length length="6"> + <fileset id="foo" file="${dir.a}/foo" /> + <fileset id="bar" file="${dir.b}/bar" /> + </length> + </not> + </condition> + </fail> + </target> + <target name="testFile" depends="init"> <length property="length.foo" file="${dir.a}/foo" /> <fail> @@ -60,6 +94,16 @@ </fail> </target> + <target name="testFileCondition" depends="init"> + <fail> + <condition> + <not> + <length length="3" file="${dir.a}/foo" /> + </not> + </condition> + </fail> + </target> + <target name="testBoth" depends="init"> <length property="length.foo" file="${dir.a}/foo"> <fileset file="${dir.b}/bar" /> @@ -73,6 +117,18 @@ </fail> </target> + <target name="testBothCondition" depends="init"> + <fail> + <condition> + <not> + <length length="6" file="${dir.a}/foo"> + <fileset file="${dir.b}/bar" /> + </length> + </not> + </condition> + </fail> + </target> + <target name="testDupes" depends="init"> <length property="length.foo" file="${dir.a}/foo"> <fileset dir="${dir}" /> @@ -80,7 +136,19 @@ <fail> <condition> <not> - <equals arg1="6" arg2="${length.foo}" /> + <equals arg1="9" arg2="${length.foo}" /> + </not> + </condition> + </fail> + </target> + + <target name="testDupesCondition" depends="init"> + <fail> + <condition> + <not> + <length length="9" file="${dir.a}/foo"> + <fileset dir="${dir}" /> + </length> </not> </condition> </fail> @@ -97,6 +165,58 @@ </fail> </target> + <target name="testStringCondition"> + <fail> + <condition> + <not> + <length string="foo" length="3" /> + </not> + </condition> + </fail> + </target> + + <target name="testTrimString"> + <length string=" foo " trim="true" property="length.string" /> + <fail> + <condition> + <not> + <equals arg1="3" arg2="${length.string}" /> + </not> + </condition> + </fail> + </target> + + <target name="testTrimStringCondition"> + <fail> + <condition> + <not> + <length string=" foo " trim="true" length="3" /> + </not> + </condition> + </fail> + </target> + + <target name="testNoTrimString"> + <length string=" foo " property="length.string" /> + <fail> + <condition> + <not> + <equals arg1="5" arg2="${length.string}" /> + </not> + </condition> + </fail> + </target> + + <target name="testNoTrimStringCondition"> + <fail> + <condition> + <not> + <length string=" foo " length="5" /> + </not> + </condition> + </fail> + </target> + <target name="testTrimFile" description="should fail"> <length file="${ant.file}" trim="false" /> </target> @@ -117,11 +237,14 @@ </fail> </target> - <target name="testZipFileSet" depends="init"> + <target name="zip" depends="init"> <zip destfile="${zipfile}"> <fileset file="${foo}" /> <fileset file="${bar}" /> </zip> + </target> + + <target name="testZipFileSet" depends="zip"> <length property="length.zipfile1"> <zipfileset src="${zipfile}" /> </length> @@ -140,6 +263,23 @@ </fail> </target> + <target name="testZipFileSetCondition" depends="zip"> + <fail> + <condition> + <not> + <and> + <length length="6"> + <zipfileset src="${zipfile}" /> + </length> + <length length="3"> + <zipfileset src="${zipfile}" includes="bar" /> + </length> + </and> + </not> + </condition> + </fail> + </target> + <target name="cleanup"> <delete dir="${dir}" /> <delete file="${zipfile}" />
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]