Browse Source

> -> >

Submitted by:	Larry Shatzer


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277037 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 20 years ago
parent
commit
706bba41a5
9 changed files with 385 additions and 385 deletions
  1. +2
    -2
      docs/manual/CoreTasks/changelog.html
  2. +2
    -2
      docs/manual/CoreTasks/chmod.html
  3. +12
    -12
      docs/manual/CoreTypes/filterchain.html
  4. +2
    -2
      docs/manual/CoreTypes/selectors-program.html
  5. +44
    -44
      docs/manual/CoreTypes/selectors.html
  6. +1
    -1
      docs/manual/OptionalTasks/replaceregexp.html
  7. +1
    -1
      docs/manual/running.html
  8. +176
    -176
      docs/manual/tutorial-tasks-filesets-properties.html
  9. +145
    -145
      docs/manual/tutorial-writing-tasks.html

+ 2
- 2
docs/manual/CoreTasks/changelog.html View File

@@ -213,9 +213,9 @@ how to generate a HTML report from the XML report.</p>
&lt;revision&gt;1.3&lt;/revision&gt; &lt;revision&gt;1.3&lt;/revision&gt;
&lt;prevrevision&gt;1.2&lt;/prevrevision&gt; &lt;prevrevision&gt;1.2&lt;/prevrevision&gt;
&lt;/file&gt; &lt;/file&gt;
&lt;msg&gt;&lt;![CDATA[Use URLs directly rather than go via a FIle.
&lt;msg&gt;&lt;![CDATA[Use URLs directly rather than go via a File.


This allows temp[lates to be stored inside jar]]&gt;&lt;/msg&gt;
This allows templates to be stored inside jar]]&gt;&lt;/msg&gt;
&lt;/entry&gt; &lt;/entry&gt;
&lt;/changelog&gt; &lt;/changelog&gt;
</pre> </pre>


+ 2
- 2
docs/manual/CoreTasks/chmod.html View File

@@ -147,8 +147,8 @@ permissions.</p>
</blockquote> </blockquote>


<p>keeps non-owners from touching cgi scripts, files with a <code>.old</code> <p>keeps non-owners from touching cgi scripts, files with a <code>.old</code>
extension or directories begining with <code>private_</code>. A directory
ending in <code>.old</code> or a file begining with private_ would remain
extension or directories beginning with <code>private_</code>. A directory
ending in <code>.old</code> or a file beginning with private_ would remain
unaffected.</p> unaffected.</p>


<hr> <hr>


+ 12
- 12
docs/manual/CoreTypes/filterchain.html View File

@@ -648,34 +648,34 @@ This graphic shows the dependencies:
<TABLE> <TABLE>
<TR> <TR>
<TD bgcolor="#C0C0C0">&nbsp;</TD> <TD bgcolor="#C0C0C0">&nbsp;</TD>
<TD><PRE>&lt;filterchain>
<TD><PRE>&lt;filterchain&gt;
&lt;headfilter lines="2"/&gt; &lt;headfilter lines="2"/&gt;
&lt;/filterchain></PRE></TD>
&lt;/filterchain&gt;</PRE></TD>
</TR> </TR>
<TR> <TR>
<TD bgcolor="#FF00FF">&nbsp;</TD> <TD bgcolor="#FF00FF">&nbsp;</TD>
<TD><PRE>&lt;filterchain>
<TD><PRE>&lt;filterchain&gt;
&lt;tailfilter lines="-1" skip="2"/&gt; &lt;tailfilter lines="-1" skip="2"/&gt;
&lt;/filterchain></PRE></TD>
&lt;/filterchain&gt;</PRE></TD>
</TR> </TR>
<TR> <TR>
<TD bgcolor="#008000">&nbsp;</TD> <TD bgcolor="#008000">&nbsp;</TD>
<TD><PRE>&lt;filterchain>
<TD><PRE>&lt;filterchain&gt;
&lt;headfilter lines="-1" skip="2"/&gt; &lt;headfilter lines="-1" skip="2"/&gt;
&lt;/filterchain></PRE></TD>
&lt;/filterchain&gt;</PRE></TD>
</TR> </TR>
<TR> <TR>
<TD bgcolor="#0000FF">&nbsp;</TD> <TD bgcolor="#0000FF">&nbsp;</TD>
<TD><PRE>&lt;filterchain>
&lt;headfilter lines="-1" skip="2"/>
&lt;tailfilter lines="-1" skip="2"/>
&lt;/filterchain></PRE></TD>
<TD><PRE>&lt;filterchain&gt;
&lt;headfilter lines="-1" skip="2"/&gt;
&lt;tailfilter lines="-1" skip="2"/&gt;
&lt;/filterchain&gt;</PRE></TD>
</TR> </TR>
<TR> <TR>
<TD bgcolor="#00FF00">&nbsp;</TD> <TD bgcolor="#00FF00">&nbsp;</TD>
<TD><PRE>&lt;filterchain>
<TD><PRE>&lt;filterchain&gt;
&lt;tailfilter lines="2"/&gt; &lt;tailfilter lines="2"/&gt;
&lt;/filterchain></PRE></TD>
&lt;/filterchain&gt;</PRE></TD>
</TR> </TR>
</TABLE> </TABLE>
</TD> </TD>


+ 2
- 2
docs/manual/CoreTypes/selectors-program.html View File

@@ -201,9 +201,9 @@ public class MySelectorTest extends BaseSelectorTest {
As an example of an error JUnit could log<pre> As an example of an error JUnit could log<pre>
[junit] FAILED [junit] FAILED
[junit] Error for files: <font color=blue>.;copy.filterset.filtered;tar/gz/asf-logo.gif.tar.gz</font> [junit] Error for files: <font color=blue>.;copy.filterset.filtered;tar/gz/asf-logo.gif.tar.gz</font>
[junit] expected:&lt;<font color=blue>FTTTFTTTF...</font>> but was:&lt;TTTTTTTTT...>
[junit] expected:&lt;<font color=blue>FTTTFTTTF...</font>&gt; but was:&lt;TTTTTTTTT...&gt;
[junit] junit.framework.ComparisonFailure: Error for files: .;copy.filterset.filtered;tar/gz/asf-logo.gif.tar.gz [junit] junit.framework.ComparisonFailure: Error for files: .;copy.filterset.filtered;tar/gz/asf-logo.gif.tar.gz
[junit] expected:&lt;FTTTFTTTF...> but was:&lt;TTTTTTTTT...>
[junit] expected:&lt;FTTTFTTTF...&gt; but was:&lt;TTTTTTTTT...&gt;
[junit] at junit.framework.Assert.assertEquals(Assert.java:81) [junit] at junit.framework.Assert.assertEquals(Assert.java:81)
[junit] at org.apache.tools.ant.types.selectors.BaseSelectorTest.performTest(BaseSelectorTest.java:194) [junit] at org.apache.tools.ant.types.selectors.BaseSelectorTest.performTest(BaseSelectorTest.java:194)
</pre></p> </pre></p>


+ 44
- 44
docs/manual/CoreTypes/selectors.html View File

@@ -613,7 +613,7 @@


<blockquote><pre> <blockquote><pre>
&lt;fileset dir=&quot;${src}&quot;&gt; &lt;fileset dir=&quot;${src}&quot;&gt;
&lt;type type="dir"/>
&lt;type type="dir"/&gt;
&lt;/fileset&gt; &lt;/fileset&gt;
</pre></blockquote> </pre></blockquote>


@@ -622,12 +622,12 @@
directory, but avoid selecting empty directories, use: directory, but avoid selecting empty directories, use:


<blockquote><pre> <blockquote><pre>
&lt;fileset dir="${src}">
&lt;and>
&lt;present targetdir="template"/>
&lt;type type="file"/>
&lt;/and>
&lt;/fileset>
&lt;fileset dir="${src}"&gt;
&lt;and&gt;
&lt;present targetdir="template"/&gt;
&lt;type type="file"/&gt;
&lt;/and&gt;
&lt;/fileset&gt;
</pre></blockquote> </pre></blockquote>




@@ -816,62 +816,62 @@
<p>Here are some examples of how to use the Modified Selector:</p> <p>Here are some examples of how to use the Modified Selector:</p>


<blockquote><pre> <blockquote><pre>
&lt;copy todir="dest">
&lt;fileset dir="src">
&lt;modified/>
&lt;/fileset>
&lt;/copy
&lt;copy todir="dest"&gt;
&lt;fileset dir="src"&gt;
&lt;modified/&gt;
&lt;/fileset&gt;
&lt;/copy&gt;
</pre></blockquote> </pre></blockquote>
<p>This will copy all files from <i>src</i> to <i>dest</i> which content has changed. <p>This will copy all files from <i>src</i> to <i>dest</i> which content has changed.
Using an updating PropertyfileCache with cache.properties and Using an updating PropertyfileCache with cache.properties and
MD5-DigestAlgorithm.</p> MD5-DigestAlgorithm.</p>


<blockquote><pre> <blockquote><pre>
&lt;copy todir="dest">
&lt;fileset dir="src">
&lt;copy todir="dest"&gt;
&lt;fileset dir="src"&gt;
&lt;modified update="true" &lt;modified update="true"
seldirs="true" seldirs="true"
cache="propertyfile" cache="propertyfile"
algorithm="digest" algorithm="digest"
comparator="equal">
&lt;param name="cache.cachefile" value="cache.properties"/>
&lt;param name="algorithm.algorithm" value="MD5"/>
&lt;/modified>
&lt;/fileset>
&lt;/copy>
comparator="equal"&gt;
&lt;param name="cache.cachefile" value="cache.properties"/&gt;
&lt;param name="algorithm.algorithm" value="MD5"/&gt;
&lt;/modified&gt;
&lt;/fileset&gt;
&lt;/copy&gt;
</pre></blockquote> </pre></blockquote>
<p>This is the same example rewritten as CoreSelector with setting the all the values <p>This is the same example rewritten as CoreSelector with setting the all the values
(same as defaults are).</p> (same as defaults are).</p>


<blockquote><pre> <blockquote><pre>
&lt;copy todir="dest">
&lt;fileset dir="src">
&lt;custom class="org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector">
&lt;param name="update" value="true"/>
&lt;param name="seldirs" value="true"/>
&lt;param name="cache" value="propertyfile"/>
&lt;param name="algorithm" value="digest"/>
&lt;param name="comparator" value="equal"/>
&lt;param name="cache.cachefile" value="cache.properties"/>
&lt;param name="algorithm.algorithm" value="MD5"/>
&lt;/custom>
&lt;/fileset>
&lt;/copy>
&lt;copy todir="dest"&gt;
&lt;fileset dir="src"&gt;
&lt;custom class="org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector"&gt;
&lt;param name="update" value="true"/&gt;
&lt;param name="seldirs" value="true"/&gt;
&lt;param name="cache" value="propertyfile"/&gt;
&lt;param name="algorithm" value="digest"/&gt;
&lt;param name="comparator" value="equal"/&gt;
&lt;param name="cache.cachefile" value="cache.properties"/&gt;
&lt;param name="algorithm.algorithm" value="MD5"/&gt;
&lt;/custom&gt;
&lt;/fileset&gt;
&lt;/copy&gt;
</pre></blockquote> </pre></blockquote>
<p>And this is the same rewritten as CustomSelector.</p> <p>And this is the same rewritten as CustomSelector.</p>


<blockquote><pre> <blockquote><pre>
&lt;target name="generate-and-upload-site">
&lt;echo> generate the site using forrest &lt;/echo>
&lt;antcall target="site"/>
&lt;echo> upload the changed file &lt;/echo>
&lt;ftp server="${ftp.server}" userid="${ftp.user}" password="${ftp.pwd}">
&lt;fileset dir="htdocs/manual">
&lt;modified/>
&lt;/fileset>
&lt;/ftp>
&lt;/target>
&lt;target name="generate-and-upload-site"&gt;
&lt;echo&gt; generate the site using forrest &lt;/echo&gt;
&lt;antcall target="site"/&gt;
&lt;echo&gt; upload the changed file &lt;/echo&gt;
&lt;ftp server="${ftp.server}" userid="${ftp.user}" password="${ftp.pwd}"&gt;
&lt;fileset dir="htdocs/manual"&gt;
&lt;modified/&gt;
&lt;/fileset&gt;
&lt;/ftp&gt;
&lt;/target&gt;
</pre></blockquote> </pre></blockquote>
<p>A useful scenario for this selector inside a build environment <p>A useful scenario for this selector inside a build environment
for homepage generation (e.g. with <a href="http://xml.apache.org/forrest/"> for homepage generation (e.g. with <a href="http://xml.apache.org/forrest/">


+ 1
- 1
docs/manual/OptionalTasks/replaceregexp.html View File

@@ -123,7 +123,7 @@ line separator. So with input


<blockquote> <blockquote>
<pre> <pre>
&lt;html> &lt;body&gt;
&lt;html&gt; &lt;body&gt;
&lt;&lt;TAB&gt;&gt;&lt;h1&gt; T E S T &lt;/h1&gt; &lt;&lt;TAB&gt;&gt; &lt;&lt;TAB&gt;&gt;&lt;h1&gt; T E S T &lt;/h1&gt; &lt;&lt;TAB&gt;&gt;
&lt;&lt;TAB&gt;&gt; &lt;/body&gt;&lt;/html&gt; &lt;&lt;TAB&gt;&gt; &lt;/body&gt;&lt;/html&gt;
</pre></blockquote> </pre></blockquote>


+ 1
- 1
docs/manual/running.html View File

@@ -217,7 +217,7 @@ set):</p>
<p>So here the result of a search through the codebase. Because system properties are <p>So here the result of a search through the codebase. Because system properties are
available via Project instance, I searched for them with a available via Project instance, I searched for them with a
<pre> <pre>
grep -r -n "getPropert" * > ..\grep.txt
grep -r -n "getPropert" * &gt; ..\grep.txt
</pre> </pre>
command. After that I filtered out the often-used but not-so-important values (most of them command. After that I filtered out the often-used but not-so-important values (most of them
read-only values): <i>path.separator, ant.home, basedir, user.dir, os.name, ant.file, read-only values): <i>path.separator, ant.home, basedir, user.dir, os.name, ant.file,


+ 176
- 176
docs/manual/tutorial-tasks-filesets-properties.html View File

@@ -41,16 +41,16 @@ location of that file in a property.</p>
<p>We can use the buildfile from the other tutorial and modify it a little bit. <p>We can use the buildfile from the other tutorial and modify it a little bit.
That´s the advantage of using properties - we can reuse nearly the whole script. :-)</p> That´s the advantage of using properties - we can reuse nearly the whole script. :-)</p>
<pre class="code"> <pre class="code">
&lt;?xml version="1.0" encoding="ISO-8859-1"?>
&lt;project name="<b>FindTask</b>" basedir="." default="test">
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;project name="<b>FindTask</b>" basedir="." default="test"&gt;
... ...
&lt;target name="use.init" description="Taskdef´ the <b>Find</b>-Task" depends="jar">
&lt;taskdef name="<b>find</b>" classname="<b>Find</b>" classpath="${ant.project.name}.jar"/>
&lt;/target>
&lt;target name="use.init" description="Taskdef´ the <b>Find</b>-Task" depends="jar"&gt;
&lt;taskdef name="<b>find</b>" classname="<b>Find</b>" classpath="${ant.project.name}.jar"/&gt;
&lt;/target&gt;


<b>&lt;!-- the other use.* targets are deleted --&gt;</b> <b>&lt;!-- the other use.* targets are deleted --&gt;</b>
... ...
&lt;/project>
&lt;/project&gt;
</pre> </pre>


<p>The buildfile is in the archive <a href="tutorial-tasks-filesets-properties.zip"> <p>The buildfile is in the archive <a href="tutorial-tasks-filesets-properties.zip">
@@ -63,13 +63,13 @@ tutorial-tasks-filesets-properties.zip [2]</a> in <tt>/build.xml.01-propertyacce
<p>Our first step is to set a property to a value and print the value of that property. <p>Our first step is to set a property to a value and print the value of that property.
So our scenario would be So our scenario would be
<pre class="code"> <pre class="code">
&lt;find property="test" value="test-value"/>
&lt;find print="test"/>
&lt;find property="test" value="test-value"/&gt;
&lt;find print="test"/&gt;
</pre> </pre>
ok, can be rewritten with the core tasks ok, can be rewritten with the core tasks
<pre class="code"> <pre class="code">
&lt;property name="test" value="test-value"/>
&lt;echo message="${test}"/>
&lt;property name="test" value="test-value"/&gt;
&lt;echo message="${test}"/&gt;
</pre> </pre>
but I have to start on known ground :-)</p> but I have to start on known ground :-)</p>
<p>So what to do? Handling three attributes (property, value, print) and an execute method. <p>So what to do? Handling three attributes (property, value, print) and an execute method.
@@ -117,7 +117,7 @@ name. Otherwise a message is logged.</p>


<p><i>(by the way: a short word to ants "namespaces" (don´t <p><i>(by the way: a short word to ants "namespaces" (don´t
be confused with xml namespaces which will be also introduces in the future (1.6 or 1.7): be confused with xml namespaces which will be also introduces in the future (1.6 or 1.7):
an &lt;antcall> creates a new space for property names. All properties from the caller
an &lt;antcall&gt; creates a new space for property names. All properties from the caller
are passed to the callee, but the callee can set its own properties without notice by the are passed to the callee, but the callee can set its own properties without notice by the
caller.)</i></p> caller.)</i></p>


@@ -158,9 +158,9 @@ their usage in buildfiles. Our goal is to search a file in path. And on this ste
path is simply a fileset (or more precise: a collection of filesets). So our usage path is simply a fileset (or more precise: a collection of filesets). So our usage
would be would be
<pre class="code"> <pre class="code">
&lt;find file="ant.jar" location="location.ant-jar">
&lt;fileset dir="${ant.home}" includes="**/*.jar"/>
&lt;/find>
&lt;find file="ant.jar" location="location.ant-jar"&gt;
&lt;fileset dir="${ant.home}" includes="**/*.jar"/&gt;
&lt;/find&gt;
</pre> </pre>
</p> </p>


@@ -315,30 +315,30 @@ whithout being complex :-)</p>
environment we have to set that value for our own. And we use the &lt;junit&gt; task in fork-mode. environment we have to set that value for our own. And we use the &lt;junit&gt; task in fork-mode.
Therefore we have do modify our buildfile: Therefore we have do modify our buildfile:
<pre class="code"> <pre class="code">
&lt;target name="junit" description="Runs the unit tests" depends="jar">
&lt;delete dir="${junit.out.dir.xml}" />
&lt;mkdir dir="${junit.out.dir.xml}" />
&lt;junit printsummary="yes" haltonfailure="no">
&lt;classpath refid="classpath.test"/>
<b>&lt;sysproperty key="ant.home" value="${ant.home}"/></b>
&lt;formatter type="xml"/>
&lt;batchtest fork="yes" todir="${junit.out.dir.xml}">
&lt;fileset dir="${src.dir}" includes="**/*Test.java"/>
&lt;/batchtest>
&lt;/junit>
&lt;/target>
&lt;target name="junit" description="Runs the unit tests" depends="jar"&gt;
&lt;delete dir="${junit.out.dir.xml}"/&gt;
&lt;mkdir dir="${junit.out.dir.xml}"/&gt;
&lt;junit printsummary="yes" haltonfailure="no"&gt;
&lt;classpath refid="classpath.test"/&gt;
<b>&lt;sysproperty key="ant.home" value="${ant.home}"/&gt;</b>
&lt;formatter type="xml"/&gt;
&lt;batchtest fork="yes" todir="${junit.out.dir.xml}"&gt;
&lt;fileset dir="${src.dir}" includes="**/*Test.java"/&gt;
&lt;/batchtest&gt;
&lt;/junit&gt;
&lt;/target&gt;
</pre> </pre>




<a name="path"/> <a name="path"/>
<h2>Using nested paths</h2> <h2>Using nested paths</h2>
<p>A task providing support for filesets is a very comfortable one. But there is another <p>A task providing support for filesets is a very comfortable one. But there is another
possibility of bundling files: the &lt;path>. Fileset are easy if the files are all under
possibility of bundling files: the &lt;path&gt;. Fileset are easy if the files are all under
a common base directory. But if this is not the case you have a problem. Another disadvantage a common base directory. But if this is not the case you have a problem. Another disadvantage
is its speed: if you have only a few files in a huge directory structure, why not use a is its speed: if you have only a few files in a huge directory structure, why not use a
&lt;filelist> instead? &lt;path>s combines these datatypes in that way that a path contains
&lt;filelist&gt; instead? &lt;path&gt;s combines these datatypes in that way that a path contains
other paths, filesets, dirsets and filelists. This is why <a href="http://ant-contrib.sourceforge.net/"> other paths, filesets, dirsets and filelists. This is why <a href="http://ant-contrib.sourceforge.net/">
Ant-Contribs [4]</a> &lt;foreach> task is modified to support paths instead of filesets. So we want that,
Ant-Contribs [4]</a> &lt;foreach&gt; task is modified to support paths instead of filesets. So we want that,
too.</p> too.</p>


<p>Changing from fileset to path support is very easy:</p> <p>Changing from fileset to path support is very easy:</p>
@@ -354,15 +354,15 @@ too.</p>
paths.add(path); paths.add(path);
} }
<i><b>and build file from:</b></i> <i><b>and build file from:</b></i>
&lt;find file="ant.jar" location="location.ant-jar">
&lt;fileset dir="${ant.home}" includes="**/*.jar"/>
&lt;/find>
&lt;find file="ant.jar" location="location.ant-jar"&gt;
&lt;fileset dir="${ant.home}" includes="**/*.jar"/&gt;
&lt;/find&gt;
<i><b>to:</b></i> <i><b>to:</b></i>
&lt;find file="ant.jar" location="location.ant-jar">
<b>&lt;path></b> *3
&lt;fileset dir="${ant.home}" includes="**/*.jar"/>
&lt;/path>
&lt;/find>
&lt;find file="ant.jar" location="location.ant-jar"&gt;
<b>&lt;path&gt;</b> *3
&lt;fileset dir="${ant.home}" includes="**/*.jar"/&gt;
&lt;/path&gt;
&lt;/find&gt;
</pre> </pre>
<p>On <b>*1</b> we rename only the vector. It´s just for better reading the source. On <b>*2</b> <p>On <b>*1</b> we rename only the vector. It´s just for better reading the source. On <b>*2</b>
we have to provide the right method: an add<i>Name</i>(<i>Type</i> t). Therefore replace the we have to provide the right method: an add<i>Name</i>(<i>Type</i> t). Therefore replace the
@@ -414,13 +414,13 @@ And would it be good to get all of them? - It depends on ...<p>


<p>In this section we will extend that task to support returning a list of all files. <p>In this section we will extend that task to support returning a list of all files.
Lists as property values are not supported by Ant natively. So we have to see how other Lists as property values are not supported by Ant natively. So we have to see how other
tasks use lists. The most famous task using lists is Ant-Contribs &lt;foreach>. All list
tasks use lists. The most famous task using lists is Ant-Contribs &lt;foreach&gt;. All list
elements are concatenated and separated with a customizable separator (default ',').</p> elements are concatenated and separated with a customizable separator (default ',').</p>


<p>So we do the following:</p> <p>So we do the following:</p>


<pre class="code"> <pre class="code">
&lt;find ... <b>delimiter=""</b>/> ... &lt;/find>
&lt;find ... <b>delimiter=""</b>/&gt; ... &lt;/find&gt;
</pre> </pre>


<p>If the delimiter is set we will return all found files as list with that delimiter.</p> <p>If the delimiter is set we will return all found files as list with that delimiter.</p>
@@ -436,35 +436,35 @@ elements are concatenated and separated with a customizable separator (default '
<p>So we add as testcase:</p> <p>So we add as testcase:</p>
<pre class="code"> <pre class="code">
<b><i>in the buildfile:</i></b> <b><i>in the buildfile:</i></b>
&lt;target name="test.init">
&lt;mkdir dir="test1/dir11/dir111"/> *1
&lt;mkdir dir="test1/dir11/dir112"/>
&lt;target name="test.init"&gt;
&lt;mkdir dir="test1/dir11/dir111"/&gt; *1
&lt;mkdir dir="test1/dir11/dir112"/&gt;
... ...
&lt;touch file="test1/dir11/dir111/test"/>
&lt;touch file="test1/dir11/dir111/not"/>
&lt;touch file="test1/dir11/dir111/test"/&gt;
&lt;touch file="test1/dir11/dir111/not"/&gt;
... ...
&lt;touch file="test1/dir13/dir131/not2"/>
&lt;touch file="test1/dir13/dir132/test"/>
&lt;touch file="test1/dir13/dir132/not"/>
&lt;touch file="test1/dir13/dir132/not2"/>
&lt;mkdir dir="test2"/>
&lt;copy todir="test2"> *2
&lt;fileset dir="test1"/>
&lt;/copy>
&lt;/target>
&lt;target name="testMultipleFiles" depends="use.init,<b>test.init</b>"> *3
&lt;find file="test" location="location.test" <b>delimiter=";"</b>>
&lt;path>
&lt;fileset dir="test1"/>
&lt;fileset dir="test2"/>
&lt;/path>
&lt;/find>
&lt;delete> *4
&lt;fileset dir="test1"/>
&lt;fileset dir="test2"/>
&lt;/delete>
&lt;/target>
&lt;touch file="test1/dir13/dir131/not2"/&gt;
&lt;touch file="test1/dir13/dir132/test"/&gt;
&lt;touch file="test1/dir13/dir132/not"/&gt;
&lt;touch file="test1/dir13/dir132/not2"/&gt;
&lt;mkdir dir="test2"/&gt;
&lt;copy todir="test2"&gt; *2
&lt;fileset dir="test1"/&gt;
&lt;/copy&gt;
&lt;/target&gt;
&lt;target name="testMultipleFiles" depends="use.init,<b>test.init</b>"&gt; *3
&lt;find file="test" location="location.test" <b>delimiter=";"</b>&gt;
&lt;path&gt;
&lt;fileset dir="test1"/&gt;
&lt;fileset dir="test2"/&gt;
&lt;/path&gt;
&lt;/find&gt;
&lt;delete&gt; *4
&lt;fileset dir="test1"/&gt;
&lt;fileset dir="test2"/&gt;
&lt;/delete&gt;
&lt;/target&gt;


<b><i>in the test class:</i></b> <b><i>in the test class:</i></b>
public void testMultipleFiles() { public void testMultipleFiles() {
@@ -563,123 +563,123 @@ important :-) examples</li>
As a template we have: As a template we have:


<pre class="code"> <pre class="code">
&lt;html>
&lt;html&gt;


&lt;head>
&lt;meta http-equiv="Content-Language" content="en-us">
&lt;title> <b>Taskname</b> Task&lt;/title>
&lt;/head>
&lt;head&gt;
&lt;meta http-equiv="Content-Language" content="en-us"&gt;
&lt;title&gt; <b>Taskname</b> Task&lt;/title&gt;
&lt;/head&gt;


&lt;body>
&lt;body&gt;


&lt;h2>&lt;a name="<i>taskname</i>"><b>Taskname</b>&lt;/a>&lt;/h2>
&lt;h3>Description&lt;/h3>
&lt;p> <b>Describe the task.</b>&lt;/p>
&lt;h2&gt;&lt;a name="<i>taskname</i>"&gt;<b>Taskname</b>&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt; <b>Describe the task.</b>&lt;/p&gt;


&lt;h3>Parameters&lt;/h3>
&lt;table border="1" cellpadding="2" cellspacing="0">
&lt;tr>
&lt;td valign="top">&lt;b>Attribute&lt;/b>&lt;/td>
&lt;td valign="top">&lt;b>Description&lt;/b>&lt;/td>
&lt;td align="center" valign="top">&lt;b>Required&lt;/b>&lt;/td>
&lt;/tr>
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table border="1" cellpadding="2" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;&lt;b&gt;Attribute&lt;/b&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/td&gt;
&lt;td align="center" valign="top"&gt;&lt;b&gt;Required&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;


<b>do this html row for each attribute (including inherited attributes)</b> <b>do this html row for each attribute (including inherited attributes)</b>
&lt;tr>
&lt;td valign="top">classname&lt;/td>
&lt;td valign="top">the Java class to execute.&lt;/td>
&lt;td align="center" valign="top">Either jar or classname&lt;/td>
&lt;/tr>
&lt;tr&gt;
&lt;td valign="top"&gt;classname&lt;/td&gt;
&lt;td valign="top"&gt;the Java class to execute.&lt;/td&gt;
&lt;td align="center" valign="top"&gt;Either jar or classname&lt;/td&gt;
&lt;/tr&gt;


&lt;/table>
&lt;/table&gt;


&lt;h3>Parameters specified as nested elements&lt;/h3>
&lt;h3&gt;Parameters specified as nested elements&lt;/h3&gt;


<b>Describe each nested element (including inherited)</b> <b>Describe each nested element (including inherited)</b>
&lt;h4><b>your nested element</b>&lt;/h4>
&lt;p> <b>description</b> &lt;/p>
&lt;p>&lt;em>since Ant 1.6&lt;/em>.&lt;/p>
&lt;h4&gt;your nested element</b>&lt;/h4&gt;
&lt;p&gt; <b>description</b> &lt;/p&gt;
&lt;p&gt;&lt;em&gt;since Ant 1.6&lt;/em&gt;.&lt;/p&gt;


&lt;h3>Examples&lt;/h3>
&lt;pre>
&lt;h3&gt;Examples&lt;/h3&gt;
&lt;pre&gt;
<b>A code sample; don´t forget to escape the &lt; of the tags with &amp;lt;</b> <b>A code sample; don´t forget to escape the &lt; of the tags with &amp;lt;</b>
&lt;/pre>
&lt;/pre&gt;
<b>what should that example do?</b> <b>what should that example do?</b>


&lt;/body>
&lt;/html>
&lt;/body&gt;
&lt;/html&gt;
</pre> </pre>


<p>For our task we have <a href="CoreTasks/find.html">that [6]</a>:</p> <p>For our task we have <a href="CoreTasks/find.html">that [6]</a>:</p>
<pre class="code"> <pre class="code">
&lt;html>
&lt;head>
&lt;meta http-equiv="Content-Language" content="en-us">
&lt;title> Find Task&lt;/title>
&lt;/head>
&lt;body>
&lt;h2>&lt;a name="find">Find&lt;/a>&lt;/h2>
&lt;h3>Description&lt;/h3>
&lt;p>Searchs in a given path for a file and returns the absolute to it as property.
If delimiter is set this task returns all found locations.&lt;/p>
&lt;h3>Parameters&lt;/h3>
&lt;table border="1" cellpadding="2" cellspacing="0">
&lt;tr>
&lt;td valign="top">&lt;b>Attribute&lt;/b>&lt;/td>
&lt;td valign="top">&lt;b>Description&lt;/b>&lt;/td>
&lt;td align="center" valign="top">&lt;b>Required&lt;/b>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td valign="top">file&lt;/td>
&lt;td valign="top">The name of the file to search.&lt;/td>
&lt;td align="center" valign="top">yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td valign="top">location&lt;/td>
&lt;td valign="top">The name of the property where to store the location&lt;/td>
&lt;td align="center" valign="top">yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td valign="top">delimiter&lt;/td>
&lt;td valign="top">A delimiter to use when returning the list&lt;/td>
&lt;td align="center" valign="top">only if the list is required&lt;/td>
&lt;/tr>
&lt;/table>
&lt;h3>Parameters specified as nested elements&lt;/h3>
&lt;h4>path&lt;/h4>
&lt;p>The path where to search the file.&lt;/p>
&lt;h3>Examples&lt;/h3>
&lt;pre>
&lt;find file="ant.jar" location="loc">
&lt;path>
&lt;fileset dir="${ant.home}"/>
&lt;path>
&lt;/find>
&lt;/pre>
Searches in Ants home directory for a file &lt;i>ant.jar&lt;/i> and stores its location in
property &lt;i>loc&lt;/i> (should be ANT_HOME/bin/ant.jar).
&lt;pre>
&lt;find file="ant.jar" location="loc" delimiter=";">
&lt;path>
&lt;fileset dir="C:/"/>
&lt;path>
&lt;/find>
&lt;echo>ant.jar found in: ${loc}&lt;/echo>
&lt;/pre>
Searches in Windows C: drive for all &lt;i>ant.jar&lt;/i> and stores their locations in
property &lt;i>loc&lt;/i> delimited with &lt;i>';'&lt;/i>. (should need a long time :-)
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Language" content="en-us"&gt;
&lt;title&gt; Find Task&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h2&gt;&lt;a name="find"&gt;Find&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Searchs in a given path for a file and returns the absolute to it as property.
If delimiter is set this task returns all found locations.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table border="1" cellpadding="2" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;&lt;b&gt;Attribute&lt;/b&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/td&gt;
&lt;td align="center" valign="top"&gt;&lt;b&gt;Required&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;file&lt;/td&gt;
&lt;td valign="top"&gt;The name of the file to search.&lt;/td&gt;
&lt;td align="center" valign="top"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;location&lt;/td&gt;
&lt;td valign="top"&gt;The name of the property where to store the location&lt;/td&gt;
&lt;td align="center" valign="top"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;delimiter&lt;/td&gt;
&lt;td valign="top"&gt;A delimiter to use when returning the list&lt;/td&gt;
&lt;td align="center" valign="top"&gt;only if the list is required&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h3&gt;Parameters specified as nested elements&lt;/h3&gt;
&lt;h4&gt;path&lt;/h4&gt;
&lt;p&gt;The path where to search the file.&lt;/p&gt;
&lt;h3&gt;Examples&lt;/h3&gt;
&lt;pre&gt;
&lt;find file="ant.jar" location="loc"&gt;
&lt;path&gt;
&lt;fileset dir="${ant.home}"/&gt;
&lt;path&gt;
&lt;/find&gt;
&lt;/pre&gt;
Searches in Ants home directory for a file &lt;i&gt;ant.jar&lt;/i&gt; and stores its location in
property &lt;i&gt;loc&lt;/i&gt; (should be ANT_HOME/bin/ant.jar).
&lt;pre&gt;
&lt;find file="ant.jar" location="loc" delimiter=";"&gt;
&lt;path&gt;
&lt;fileset dir="C:/"/&gt;
&lt;path&gt;
&lt;/find&gt;
&lt;echo&gt;ant.jar found in: ${loc}&lt;/echo&gt;
&lt;/pre&gt;
Searches in Windows C: drive for all &lt;i&gt;ant.jar&lt;/i&gt; and stores their locations in
property &lt;i&gt;loc&lt;/i&gt; delimited with &lt;i&gt;';'&lt;/i&gt;. (should need a long time :-)
After that it prints out the result (e.g. C:/ant-1.5.4/bin/ant.jar;C:/ant-1.6/bin/ant.jar). After that it prints out the result (e.g. C:/ant-1.5.4/bin/ant.jar;C:/ant-1.6/bin/ant.jar).


&lt;/body>
&lt;/html>
&lt;/body&gt;
&lt;/html&gt;
</pre> </pre>




@@ -755,9 +755,9 @@ on <b>//4</b>.</p>
are any tests failing on our machine. (We can ignore these failing tests on later are any tests failing on our machine. (We can ignore these failing tests on later
steps; windows syntax used here- translate to xNIX if needed): steps; windows syntax used here- translate to xNIX if needed):
<pre class="output"> <pre class="output">
ANTHOME> build // 1
ANTHOME> set ANT_HOME=%CD%\dist // 2
ANTHOME> ant test -Dtest.haltonfailure=false // 3
ANTHOME&gt; build // 1
ANTHOME&gt; set ANT_HOME=%CD%\dist // 2
ANTHOME&gt; ant test -Dtest.haltonfailure=false // 3
</pre> </pre>


First we have to build our Ant distribution (<b>//1</b>). On <b>//2</b> we set the ANT_HOME First we have to build our Ant distribution (<b>//1</b>). On <b>//2</b> we set the ANT_HOME
@@ -782,14 +782,14 @@ necessary and saves a lot of work if you modify existing source :-)</i>.
<li>in FindTest.java change the line <tt>configureProject("build.xml");</tt> to <li>in FindTest.java change the line <tt>configureProject("build.xml");</tt> to
<tt>configureProject("src/etc/testcases/taskdefs/find.xml");</tt> </li> <tt>configureProject("src/etc/testcases/taskdefs/find.xml");</tt> </li>
<li>move the find.html to ANTHOME/docs/manual/CoreTasks/find.html </li> <li>move the find.html to ANTHOME/docs/manual/CoreTasks/find.html </li>
<li>add a <tt>&lt;a href="CoreTasks/find.html">Find&lt;/a>&lt;br></tt>
<li>add a <tt>&lt;a href="CoreTasks/find.html"&gt;Find&lt;/a&gt;&lt;br&gt;</tt>
in the ANTHOME/docs/manual/coretasklist.html </li> in the ANTHOME/docs/manual/coretasklist.html </li>
</ul> </ul>


Now our modifications are done and we will retest it: Now our modifications are done and we will retest it:
<pre class="output"> <pre class="output">
ANTHOME> build
ANTHOME> ant run-single-test // 1
ANTHOME&gt; build
ANTHOME&gt; ant run-single-test // 1
-Dtestcase=org.apache.tools.ant.taskdefs.FindTest // 2 -Dtestcase=org.apache.tools.ant.taskdefs.FindTest // 2
-Dtest.haltonfailure=false -Dtest.haltonfailure=false
</pre> </pre>
@@ -799,15 +799,15 @@ failures of our own test (<b>//1 + 2</b>).</p>


<p>And ... oh, all tests fail: <i>Ant could not find the task or a class this task relies upon.</i></p> <p>And ... oh, all tests fail: <i>Ant could not find the task or a class this task relies upon.</i></p>


<p>Ok: in the earlier steps we told Ant to use the Find class for the &lt;find> task (remember the
&lt;taskdef> statement in the "use.init" target). But now we want to introduce that task as
<p>Ok: in the earlier steps we told Ant to use the Find class for the &lt;find&gt; task (remember the
&lt;taskdef&gt; statement in the "use.init" target). But now we want to introduce that task as
a core task. And nobody wants to taskdef the javac, echo, ... So what to do? The answer is the a core task. And nobody wants to taskdef the javac, echo, ... So what to do? The answer is the
src/main/.../taskdefs/default.properties. Here is the mapping between taskname and implementing src/main/.../taskdefs/default.properties. Here is the mapping between taskname and implementing
class done. So we add a <tt>find=org.apache.tools.ant.taskdefs.Find</tt> as the last core class done. So we add a <tt>find=org.apache.tools.ant.taskdefs.Find</tt> as the last core
task (just before the <tt># optional tasks</tt> line). Now a second try: task (just before the <tt># optional tasks</tt> line). Now a second try:
<pre class="output"> <pre class="output">
ANTHOME> build // 1
ANTHOME> ant run-single-test
ANTHOME&gt; build // 1
ANTHOME&gt; ant run-single-test
-Dtestcase=org.apache.tools.ant.taskdefs.FindTest -Dtestcase=org.apache.tools.ant.taskdefs.FindTest
-Dtest.haltonfailure=false -Dtest.haltonfailure=false
</pre> </pre>
@@ -816,7 +816,7 @@ We have to rebuild (<b>//1</b>) Ant because the test look in the %ANT_HOME%\lib\
source path. So we have to rebuild that jar. But now all tests pass and we check whether our class source path. So we have to rebuild that jar. But now all tests pass and we check whether our class
breaks some other tests. breaks some other tests.
<pre class="output"> <pre class="output">
ANTHOME> ant test -Dtest.haltonfailure=false
ANTHOME&gt; ant test -Dtest.haltonfailure=false
</pre> </pre>
Because there are a lot of tests this step requires a little bit of time. So use the <i>run-single-test</i> Because there are a lot of tests this step requires a little bit of time. So use the <i>run-single-test</i>
during development and do the <i>test</i> only at the end (maybe sometimes during development too). during development and do the <i>test</i> only at the end (maybe sometimes during development too).
@@ -863,7 +863,7 @@ directory (this feature was added with Ant 1.6).</p>


<p>So we will run the tests with <p>So we will run the tests with
<pre class="output"> <pre class="output">
ANTHOME> ant -f check.xml checkstyle htmlreport
ANTHOME&gt; ant -f check.xml checkstyle htmlreport
</pre> </pre>
I prefer the HTML report because there are lots of messages and we can navigate faster. I prefer the HTML report because there are lots of messages and we can navigate faster.
Open the ANTHOME/build/reports/checkstyle/html/index.html and navigate to the Find.java. Now we Open the ANTHOME/build/reports/checkstyle/html/index.html and navigate to the Find.java. Now we
@@ -900,7 +900,7 @@ entry. For both we need some information:</p>
<tr> <tr>
<th>body</th> <th>body</th>
<td><i>more details about the path</i></td> <td><i>more details about the path</i></td>
<td>This new task looks inside a nested &lt;path/> for occurrences of a file and stores
<td>This new task looks inside a nested &lt;path/&gt; for occurrences of a file and stores
all locations as a property. See the included manual for details.</td> all locations as a property. See the included manual for details.</td>
</tr> </tr>
<tr> <tr>


+ 145
- 145
docs/manual/tutorial-writing-tasks.html View File

@@ -44,52 +44,52 @@ create a text file names <i>build.xml</i>. What should Ant do for us?
</ul> </ul>
So the buildfile contains three targets. So the buildfile contains three targets.
<pre class="code"> <pre class="code">
&lt;?xml version="1.0" encoding="ISO-8859-1"?>
&lt;project name="MyTask" basedir="." default="jar">
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;project name="MyTask" basedir="." default="jar"&gt;


&lt;target name="clean" description="Delete all generated files">
&lt;delete dir="classes"/>
&lt;delete file="MyTasks.jar"/>
&lt;/target>
&lt;target name="clean" description="Delete all generated files"&gt;
&lt;delete dir="classes"/&gt;
&lt;delete file="MyTasks.jar"/&gt;
&lt;/target&gt;


&lt;target name="compile" description="Compiles the Task">
&lt;javac srcdir="src" destdir="classes"/>
&lt;/target>
&lt;target name="compile" description="Compiles the Task"&gt;
&lt;javac srcdir="src" destdir="classes"/&gt;
&lt;/target&gt;


&lt;target name="jar" description="JARs the Task">
&lt;jar destfile="MyTask.jar" basedir="classes"/>
&lt;/target>
&lt;target name="jar" description="JARs the Task"&gt;
&lt;jar destfile="MyTask.jar" basedir="classes"/&gt;
&lt;/target&gt;


&lt;/project>
&lt;/project&gt;
</pre> </pre>


This buildfile uses often the same value (src, classes, MyTask.jar), so we should rewrite that This buildfile uses often the same value (src, classes, MyTask.jar), so we should rewrite that
using &lt;property>s. On second there are some handicaps: &lt;javac> requires that the destination
using &lt;property&gt;s. On second there are some handicaps: &lt;javac&gt; requires that the destination
directory exists; a call of "clean" with a non existing classes directory will fail; "jar" requires directory exists; a call of "clean" with a non existing classes directory will fail; "jar" requires
the execution of some steps bofore. So the refactored code is: the execution of some steps bofore. So the refactored code is:


<pre class="code"> <pre class="code">
&lt;?xml version="1.0" encoding="ISO-8859-1"?>
&lt;project name="MyTask" basedir="." default="jar">
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;project name="MyTask" basedir="." default="jar"&gt;


<b>&lt;property name="src.dir" value="src"/></b>
<b>&lt;property name="classes.dir" value="classes"/></b>
<b>&lt;property name="src.dir" value="src"/&gt;</b>
<b>&lt;property name="classes.dir" value="classes"/&gt;</b>


&lt;target name="clean" description="Delete all generated files">
&lt;delete dir="<b>${classes.dir}</b>" <b>failonerror="false"</b>/>
&lt;delete file="<b>${ant.project.name}.jar</b>"/>
&lt;/target>
&lt;target name="clean" description="Delete all generated files"&gt;
&lt;delete dir="<b>${classes.dir}</b>" <b>failonerror="false"</b>/&gt;
&lt;delete file="<b>${ant.project.name}.jar</b>"/&gt;
&lt;/target&gt;


&lt;target name="compile" description="Compiles the Task">
<b>&lt;mkdir dir="${classes.dir}"/></b>
&lt;javac srcdir="<b>${src.dir}</b>" destdir="${classes.dir}"/>
&lt;/target>
&lt;target name="compile" description="Compiles the Task"&gt;
<b>&lt;mkdir dir="${classes.dir}"/&gt;</b>
&lt;javac srcdir="<b>${src.dir}</b>" destdir="${classes.dir}"/&gt;
&lt;/target&gt;


&lt;target name="jar" description="JARs the Task" <b>depends="compile"</b>>
&lt;jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/>
&lt;/target>
&lt;target name="jar" description="JARs the Task" <b>depends="compile"</b>&gt;
&lt;jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/&gt;
&lt;/target&gt;


&lt;/project>
&lt;/project&gt;
</pre> </pre>
<i>ant.project.name</i> is one of the <i>ant.project.name</i> is one of the
<a href="http://ant.apache.org/manual/using.html#built-in-props" target="_blank"> <a href="http://ant.apache.org/manual/using.html#built-in-props" target="_blank">
@@ -118,19 +118,19 @@ its <i>depends</i>-clause the "compile" is executed before).
<p>But after creating the jar we want to use our new Task. Therefore we need a <p>But after creating the jar we want to use our new Task. Therefore we need a
new target "use". Before we can use our new task we have to declare it with new target "use". Before we can use our new task we have to declare it with
<a href="http://ant.apache.org/manual/CoreTasks/taskdef.html" target="_blank"> <a href="http://ant.apache.org/manual/CoreTasks/taskdef.html" target="_blank">
&lt;taskdef> [2]</a>. And for easier process we change the default clause:
&lt;taskdef&gt; [2]</a>. And for easier process we change the default clause:
<pre class="code"> <pre class="code">
&lt;?xml version="1.0" encoding="ISO-8859-1"?>
&lt;project name="MyTask" basedir="." default="<b>use</b>">
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;project name="MyTask" basedir="." default="<b>use</b>"&gt;


... ...


<b>&lt;target name="use" description="Use the Task" depends="jar">
&lt;taskdef name="helloworld" classname="HelloWorld" classpath="${ant.project.name}.jar"/>
&lt;helloworld/>
&lt;/target></b>
<b>&lt;target name="use" description="Use the Task" depends="jar"&gt;
&lt;taskdef name="helloworld" classname="HelloWorld" classpath="${ant.project.name}.jar"/&gt;
&lt;helloworld/&gt;
&lt;/target&gt;</b>


&lt;/project>
&lt;/project&gt;
</pre> </pre>


Important is the <i>classpath</i>-attribute. Ant searches in its /lib directory for Important is the <i>classpath</i>-attribute. Ant searches in its /lib directory for
@@ -226,8 +226,8 @@ use:
<a name="attributes"> <a name="attributes">
<h2>Attributes</h2> <h2>Attributes</h2>
<p>Now we want to specify the text of our message (it seems that we are <p>Now we want to specify the text of our message (it seems that we are
rewriting the &lt;echo/> task :-). First we well do that with an attribute.
It is very easy - for each attribute provide a <tt>public void set&lt;attributename>(&lt;type>
rewriting the &lt;echo/&gt; task :-). First we well do that with an attribute.
It is very easy - for each attribute provide a <tt>public void set&lt;attributename&gt;(&lt;type&gt;
newValue)</tt> method and Ant will do the rest via reflection.</p> newValue)</tt> method and Ant will do the rest via reflection.</p>
<pre class="code"> <pre class="code">
import org.apache.tools.ant.Task; import org.apache.tools.ant.Task;
@@ -257,12 +257,12 @@ the log() method can't handle a <i>null</i> value as parameter and throws a Null


<p>After that we have to modify our buildfile: <p>After that we have to modify our buildfile:
<pre class="code"> <pre class="code">
&lt;target name="use" description="Use the Task" depends="jar">
&lt;target name="use" description="Use the Task" depends="jar"&gt;
&lt;taskdef name="helloworld" &lt;taskdef name="helloworld"
classname="HelloWorld" classname="HelloWorld"
classpath="${ant.project.name}.jar"/>
&lt;helloworld <b>message="Hello World"</b>/>
&lt;/target>
classpath="${ant.project.name}.jar"/&gt;
&lt;helloworld <b>message="Hello World"</b>/&gt;
&lt;/target&gt;
</pre> </pre>
That's all.</p> That's all.</p>


@@ -275,13 +275,13 @@ arguments of the set-method:<ul>
<a href="http://ant.apache.org/manual/develop.html#set-magic">Manual <a href="http://ant.apache.org/manual/develop.html#set-magic">Manual
'Writing Your Own Task' [3]</a>)</li> 'Writing Your Own Task' [3]</a>)</li>
</ul> </ul>
Before calling the set-method all properties are resolved. So a <tt>&lt;helloworld message="${msg}"/></tt>
Before calling the set-method all properties are resolved. So a <tt>&lt;helloworld message="${msg}"/&gt;</tt>
would not set the message string to "${msg}" if there is a property "msg" with a set value. would not set the message string to "${msg}" if there is a property "msg" with a set value.




<a name="NestedText"></a> <a name="NestedText"></a>
<h2>Nested Text</h2> <h2>Nested Text</h2>
<p>Maybe you have used the &lt;echo> task in a way like <tt>&lt;echo>Hello World&lt;/echo></tt>.
<p>Maybe you have used the &lt;echo&gt; task in a way like <tt>&lt;echo&gt;Hello World&lt;/echo&gt;</tt>.
For that you have to provide a <tt>public void addText(String text)</tt> method. For that you have to provide a <tt>public void addText(String text)</tt> method.
<pre class="code"> <pre class="code">
... ...
@@ -305,7 +305,7 @@ the <a href="http://ant.apache.org/manual/develop.html#nested-elements">Manual [
We use the first way of the three described ways. There are several steps for that:<ol> We use the first way of the three described ways. There are several steps for that:<ol>
<li>We create a class for collecting all the infos the nested element should contain. <li>We create a class for collecting all the infos the nested element should contain.
This class is created by the same rules for attributes and nested elements This class is created by the same rules for attributes and nested elements
as for the task (set&lt;attributename>() methods). </li>
as for the task (set&lt;attributename&gt;() methods). </li>
<li>The task holds multiple instances of this class in a list.</li> <li>The task holds multiple instances of this class in a list.</li>
<li>A factory method instantiates an object, saves the reference in the list <li>A factory method instantiates an object, saves the reference in the list
and returns it to Ant Core.</li> and returns it to Ant Core.</li>
@@ -346,10 +346,10 @@ The mapping XML-name : classname is defined in the factory method:
<tt>public <i>classname</i> create<i>XML-name</i>()</tt>. Therefore we write in <tt>public <i>classname</i> create<i>XML-name</i>()</tt>. Therefore we write in
the buildfile the buildfile
<pre class="code"> <pre class="code">
&lt;helloworld>
&lt;message msg="Nested Element 1"/>
&lt;message msg="Nested Element 2"/>
&lt;/helloworld>
&lt;helloworld&gt;
&lt;message msg="Nested Element 1"/&gt;
&lt;message msg="Nested Element 2"/&gt;
&lt;/helloworld&gt;
</pre> </pre>




@@ -357,76 +357,76 @@ the buildfile
<h2>Our task in a little more complex version</h2> <h2>Our task in a little more complex version</h2>
<p>For recapitulation now a little refactored buildfile: <p>For recapitulation now a little refactored buildfile:
<pre class="code"> <pre class="code">
&lt;?xml version="1.0" encoding="ISO-8859-1"?>
&lt;project name="MyTask" basedir="." default="use">
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;project name="MyTask" basedir="." default="use"&gt;


&lt;property name="src.dir" value="src"/>
&lt;property name="classes.dir" value="classes"/>
&lt;property name="src.dir" value="src"/&gt;
&lt;property name="classes.dir" value="classes"/&gt;


&lt;target name="clean" description="Delete all generated files">
&lt;delete dir="${classes.dir}" failonerror="false"/>
&lt;delete file="${ant.project.name}.jar"/>
&lt;/target>
&lt;target name="clean" description="Delete all generated files"&gt;
&lt;delete dir="${classes.dir}" failonerror="false"/&gt;
&lt;delete file="${ant.project.name}.jar"/&gt;
&lt;/target&gt;


&lt;target name="compile" description="Compiles the Task">
&lt;mkdir dir="${classes.dir}"/>
&lt;javac srcdir="${src.dir}" destdir="${classes.dir}"/>
&lt;/target>
&lt;target name="compile" description="Compiles the Task"&gt;
&lt;mkdir dir="${classes.dir}"/&gt;
&lt;javac srcdir="${src.dir}" destdir="${classes.dir}"/&gt;
&lt;/target&gt;


&lt;target name="jar" description="JARs the Task" depends="compile">
&lt;jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/>
&lt;/target>
&lt;target name="jar" description="JARs the Task" depends="compile"&gt;
&lt;jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/&gt;
&lt;/target&gt;




&lt;target name="use.init" &lt;target name="use.init"
description="Taskdef the HelloWorld-Task" description="Taskdef the HelloWorld-Task"
depends="jar">
depends="jar"&gt;
&lt;taskdef name="helloworld" &lt;taskdef name="helloworld"
classname="HelloWorld" classname="HelloWorld"
classpath="${ant.project.name}.jar"/>
&lt;/target>
classpath="${ant.project.name}.jar"/&gt;
&lt;/target&gt;




&lt;target name="use.without" &lt;target name="use.without"
description="Use without any" description="Use without any"
depends="use.init">
&lt;helloworld/>
&lt;/target>
depends="use.init"&gt;
&lt;helloworld/&gt;
&lt;/target&gt;


&lt;target name="use.message" &lt;target name="use.message"
description="Use with attribute 'message'" description="Use with attribute 'message'"
depends="use.init">
&lt;helloworld message="attribute-text"/>
&lt;/target>
depends="use.init"&gt;
&lt;helloworld message="attribute-text"/&gt;
&lt;/target&gt;


&lt;target name="use.fail" &lt;target name="use.fail"
description="Use with attribute 'fail'" description="Use with attribute 'fail'"
depends="use.init">
&lt;helloworld fail="true"/>
&lt;/target>
depends="use.init"&gt;
&lt;helloworld fail="true"/&gt;
&lt;/target&gt;


&lt;target name="use.nestedText" &lt;target name="use.nestedText"
description="Use with nested text" description="Use with nested text"
depends="use.init">
&lt;helloworld>nested-text&lt;/helloworld>
&lt;/target>
depends="use.init"&gt;
&lt;helloworld&gt;nested-text&lt;/helloworld&gt;
&lt;/target&gt;


&lt;target name="use.nestedElement" &lt;target name="use.nestedElement"
description="Use with nested 'message'" description="Use with nested 'message'"
depends="use.init">
&lt;helloworld>
&lt;message msg="Nested Element 1"/>
&lt;message msg="Nested Element 2"/>
&lt;/helloworld>
&lt;/target>
depends="use.init"&gt;
&lt;helloworld&gt;
&lt;message msg="Nested Element 1"/&gt;
&lt;message msg="Nested Element 2"/&gt;
&lt;/helloworld&gt;
&lt;/target&gt;




&lt;target name="use" &lt;target name="use"
description="Try all (w/out use.fail)" description="Try all (w/out use.fail)"
depends="use.without,use.message,use.nestedText,use.nestedElement" depends="use.without,use.message,use.nestedText,use.nestedElement"
/>
/&gt;


&lt;/project>
&lt;/project&gt;
</pre> </pre>


And the code of the task: And the code of the task:
@@ -505,7 +505,7 @@ public class HelloWorld extends Task {


And it works: And it works:
<pre class="output"> <pre class="output">
C:\tmp\anttests\MyFirstTask>ant
C:\tmp\anttests\MyFirstTask&gt;ant
Buildfile: build.xml Buildfile: build.xml


compile: compile:
@@ -537,7 +537,7 @@ use:


BUILD SUCCESSFUL BUILD SUCCESSFUL
Total time: 3 seconds Total time: 3 seconds
C:\tmp\anttests\MyFirstTask>ant use.fail
C:\tmp\anttests\MyFirstTask&gt;ant use.fail
Buildfile: build.xml Buildfile: build.xml


compile: compile:
@@ -552,7 +552,7 @@ BUILD FAILED
C:\tmp\anttests\MyFirstTask\build.xml:36: Fail requested. C:\tmp\anttests\MyFirstTask\build.xml:36: Fail requested.


Total time: 1 second Total time: 1 second
C:\tmp\anttests\MyFirstTask>
C:\tmp\anttests\MyFirstTask&gt;
</pre> </pre>
Next step: test ... Next step: test ...


@@ -580,66 +580,66 @@ target "test-jar" or you can download a nightly build from
<a href="http://gump.covalent.net/jars/latest/ant/ant-testutil.jar"> <a href="http://gump.covalent.net/jars/latest/ant/ant-testutil.jar">
http://gump.covalent.net/jars/latest/ant/ant-testutil.jar [5]</a>.</p> http://gump.covalent.net/jars/latest/ant/ant-testutil.jar [5]</a>.</p>


<p>For executing the test and creating a report we need the optional tasks &lt;junit>
and &lt;junitreport>. So we add to the buildfile:
<p>For executing the test and creating a report we need the optional tasks &lt;junit&gt;
and &lt;junitreport&gt;. So we add to the buildfile:
<pre class="code"> <pre class="code">
... ...
<font color="#9F9F9F">&lt;project name="MyTask" basedir="." </font>default="test"<font color="#9F9F9F">&gt;</font> <font color="#9F9F9F">&lt;project name="MyTask" basedir="." </font>default="test"<font color="#9F9F9F">&gt;</font>
... ...
&lt;property name="ant.test.lib" value="ant-testutil.jar"/>
&lt;property name="report.dir" value="report"/>
&lt;property name="junit.out.dir.xml" value="${report.dir}/junit/xml"/>
&lt;property name="junit.out.dir.html" value="${report.dir}/junit/html"/>
&lt;path id="classpath.run">
&lt;path path="${java.class.path}"/>
&lt;path location="${ant.project.name}.jar"/>
&lt;/path>
&lt;path id="classpath.test">
&lt;path refid="classpath.run"/>
&lt;path location="${ant.test.lib}"/>
&lt;/path>
&lt;target name="clean" description="Delete all generated files">
&lt;delete failonerror="false" includeEmptyDirs="true">
&lt;fileset dir="." includes="${ant.project.name}.jar"/>
&lt;fileset dir="${classes.dir}"/>
&lt;fileset dir="${report.dir}"/>
&lt;/delete>
&lt;/target>
<font color="#9F9F9F">&lt;target name="compile" description="Compiles the Task">
&lt;mkdir dir="${classes.dir}"/>
&lt;javac srcdir="${src.dir}" destdir="${classes.dir}" </font>classpath="${ant.test.lib}"<font color="#9F9F9F">/>
&lt;/target></font>
&lt;property name="ant.test.lib" value="ant-testutil.jar"/&gt;
&lt;property name="report.dir" value="report"/&gt;
&lt;property name="junit.out.dir.xml" value="${report.dir}/junit/xml"/&gt;
&lt;property name="junit.out.dir.html" value="${report.dir}/junit/html"/&gt;
&lt;path id="classpath.run"&gt;
&lt;path path="${java.class.path}"/&gt;
&lt;path location="${ant.project.name}.jar"/&gt;
&lt;/path&gt;
&lt;path id="classpath.test"&gt;
&lt;path refid="classpath.run"/&gt;
&lt;path location="${ant.test.lib}"/&gt;
&lt;/path&gt;
&lt;target name="clean" description="Delete all generated files"&gt;
&lt;delete failonerror="false" includeEmptyDirs="true"&gt;
&lt;fileset dir="." includes="${ant.project.name}.jar"/&gt;
&lt;fileset dir="${classes.dir}"/&gt;
&lt;fileset dir="${report.dir}"/&gt;
&lt;/delete&gt;
&lt;/target&gt;
<font color="#9F9F9F">&lt;target name="compile" description="Compiles the Task"&gt;
&lt;mkdir dir="${classes.dir}"/&gt;
&lt;javac srcdir="${src.dir}" destdir="${classes.dir}" </font>classpath="${ant.test.lib}"<font color="#9F9F9F">/&gt;
&lt;/target&gt;</font>
... ...
&lt;target name="junit" description="Runs the unit tests" depends="jar">
&lt;delete dir="${junit.out.dir.xml}" />
&lt;mkdir dir="${junit.out.dir.xml}" />
&lt;junit printsummary="yes" haltonfailure="no">
&lt;classpath refid="classpath.test"/>
&lt;formatter type="xml"/>
&lt;batchtest fork="yes" todir="${junit.out.dir.xml}">
&lt;fileset dir="${src.dir}" includes="**/*Test.java"/>
&lt;/batchtest>
&lt;/junit>
&lt;/target>
&lt;target name="junitreport" description="Create a report for the rest result">
&lt;mkdir dir="${junit.out.dir.html}" />
&lt;junitreport todir="${junit.out.dir.html}">
&lt;fileset dir="${junit.out.dir.xml}">
&lt;include name="*.xml"/>
&lt;/fileset>
&lt;report format="frames" todir="${junit.out.dir.html}"/>
&lt;/junitreport>
&lt;/target>
&lt;target name="junit" description="Runs the unit tests" depends="jar"&gt;
&lt;delete dir="${junit.out.dir.xml}"/&gt;
&lt;mkdir dir="${junit.out.dir.xml}"/&gt;
&lt;junit printsummary="yes" haltonfailure="no"&gt;
&lt;classpath refid="classpath.test"/&gt;
&lt;formatter type="xml"/&gt;
&lt;batchtest fork="yes" todir="${junit.out.dir.xml}"&gt;
&lt;fileset dir="${src.dir}" includes="**/*Test.java"/&gt;
&lt;/batchtest&gt;
&lt;/junit&gt;
&lt;/target&gt;
&lt;target name="junitreport" description="Create a report for the rest result"&gt;
&lt;mkdir dir="${junit.out.dir.html}"/&gt;
&lt;junitreport todir="${junit.out.dir.html}"&gt;
&lt;fileset dir="${junit.out.dir.xml}"&gt;
&lt;include name="*.xml"/&gt;
&lt;/fileset&gt;
&lt;report format="frames" todir="${junit.out.dir.html}"/&gt;
&lt;/junitreport&gt;
&lt;/target&gt;


&lt;target name="test" &lt;target name="test"
depends="junit,junitreport" depends="junit,junitreport"
description="Runs unit tests and creates a report" description="Runs unit tests and creates a report"
/>
/&gt;
... ...
</pre></p> </pre></p>


@@ -693,7 +693,7 @@ public class HelloWorldTest extends BuildFileTest {
<p>When starting <tt>ant</tt> we'll get a short message to STDOUT and <p>When starting <tt>ant</tt> we'll get a short message to STDOUT and
a nice HTML-report. a nice HTML-report.
<pre class="output"> <pre class="output">
C:\tmp\anttests\MyFirstTask>ant
C:\tmp\anttests\MyFirstTask&gt;ant
Buildfile: build.xml Buildfile: build.xml


compile: compile:
@@ -719,7 +719,7 @@ test:


BUILD SUCCESSFUL BUILD SUCCESSFUL
Total time: 7 seconds Total time: 7 seconds
C:\tmp\anttests\MyFirstTask>
C:\tmp\anttests\MyFirstTask&gt;
</pre></p> </pre></p>






Loading…
Cancel
Save