and updated the docs. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271949 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -0,0 +1,223 @@ | |||||
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> | |||||
| <!-- Content Stylesheet for Site --> | |||||
| <!-- start the processing --> | |||||
| <html> | |||||
| <head> | |||||
| <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> | |||||
| <meta name="author" value="Darrell DeBoer"> | |||||
| <meta name="email" value="darrell at apache dot org"> | |||||
| <title>Apache Myrmidon - Ant1 Compatibitlity Layer</title> | |||||
| </head> | |||||
| <body bgcolor="#ffffff" text="#000000" link="#525D76"> | |||||
| <table border="0" width="100%" cellspacing="0"> | |||||
| <!-- TOP IMAGE --> | |||||
| <tr> | |||||
| <td> <td colspan="2"> | |||||
| <a href="http://jakarta.apache.org"><img src="http://jakarta.apache.org/images/jakarta-logo.gif" align="left" border="0"/></a> | |||||
| </td> | |||||
| </td> | |||||
| <td valign="bottom"><div align="right"><b><font size="+3" color="#525D76">Apache Myrmidon</font></b></div></td> | |||||
| </tr> | |||||
| </table> | |||||
| <table border="0" width="100%" cellspacing="4"> | |||||
| <tr><td colspan="2"> | |||||
| <hr noshade="" size="1"/> | |||||
| </td></tr> | |||||
| <tr> | |||||
| <!-- LEFT SIDE NAVIGATION --> | |||||
| <td valign="top" nowrap="true"> | |||||
| <p><strong>Myrmidon</strong></p> | |||||
| <ul> | |||||
| <li> <a href="./index.html">Introduction</a> | |||||
| </li> | |||||
| <li> <a href="./getinvolved.html">Get Involved</a> | |||||
| </li> | |||||
| <li> <a href="./user.html">Building Myrmidon</a> | |||||
| </li> | |||||
| <li> <a href="./todo.html">Todo List</a> | |||||
| </li> | |||||
| </ul> | |||||
| <p><strong>User Guide</strong></p> | |||||
| <ul> | |||||
| <li> <a href="./buildfile.html">Build file</a> | |||||
| </li> | |||||
| <li> <a href="./vfs.html">Virtual File System</a> | |||||
| </li> | |||||
| <li> <a href="./ant1compat.html">Ant1 Compatibility Layer</a> | |||||
| </li> | |||||
| </ul> | |||||
| <p><strong>Extending Ant</strong></p> | |||||
| <ul> | |||||
| <li> <a href="./task.html">Task Writers HOWTO</a> | |||||
| </li> | |||||
| <li> <a href="./classloader.html">ClassLoader HOWTO</a> | |||||
| </li> | |||||
| <li> <a href="./librarys.html">Library HOWTO</a> | |||||
| </li> | |||||
| </ul> | |||||
| <p><strong>Container Design</strong></p> | |||||
| <ul> | |||||
| </ul> | |||||
| </td> | |||||
| <td align="left" valign="top"> | |||||
| <table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||||
| <tr><td bgcolor="#525D76"> | |||||
| <font color="#ffffff" face="arial,helvetica,sanserif"> | |||||
| <a name="Overview"><strong>Overview</strong></a> | |||||
| </font> | |||||
| </td></tr> | |||||
| <tr><td> | |||||
| <blockquote> | |||||
| <p> | |||||
| The Myrmidon-Ant1 Compatibility layer works by reusing most of the Ant1 code, | |||||
| with tasks and datatypes | |||||
| being prefixed with "ant1." in build files. Almost all of the main Ant1 tree | |||||
| is included in the compatibility layer antlib. To insulate from changes in | |||||
| the Ant1 tree, Ant1 class files are extracted from a jar, rather than | |||||
| being compiled from scratch. | |||||
| </p> | |||||
| <p> | |||||
| Here's how it works: The first time an Ant1 task is encountered, an Ant1 | |||||
| project is created, and stored in the TaskContext under the name "ant1.project". | |||||
| The Ant1 versions of Task and Project have been extended, overriding core behaviour, | |||||
| with Myrmidon-specific behaviour. | |||||
| </p> | |||||
| <p> | |||||
| The updated version of Task implements Configurable, receiving it's | |||||
| complete Task Model, and actually setting/adding/creating attributes | |||||
| with the help of the IntrospectionHelper. This process is designed to | |||||
| mimic the Ant1 configuration policy, although not <i>all</i> of the | |||||
| subtle variations of configuration present in Ant1 are handled. | |||||
| </p> | |||||
| <p> | |||||
| The updated version of Project will provide hooks into the Myrmidon TaskContext, | |||||
| such as:</p> | |||||
| <ul> | |||||
| <li>logging (done)</li> | |||||
| <li>properties (done)</li> | |||||
| <li>references (not yet done)</li> | |||||
| <li>Task defined by <taskdef> (done)</li> | |||||
| </ul> | |||||
| <p> | |||||
| So at present, properties declared in Ant2 tasks are available to all Ant1 tasks, | |||||
| and vice-versa. However, while a <code><ant1.path></code> reference works fine | |||||
| in other <code><ant1.XXX></code> | |||||
| tasks, it's not visible to Ant2 tasks in the same build, and vice-versa. | |||||
| </p> | |||||
| <p> | |||||
| The <code><taskdef></code> task works ok, registering the task with the TypeManager using the | |||||
| "ant1." prefix. Only a couple of DataTypes (Path and Patternset) are working | |||||
| as top-level types, but this should be just a matter of adding references to | |||||
| the Ant1 version of TypeInstanceTask in the descriptor. | |||||
| </p> | |||||
| <p> | |||||
| The TransformingProjectBuilder (which is now the default builder for files | |||||
| of type ".xml", applies a transformation stylesheet to the file, prefixing select | |||||
| tasks (all at present) with "ant.". If a version attribute is encountered, the | |||||
| file is not transformed | |||||
| </p> | |||||
| </blockquote> | |||||
| </td></tr> | |||||
| </table> | |||||
| <table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||||
| <tr><td bgcolor="#525D76"> | |||||
| <font color="#ffffff" face="arial,helvetica,sanserif"> | |||||
| <a name="Using the compatibility layer"><strong>Using the compatibility layer</strong></a> | |||||
| </font> | |||||
| </td></tr> | |||||
| <tr><td> | |||||
| <blockquote> | |||||
| <table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||||
| <tr><td bgcolor="#828DA6"> | |||||
| <font color="#ffffff" face="arial,helvetica,sanserif"> | |||||
| <a name="Using Ant1 tasks in a Myrmidon build file"><strong>Using Ant1 tasks in a Myrmidon build file</strong></a> | |||||
| </font> | |||||
| </td></tr> | |||||
| <tr><td> | |||||
| <blockquote> | |||||
| <p> | |||||
| If you have a Myrmidon build file (eg with <code>version="2.0"</code> | |||||
| on the project element, you can use Ant1 tasks and datatypes by using | |||||
| the "ant1." suffix on the regular element name. | |||||
| Virtually <i>all</i> tasks and datatypes from Ant1.4.1 are available | |||||
| in this way. | |||||
| </p> | |||||
| <p> | |||||
| When declaring a new task using the <code><ant1.taskdef></code> | |||||
| task, <i>don't</i> prepend "ant1." to the taskname. This will be | |||||
| done automatically by the taskdef task. However, you will need | |||||
| to use the "ant1." prefix in all uses of that task. | |||||
| </p> | |||||
| </blockquote> | |||||
| </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="Using an existing Ant1 build file"><strong>Using an existing Ant1 build file</strong></a> | |||||
| </font> | |||||
| </td></tr> | |||||
| <tr><td> | |||||
| <blockquote> | |||||
| <p> | |||||
| Myrmidon will automatically handle Ant1 build files using the | |||||
| Ant1 Compatibility layer. So, using an Ant1 build | |||||
| file with Myrmidon should be as simple as:</p> | |||||
| <pre>[myrmidon-command] -f ant1-build-file.xml</pre> | |||||
| <p> | |||||
| This works as follows: When Myrmidon encounters a ".xml" build file which does not have a | |||||
| <code>version</code> attribute on the top-level <code>project</code> | |||||
| element, it assumes that it is an Ant1 build file. So all tasks are | |||||
| interpreted as though they are prefixed with the "ant." name prefix. | |||||
| </p> | |||||
| </blockquote> | |||||
| </td></tr> | |||||
| </table> | |||||
| </blockquote> | |||||
| </td></tr> | |||||
| </table> | |||||
| <table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||||
| <tr><td bgcolor="#525D76"> | |||||
| <font color="#ffffff" face="arial,helvetica,sanserif"> | |||||
| <a name="Building the compatibility layer"><strong>Building the compatibility layer</strong></a> | |||||
| </font> | |||||
| </td></tr> | |||||
| <tr><td> | |||||
| <blockquote> | |||||
| <p>Before building the Ant1 Compatibility layer, you need to build | |||||
| Myrmidon, running the <code>dist-lite</code> target of the main build. | |||||
| See <a href="user.html#Building Myrmidon">the build instructions</a> | |||||
| for more details.</p> | |||||
| <p>To build the compatibility layer, simply execute:</p> | |||||
| <pre>ant -f ant1compat.xml</pre> | |||||
| <p>from within the root directory of the Myrmidon source tree.</p> | |||||
| </blockquote> | |||||
| </td></tr> | |||||
| </table> | |||||
| </td> | |||||
| </tr> | |||||
| <!-- FOOTER --> | |||||
| <tr><td colspan="2"> | |||||
| <hr noshade="" size="1"/> | |||||
| </td></tr> | |||||
| <tr><td colspan="2"> | |||||
| <div align="center"><font color="#525D76" size="-1"><em> | |||||
| Copyright © 2000-2002, Apache Software Foundation | |||||
| </em></font></div> | |||||
| </td></tr> | |||||
| </table> | |||||
| </body> | |||||
| </html> | |||||
| <!-- end the processing --> | |||||
| @@ -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> | ||||
| @@ -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> | ||||
| @@ -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> | ||||
| @@ -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> | ||||
| @@ -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> | ||||
| @@ -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> | ||||
| @@ -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> | ||||
| @@ -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> | ||||
| @@ -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> | ||||
| @@ -1,58 +0,0 @@ | |||||
| Myrmidon Ant1 compatibility layer. | |||||
| This directory contains the source for the Ant1 compatibility layer. | |||||
| DESCRIPTION | |||||
| ----------- | |||||
| The layer works by reusing most of the Ant1 code, with tasks and datatypes | |||||
| being prefixed with "ant1." in build files. Almost all of the main Ant1 tree | |||||
| is included in the compatibility layer antlib. To insulate from changes in | |||||
| the Ant1 tree, Ant1 class files are extracted from a jar, rather than | |||||
| being compiled from scratch. | |||||
| Here's how it works: The first time an Ant1 task is encountered, an Ant1 | |||||
| project is created, and stored in the TaskContext. The Ant1 versions of Task | |||||
| and Project have been extended, with Task implementing Configurable so that | |||||
| it may can mimic the Ant1 configuration policy using the IntrospectionHelper. | |||||
| The idea is to provide hooks between the Ant1 project and the Myrmidon | |||||
| project, eg | |||||
| logging: done | |||||
| properties: done | |||||
| references: not done | |||||
| Task definitions: done. | |||||
| So at present, while a <ant1:path> reference works fine in other <ant1:xxx> | |||||
| tasks, it's not visible to the rest of the build, and vice-versa. | |||||
| The <taskdef> task works ok, registering the task with the TypeManager using the | |||||
| "ant1." prefix. Only a couple of DataTypes (Path and Patternset) are working | |||||
| as top-level types, but this should be just a matter of adding references to | |||||
| the Ant1 version of TypeInstanceTask in the descriptor. | |||||
| The TransformingProjectBuilder (which is now the default builder for files | |||||
| of type ".xml", applies a transformation stylesheet to the file, prefixing select | |||||
| tasks (all at present) with "ant.". If a version attribute is encountered, the | |||||
| file is not transformed | |||||
| USAGE INSTRUCTIONS | |||||
| ------------------ | |||||
| Myrmidon will automatically attempt to upgrade any ".xml" build file that | |||||
| doesn't have a version attribute on the root element. So, using an Ant1 build | |||||
| file with Myrmidon should be as simple as: | |||||
| [myrmidon-command] -f ant1-build-file.xml | |||||
| BUILD INSTRUCTIONS | |||||
| ------------------ | |||||
| * It is required that Myrmidon is first build by running the default target | |||||
| in the Myrmidon directory. | |||||
| * Run "ant -f ant1compat.xml" | |||||
| TODO | |||||
| ---- | |||||
| * Convert this to an Xdoc document | |||||
| * Get a version of <ant> and <antcall> working | |||||
| * Test heaps more tasks | |||||
| * Provide hooks between Ant1 references and Myrmidon properties. Need to use | |||||
| converters for adapting Ant2 objects (like Ant2 <path> or <fileset>) as Ant1 types. | |||||
| @@ -0,0 +1,112 @@ | |||||
| <document> | |||||
| <properties> | |||||
| <author email="darrell at apache dot org">Darrell DeBoer</author> | |||||
| <title>Ant1 Compatibitlity Layer</title> | |||||
| </properties> | |||||
| <body> | |||||
| <section name="Overview"> | |||||
| <p> | |||||
| The Myrmidon-Ant1 Compatibility layer works by reusing most of the Ant1 code, | |||||
| with tasks and datatypes | |||||
| being prefixed with "ant1." in build files. Almost all of the main Ant1 tree | |||||
| is included in the compatibility layer antlib. To insulate from changes in | |||||
| the Ant1 tree, Ant1 class files are extracted from a jar, rather than | |||||
| being compiled from scratch. | |||||
| </p> | |||||
| <p> | |||||
| Here's how it works: The first time an Ant1 task is encountered, an Ant1 | |||||
| project is created, and stored in the TaskContext under the name "ant1.project". | |||||
| The Ant1 versions of Task and Project have been extended, overriding core behaviour, | |||||
| with Myrmidon-specific behaviour. | |||||
| </p> | |||||
| <p> | |||||
| The updated version of Task implements Configurable, receiving it's | |||||
| complete Task Model, and actually setting/adding/creating attributes | |||||
| with the help of the IntrospectionHelper. This process is designed to | |||||
| mimic the Ant1 configuration policy, although not <i>all</i> of the | |||||
| subtle variations of configuration present in Ant1 are handled. | |||||
| </p> | |||||
| <p> | |||||
| The updated version of Project will provide hooks into the Myrmidon TaskContext, | |||||
| such as:</p> | |||||
| <ul> | |||||
| <li>logging (done)</li> | |||||
| <li>properties (done)</li> | |||||
| <li>references (not yet done)</li> | |||||
| <li>Task defined by <taskdef> (done)</li> | |||||
| </ul> | |||||
| <p> | |||||
| So at present, properties declared in Ant2 tasks are available to all Ant1 tasks, | |||||
| and vice-versa. However, while a <code><ant1.path></code> reference works fine | |||||
| in other <code><ant1.XXX></code> | |||||
| tasks, it's not visible to Ant2 tasks in the same build, and vice-versa. | |||||
| </p> | |||||
| <p> | |||||
| The <code><taskdef></code> task works ok, registering the task with the TypeManager using the | |||||
| "ant1." prefix. Only a couple of DataTypes (Path and Patternset) are working | |||||
| as top-level types, but this should be just a matter of adding references to | |||||
| the Ant1 version of TypeInstanceTask in the descriptor. | |||||
| </p> | |||||
| <p> | |||||
| The TransformingProjectBuilder (which is now the default builder for files | |||||
| of type ".xml", applies a transformation stylesheet to the file, prefixing select | |||||
| tasks (all at present) with "ant.". If a version attribute is encountered, the | |||||
| file is not transformed | |||||
| </p> | |||||
| </section> | |||||
| <section name="Using the compatibility layer"> | |||||
| <subsection name="Using Ant1 tasks in a Myrmidon build file"> | |||||
| <p> | |||||
| If you have a Myrmidon build file (eg with <code>version="2.0"</code> | |||||
| on the project element, you can use Ant1 tasks and datatypes by using | |||||
| the "ant1." suffix on the regular element name. | |||||
| Virtually <i>all</i> tasks and datatypes from Ant1.4.1 are available | |||||
| in this way. | |||||
| </p> | |||||
| <p> | |||||
| When declaring a new task using the <code><ant1.taskdef></code> | |||||
| task, <i>don't</i> prepend "ant1." to the taskname. This will be | |||||
| done automatically by the taskdef task. However, you will need | |||||
| to use the "ant1." prefix in all uses of that task. | |||||
| </p> | |||||
| </subsection> | |||||
| <subsection name="Using an existing Ant1 build file"> | |||||
| <p> | |||||
| Myrmidon will automatically handle Ant1 build files using the | |||||
| Ant1 Compatibility layer. So, using an Ant1 build | |||||
| file with Myrmidon should be as simple as:</p> | |||||
| <pre>[myrmidon-command] -f ant1-build-file.xml</pre> | |||||
| <p> | |||||
| This works as follows: When Myrmidon encounters a ".xml" build file which does not have a | |||||
| <code>version</code> attribute on the top-level <code>project</code> | |||||
| element, it assumes that it is an Ant1 build file. So all tasks are | |||||
| interpreted as though they are prefixed with the "ant." name prefix. | |||||
| </p> | |||||
| Myrmidon will automatically attempt to upgrade any ".xml" build file that | |||||
| </subsection> | |||||
| </section> | |||||
| <section name="Building the compatibility layer"> | |||||
| <p>Before building the Ant1 Compatibility layer, you need to build | |||||
| Myrmidon, running the <code>dist-lite</code> target of the main build. | |||||
| See <a href="user.html#Building Myrmidon">the build instructions</a> | |||||
| for more details.</p> | |||||
| <p>To build the compatibility layer, simply execute:</p> | |||||
| <pre>ant -f ant1compat.xml</pre> | |||||
| <p>from within the root directory of the Myrmidon source tree.</p> | |||||
| </section> | |||||
| </body> | |||||
| </document> | |||||
| @@ -13,6 +13,7 @@ | |||||
| <menu name="User Guide"> | <menu name="User Guide"> | ||||
| <item name="Build file" href="/buildfile.html"/> | <item name="Build file" href="/buildfile.html"/> | ||||
| <item name="Virtual File System" href="/vfs.html"/> | <item name="Virtual File System" href="/vfs.html"/> | ||||
| <item name="Ant1 Compatibility Layer" href="/ant1compat.html"/> | |||||
| </menu> | </menu> | ||||
| <menu name="Extending Ant"> | <menu name="Extending Ant"> | ||||
| @@ -53,11 +53,30 @@ | |||||
| </subsection> | </subsection> | ||||
| <subsection name="Ant 1.x Compatibility"> | <subsection name="Ant 1.x Compatibility"> | ||||
| <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> | |||||
| </subsection> | </subsection> | ||||
| <subsection name="Virtual File System"> | <subsection name="Virtual File System"> | ||||