@@ -49,6 +49,8 @@
<li> <a href="./buildfile.html">Build file</a>
<li> <a href="./buildfile.html">Build file</a>
</li>
</li>
<li> <a href="./vfs.html">Virtual File System</a>
<li> <a href="./vfs.html">Virtual File System</a>
</li>
<li> <a href="./ant1compat.html">Ant1 Compatibility Layer</a>
</li>
</li>
</ul>
</ul>
<p><strong>Extending Ant</strong></p>
<p><strong>Extending Ant</strong></p>
@@ -92,6 +94,40 @@
able to be built from scratch, without using Ant 1.x at all).</p>
able to be built from scratch, without using Ant 1.x at all).</p>
</blockquote>
</blockquote>
</td></tr>
</td></tr>
</table>
<table border="0" cellspacing="0" cellpadding="2" width="100%">
<tr><td bgcolor="#828DA6">
<font color="#ffffff" face="arial,helvetica,sanserif">
<a name="Paths"><strong>Paths</strong></a>
</font>
</td></tr>
<tr><td>
<blockquote>
<p>Consider allowing the user to configure the ant system by setting the
following path types.</p>
<ul>
<li>ant.type.path: path that is used to search for the type libraries</li>
<li>ant.ext.path: path that is used to search for "Optional Packages"
or extensions.</li>
</ul>
<p>
The default search path will probably include a per-user path element,
a workspace path element and a system path elemtn that are searched in
that order. Some possible defaults;
</p>
<ul>
<li>Unix Per-user: ${user.home}/.ant/lib, ${user.home}/.ant/ext</li>
<li>Windows Per-user: ${user.home}/ant/lib, ${user.home}/ant/ext</li>
<li>MacOSX Per-user: ${user.home}/Library/Ant/lib,
${user.home}/Library/Ant/ext</li>
<li>Unix System-wide: /opt/ant/lib, /opt/ant/ext</li>
<li>Unix System-wide: /usr/local/ant/lib, /usr/local/ant/ext</li>
<li>Windows System-wide: %SYS_DRIVE%/Program Files/ant/lib,
%SYS_DRIVE%/Program Files/ant/ext</li>
<li>MacOSX System-wide: /Library/Ant/lib, /Library/Ant/ant/ext</li>
</ul>
</blockquote>
</td></tr>
</table>
</table>
<table border="0" cellspacing="0" cellpadding="2" width="100%">
<table border="0" cellspacing="0" cellpadding="2" width="100%">
<tr><td bgcolor="#828DA6">
<tr><td bgcolor="#828DA6">
@@ -101,9 +137,30 @@
</td></tr>
</td></tr>
<tr><td>
<tr><td>
<blockquote>
<blockquote>
<p>There are 2 parts to this broad topic: Allow Ant 1.x build scripts to be
executed by Myrmidon, and allow Ant 1.x tasks to be executed unmodified
by Myrmidon.</p>
<p>The Ant1 Compatibility layer is still in early stages of development.
</p>
<ul>
<li>Get a version of <code><ant></code> and
<code><antcall></code> working.</li>
<li>
Provide hooks between Ant1 references and Myrmidon properties.
May use converters for adapting Ant2 objects (like Ant2
<code><path></code> or <code><fileset></code>)
as Ant1 types.
</li>
<li>Handle differences between Ant1 if/unless on targets,
and Myrmidon <if> task.</li>
<li>
Write tests for the various bits that rely on Myrmidon
functionality:
<ul>
<li>if/unless on targets: check that behaviour complies with Ant1</li>
<li>Make sure properties are shared between Ant1 and Myrmidon tasks.</li>
<li>Make sure that <ant1.property> behaves as per Ant1</li>
</ul>
</li>
<li>Get GUMP runs going using Myrmidon.</li>
</ul>
</blockquote>
</blockquote>
</td></tr>
</td></tr>
</table>
</table>
@@ -150,66 +207,96 @@
</td></tr>
</td></tr>
<tr><td>
<tr><td>
<blockquote>
<blockquote>
<p>The file data-types, such as <code><fileset></code> and
<code><path></code>, are some of the most widely used parts of Ant 1.x.
Unfortunately, they aren't particularly extensible.</p>
<p>The file data-types, such as
<code><fileset></code> and
<code><path></code>, are some of the most widely used parts of Ant 1.x.
Unfortunately, they aren't particularly extensible.
</p>
<ul>
<ul>
<li>Redesign the file data-types, replacing them with an interface-based
<li>Redesign the file data-types, replacing them with an interface-based
API, plus a set of implementations. The API should use the VFS file
API, plus a set of implementations. The API should use the VFS file
<code>FileObject</code>, rather than <code>java.io.File</code>.
This process has started, in the <code>antlib.vfile</code> package.
<code>FileObject</code>, rather than
<code>java.io.File</code>.
This process has started, in the
<code>antlib.vfile</code> package.
</li>
</li>
<li>File Selectors:
<li>File Selectors:
<ul>
<li>Change <code>AbstractNameFileSelector</code> to use Ant 1 style patterns
matches, rather than Globs patterns.</li>
<li>Add 'defaultexcludes' to <code>DefaultFileSet</code>. Also add a
file selector implementation that matches everything except the default
excludes.</li>
<li>Add a name selector that loads patterns from a file.</li>
<li>Add more selector implementations: size and last-modified comparisons,
checksum comparison, byte-wise content comparison.</li>
</ul></li>
<ul>
<li>Change
<code>AbstractNameFileSelector</code> to use Ant 1 style patterns
matches, rather than Globs patterns.
</li>
<li>Add 'defaultexcludes' to
<code>DefaultFileSet</code>. Also add a
file selector implementation that matches everything except the default
excludes.
</li>
<li>Add a name selector that loads patterns from a file.</li>
<li>Add more selector implementations: size and last-modified comparisons,
checksum comparison, byte-wise content comparison.</li>
</ul>
</li>
<li>File conditions:
<li>File conditions:
<ul>
<li>Add more condition implementations that perform checks on files.
One that searches a path for a file would be useful.</li>
</ul></li>
<ul>
<li>Add more condition implementations that perform checks on files.
One that searches a path for a file would be useful.</li>
</ul>
</li>
<li>File Name Mappers:
<li>File Name Mappers:
<ul>
<li>Change FileNameMapper.mapFileName() to take vfs.FileName objects.</li>
<li>Move the current mapper implementations across to antlib.</li>
</ul></li>
<ul>
<li>Change FileNameMapper.mapFileName() to take vfs.FileName objects.</li>
<li>Move the current mapper implementations across to antlib.</li>
</ul>
</li>
<li>File Sets:
<li>File Sets:
<ul>
<li>Add a file set implementation that provides the union of several
nested file sets (that is, a file set that merges several file sets
together).</li>
<li>Add a file set implementation that filters files that are up-to-date
WRT some other file. Alternatively, this might be better done as a
file selector.</li>
</ul></li>
<ul>
<li>Add a file set implementation that provides the union of several
nested file sets (that is, a file set that merges several file sets
together).</li>
<li>Add a file set implementation that filters files that are up-to-date
WRT some other file. Alternatively, this might be better done as a
file selector.</li>
</ul>
</li>
<li>Paths:
<li>Paths:
<ul>
<li>Add path implementations that evaluate to the system classpath,
and the ant runtime classpath. Or, more generally, combine this with
<code>ClassLoaderManager</code> to evaluate to the classpath of any
'library' (e.g. system classpath, ant runtime, tools.jar,
an antlib, an installed extension, or the system classes of another JVM
for cross-compiling).</li>
</ul></li>
<ul>
<li>Add path implementations that evaluate to the system classpath,
and the ant runtime classpath. Or, more generally, combine this with
<code>ClassLoaderManager</code> to evaluate to the classpath of any
'library' (e.g. system classpath, ant runtime, tools.jar,
an antlib, an installed extension, or the system classes of another JVM
for cross-compiling).
</li>
</ul>
</li>
<li>Port across the Ant 1 file filter proposal, once it is complete.</li>
<li>Port across the Ant 1 file filter proposal, once it is complete.</li>
<li>Copy task:
<li>Copy task:
<ul>
<li>Implement 'preservelastmodified', 'overwrite', and 'includeemptydirs'.</li>
<li>Support a file name mapper.</li>
<li>Support file filters.</li>
<li>Detect and handle destination file name collisions.</li>
</ul></li>
<li>Implement the <code><move></code>, <code><delete></code>,
<code><touch></code> and <code><mkdir></code> tasks on top
<ul>
<li>Implement 'preservelastmodified', 'overwrite', and 'includeemptydirs'.</li>
<li>Support a file name mapper.</li>
<li>Support file filters.</li>
<li>Detect and handle destination file name collisions.</li>
</ul>
</li>
<li>Implement the
<code><move></code>,
<code><delete></code>,
<code><touch></code> and
<code><mkdir></code> tasks on top
of the VFS and the new file data-types. Might be some scope for generalising
of the VFS and the new file data-types. Might be some scope for generalising
'touch' and 'mkdir' into a single task.</li>
'touch' and 'mkdir' into a single task.
</li>
</ul>
</ul>
</blockquote>
</blockquote>
</td></tr>
</td></tr>
@@ -232,8 +319,12 @@
configuration files.</li>
configuration files.</li>
<li>Allow the following via config files:
<li>Allow the following via config files:
<ul>
<ul>
<li>Add (or override) the <code>lib</code> and <code>ext</code> directories.</li>
<li>Add (or override) the
<code>lib</code> and
<code>ext</code> directories.
</li>
<li>Enable more than one listener, and configure the listeners from
<li>Enable more than one listener, and configure the listeners from
the conents of the config file.</li>
the conents of the config file.</li>
<li>Import libraries, and set properties.</li>
<li>Import libraries, and set properties.</li>
@@ -308,7 +399,9 @@
<ul>
<ul>
<li>Search through the code for 'TODO' items and fix them.</li>
<li>Search through the code for 'TODO' items and fix them.</li>
<li>Allow service factories to be configured from the contents of the
<li>Allow service factories to be configured from the contents of the
<code>ant-services.xml</code> descriptor.</li>
<code>ant-services.xml</code> descriptor.
</li>
<li>Route external process stdout and stderr through the logger.</li>
<li>Route external process stdout and stderr through the logger.</li>
<li>Add verbosity level to ProjectListener LogEvent</li>
<li>Add verbosity level to ProjectListener LogEvent</li>
<li>Fire ProjectListener events taskFinished(), targetFinished() and
<li>Fire ProjectListener events taskFinished(), targetFinished() and
@@ -320,17 +413,33 @@
<li>Detect duplicate type names.</li>
<li>Detect duplicate type names.</li>
<li>Add fully qualified type names, based on antlib name and type shorthand name.
<li>Add fully qualified type names, based on antlib name and type shorthand name.
Allow these to be used in build files in addition to the shorthand names.</li>
Allow these to be used in build files in addition to the shorthand names.</li>
<li>Move the <code><http></code> and <code><socket></code>
conditions to an antlib. Need to resolve how these will be passed a logger.</li>
<li>Make the <code><uptodate></code> task a condition, and move to
an antlib.</li>
<li>Split up <code><is-set></code> condition into is-set and is-true conditions.</li>
<li>Allow the <code><if></code> task to take any condition implementation.</li>
<li>Add an else block to the <code><if></code> task.</li>
<li>Split the <code><available></code> condition into separate conditions
that test for the availability of a class, or a resource.</li>
<li>Move <code>crimson.jar</code> to <code>bin/lib</code> in the distribution,
and make to other jars via the extension mechanism.</li>
<li>Move the
<code><http></code> and
<code><socket></code>
conditions to an antlib. Need to resolve how these will be passed a logger.
</li>
<li>Make the
<code><uptodate></code> task a condition, and move to
an antlib.
</li>
<li>Split up
<code><is-set></code> condition into is-set and is-true conditions.
</li>
<li>Allow the
<code><if></code> task to take any condition implementation.
</li>
<li>Add an else block to the
<code><if></code> task.
</li>
<li>Split the
<code><available></code> condition into separate conditions
that test for the availability of a class, or a resource.
</li>
<li>Move
<code>crimson.jar</code> to
<code>bin/lib</code> in the distribution,
and make to other jars via the extension mechanism.
</li>
<li>Unit tests.</li>
<li>Unit tests.</li>
</ul>
</ul>
</blockquote>
</blockquote>