need to look at refactoring Ant1 to allow extension without cut&paste). * Updated todo and regenerated docs. * Javadoc git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272106 13f79535-47bb-0310-9956-ffa450edef68master
@@ -77,22 +77,22 @@ | |||||
</td></tr> | </td></tr> | ||||
<tr><td> | <tr><td> | ||||
<blockquote> | <blockquote> | ||||
<p>In many ways Ant2 needs to follow rules similar to a number of | |||||
different application servers with respect to ClassLoader management. | |||||
Ant2 will create a number of different ClassLoaders that have access | |||||
to different sets of resources (and thus Classes). The main reason | |||||
for this arrangment is to partition different sections of the | |||||
application such as the Container, the Task API, task/type libraries | |||||
and support libraries.</p> | |||||
<p>In many ways Ant2 needs to follow rules similar to a number of | |||||
different application servers with respect to ClassLoader management. | |||||
Ant2 will create a number of different ClassLoaders that have access | |||||
to different sets of resources (and thus Classes). The main reason | |||||
for this arrangment is to partition different sections of the | |||||
application such as the Container, the Task API, task/type libraries | |||||
and support libraries.</p> | |||||
<p>The recomended structure for ClassLoader relationships is a hierarchy. | <p>The recomended structure for ClassLoader relationships is a hierarchy. | ||||
When a ClassLoader is asked for a resource (or a class) it first delegates | |||||
to it's parent to ask for the resource. If the resource is not present in | |||||
its parent ClassLoader then the ClassLoader attempts to locate the resource | |||||
in it's own store. In practice this means that all the classes (and static | |||||
variables defined by said classes) in a parent ClassLoader are shared with | |||||
the child ClassLoaders.</p> | |||||
<p>Using kooky ascii art, the specific ClassLoader structure for Ant2 is as | |||||
follows:</p> | |||||
When a ClassLoader is asked for a resource (or a class) it first delegates | |||||
to it's parent to ask for the resource. If the resource is not present in | |||||
its parent ClassLoader then the ClassLoader attempts to locate the resource | |||||
in it's own store. In practice this means that all the classes (and static | |||||
variables defined by said classes) in a parent ClassLoader are shared with | |||||
the child ClassLoaders.</p> | |||||
<p>Using kooky ascii art, the specific ClassLoader structure for Ant2 is as | |||||
follows:</p> | |||||
<div align="left"> | <div align="left"> | ||||
<table cellspacing="4" cellpadding="0" border="0"> | <table cellspacing="4" cellpadding="0" border="0"> | ||||
<tr> | <tr> | ||||
@@ -103,16 +103,16 @@ follows:</p> | |||||
<tr> | <tr> | ||||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | <td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | ||||
<td bgcolor="#ffffff"><pre> | <td bgcolor="#ffffff"><pre> | ||||
Bootstrap | |||||
| | |||||
System | |||||
| | |||||
Common | |||||
/ \ | |||||
Container Shared | |||||
/ \ | |||||
Antlib1 Antlib2 ... | |||||
</pre></td> | |||||
Bootstrap | |||||
| | |||||
System | |||||
| | |||||
Common | |||||
/ \ | |||||
Container Shared | |||||
/ \ | |||||
Antlib1 Antlib2 ... | |||||
</pre></td> | |||||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | <td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
@@ -123,70 +123,93 @@ follows:</p> | |||||
</table> | </table> | ||||
</div> | </div> | ||||
<ul> | <ul> | ||||
<li> | |||||
The <strong>Bootstrap</strong> ClassLoader contains the classes and resources | |||||
provided by the Java runtime. | |||||
</li> | |||||
<li> | |||||
The <strong>System</strong> ClassLoader contains the classes that were made accessible | |||||
via the CLASSPATH environment variable. If the standard ant script was used then this | |||||
should only contain the classes that are used to bootstrap the ant runtime. ie | |||||
<code>$ANT_HOME/bin/ant-launcher.jar</code> | |||||
</li> | |||||
<li> | |||||
The <strong>Common</strong> ClassLoader contains the classes and resources | |||||
that are made visible to both the Container and to all the ant type librarys. This | |||||
contains all the classes that the Container uses to communicate with tasks and other | |||||
supporting infrastructure. In particular it contains the following APIs; | |||||
<ul> | |||||
<li> | |||||
<em>Task API</em> - Contains the classes that are part of the API used | |||||
to define tasks. | |||||
</li> | |||||
<li> | |||||
<em>ProjectListener API</em> - Contains the classes necessary to define new | |||||
ProjectListeners. | |||||
</li> | |||||
<li> | |||||
<em>Aspect API</em> - Contains the classes that are used to define Aspects | |||||
of the container. | |||||
</li> | |||||
<li> | |||||
<em>Container API</em> - Contains the interfaces that are required to communicate | |||||
with the objects deep within the container. <strong>NOTE</strong>: These interfaces | |||||
are not to be used by user tasks but are made available so that certain tasks (such | |||||
as <antcall/>) can be implemented. However they are subject to change without | |||||
notice between between different ant2 versions. | |||||
</li> | |||||
</ul> | |||||
<p> | |||||
These classes are loaded from all the jars present in the <code>$ANT_HOME/lib</code> | |||||
directory. | |||||
</p> | |||||
</li> | |||||
<li> | |||||
The <strong>Container</strong> ClassLoader contains all the classes and resources | |||||
that are part of the actual implementation of the Container. These classes are not | |||||
directly accessible to any Ant library or task. Some of the classes are indirectly | |||||
accessible to tasks and other elements defined in the ant librarys as they implement | |||||
interfaces defined in the <strong>Common</strong> ClassLoader. The classes that are | |||||
stored in jars in the <code>$ANT_HOME/bin/lib/</code> directory. | |||||
</li> | |||||
<li> | |||||
The <strong>Shared</strong> ClassLoader contains all the classes and resources | |||||
that are shared across all of the ant librarys (unless they are als needed by the | |||||
container in which case they should be placed int the <strong>Container</strong> | |||||
ClassLoader). This ClassLoader is populated by all the jars that are contained in | |||||
the <code>$ANT_HOME/shared/</code> directory. | |||||
</li> | |||||
<li> | |||||
The <strong>AntLib</strong> ClassLoaders each contain the classes and resources | |||||
that required by that particular library. Note that in some cases a single Ant | |||||
Library will manifest as a single ClassLoader containing a single jar. However | |||||
in some cases it is possible for one Ant Library to have multiple jars in its | |||||
ClassLoader or even have multiple ClassLoaders. See XXXX for further details. | |||||
</li> | |||||
</ul> | |||||
<li> | |||||
The | |||||
<strong>Bootstrap</strong> ClassLoader contains the classes and resources | |||||
provided by the Java runtime. | |||||
</li> | |||||
<li> | |||||
The | |||||
<strong>System</strong> ClassLoader contains the classes that were made accessible | |||||
via the CLASSPATH environment variable. If the standard ant script was used then this | |||||
should only contain the classes that are used to bootstrap the ant runtime. ie | |||||
<code>$ANT_HOME/bin/ant-launcher.jar</code> | |||||
</li> | |||||
<li> | |||||
The | |||||
<strong>Common</strong> ClassLoader contains the classes and resources | |||||
that are made visible to both the Container and to all the ant type librarys. This | |||||
contains all the classes that the Container uses to communicate with tasks and other | |||||
supporting infrastructure. In particular it contains the following APIs; | |||||
<ul> | |||||
<li> | |||||
<em>Task API</em> - Contains the classes that are part of the API used | |||||
to define tasks. | |||||
</li> | |||||
<li> | |||||
<em>ProjectListener API</em> - Contains the classes necessary to define new | |||||
ProjectListeners. | |||||
</li> | |||||
<li> | |||||
<em>Aspect API</em> - Contains the classes that are used to define Aspects | |||||
of the container. | |||||
</li> | |||||
<li> | |||||
<em>Container API</em> - Contains the interfaces that are required to communicate | |||||
with the objects deep within the container. | |||||
<strong>NOTE</strong>: These interfaces | |||||
are not to be used by user tasks but are made available so that certain tasks (such | |||||
as <antcall/>) can be implemented. However they are subject to change without | |||||
notice between between different ant2 versions. | |||||
</li> | |||||
</ul> | |||||
<p> | |||||
These classes are loaded from all the jars present in the | |||||
<code>$ANT_HOME/lib</code> | |||||
directory. | |||||
</p> | |||||
</li> | |||||
<li> | |||||
The | |||||
<strong>Container</strong> ClassLoader contains all the classes and resources | |||||
that are part of the actual implementation of the Container. These classes are not | |||||
directly accessible to any Ant library or task. Some of the classes are indirectly | |||||
accessible to tasks and other elements defined in the ant librarys as they implement | |||||
interfaces defined in the | |||||
<strong>Common</strong> ClassLoader. The classes that are | |||||
stored in jars in the | |||||
<code>$ANT_HOME/bin/lib/</code> directory. | |||||
</li> | |||||
<li> | |||||
The | |||||
<strong>Shared</strong> ClassLoader contains all the classes and resources | |||||
that are shared across all of the ant librarys (unless they are als needed by the | |||||
container in which case they should be placed int the | |||||
<strong>Container</strong> | |||||
ClassLoader). This ClassLoader is populated by all the jars that are contained in | |||||
the | |||||
<code>$ANT_HOME/shared/</code> directory. | |||||
</li> | |||||
<li> | |||||
The | |||||
<strong>AntLib</strong> ClassLoaders each contain the classes and resources | |||||
that required by that particular library. Note that in some cases a single Ant | |||||
Library will manifest as a single ClassLoader containing a single jar. However | |||||
in some cases it is possible for one Ant Library to have multiple jars in its | |||||
ClassLoader or even have multiple ClassLoaders. See XXXX for further details. | |||||
</li> | |||||
</ul> | |||||
</blockquote> | </blockquote> | ||||
</td></tr> | </td></tr> | ||||
</table> | </table> | ||||
@@ -78,35 +78,42 @@ | |||||
<tr><td> | <tr><td> | ||||
<blockquote> | <blockquote> | ||||
<p>Long ago there was identified the need for librarys that contain | <p>Long ago there was identified the need for librarys that contain | ||||
tasks and other elements present in the build file. This document | |||||
attempts to describe the mechanism via which these libraries will be | |||||
defined and used in Ant2. The librarys (also referred to as | |||||
deployments) will be termed antlibs.</p> | |||||
tasks and other elements present in the build file. This document | |||||
attempts to describe the mechanism via which these libraries will be | |||||
defined and used in Ant2. The librarys (also referred to as | |||||
deployments) will be termed antlibs.</p> | |||||
<p>Ant librarys can be packaged and signed into a ANt Type Library | <p>Ant librarys can be packaged and signed into a ANt Type Library | ||||
format (.atl) using the standard Java Archive tools. (For details on | |||||
the .jar file format see the | |||||
<a href="http://java.sun.com/j2se/1.3/docs/guide/jar/index.html"> | |||||
Jar Specification</a>.</p> | |||||
format (.atl) using the standard Java Archive tools. (For details on | |||||
the .jar file format see the | |||||
<a href="http://java.sun.com/j2se/1.3/docs/guide/jar/index.html"> | |||||
Jar Specification</a>. | |||||
</p> | |||||
<p>When packaged into such a form the META-INF/ directory contains | <p>When packaged into such a form the META-INF/ directory contains | ||||
ant specific descriptors in addition to the standard Jar manifest | |||||
and other descriptor files. The archive will also contain the | |||||
<code>.class</code> files for all the tasks and other types the | |||||
library defines. It may also contain additional resources that can | |||||
be referenced in the build file (an example being DTDs).</p> | |||||
ant specific descriptors in addition to the standard Jar manifest | |||||
and other descriptor files. The archive will also contain the | |||||
<code>.class</code> files for all the tasks and other types the | |||||
library defines. It may also contain additional resources that can | |||||
be referenced in the build file (an example being DTDs). | |||||
</p> | |||||
<p>The library may also need access to other librarys or resources | <p>The library may also need access to other librarys or resources | ||||
to perform its job. For instance, if the task loaded an XML document | |||||
and then processed said document using the <em>Trax API</em> then | |||||
the Ant library needs to have access to the <em>Trax API</em> and an | |||||
implementation of the API. The Antlib mechanism thus uses the standard | |||||
"Optional Package" Specification to declare dependencies on other | |||||
libraries.</p> | |||||
to perform its job. For instance, if the task loaded an XML document | |||||
and then processed said document using the | |||||
<em>Trax API</em> then | |||||
the Ant library needs to have access to the | |||||
<em>Trax API</em> and an | |||||
implementation of the API. The Antlib mechanism thus uses the standard | |||||
"Optional Package" Specification to declare dependencies on other | |||||
libraries. | |||||
</p> | |||||
<p>The libraries will usually be installed in standard locations that | <p>The libraries will usually be installed in standard locations that | ||||
make it possible for the Ant container to automatically locate and scan | |||||
the libraries. It will also be possible for the users to specify | |||||
additional search locations or even the specific location of ant | |||||
libraries.</p> | |||||
make it possible for the Ant container to automatically locate and scan | |||||
the libraries. It will also be possible for the users to specify | |||||
additional search locations or even the specific location of ant | |||||
libraries.</p> | |||||
<p>The following sections will describe each of these different facets | <p>The following sections will describe each of these different facets | ||||
in greater detail.</p> | |||||
in greater detail.</p> | |||||
<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"> | ||||
<font color="#ffffff" face="arial,helvetica,sanserif"> | <font color="#ffffff" face="arial,helvetica,sanserif"> | ||||
@@ -128,9 +135,13 @@ in greater detail.</p> | |||||
<tr><td> | <tr><td> | ||||
<blockquote> | <blockquote> | ||||
<p>The class and resources files should be stored as in standard jars. The | <p>The class and resources files should be stored as in standard jars. The | ||||
root directory being the base via which code and resources are loaded. So | |||||
the <code>.class</code> file for the Java class <code>com.biz.tasks.Mytask</code> | |||||
would be stored in <code>/com/biz/tasks/Mytask.class</code></p> | |||||
root directory being the base via which code and resources are loaded. So | |||||
the | |||||
<code>.class</code> file for the Java class | |||||
<code>com.biz.tasks.Mytask</code> | |||||
would be stored in | |||||
<code>/com/biz/tasks/Mytask.class</code> | |||||
</p> | |||||
</blockquote> | </blockquote> | ||||
</td></tr> | </td></tr> | ||||
</table> | </table> | ||||
@@ -143,24 +154,30 @@ would be stored in <code>/com/biz/tasks/Mytask.class</code></p> | |||||
<tr><td> | <tr><td> | ||||
<blockquote> | <blockquote> | ||||
<p>It is often the case that a library will need external resources. The | <p>It is often the case that a library will need external resources. The | ||||
example given above described dependence on an external XML library. The | |||||
ant library thus needs a mechanism via which to declare dependencies on | |||||
external libraries.</p> | |||||
example given above described dependence on an external XML library. The | |||||
ant library thus needs a mechanism via which to declare dependencies on | |||||
external libraries.</p> | |||||
<p>Ant2 uses the "Optional Package" mechanism. Prior to JDK1.3, an "Optional | <p>Ant2 uses the "Optional Package" mechanism. Prior to JDK1.3, an "Optional | ||||
Package" was known as an <em>Extension</em>. The specification for this | |||||
mechanism is available in the JDK1.3 documentation in the directory | |||||
<code>$JDK_HOME/docs/guide/extensions/versioning.html</code>. Alternatively | |||||
it is available online at | |||||
<a href="http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html"> | |||||
http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html</a>.</p> | |||||
Package" was known as an | |||||
<em>Extension</em>. The specification for this | |||||
mechanism is available in the JDK1.3 documentation in the directory | |||||
<code>$JDK_HOME/docs/guide/extensions/versioning.html</code>. Alternatively | |||||
it is available online at | |||||
<a href="http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html"> | |||||
http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html</a>. | |||||
</p> | |||||
<p>This mechanism was adopted as it is an established standard. The standard | <p>This mechanism was adopted as it is an established standard. The standard | ||||
is also begining to be adopted by other specifications such as the <em>Servlet | |||||
2.3 API</em>. Thus we are likely to see an increase of jars using this mechanism | |||||
to specify dependencies.</p> | |||||
is also begining to be adopted by other specifications such as the | |||||
<em>Servlet | |||||
2.3 API</em>. Thus we are likely to see an increase of jars using this mechanism | |||||
to specify dependencies. | |||||
</p> | |||||
<p>The "Optional Package" mechanism allows jars to specify dependencies on other | <p>The "Optional Package" mechanism allows jars to specify dependencies on other | ||||
jars that implement a particular specification at particular version levels. For | |||||
example you could specify a dependency on the Trax 1.1 API by adding the following | |||||
to the manifest of your jar.</p> | |||||
jars that implement a particular specification at particular version levels. For | |||||
example you could specify a dependency on the Trax 1.1 API by adding the following | |||||
to the manifest of your jar.</p> | |||||
<div align="left"> | <div align="left"> | ||||
<table cellspacing="4" cellpadding="0" border="0"> | <table cellspacing="4" cellpadding="0" border="0"> | ||||
<tr> | <tr> | ||||
@@ -171,10 +188,10 @@ to the manifest of your jar.</p> | |||||
<tr> | <tr> | ||||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | <td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | ||||
<td bgcolor="#ffffff"><pre> | <td bgcolor="#ffffff"><pre> | ||||
Extension-List: trax | |||||
trax-Extension-Name: Java API for XML Parsing | |||||
trax-Specification-Version: 1.1 | |||||
</pre></td> | |||||
Extension-List: trax | |||||
trax-Extension-Name: Java API for XML Parsing | |||||
trax-Specification-Version: 1.1 | |||||
</pre></td> | |||||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | <td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
@@ -185,8 +202,8 @@ trax-Specification-Version: 1.1 | |||||
</table> | </table> | ||||
</div> | </div> | ||||
<p>In some cases you may also wish to specify a dependency on a specific vendors | <p>In some cases you may also wish to specify a dependency on a specific vendors | ||||
implementation. For instance you may need to use xalan due to it implementing a | |||||
particular extension you need. In that case you manifest may contain;</p> | |||||
implementation. For instance you may need to use xalan due to it implementing a | |||||
particular extension you need. In that case you manifest may contain;</p> | |||||
<div align="left"> | <div align="left"> | ||||
<table cellspacing="4" cellpadding="0" border="0"> | <table cellspacing="4" cellpadding="0" border="0"> | ||||
<tr> | <tr> | ||||
@@ -197,13 +214,13 @@ particular extension you need. In that case you manifest may contain;</p> | |||||
<tr> | <tr> | ||||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | <td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | ||||
<td bgcolor="#ffffff"><pre> | <td bgcolor="#ffffff"><pre> | ||||
Extension-List: trax | |||||
trax-Extension-Name: Java API for XML Parsing | |||||
trax-Specification-Version: 1.1 | |||||
trax-Implementation-Title: org.apache.xalan.xslt | |||||
trax-Implementation-Version: 2.1.0 | |||||
trax-Implementation-Vendor: Apache Software Foundation | |||||
</pre></td> | |||||
Extension-List: trax | |||||
trax-Extension-Name: Java API for XML Parsing | |||||
trax-Specification-Version: 1.1 | |||||
trax-Implementation-Title: org.apache.xalan.xslt | |||||
trax-Implementation-Version: 2.1.0 | |||||
trax-Implementation-Vendor: Apache Software Foundation | |||||
</pre></td> | |||||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | <td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
@@ -214,10 +231,10 @@ trax-Implementation-Vendor: Apache Software Foundation | |||||
</table> | </table> | ||||
</div> | </div> | ||||
<p>In many cases there will be no distinction between the specification and | <p>In many cases there will be no distinction between the specification and | ||||
the implementation of a library. For instance the Velocity project only has | |||||
one implementation and one specification. In which case it is sufficient to | |||||
just declare a dependency on the Velocity "Specification". A library that uses | |||||
both the Trax API and the Velocity project may look like;</p> | |||||
the implementation of a library. For instance the Velocity project only has | |||||
one implementation and one specification. In which case it is sufficient to | |||||
just declare a dependency on the Velocity "Specification". A library that uses | |||||
both the Trax API and the Velocity project may look like;</p> | |||||
<div align="left"> | <div align="left"> | ||||
<table cellspacing="4" cellpadding="0" border="0"> | <table cellspacing="4" cellpadding="0" border="0"> | ||||
<tr> | <tr> | ||||
@@ -228,15 +245,15 @@ both the Trax API and the Velocity project may look like;</p> | |||||
<tr> | <tr> | ||||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | <td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | ||||
<td bgcolor="#ffffff"><pre> | <td bgcolor="#ffffff"><pre> | ||||
Extension-List: trax velocity | |||||
velocity-Extension-Name: org.apache.velocity | |||||
velocity-Specification-Version: 1.0 | |||||
trax-Extension-Name: Java API for XML Parsing | |||||
trax-Specification-Version: 1.1 | |||||
trax-Implementation-Title: org.apache.xalan.xslt | |||||
trax-Implementation-Version: 2.1.0 | |||||
trax-Implementation-Vendor: Apache Software Foundation | |||||
</pre></td> | |||||
Extension-List: trax velocity | |||||
velocity-Extension-Name: org.apache.velocity | |||||
velocity-Specification-Version: 1.0 | |||||
trax-Extension-Name: Java API for XML Parsing | |||||
trax-Specification-Version: 1.1 | |||||
trax-Implementation-Title: org.apache.xalan.xslt | |||||
trax-Implementation-Version: 2.1.0 | |||||
trax-Implementation-Vendor: Apache Software Foundation | |||||
</pre></td> | |||||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | <td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
@@ -247,8 +264,8 @@ trax-Implementation-Vendor: Apache Software Foundation | |||||
</table> | </table> | ||||
</div> | </div> | ||||
<p>To make other jars available to Ant librarys as "Optional Packages" | <p>To make other jars available to Ant librarys as "Optional Packages" | ||||
or Extensions then you need to add a few lines to the manifest of the | |||||
other jar. The minimal manifest is the following;</p> | |||||
or Extensions then you need to add a few lines to the manifest of the | |||||
other jar. The minimal manifest is the following;</p> | |||||
<div align="left"> | <div align="left"> | ||||
<table cellspacing="4" cellpadding="0" border="0"> | <table cellspacing="4" cellpadding="0" border="0"> | ||||
<tr> | <tr> | ||||
@@ -259,10 +276,10 @@ other jar. The minimal manifest is the following;</p> | |||||
<tr> | <tr> | ||||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | <td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | ||||
<td bgcolor="#ffffff"><pre> | <td bgcolor="#ffffff"><pre> | ||||
Extension-Name: org.realityforge.dve | |||||
Specification-Vendor: Peter Donald | |||||
Specification-Version: 1.0 | |||||
</pre></td> | |||||
Extension-Name: org.realityforge.dve | |||||
Specification-Vendor: Peter Donald | |||||
Specification-Version: 1.0 | |||||
</pre></td> | |||||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | <td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
@@ -273,8 +290,8 @@ Specification-Version: 1.0 | |||||
</table> | </table> | ||||
</div> | </div> | ||||
<p>It is important to note that looking for dependencies is recursive. For example, | <p>It is important to note that looking for dependencies is recursive. For example, | ||||
if the ant library depends upon jar A and and A depends on B then both A and B will | |||||
need to be loaded by the container.</p> | |||||
if the ant library depends upon jar A and and A depends on B then both A and B will | |||||
need to be loaded by the container.</p> | |||||
</blockquote> | </blockquote> | ||||
</td></tr> | </td></tr> | ||||
</table> | </table> | ||||
@@ -287,22 +304,24 @@ need to be loaded by the container.</p> | |||||
<tr><td> | <tr><td> | ||||
<blockquote> | <blockquote> | ||||
<p>So far there has been no mention of implementation strategies for | <p>So far there has been no mention of implementation strategies for | ||||
managing ClassLoaders and other details about where the "Optional Packages" | |||||
are stored. This section will outline such details but they could change | |||||
in the future. The above specification will still be accurate but the approach | |||||
to implementing specification will be different.</p> | |||||
managing ClassLoaders and other details about where the "Optional Packages" | |||||
are stored. This section will outline such details but they could change | |||||
in the future. The above specification will still be accurate but the approach | |||||
to implementing specification will be different.</p> | |||||
<p>In the current architecture all of the "Optional Packages" are assumed to | <p>In the current architecture all of the "Optional Packages" are assumed to | ||||
be stored in the <code>$ANT_HOME/ext</code> directory. The runtime will scan | |||||
this directory for jars and add all the "optional Packages" found into a | |||||
registry. This registry will be used by the library loading mechanism to locate | |||||
all the "Optional Packages". The user is able to specify an alternative directory | |||||
or add a new directory to search on the commandline.</p> | |||||
be stored in the | |||||
<code>$ANT_HOME/ext</code> directory. The runtime will scan | |||||
this directory for jars and add all the "optional Packages" found into a | |||||
registry. This registry will be used by the library loading mechanism to locate | |||||
all the "Optional Packages". The user is able to specify an alternative directory | |||||
or add a new directory to search on the commandline. | |||||
</p> | |||||
<p>When the container attempts to load an ant library it will also try to load | <p>When the container attempts to load an ant library it will also try to load | ||||
any needed dependencies. First it will check the parent ClassLoaders to see if any | |||||
of them contain the required dependencies. If not then it will search the | |||||
"Optional Packages" registry. If the dependency is not found then a error will be | |||||
signaled. If the dependency is found in the "Optional Packages" registry then it is | |||||
loaded by the same ClassLoader that is used to load the Ant library.</p> | |||||
any needed dependencies. First it will check the parent ClassLoaders to see if any | |||||
of them contain the required dependencies. If not then it will search the | |||||
"Optional Packages" registry. If the dependency is not found then a error will be | |||||
signaled. If the dependency is found in the "Optional Packages" registry then it is | |||||
loaded by the same ClassLoader that is used to load the Ant library.</p> | |||||
</blockquote> | </blockquote> | ||||
</td></tr> | </td></tr> | ||||
</table> | </table> | ||||
@@ -201,28 +201,23 @@ public class MyrmidonSecurityManager | |||||
<p>The Ant1 Compatibility layer is still in early stages of development. | <p>The Ant1 Compatibility layer is still in early stages of development. | ||||
</p> | </p> | ||||
<ul> | <ul> | ||||
<li>Get a version of <code><ant></code> and | |||||
<code><antcall></code> working.</li> | |||||
<li>Get a version of <code><antcall></code> working.</li> | |||||
<li> | <li> | ||||
Provide hooks between Ant1 references and Myrmidon properties. | Provide hooks between Ant1 references and Myrmidon properties. | ||||
May use converters for adapting Ant2 objects (like Ant2 | May use converters for adapting Ant2 objects (like Ant2 | ||||
<code><path></code> or <code><fileset></code>) | <code><path></code> or <code><fileset></code>) | ||||
as Ant1 types. | as Ant1 types. | ||||
</li> | </li> | ||||
<li>Handle differences between Ant1 if/unless on targets, | |||||
and Myrmidon <if> task.</li> | |||||
<li> | <li> | ||||
Write tests for the various bits that rely on Myrmidon | |||||
functionality: | |||||
Missing tests: | |||||
<ul> | <ul> | ||||
<li>Simple sanity test</li> | |||||
<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 properties are shared between Ant1 and Myrmidon tasks.</li> | ||||
<li>Make sure that <ant1.property> behaves as per Ant1</li> | |||||
</ul> | </ul> | ||||
</li> | </li> | ||||
<li>Get GUMP runs going using Myrmidon.</li> | <li>Get GUMP runs going using Myrmidon.</li> | ||||
<li>i18n messages</li> | |||||
<li>Add protected accessors for get/set/list properties in | |||||
Ant1 Project, to minimise the amount of code duplication in | |||||
Ant1CompatProject.</li> | |||||
</ul> | </ul> | ||||
</blockquote> | </blockquote> | ||||
</td></tr> | </td></tr> | ||||
@@ -18,6 +18,7 @@ import java.util.Iterator; | |||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Properties; | import java.util.Properties; | ||||
import java.util.Set; | import java.util.Set; | ||||
import java.security.CodeSource; | |||||
import org.apache.aut.converter.Converter; | import org.apache.aut.converter.Converter; | ||||
import org.apache.aut.converter.ConverterException; | import org.apache.aut.converter.ConverterException; | ||||
import org.apache.myrmidon.api.TaskContext; | import org.apache.myrmidon.api.TaskContext; | ||||
@@ -38,16 +39,21 @@ import org.apache.myrmidon.interfaces.type.TypeManager; | |||||
public class Ant1CompatProject extends Project | public class Ant1CompatProject extends Project | ||||
{ | { | ||||
public static final String ANT1_TASK_PREFIX = "ant1."; | public static final String ANT1_TASK_PREFIX = "ant1."; | ||||
public static final String MYRMIDON_PROJECT_PROP = | |||||
org.apache.myrmidon.interfaces.model.Project.PROJECT; | |||||
private static String javaclasspath; | private static String javaclasspath; | ||||
static | static | ||||
{ | { | ||||
URL ant1jar = | |||||
Ant1CompatProject.class.getProtectionDomain().getCodeSource().getLocation(); | |||||
String ant1classpath = ant1jar.getFile().toString(); | |||||
// Find the path to the Ant1 antlib file. | |||||
CodeSource ant1codesource = | |||||
Ant1CompatProject.class.getProtectionDomain().getCodeSource(); | |||||
String ant1jar = ant1codesource.getLocation().getFile().toString(); | |||||
// Append this to the java.class.path system property. | |||||
javaclasspath = System.getProperty( "java.class.path" ); | javaclasspath = System.getProperty( "java.class.path" ); | ||||
javaclasspath = javaclasspath + File.pathSeparator + ant1classpath; | |||||
javaclasspath = javaclasspath + File.pathSeparator + ant1jar; | |||||
} | } | ||||
private final Converter m_converter; | private final Converter m_converter; | ||||
@@ -67,8 +73,8 @@ public class Ant1CompatProject extends Project | |||||
recontextulize( context ); | recontextulize( context ); | ||||
setBaseDir( m_context.getBaseDirectory() ); | setBaseDir( m_context.getBaseDirectory() ); | ||||
String projectName = (String) | |||||
m_context.getProperty( org.apache.myrmidon.interfaces.model.Project.PROJECT ); | |||||
String projectName = | |||||
(String) m_context.getProperty( MYRMIDON_PROJECT_PROP ); | |||||
if( projectName != null ) | if( projectName != null ) | ||||
{ | { | ||||
setName( projectName ); | setName( projectName ); | ||||
@@ -9,6 +9,8 @@ package org.apache.tools.ant; | |||||
import org.apache.avalon.framework.configuration.Configuration; | import org.apache.avalon.framework.configuration.Configuration; | ||||
import org.apache.avalon.framework.configuration.ConfigurationException; | import org.apache.avalon.framework.configuration.ConfigurationException; | ||||
import org.apache.avalon.excalibur.i18n.Resources; | |||||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||||
/** | /** | ||||
* An adapter for running (in Myrmidon) Ant1 tasks which do not extend Task | * An adapter for running (in Myrmidon) Ant1 tasks which do not extend Task | ||||
@@ -19,7 +21,18 @@ import org.apache.avalon.framework.configuration.ConfigurationException; | |||||
public class Ant1CompatTaskAdapter | public class Ant1CompatTaskAdapter | ||||
extends TaskAdapter | extends TaskAdapter | ||||
{ | { | ||||
public void configure( Configuration configuration ) throws ConfigurationException | |||||
private static final Resources REZ = | |||||
ResourceManager.getPackageResources( Ant1CompatTaskAdapter.class ); | |||||
/** | |||||
* Gets the adapted task name from the configuration, and looks up the | |||||
* Class for the adapted task. The adapted task is then instantiated and | |||||
* configured. | |||||
* @param configuration The Task Model | |||||
* @throws ConfigurationException If the configuration is invalid. | |||||
*/ | |||||
public void configure( Configuration configuration ) | |||||
throws ConfigurationException | |||||
{ | { | ||||
// Create a new instance of the proxy object, | // Create a new instance of the proxy object, | ||||
// and configure it. | // and configure it. | ||||
@@ -29,7 +42,9 @@ public class Ant1CompatTaskAdapter | |||||
if( taskClass == null ) | if( taskClass == null ) | ||||
{ | { | ||||
throw new ConfigurationException( "Invalid task name for TaskAdapter: " + taskName ); | |||||
String message = | |||||
REZ.getString( "taskadapter.invalid-task-name.error", taskName ); | |||||
throw new ConfigurationException( message ); | |||||
} | } | ||||
Object adaptedTask = null; | Object adaptedTask = null; | ||||
@@ -39,7 +54,9 @@ public class Ant1CompatTaskAdapter | |||||
} | } | ||||
catch( Exception e ) | catch( Exception e ) | ||||
{ | { | ||||
throw new ConfigurationException( "Could not instantiate adapted task: " + taskClass.getName() ); | |||||
String message = | |||||
REZ.getString( "taskadapter.no-create.error", taskClass.getName() ); | |||||
throw new ConfigurationException( message ); | |||||
} | } | ||||
configure( adaptedTask, configuration ); | configure( adaptedTask, configuration ); | ||||
@@ -9,6 +9,8 @@ package org.apache.tools.ant; | |||||
import org.apache.avalon.framework.configuration.Configuration; | import org.apache.avalon.framework.configuration.Configuration; | ||||
import org.apache.avalon.framework.configuration.ConfigurationException; | import org.apache.avalon.framework.configuration.ConfigurationException; | ||||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||||
import org.apache.avalon.excalibur.i18n.Resources; | |||||
/** | /** | ||||
* A task for instantiating Ant1 datatypes. | * A task for instantiating Ant1 datatypes. | ||||
@@ -19,11 +21,14 @@ import org.apache.avalon.framework.configuration.ConfigurationException; | |||||
public class Ant1CompatTypeInstanceTask | public class Ant1CompatTypeInstanceTask | ||||
extends Task | extends Task | ||||
{ | { | ||||
private static final Resources REZ = | |||||
ResourceManager.getPackageResources( Ant1CompatTypeInstanceTask.class ); | |||||
public void configure( Configuration configuration ) throws ConfigurationException | public void configure( Configuration configuration ) throws ConfigurationException | ||||
{ | { | ||||
if( configuration.getAttribute( "id", null ) == null ) | if( configuration.getAttribute( "id", null ) == null ) | ||||
{ | { | ||||
final String message = "id is required."; | |||||
final String message = REZ.getString( "type.no-id.error" ); | |||||
throw new ConfigurationException( message ); | throw new ConfigurationException( message ); | ||||
} | } | ||||
@@ -0,0 +1,4 @@ | |||||
type.no-id.error=Id must be specified. | |||||
taskadapter.invalid-task-name.error=Invalid task name for TaskAdapter: {0}. | |||||
taskadapter.no-create.error=Could not instantiate adapted task: {0}. |
@@ -27,6 +27,7 @@ import org.apache.myrmidon.api.TaskException; | |||||
public class Task extends OriginalAnt1Task | public class Task extends OriginalAnt1Task | ||||
implements org.apache.myrmidon.api.Task, Configurable | implements org.apache.myrmidon.api.Task, Configurable | ||||
{ | { | ||||
private static final String ANT1_PROJECT_PROP = "ant1.project"; | |||||
protected TaskContext m_context; | protected TaskContext m_context; | ||||
/** | /** | ||||
@@ -44,11 +45,11 @@ public class Task extends OriginalAnt1Task | |||||
// Create/recontextualise the Ant1 Project. | // Create/recontextualise the Ant1 Project. | ||||
Ant1CompatProject project = | Ant1CompatProject project = | ||||
(Ant1CompatProject)context.getProperty( "ant1.project" ); | |||||
(Ant1CompatProject)context.getProperty( ANT1_PROJECT_PROP ); | |||||
if( project == null ) | if( project == null ) | ||||
{ | { | ||||
project = createProject(); | project = createProject(); | ||||
m_context.setProperty( "ant1.project", project ); | |||||
m_context.setProperty( ANT1_PROJECT_PROP, project ); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
@@ -84,28 +84,23 @@ public class MyrmidonSecurityManager | |||||
<p>The Ant1 Compatibility layer is still in early stages of development. | <p>The Ant1 Compatibility layer is still in early stages of development. | ||||
</p> | </p> | ||||
<ul> | <ul> | ||||
<li>Get a version of <code><ant></code> and | |||||
<code><antcall></code> working.</li> | |||||
<li>Get a version of <code><antcall></code> working.</li> | |||||
<li> | <li> | ||||
Provide hooks between Ant1 references and Myrmidon properties. | Provide hooks between Ant1 references and Myrmidon properties. | ||||
May use converters for adapting Ant2 objects (like Ant2 | May use converters for adapting Ant2 objects (like Ant2 | ||||
<code><path></code> or <code><fileset></code>) | <code><path></code> or <code><fileset></code>) | ||||
as Ant1 types. | as Ant1 types. | ||||
</li> | </li> | ||||
<li>Handle differences between Ant1 if/unless on targets, | |||||
and Myrmidon <if> task.</li> | |||||
<li> | <li> | ||||
Write tests for the various bits that rely on Myrmidon | |||||
functionality: | |||||
Missing tests: | |||||
<ul> | <ul> | ||||
<li>Simple sanity test</li> | |||||
<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 properties are shared between Ant1 and Myrmidon tasks.</li> | ||||
<li>Make sure that <ant1.property> behaves as per Ant1</li> | |||||
</ul> | </ul> | ||||
</li> | </li> | ||||
<li>Get GUMP runs going using Myrmidon.</li> | <li>Get GUMP runs going using Myrmidon.</li> | ||||
<li>i18n messages</li> | |||||
<li>Add protected accessors for get/set/list properties in | |||||
Ant1 Project, to minimise the amount of code duplication in | |||||
Ant1CompatProject.</li> | |||||
</ul> | </ul> | ||||
</subsection> | </subsection> | ||||