git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268691 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1,4 +1,4 @@ | |||||
Changes from Ant 1.2 to Ant 1.3 Beta 1 | |||||
Changes from Ant 1.2 to Ant 1.3 Beta 2 | |||||
=========================================== | =========================================== | ||||
Changes that could break older environments: | Changes that could break older environments: | ||||
@@ -72,6 +72,10 @@ Other changes: | |||||
* wlrun, wlstop and ejbjar now support Weblogic 6.0 | * wlrun, wlstop and ejbjar now support Weblogic 6.0 | ||||
* The MPasre task has been updated to work with MParse 2.0 | |||||
* The documentation has been significantly updated. | |||||
Fixed bugs: | Fixed bugs: | ||||
----------- | ----------- | ||||
@@ -298,7 +298,8 @@ | |||||
<copy todir="${dist.lib}" file="${lib.dir}/optional/README"/> | <copy todir="${dist.lib}" file="${lib.dir}/optional/README"/> | ||||
<copy todir="${dist.docs}"> | |||||
<copy todir="${dist.docs}" | |||||
filtering="on"> | |||||
<fileset dir="${docs.dir}"/> | <fileset dir="${docs.dir}"/> | ||||
</copy> | </copy> | ||||
@@ -15,7 +15,7 @@ Token filters are used by all tasks that perform file copying operations | |||||
through the Project commodity methods.</p> | through the Project commodity methods.</p> | ||||
<p>Note 1: the token string must not contain the separators chars (@).<br> | <p>Note 1: the token string must not contain the separators chars (@).<br> | ||||
Note 2: Either token and value attributes must be provided, or only the | Note 2: Either token and value attributes must be provided, or only the | ||||
filterfile attribute.</p> | |||||
filtersfile attribute.</p> | |||||
<h3>Parameters</h3> | <h3>Parameters</h3> | ||||
<table border="1" cellpadding="2" cellspacing="0"> | <table border="1" cellpadding="2" cellspacing="0"> | ||||
@@ -50,7 +50,7 @@ filterfile attribute.</p> | |||||
<p>will copy recursively all the files from the <i>src.dir</i> directory into | <p>will copy recursively all the files from the <i>src.dir</i> directory into | ||||
the <i>dest.dir</i> directory replacing all the occurences of the string <i>@year@</i> | the <i>dest.dir</i> directory replacing all the occurences of the string <i>@year@</i> | ||||
with <i>2000.</i></p> | with <i>2000.</i></p> | ||||
<pre> <filter filterfile="deploy_env.properties"/></pre> | |||||
<pre> <filter filtersfile="deploy_env.properties"/></pre> | |||||
will read all property entries from the <i>deploy_env.properties</i> file | will read all property entries from the <i>deploy_env.properties</i> file | ||||
and set these as filters. | and set these as filters. | ||||
@@ -157,7 +157,7 @@ classname in the "build.compiler" property. | |||||
<tr> | <tr> | ||||
<td valign="top">includeAntRuntime</td> | <td valign="top">includeAntRuntime</td> | ||||
<td valign="top">whether to include the Ant run-time libraries; | <td valign="top">whether to include the Ant run-time libraries; | ||||
defaults to <code>no</code>.</td> | |||||
defaults to <code>yes</code>.</td> | |||||
<td align="center" valign="top">No</td> | <td align="center" valign="top">No</td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
@@ -22,16 +22,24 @@ filesets are extended to allow control over the access mode, username and groupn | |||||
to be applied to the tar entries. This is useful, for example, when preparing archives for | to be applied to the tar entries. This is useful, for example, when preparing archives for | ||||
Unix systems where some files need to have execute permission.</p> | Unix systems where some files need to have execute permission.</p> | ||||
<p>The POSIX tar standard does not support path lengths greater than 100 characters. The | |||||
behaviour of the tar task when it encounters such paths is controlled by the <i>longfile</i> | |||||
attribute. If this attribute is not present, the tar task will throw an exception upon encountering | |||||
a long path. If the longfile attribute is set to <code>truncate</code>, any long paths will be | |||||
truncated to the 100 character maximum length prior to adding to the archive. This ensures that | |||||
the file will be in the archive and that the archive can be untarred by any compliant version of | |||||
tar. If the loss of path information is not acceptable, and it rarely is, longfile may be set to | |||||
the value <code>gnu</code>. The tar task will then produce a GNU tar file which can have | |||||
arbitrary length paths. Note however, that the resulting archive will only be able to be untarred | |||||
with GNU tar.</p> | |||||
<p>Early versions of tar did not support path lengths greater than 100 | |||||
characters. Modern versions of tar do so, but in incompatible ways. | |||||
The behaviour of the tar task when it encounters such paths is | |||||
controlled by the <i>longfile</i> attribute. | |||||
If the longfile attribute is set to <code>fail</code>, any long paths will | |||||
cause the tar task to fail. If the longfile attribute is set to | |||||
<code>truncate</code>, any long paths will be truncated to the 100 character | |||||
maximum length prior to adding to the archive. If the value of the longfile | |||||
attribute is set to <code>omit</code> then files containing long paths will be | |||||
omitted from the archive. Either option ensures that the archive can be | |||||
untarred by any compliant version of tar. If the loss of path or file | |||||
information is not acceptable, and it rarely is, longfile may be set to the | |||||
value <code>gnu</code>. The tar task will then produce a GNU tar file which | |||||
can have arbitrary length paths. Note however, that the resulting archive will | |||||
only be able to be untarred with GNU tar. The default for the longfile | |||||
attribute is <code>warn</code> which behaves just like the gnu option except | |||||
that it produces a warning for each file path encountered that does not match | |||||
the limit.</p> | |||||
<p>Note that this task does not perform compression. You might want to use the | <p>Note that this task does not perform compression. You might want to use the | ||||
<a href="gzip.html">GZip</a> task to prepare a .tar.gz package.</p> | <a href="gzip.html">GZip</a> task to prepare a .tar.gz package.</p> | ||||
@@ -55,9 +63,11 @@ with GNU tar.</p> | |||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td valign="top">longfile</td> | <td valign="top">longfile</td> | ||||
<td valign="top">Controls how long paths are handled. Allowable | |||||
values are "gnu" and "truncate"</td> | |||||
<td align="center" valign="top">No</td> | |||||
<td valign="top">Determines how long files (>100 chars) are to be | |||||
handled. Allowable values are "truncate", "fail", | |||||
"warn", "omil" and "gnu". Default is | |||||
"warn". | |||||
<td valign="top" align="center">No</td> | |||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td valign="top">includes</td> | <td valign="top">includes</td> | ||||
@@ -3,133 +3,619 @@ | |||||
<head> | <head> | ||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | ||||
<meta http-equiv="Content-Language" content="en-us"> | <meta http-equiv="Content-Language" content="en-us"> | ||||
<title>Ant VisualAge for Java Tool Integration</title> | |||||
<title>Visual Age for Java Tasks and Plugin User Manual</title> | |||||
</head> | </head> | ||||
<body> | <body> | ||||
<h1>Ant PlugIn for VisualAge for Java</h1> | |||||
<a name="authors"></a>by | |||||
<h1>Visual Age for Java Tasks and Plugin User Manual</h1> | |||||
<a name="authors"></a>by | |||||
<ul> | <ul> | ||||
<li>Wolf Siberski (<a href="mailto:wolf.siberski@tui.de"> | |||||
wolf.siberski@tui.de</a>)</li> | |||||
<li>Christoph Wilhelms (<a href="mailto:christoph.wilhelms@tui.de"> | |||||
christoph.wilhelms@tui.de</a>)</li> | |||||
<li>Wolf Siberski | |||||
(<a href="mailto:wolf.siberski@tui.de"> wolf.siberski@tui.de</a> )</li> | |||||
<li>Christoph Wilhelms | |||||
(<a href="mailto:christoph.wilhelms@tui.de"> christoph.wilhelms@tui.de</a>)</li> | |||||
</ul> | </ul> | ||||
Version 1.0 - 2000/11/09<br> | |||||
Version 1.1 - 2001/02/14<br> | |||||
<hr> | <hr> | ||||
<h2>Table of Contents</h2> | <h2>Table of Contents</h2> | ||||
<ul> | <ul> | ||||
<li><a href="#introduction">Introduction</a></li> | <li><a href="#introduction">Introduction</a></li> | ||||
<li><a href="#installation">Installation</a></li> | |||||
<li><a href="#usage">Usage</a></li> | |||||
<li><a href="#tasks">The Tasks</a><a href="#introduction"></a></li> | |||||
<ul> | |||||
<li><a href="#vajload">VAJLoad</a></li> | |||||
<li><a href="#vajexport">VAJExport</a></li> | |||||
<li><a href="#vajimport">VAJImport</a></li> | |||||
</ul> | |||||
<li><a href="#sample_buildfile">A sample build file</a><br></li> | |||||
<li><a href="#plugin">The Plugin</a></li> | |||||
<ul> | |||||
<li><a href="#installation">Installation</a></li> | |||||
<li><a href="#usage">Usage</a></li> | |||||
</ul> | |||||
<li><a href="#faq">Frequently Asked Questions</a></li> | <li><a href="#faq">Frequently Asked Questions</a></li> | ||||
<li><a href="#va_versions">Visual Age Versions</a></li> | <li><a href="#va_versions">Visual Age Versions</a></li> | ||||
<li><a href="#history">History</a><a href="#history"></a></li> | |||||
</ul> | </ul> | ||||
<hr> | <hr> | ||||
<h2><a name="introduction"></a>Introduction</h2> | <h2><a name="introduction"></a>Introduction</h2> | ||||
Visual Age for Java is a great Java IDE, but it lacks decent build support | |||||
for creating deliveries. On the other hand, Ant supports the build process | |||||
very good, but is (at least at the moment) command line based. So we decided | |||||
to write a small visual Ant frontend to make running Ant from VAJ possible. | |||||
We use the Tool API to integrate Ant in VisualAge for Java. In combination | |||||
with the VAJ targets (vajload, vajexport, vajimport) you can load defined | |||||
defined versions of projects into your workspace, export the source code, | |||||
compile it with an external compiler and build a jar without leaving the | |||||
IDE. Of course compile messages are viewed in a logging window. Concluding: | |||||
This tool provides a comfortable deployment VAJ has not (out of the box)!<br> | |||||
Visual Age for Java is a great Java IDE, but it lacks decent | |||||
build support; for creating deliveries. On the other hand, | |||||
Ant supports the build process very good, but is | |||||
(at least at the moment) command line based. So we decided | |||||
to write some tasks to access the VAJ repository and | |||||
a small visual Ant frontend to make running Ant from VAJ possible. | |||||
We use the Tool API to integrate Ant in VisualAge for Java. | |||||
In combination with the VAJ tasks (vajload, vajexport, vajimport) | |||||
you can load defined defined versions of projects into your workspace, | |||||
export the source code, compile it with an external compiler | |||||
and build a jar without leaving the IDE. Of course compile | |||||
messages are viewed in a logging window. Concluding: This | |||||
tool provides decent deployment support VAJ has not (out of the box).<br> | |||||
<h2><a name="tasks"></a>The Tasks</h2> | |||||
At the moment there are three tasks which help integrating the VAJ repository | |||||
contents into an external build process: | |||||
<table cellpadding="2" cellspacing="2" border="0" width="500"> | |||||
<tbody> | |||||
<tr valign="Top"> | |||||
<td valign="Top"><a href="#vajload">VAJLoad</a><br> | |||||
</td> | |||||
<td valign="Top"> loads specified versions into the workspace<br> | |||||
</td> | |||||
</tr> | |||||
<tr valign="Top"> | |||||
<td valign="Top"><a href="#vajexport">VAJExport</a><br> | |||||
</td> | |||||
<td valign="Top"> exports specified packages into the file system<br> | |||||
</td> | |||||
</tr> | |||||
<tr valign="Top"> | |||||
<td valign="Top"><a href="#vajimport">VAJImport</a><br> | |||||
</td> | |||||
<td valign="Top"> imports specified files into the workspace<br> | |||||
</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
These tasks are described in detail below. | |||||
<hr> | |||||
<h2><a name="vajload"></a>VAJLoad</h2> | |||||
<h3>Description:</h3> | |||||
<p>Loads a specified VAJ project version into the workspace.</p> | |||||
<h3>Parameters</h3> | |||||
<p>none</p> | |||||
<h3>Parameters specified as nested elements</h3> | |||||
<h4>vajproject</h4> | |||||
<table border="1" cellpadding="2" cellspacing="0"> | |||||
<tbody> | |||||
<tr> | |||||
<td valign="Top"><b>Attribute</b></td> | |||||
<td valign="Top"><b>Description</b></td> | |||||
<td align="Center" valign="Top"><b>Required</b></td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="Top">name</td> | |||||
<td valign="Top">name of the VAJ project to load into the workspace</td> | |||||
<td valign="Top" align="Center">yes</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="Top">version</td> | |||||
<td valign="Top">name of the requested version</td> | |||||
<td valign="Top" align="Center">yes</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
<h3>Example</h3> | |||||
<pre> | |||||
<vajload> | |||||
<vajproject name="My Testcases" version="1.7beta" /> | |||||
<vajproject name="JUnit" version="3.2" /> | |||||
</vajload> | |||||
</pre> | |||||
<hr> | |||||
<h2><a name="vajexport"></a>VAJExport</h2> | |||||
<h3>Description:</h3> | |||||
<p>Exports Java source files, class files and/or resources from the workspace | |||||
to the file system. Exports can be specified by giving the VAJ project | |||||
name and package name(s). This works very similar to <a href="index.html#fileset"> | |||||
FileSets</a>. </p> | |||||
<h3>Parameters</h3> | |||||
<table border="1" cellpadding="2" cellspacing="0"> | |||||
<tbody> | |||||
<tr> | |||||
<td valign="Top"><b>Attribute</b></td> | |||||
<td valign="Top"><b>Description</b></td> | |||||
<td align="Center" valign="Top"><b>Required</b></td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="Top">destdir</td> | |||||
<td valign="Top">location to store the exported files</td> | |||||
<td valign="Top" align="Center">yes</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="Top">exportSources</td> | |||||
<td valign="Top">export source files (default: "yes")</td> | |||||
<td valign="Top" align="Center">no</td> | |||||
</tr> | |||||
<tr valign="Top"> | |||||
<td valign="Top">exportResources</td> | |||||
<td valign="Top">export resource files (default: "yes")</td> | |||||
<td valign="Top" align="Center">no</td> | |||||
</tr> | |||||
<tr valign="Top"> | |||||
<td valign="Top">exportClasses</td> | |||||
<td valign="Top">export class files (default: "no")</td> | |||||
<td valign="Top" align="Center">no</td> | |||||
</tr> | |||||
<tr valign="Top"> | |||||
<td valign="Top">exportDebugInfo</td> | |||||
<td valign="Top">include debug info in exported | |||||
class files (default: "no")</td> | |||||
<td valign="Top" align="Center">no</td> | |||||
</tr> | |||||
<tr valign="Top"> | |||||
<td valign="Top">defaultexcludes </td> | |||||
<td valign="Top">use default excludes when exporting (default: "yes") | |||||
<td valign="Top" align="Center">no</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
<h3>Parameters specified as nested elements</h3> | |||||
<h4>include</h4> | |||||
specifies the packages to include into the export | |||||
<table border="1" cellpadding="2" cellspacing="0"> | |||||
<tbody> | |||||
<tr> | |||||
<td valign="Top"><b>Attribute</b></td> | |||||
<td valign="Top"><b>Description</b></td> | |||||
<td align="Center" valign="Top"><b>Required</b></td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="Top">name</td> | |||||
<td valign="Top">name of the VAJ project and package to export.<br> | |||||
The first element of the name must be the project name, <br> | |||||
then the package name elements separated by '/'.</td> | |||||
<td valign="Top">yes</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
<h4>exclude</h4> | |||||
specifies the packages to exclude from the export<br> | |||||
<table border="1" cellpadding="2" cellspacing="0"> | |||||
<tbody> | |||||
<tr> | |||||
<td valign="Top"><b>Attribute</b></td> | |||||
<td valign="Top"><b>Description</b></td> | |||||
<td align="Center" valign="Top"><b>Required</b></td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="Top">name</td> | |||||
<td valign="Top">name of the VAJ project/package not to export</td> | |||||
<td valign="Top" align="Center">yes</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
<h3>Example</h3> | |||||
<pre> | |||||
<vajexport destdir="${src.dir}" exportResources="no"> | |||||
<include name="MyProject/**"/> | |||||
<exclude name="MyProject/test/**"/> | |||||
</vajexport> | |||||
</pre> | |||||
This example exports all packages in the VAJ project 'MyProject', except | |||||
packages starting with 'test'. | |||||
<hr> | |||||
<h2><a name="vajimport"></a>VAJImport</h2> | |||||
<h3>Description:</h3> | |||||
<p>Imports Java source files, class files and/or resources from the file | |||||
system into VAJ. These imports can be specified with a fileset. </p> | |||||
<h3>Parameters</h3> | |||||
<table border="1" cellpadding="2" cellspacing="0"> | |||||
<tbody> | |||||
<tr> | |||||
<td valign="Top"><b>Attribute</b></td> | |||||
<td valign="Top"><b>Description</b></td> | |||||
<td align="Center" valign="Top"><b>Required</b></td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="Top">vajProject</td> | |||||
<td valign="Top">imported files are added to this VAJ project</td> | |||||
<td valign="Top" align="Center">yes</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="Top">importSources</td> | |||||
<td valign="Top">export source files (default: "yes")</td> | |||||
<td valign="Top" align="Center">no</td> | |||||
</tr> | |||||
<tr valign="Top"> | |||||
<td valign="Top">importResources</td> | |||||
<td valign="Top">export resource files (default: "yes")</td> | |||||
<td valign="Top" align="Center">no</td> | |||||
</tr> | |||||
<tr valign="Top"> | |||||
<td valign="Top">importClasses</td> | |||||
<td valign="Top">export class files (default: "no")</td> | |||||
<td valign="Top" align="Center">no</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
<h3>Parameters specified as nested elements</h3> | |||||
<h4>fileset</h4> | |||||
A <a href="index.html#fileset">FileSet</a> specifies the files to import. | |||||
<h3>Example</h3> | |||||
<pre> | |||||
<vajimport project="Test" importClasses="true"> | |||||
<fileset dir="${import.dir}"> | |||||
<include name="com/sample/**/*.class"/> | |||||
<exclude name="com/sample/test/**"/> | |||||
</fileset> | |||||
</vajimport> | |||||
</pre> | |||||
This example imports all class files in the directory ${import.dir}/com/sample | |||||
excluding those in the subdirectory test<br> | |||||
<hr> | |||||
<h2><a name="sample_buildfile"></a>A sample build file</h2> | |||||
This is a sample build file which builds a zip file useful for distribution | |||||
of the VAJ plugin. The build file exports a specific version of Ant, compiles | |||||
it, extracts necessary helper classes and zips everything together. This | |||||
is useful as complete example as well as to deploy Ant in a team where all | |||||
developers use VAJ. The resulting zip file must be unzipped in | |||||
<tt><VAJInstallDir>\ide\tools\org-apache-tools-ant</tt>. | |||||
For more information see the <a href="#installation">installation</a> section.<br> | |||||
<br> | |||||
<pre> | |||||
<?xml version="1.0"?> | |||||
<!-- ======================================================================= --> | |||||
<!-- Builds a binary distribution of the VAJ Ant Plugin --> | |||||
<!-- ======================================================================= --> | |||||
<project name="anttool" default="buildall" basedir="c:\temp\anttool"> | |||||
<property name="src.dir" value="${basedir}/src"/> | |||||
<property name="zip.dir" value="${basedir}/dist"/> | |||||
<property name="build.classes" value="${basedir}/classes"/> | |||||
<!-- location of the unzipped Ant source distribution --> | |||||
<property name="antdistribution.dir" value="u:\ant-1.3beta1"/> | |||||
<!-- VAJ install dir --> | |||||
<property name="vaj.dir" value="C:\IBMVJava2"/> | |||||
<path id="classpath"> | |||||
<pathelement location="${src.dir}"/> | |||||
<pathelement location="${vaj.dir}\IDE\project_resources\IBM IDE Utility class libraries" /> | |||||
<pathelement location="${build.classes}"/> | |||||
</path> | |||||
<!-- =================================================================== --> | |||||
<!-- Load Projects into Workspace --> | |||||
<!-- =================================================================== --> | |||||
<target name="load" description="load projects"> | |||||
<vajload> | |||||
<project name="Ant" version="1.3"/> | |||||
<project name="Apache Oro RegExp" version="2.0.1"/> | |||||
</vajload> | |||||
</target> | |||||
<!-- =================================================================== --> | |||||
<!-- Creates the build dirs --> | |||||
<!-- =================================================================== --> | |||||
<target name="preparedirs"> | |||||
<mkdir dir="${basedir}"/> | |||||
<mkdir dir="${src.dir}"/> | |||||
<mkdir dir="${zip.dir}"/> | |||||
<mkdir dir="${build.classes}"/> | |||||
</target> | |||||
<!-- =================================================================== --> | |||||
<!-- Export from VA --> | |||||
<!-- =================================================================== --> | |||||
<target name="export" depends="preparedirs" description="export projects"> | |||||
<mkdir dir="${src.dir}"/> | |||||
<!-- Export all Ant sources except optional tasks and the Oro sources --> | |||||
<vajexport destdir="${src.dir}"> | |||||
<include name="Ant/**"/> | |||||
<exclude name="Ant/**/optional/**"/> | |||||
<exclude name="Ant/org/apache/tools/ant/gui/**"/> | |||||
<include name="Apache Oro*/**"/> | |||||
</vajexport> | |||||
<!-- Export selected optional tasks --> | |||||
<vajexport destdir="${src.dir}"> | |||||
<include name="Ant/org/apache/tools/ant/taskdefs/optional/ide/**"/> | |||||
</vajexport> | |||||
</target> | |||||
<!-- =================================================================== --> | |||||
<!-- Unzip necessary libraries --> | |||||
<!-- =================================================================== --> | |||||
<target name="expand"> | |||||
<mkdir dir="${build.classes}"/> | |||||
<unzip src="${antdistribution.dir}\lib\parser.jar" | |||||
dest="${build.classes}" | |||||
/> | |||||
<unzip src="${antdistribution.dir}\lib\jaxp.jar" | |||||
dest="${build.classes}" | |||||
/> | |||||
<delete dir="${build.classes}\META-INF" /> | |||||
</target> | |||||
<!-- =================================================================== --> | |||||
<!-- Compile the source code --> | |||||
<!-- =================================================================== --> | |||||
<target name="compile" depends="expand" description="compile java sources"> | |||||
<mkdir dir="${build.classes}"/> | |||||
<javac srcdir="${src.dir}" | |||||
destdir="${build.classes}" | |||||
debug="on" | |||||
deprecation="off" | |||||
optimize="on" > | |||||
<classpath refid="classpath" /> | |||||
<include name="org/apache/**"/> | |||||
<exclude name="**/JakartaRegexpMatcher.java"/> | |||||
</javac> | |||||
</target> | |||||
<!-- =================================================================== --> | |||||
<!-- Copy resources and zip everything together --> | |||||
<!-- =================================================================== --> | |||||
<target name="zip" depends="compile" description="creates zip distribution"> | |||||
<copy todir="${build.classes}"> | |||||
<fileset dir="${src.dir}"> | |||||
<include name="org/apache/**"/> | |||||
<exclude name="**/*.java"/> | |||||
</fileset> | |||||
</copy> | |||||
<mkdir dir="${build.classes}/doc"/> | |||||
<copy todir="${build.classes}/doc" overwrite="yes"> | |||||
<fileset dir="${antdistribution.dir}/docs"> | |||||
<include name="VAJAnttool.html, toolmenu.gif, anttool1.gif"/> | |||||
</fileset> | |||||
</copy> | |||||
<copy file="${antdistribution.dir}/src/main/org/apache/tools/ant/taskdefs/optional/ide/default.ini" todir="${build.classes}" overwrite="yes"/> | |||||
<mkdir dir="${zip.dir}"/> | |||||
<zip basedir="${build.classes}" zipfile="${zip.dir}/anttool.zip" /> | |||||
</target> | |||||
<!-- =================================================================== --> | |||||
<!-- Cleans source and class dirs --> | |||||
<!-- =================================================================== --> | |||||
<target name="clean" depends="preparedirs" description="removes all files from src and build tree"> | |||||
<delete> | |||||
<fileset dir="${src.dir}"/> | |||||
</delete> | |||||
<delete> | |||||
<fileset dir="${build.classes}"/> | |||||
</delete> | |||||
<delete> | |||||
<fileset dir="${zip.dir}"/> | |||||
</delete> | |||||
</target> | |||||
<!-- =================================================================== --> | |||||
<!-- Cleans the build dir, loads required project versions, exports, --> | |||||
<!-- compiles and zips the Plugin --> | |||||
<!-- =================================================================== --> | |||||
<target name="buildall" depends="clean, load, export, zip" description="build all"> | |||||
</target> | |||||
</project> | |||||
</pre> | |||||
<hr> | |||||
<h2><a name="plugin"></a>The Plugin</h2> | |||||
The tasks are usable within VAJ by running the | |||||
org.apache.tools.ant.Main class, but this is | |||||
quite inconvenient. Therefore a small GUI is | |||||
provided which allows selecting a build file | |||||
and executing its targets. This Plugin is accessible | |||||
from the VAJ Tools menu (see <a href="#usage">Usage</a>). | |||||
<hr> | <hr> | ||||
<h2><a name="installation"></a>Installation</h2> | <h2><a name="installation"></a>Installation</h2> | ||||
At the moment the installation has it's rough edges. If something described | |||||
below doesn't work for You, it's probably not Your fault but incomplete/wrong | |||||
instructions. In this case, please contact one of the <a href="#authors"> | |||||
authors</a>.<br> | |||||
We assume <font face="Courier">C:\IBMVJava</font> as VAJ install directory. | |||||
If you have installed it elsewhere, adapt the paths below. Execute following | |||||
steps to get the PlugIn up and running: | |||||
At the moment the installation has it's rough edges. If something | |||||
described below doesn't work for You, it's probably not Your fault | |||||
but incomplete/wrong instructions. In this case, please contact one | |||||
of the <a href="#authors">authors</a>. | |||||
We assume <font face="Courier">C:\IBMVJava</font> as VAJ install | |||||
directory. If You have installed it elsewhere, adapt the pathes below. | |||||
Execute following steps to get the PlugIn up and running: | |||||
<ul> | <ul> | ||||
<li>import the Ant sources into VAJ.</li> | |||||
<li>install the Visual Age IDE Tools (via File->Quick Start-> | |||||
Add feature->'IBM IDE Utility class libraries' | |||||
</li> | |||||
<li>import an appropriate XML parser to VAJ (we use Xerces 1.2.0 and are | <li>import an appropriate XML parser to VAJ (we use Xerces 1.2.0 and are | ||||
happy with it). Unfortunately the XML parser delivered with VAJ (in the | |||||
project 'IBM XML Parser for Java') doesn't work with Ant. You have to | |||||
remove that project (temporarily) from the workspace before importing | |||||
another XML implementation.</li> | |||||
happy with it). Unfortunately the XML parser delivered with VAJ (in | |||||
the project 'IBM XML Parser for Java') doesn't work with Ant. You have to | |||||
remove that project (temporarily) from the workspace before importing another | |||||
XML implementation. | |||||
</li> | |||||
<li>import the Ant sources into VAJ.</li> | |||||
<li>Create the directory <font face="Courier"> | <li>Create the directory <font face="Courier"> | ||||
C:\IBMVJava\ide\tools\org-apache-tools-ant</font>.</li> | |||||
C:\IBMVJava\ide\tools\org-apache-tools-ant</font>. | |||||
</li> | |||||
<li>export the Ant and XML parser class files into this directory. Be sure | <li>export the Ant and XML parser class files into this directory. Be sure | ||||
to select class files and resources. Sources don't have to be exported. | |||||
Some optional tasks have errors and can't be exported when You don't have | |||||
the necessary packages in Your workspace (e.g. junit task, ejbc task). | |||||
If You need this tasks either import these packages into VAJ, too, | |||||
or copy the .class files directly from the binary distribution</li> | |||||
<li>copy <font face="Courier">default.ini</font> (in | |||||
<font face="Courier">jakarta-ant\src\...\taskdefs\optional\ide</font>) | |||||
to <font face="Courier"> | |||||
C:\IBMVJava\ide\tools\org-apache-tools-ant\default.ini</font>.</li> | |||||
<li>if you want to access this help from the Workbench, create the | |||||
directory <font face="Courier"> | |||||
C:\IBMVJava\ide\tools\org-apache-tools-ant\doc</font> and copy the files | |||||
<font face="Courier">VAJAntTool.html</font>, | |||||
<font face="Courier">toolmenu.gif</font> and | |||||
<font face="Courier">anttool1.gif</font> to it.</li> | |||||
to select class files and resources. Sources don't have to be exported. | |||||
Some optional tasks have errors and can't be exported when You | |||||
don't have the necessary packages in Your workspace (e.g. junit | |||||
task, ejbc task). If You need this tasks either import these packages | |||||
into VAJ, too, or copy the .class files directly from the binary | |||||
distribution. | |||||
</li> | |||||
<li>copy <font face="Courier">default.ini</font> (in <font face="Courier"> | |||||
jakarta-ant\src\...\taskdefs\optional\ide</font>) to <font face="Courier"> | |||||
C:\IBMVJava\ide\tools\org-apache-tools-ant\default.ini</font>. | |||||
</li> | |||||
<li>if you want to access this help from the Workbench, create the | |||||
directory <font face="Courier"> C:\IBMVJava\ide\tools\org-apache-tools-ant\doc</font> | |||||
and copy the files <font face="Courier">VAJAntTool.html</font>, | |||||
<font face="Courier">toolmenu.gif</font> and <font face="Courier"> | |||||
anttool1.gif</font> to it. | |||||
</li> | |||||
<li>VAJ has to be restarted to recognize the new tool.</li> | <li>VAJ has to be restarted to recognize the new tool.</li> | ||||
<li>Now if You open the context menu of a project, You should see the entry | <li>Now if You open the context menu of a project, You should see the entry | ||||
'Ant Build' in the Tools submenu (see <a href="#usage">Usage</a>).</li> | |||||
'Ant Build' in the Tools submenu (see <a href="#usage">Usage</a>). | |||||
</li> | |||||
<li>Make sure the tool works as expected. Now You can remove Ant and the | <li>Make sure the tool works as expected. Now You can remove Ant and the | ||||
imported XML parser from Your workspace (and optionally add the IBM parser | |||||
again).</li> | |||||
imported XML parser from Your workspace (and optionally add the | |||||
IBM parser again). | |||||
</li> | |||||
</ul> | </ul> | ||||
<hr> | <hr> | ||||
<h2><a name="usage"></a>Usage</h2> | <h2><a name="usage"></a>Usage</h2> | ||||
Being sure the tool is installed correctly and your Ant build file is | |||||
configured, it is really easy to use.<br> | |||||
Go to your Workbench, select the project you want to deploy and open | |||||
its context menu. In the submenu <i>Tools</i> you should find the new | |||||
entry <i>Ant Build</i>. Click it to start the tool! | |||||
<center><p><img src="toolmenu.gif" border="0" height="246" width="393"> | |||||
</p></center> | |||||
After a short time this frame should pop up: | |||||
<center><p><img src="anttool1.gif" border="0" height="222" width="389"> | |||||
</p></center> | |||||
This frame contains the following: | |||||
Beeing sure the tool is installed correctly and your Ant build | |||||
file is configured, it is really easy to use.<br> | |||||
Go to your Workbench, select the project you want to deploy and | |||||
open its context menu. In the submenu <i>Tools</i> you should find | |||||
the new entry <i>Ant Build</i>. Klick it to start the tool! | |||||
<center><img src="toolmenu.gif" border="0" height="246" width="393"></center> | |||||
After a short time this frame should pop up: | |||||
<center><img src="anttool1.gif" border="0" height="222" width="389"></center> | |||||
This frame contains the following elements: | |||||
<ul> | <ul> | ||||
<li>A menubar with some options described later</li> | <li>A menubar with some options described later</li> | ||||
<li>The name of your selected VAJ project</li> | <li>The name of your selected VAJ project</li> | ||||
<li>An entry field for the Ant XML buildfile with a browse [...] button. The | |||||
full qualified filename, including the directory is needed here.</li> | |||||
<li>A list with tasks specified in the buildfile. Until your first save of | |||||
the build info (described later), this list will be empty. When loading a | |||||
build file by the <i>Reload Project</i> button, this list is filled with | |||||
all tasks which have a description attribute. The task you select in this | |||||
list will be executed when pressing the <i>Execute Task</i> button.</li> | |||||
<li>An entry field for the Ant XML buildfile with a browse [...] button. | |||||
The full qualified filename, including the directory is needed here. | |||||
</li> | |||||
<li>A list with tasks specified in the buildfile. Until your first save | |||||
of the build info (described later), this list will be empty. When | |||||
loading a build file by the <i>Reload Project</i> button, this list | |||||
is filled with all tasks which have a description attribute. The | |||||
task you select in this list will be executed when pressing the | |||||
<i> Execute Task</i> button. | |||||
</li> | |||||
<li>A pulldown box for specifying the log level.</li> | <li>A pulldown box for specifying the log level.</li> | ||||
<li>Three buttons. Two of them I have already described and the third one | <li>Three buttons. Two of them I have already described and the third one | ||||
is just the <i>Close </i>button to exit our small tool!</li> | |||||
is just the <i>Close </i>button to exit our small tool! | |||||
</li> | |||||
</ul> | </ul> | ||||
After you have set up your buildprocess you might find it useful to save | |||||
the data you've just entered, so we implemented an option to save it to | |||||
the repository into your selected project. Make sure that you have an open | |||||
edition of your project before selecting <i>Save BuildInfo To Repository</i> | |||||
from the <i>File</i> menu. Now your information is saved to this edition | |||||
of your project and will be loaded automatically the next time you start | |||||
<i>Ant Build</i>.<br> | |||||
If you have closed the log window accidentally, it can be reopened with | |||||
the <i>Log</i> item in the <i>File</i> menu, and if you want to know who | |||||
developed this, just select <i>About</i> in the <i>Help</i> menu. | |||||
<br> | |||||
After you have set up your buildprocess you might find it useful | |||||
to save the data you've just entered, so we implemented an option to | |||||
save it to the repository into your selected project. Make sure that you | |||||
have an open edition of your project before selecting | |||||
<i>Save BuildInfo To Repository</i> from the <i>File</i> menu. | |||||
Now your information is saved to this edition of your project and will | |||||
be loaded automatically the next time you start <i>Ant Build</i>.<br> | |||||
If you have closed the log window accidentally, it can be reopened | |||||
with the <i>Log</i> item in the <i>File</i> menu, and if you want to | |||||
know who developed this, just select <i>About</i> in the <i>Help</i> menu. | |||||
<hr> | <hr> | ||||
<h2><a name="faq"></a>Frequently Asked Questions</h2> | <h2><a name="faq"></a>Frequently Asked Questions</h2> | ||||
<p>F: I want to load, export and build more then one Visual Age project to | |||||
one jar! How to?<br> | |||||
A: The VA tasks are able to load and export several Projects all at | |||||
once. You can choose whatever project you like for storing the tool | |||||
information, it doesn't really matter.</p> | |||||
<p><b>Q: I want to load, export and build more then one Visual Age project | |||||
to one jar! How to?</b><br> | |||||
A: The VA tasks are able to load and export several Projects all | |||||
at once. You can choose whatever project you like for storing the tool | |||||
information, it doesn't really matter | |||||
</p> | |||||
<p><b>Q: When I load my build file, the list of targets is empty. Why?</b><br> | |||||
A: You need to add the optional "description" parameter to the targets You | |||||
want to come up in the list. Then reload the build file in the "ant build" | |||||
tool. We chose to display only targets with description to allow the build | |||||
file developer to distinguish between targets for end users and helper targets. | |||||
</p> | |||||
<p><b>Q: Is there a sample build file available? </b><br> | |||||
A: Now You can find an <a href="#sample_buildfile">example</a> in this manual | |||||
</p> | |||||
<p><b>Q: Why does it export my entire workspace when I've already implicitly | |||||
selected a project when starting the Tool?</b><br> | |||||
A: This selection does not carry into the buildfile you are using. Set the | |||||
Project name at the beginning of the "includes" parameter. | |||||
</p> | |||||
<p><b>Q: When I import Ant into my Workspace, I get Problems reported. Can I | |||||
ignore them?</b><br> | |||||
A: It depends on the problems reported, and what you want to do with Ant. | |||||
Problems you can't ignore: | |||||
<ul> | |||||
<li>Classes from javax.xml.parser missing - install a compatible parser | |||||
(see <a href="#installation">installation</a>) | |||||
</li> | |||||
<li>Classes from com.ibm.ivj.util missing - install the Visual Age IDE | |||||
Utility feature (see <a href="#installation">installation</a>). | |||||
</li> | |||||
</ul> | |||||
</p> | |||||
<p><b>Q: Why is the task name vajload when the class is called VAJLoadProjects?</b><br> | |||||
A: At the moment this task can load only project versions. This is reflected | |||||
by the class name. It may be extended to load package and class versions, | |||||
too, and we didn't want to let these extensions affect the build files. Therefore | |||||
we chose the more general name vajload as task name. | |||||
</p> | |||||
<p><b>Q: I want to use the same buildfile both within Visual Age and from the | |||||
command line using my regular Ant environment. What do I need to be aware | |||||
of?</b><br> | |||||
A: The three Visual Age Tasks won't work when executing Ant from the command | |||||
line. | |||||
</p> | |||||
<p><b>Q: How do I control the import/export of sourcefiles, compiled files and | |||||
project resources explicity?</b><br> | |||||
A: Via the Boolean values exportClasses (default false) exportSources (default | |||||
true) and exportResources (default true). In some situations, Resources are | |||||
not exported correctly without this being explicity set. | |||||
</p> | |||||
<hr> | <hr> | ||||
<h2><a name="known_problems"></a>Known Problems</h2> | |||||
<ul> | |||||
<li>Exporting a package containing just resources doesn't work. This is | |||||
a VAJ Tool API bug. Workaround: create a dummy class and set 'exportSources' | |||||
to false. | |||||
</li> | |||||
</ul> | |||||
<hr> | |||||
<h2><a name="va_versions"></a>VisualAge for Java Versions</h2> | <h2><a name="va_versions"></a>VisualAge for Java Versions</h2> | ||||
This tool integration has been tested with versions 3.02 and 3.5 of VisualAge | |||||
for Java. It should run with the 2.x Versions, too, but we didn't try. | |||||
The graphical user interface is build with AWT so it is JDK independent | |||||
by now!<br> | |||||
This tool integration has been tested with versions 3.02 and 3.5 | |||||
of VisualAge for Java. It should run with the 2.x Versions, too, but | |||||
we didn't try. The graphical user interface is build with AWT so it is | |||||
JDK independent by now. | |||||
<hr> | |||||
<h2><a name="history"></a>History</h2> | |||||
<table cellpadding="2" cellspacing="2" border="1" width="400"> | |||||
<tbody> | |||||
<tr valign="Top"> | |||||
<td valign="Top">1.0</td> | |||||
<td valign="Top">2000/09/11</td> | |||||
<td valign="Top">Initial Version</td> | |||||
</tr> | |||||
<tr valign="Top"> | |||||
<td valign="Top">1.1</td> | |||||
<td valign="Top">2001/02/14</td> | |||||
<td valign="Top">Added Task documentation and more FAQs (thanks to | |||||
Richard Bourke for the FAQ additions) | |||||
</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
<hr> | <hr> | ||||
<center><p>Copyright © 2000 Apache Software Foundation. | |||||
All rights Reserved.</p></center> | |||||
<center>Copyright © 2001 Apache Software Foundation. All rights Reserved.</center> | |||||
</body> | </body> | ||||
</html> | </html> | ||||
@@ -1,16 +1,20 @@ | |||||
<!-- saved from url=(0022)http://internet.e-mail --> | |||||
<html> | <html> | ||||
<head> | <head> | ||||
<meta http-equiv="Content-Language" content="en-us"> | <meta http-equiv="Content-Language" content="en-us"> | ||||
<title>JavaCC Task</title> | |||||
<title>MParse Task</title> | |||||
</head> | </head> | ||||
<body> | <body> | ||||
<h2><a name="javacc">MParse</a></h2> | |||||
<h2><a name="mparse">MParse</a></h2> | |||||
<p>by</p> | |||||
<ul> | |||||
<li>Stephane Bailliez (<a href="mailto:sbailliez@imediation.com">sbailliez@imediation.com</a>)</li> | |||||
</ul> | |||||
<h3>Requirements</h3> | <h3>Requirements</h3> | ||||
<p>This task requires Metamata Development environment 1.1. It does not work as | |||||
is with the latest 2.0 version freely available at <a href="http://www.metamata.com">Metamata</a>.</p> | |||||
<p>This task requires Metamata Development environment 2.0 freely available at <a href="http://www.metamata.com">Metamata</a>.</p> | |||||
<h3>Description</h3> | <h3>Description</h3> | ||||
<p> | <p> | ||||
Invokes the Metamata <a HREF="http://www.metamata.com/parse.html">MParse</a> compiler | Invokes the Metamata <a HREF="http://www.metamata.com/parse.html">MParse</a> compiler | ||||
@@ -51,32 +55,62 @@ is with the latest 2.0 version freely available at <a href="http://www.metamata. | |||||
<td valign="top" align="center">Yes</td> | <td valign="top" align="center">Yes</td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td valign="top">workingdir</td> | |||||
<td valign="top">verbose</td> | |||||
<td valign="top"> | <td valign="top"> | ||||
The temporary directory used by MParse. | |||||
Enable all messages | |||||
</td> | </td> | ||||
<td valign="top" align="center">Yes</td> | |||||
<td valign="top" align="center">No</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">debugparser</td> | |||||
<td valign="top"> | |||||
Enables parser debugging | |||||
</td> | |||||
<td valign="top" align="center">No</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">debugscanner</td> | |||||
<td valign="top"> | |||||
Enables scanner debugging | |||||
</td> | |||||
<td valign="top" align="center">No</td> | |||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td valign="top">cleanuphack</td> | |||||
<td valign="top">Remove the stale file as well as the intermediate Sun | |||||
<td valign="top">cleanup</td> | |||||
<td valign="top">Remove the intermediate Sun | |||||
JavaCC file created during the transformation of the grammar file.</td> | JavaCC file created during the transformation of the grammar file.</td> | ||||
<td valign="top" align="center">No. Default to false.</td> | |||||
<td valign="top" align="center">No. Default to false</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">maxmemory</td> | |||||
<td valign="top">Set the maximum memory for the JVM. this is a convenient | |||||
way to set the -mx or -Xmx argument.</td> | |||||
<td valign="top" align="center">No</td> | |||||
</tr> | </tr> | ||||
</table> | </table> | ||||
<h3>Nested elements</h3> | <h3>Nested elements</h3> | ||||
<h4>userclasspath</h4> | |||||
<p> The <tt>userclasspath</tt> element is required and represents a <a href="index.html#path">PATH like | |||||
<h4>jvmarg</h4> | |||||
<p>Additional parameters may be passed to the VM via nested <code><jvmarg></code> | |||||
attributes. <code><jvmarg></code> allows all attributes described in <a href="index.html#arg">Command | |||||
line arguments</a>.</p> | |||||
<h4>classpath</h4> | |||||
<p>Sets class path (also source path unless one explicitly set). Overrides | |||||
METAPATH/CLASSPATH environment variables. The <tt>classpath</tt> element represents a <a href="index.html#path">PATH like | |||||
structure</a>.</p> | |||||
<h4>sourcepath</h4> | |||||
<p>Sets source path. Overrides the SOURCEPATH environment variable. The <tt>sourcepath</tt> element represents a <a href="index.html#path">PATH like | |||||
structure</a>.</p> | structure</a>.</p> | ||||
<h3>Example</h3> | <h3>Example</h3> | ||||
<pre> <mparse target="src/Parser.jj" metamatahome="c:/metamata" workingdir="c:/tmp"> | |||||
<userclasspath> | |||||
<pathelement location="./lib/dependency.jar"/> | |||||
</userclasspath> | |||||
<pre> <mparse target="c:/metamata/examples/parseexamples/javagrammars/singlefile/JavaParser.jj" | |||||
metamatahome="c:/metamata" cleanup="true"> | |||||
<classpath> | |||||
<pathelement location="c:/metamata/examples/"/> | |||||
</classpath> | |||||
</mparse></pre> | </mparse></pre> | ||||
<p> | <p> | ||||
This invokes Metamata MParse installed in <tt>c:/metamata</tt> on a grammar file <tt>src/Parser.jj</tt> | |||||
with a working directory in <tt>c:/tmp</tt> and a specific classpath | |||||
This invokes Metamata MParse installed in <tt>c:/metamata</tt> on one of the grammar file | |||||
example <tt>(JavaParser.jj)</tt> | |||||
and cleans up the intermediate Sun JavaCC file. | |||||
</p> | </p> | ||||
<hr> | <hr> | ||||
@@ -0,0 +1,78 @@ | |||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> | |||||
<html> | |||||
<head> | |||||
<title>Documentation for Ant 1.3 optional task VSSLABEL</title> | |||||
</head> | |||||
<body> | |||||
<h2><a name="vsslabel">VssLabel</a></h2> | |||||
<h3>Description</h3> | |||||
Task to perform LABEL commands to Microsoft Visual Source Safe. | |||||
<p>Assigns a label to the specified version or current version of a file or | |||||
project.</p> | |||||
<h3>Parameters</h3> | |||||
<table border="1" cellpadding="2" cellspacing="0"> | |||||
<tr> | |||||
<th>Attribute</th> | |||||
<th>Values</th> | |||||
<th>Required</th> | |||||
</tr> | |||||
<tr> | |||||
<td>login</td> | |||||
<td>username,password</td> | |||||
<td>No</td> | |||||
</tr> | |||||
<tr> | |||||
<td>vsspath</td> | |||||
<td>SourceSafe path</td> | |||||
<td>Yes</td> | |||||
</tr> | |||||
<tr> | |||||
<td>ssdir</td> | |||||
<td>directory where <code>ss.exe</code> resides. By default the task | |||||
expects it to be in the PATH.</td> | |||||
<td>No</td> | |||||
</tr> | |||||
<tr> | |||||
<td>label</td> | |||||
<td>A label to apply to the hierarchy</td> | |||||
<td>Yes</td> | |||||
</tr> | |||||
<tr> | |||||
<td>version</td> | |||||
<td>An existing file or project version to label. By default the current | |||||
version is labelled.</td> | |||||
<td>No</td> | |||||
</tr> | |||||
</table> | |||||
<h3>Examples</h3> | |||||
<blockquote> | |||||
<pre> | |||||
<vsslabel vsspath="/source/aProject" | |||||
login="me,mypassword" | |||||
label="Release1"/> | |||||
</pre> | |||||
</blockquote> | |||||
<p>Labels the current version of the VSS project <i>$/source/aproject</i> with | |||||
the label <i>Release1</i> using the username <i>me</i> and the password | |||||
<i>mypassword</i>. | |||||
</p> | |||||
<blockquote> | |||||
<pre> | |||||
<vsslabel vsspath="/source/aProject/myfile.txt" | |||||
version="4" | |||||
label="1.03.004"/> | |||||
</pre> | |||||
</blockquote> | |||||
<p>Labels version 4 of the VSS file <i>$/source/aproject/myfile.txt</i> with the | |||||
label <i>1.03.004</i>. If this version already has a label, the operation (and | |||||
the build) will fail. | |||||
</p> | |||||
<hr> | |||||
<p align="center">Copyright © 2000,2001 Apache Software Foundation. All rights | |||||
Reserved.</p> | |||||
</body> | |||||
</html> |
@@ -30,6 +30,7 @@ | |||||
<li>Jon S. Stevens (<a href="mailto:jon@latchkey.com">jon@latchkey.com</a>)</li> | <li>Jon S. Stevens (<a href="mailto:jon@latchkey.com">jon@latchkey.com</a>)</li> | ||||
<li>Roger Vaughn (<a href="mailto:rvaughn@seaconinc.com">rvaughn@seaconinc.com</a>)</li> | <li>Roger Vaughn (<a href="mailto:rvaughn@seaconinc.com">rvaughn@seaconinc.com</a>)</li> | ||||
<li>Dave Walend (<a href="mailto:dwalend@cs.tufts.edu">dwalend@cs.tufts.edu</a>)</li> | <li>Dave Walend (<a href="mailto:dwalend@cs.tufts.edu">dwalend@cs.tufts.edu</a>)</li> | ||||
<li>Phillip Wells (<a href="mailto:philwells@rocketmail.com">philwells@rocketmail.com</a>)</li> | |||||
</ul> | </ul> | ||||
<center> | <center> | ||||
@@ -33,7 +33,9 @@ | |||||
<a href="OptionalTasks/stylebook.html">Stylebook</a><br> | <a href="OptionalTasks/stylebook.html">Stylebook</a><br> | ||||
<a href="OptionalTasks/test.html">Test</a><br> | <a href="OptionalTasks/test.html">Test</a><br> | ||||
<a href="OptionalTasks/telnet.html">Telnet</a><br> | <a href="OptionalTasks/telnet.html">Telnet</a><br> | ||||
<a href="Integration/VAJAntTool.html#tasks">Visual Age for Java Tasks</a><br> | |||||
<a href="OptionalTasks/vssget.html">VssGet</a><br> | <a href="OptionalTasks/vssget.html">VssGet</a><br> | ||||
<a href="OptionalTasks/vsslabel.html">VssLabel</a><br> | |||||
</body> | </body> | ||||
</html> | </html> | ||||
@@ -17,7 +17,7 @@ | |||||
<a href="ide.html" target="navFrame">IDE Integration</a><br> | <a href="ide.html" target="navFrame">IDE Integration</a><br> | ||||
<a href="develop.html">Developing with Ant</a><br> | <a href="develop.html">Developing with Ant</a><br> | ||||
<a href="resources.html">Ant Resources</a><br> | <a href="resources.html">Ant Resources</a><br> | ||||
<a href="License">LICENSE</a><br> | |||||
<a href="LICENSE">License</a><br> | |||||
<a href="feedback.html">Feedback</a><br><br> | <a href="feedback.html">Feedback</a><br><br> | ||||
<a href="credits.html">Authors</a><br> | <a href="credits.html">Authors</a><br> | ||||
@@ -0,0 +1,3 @@ | |||||
<target name="test1"> | |||||
<echo message="from included entity"/> | |||||
</target> |
@@ -0,0 +1,9 @@ | |||||
<?xml version="1.0"?> | |||||
<!DOCTYPE project [ | |||||
<!ENTITY include SYSTEM "file:./include.inc"> | |||||
]> | |||||
<project name="include-test" basedir="." default="test1"> | |||||
&include; | |||||
</project> |
@@ -0,0 +1,9 @@ | |||||
<?xml version="1.0"?> | |||||
<!DOCTYPE project [ | |||||
<!ENTITY include SYSTEM "./include.inc"> | |||||
]> | |||||
<project name="include-test" basedir="." default="test1"> | |||||
&include; | |||||
</project> |
@@ -0,0 +1,3 @@ | |||||
<target name="test1"> | |||||
<echo message="from included entity"/> | |||||
</target> |
@@ -0,0 +1,9 @@ | |||||
<?xml version="1.0"?> | |||||
<!DOCTYPE project [ | |||||
<!ENTITY include SYSTEM "file:include.inc"> | |||||
]> | |||||
<project name="include-test" basedir="." default="test1"> | |||||
&include; | |||||
</project> |
@@ -0,0 +1,9 @@ | |||||
<?xml version="1.0"?> | |||||
<!DOCTYPE project [ | |||||
<!ENTITY include SYSTEM "include.inc"> | |||||
]> | |||||
<project name="include-test" basedir="." default="test1"> | |||||
&include; | |||||
</project> |
@@ -0,0 +1,6 @@ | |||||
<?xml version="1.0"?> | |||||
<project name="include-test" basedir="." default="test1"> | |||||
<target name="test1"> | |||||
<echo message="from simple buildfile"/> | |||||
</target> | |||||
</project> |
@@ -0,0 +1,8 @@ | |||||
<?xml version="1.0"?> | |||||
<project name="property-test" basedir="." default="test1"> | |||||
<target name="test1"> | |||||
<property environment="testenv"/> | |||||
</target> | |||||
</project> |
@@ -103,6 +103,12 @@ public class AntClassLoader extends ClassLoader { | |||||
*/ | */ | ||||
private Vector loaderPackages = new Vector(); | private Vector loaderPackages = new Vector(); | ||||
/** | |||||
* This flag indicates that the classloader will ignore the base | |||||
* classloader if it can;t find a class. | |||||
*/ | |||||
private boolean ignoreBase = false; | |||||
private static Method getProtectionDomain = null; | private static Method getProtectionDomain = null; | ||||
private static Method defineClassProtectionDomain = null; | private static Method defineClassProtectionDomain = null; | ||||
static { | static { | ||||
@@ -143,6 +149,16 @@ public class AntClassLoader extends ClassLoader { | |||||
this(project, classpath); | this(project, classpath); | ||||
this.systemFirst = systemFirst; | this.systemFirst = systemFirst; | ||||
} | } | ||||
/** | |||||
* Set this classloader to run in isolated mode. In isolated mode, classes not | |||||
* found on the given classpath will not be referred to the base class loader | |||||
* but will cause a classNotFoundException. | |||||
*/ | |||||
public void setIsolated(boolean isolated) { | |||||
ignoreBase = isolated; | |||||
} | |||||
/** | /** | ||||
* Add a package root to the list of packages which must be loaded on the | * Add a package root to the list of packages which must be loaded on the | ||||
@@ -354,6 +370,9 @@ public class AntClassLoader extends ClassLoader { | |||||
project.log("Class " + classname + " loaded from ant loader", Project.MSG_DEBUG); | project.log("Class " + classname + " loaded from ant loader", Project.MSG_DEBUG); | ||||
} | } | ||||
catch (ClassNotFoundException cnfe) { | catch (ClassNotFoundException cnfe) { | ||||
if (ignoreBase) { | |||||
throw cnfe; | |||||
} | |||||
theClass = findBaseClass(classname); | theClass = findBaseClass(classname); | ||||
project.log("Class " + classname + " loaded from system loader", Project.MSG_DEBUG); | project.log("Class " + classname + " loaded from system loader", Project.MSG_DEBUG); | ||||
} | } | ||||
@@ -99,13 +99,17 @@ public class ProjectHelper { | |||||
*/ | */ | ||||
private void parse() throws BuildException { | private void parse() throws BuildException { | ||||
FileInputStream inputStream = null; | FileInputStream inputStream = null; | ||||
InputSource inputSource = null; | |||||
try { | try { | ||||
SAXParser saxParser = getParserFactory().newSAXParser(); | SAXParser saxParser = getParserFactory().newSAXParser(); | ||||
parser = saxParser.getParser(); | parser = saxParser.getParser(); | ||||
inputStream = new FileInputStream(buildFile); | |||||
saxParser.parse(inputStream, new RootHandler()); | |||||
String uri = "file:" + buildFile.getAbsolutePath().replace('\\', '/'); | |||||
for (int index = uri.indexOf('#'); index != -1; index = uri.indexOf('#')) { | |||||
uri = uri.substring(0, index) + "%23" + uri.substring(index+1); | |||||
} | |||||
saxParser.parse(uri, new RootHandler()); | |||||
} | } | ||||
catch(ParserConfigurationException exc) { | catch(ParserConfigurationException exc) { | ||||
throw new BuildException("Parser has not been configured correctly", exc); | throw new BuildException("Parser has not been configured correctly", exc); | ||||
@@ -208,16 +212,35 @@ public class ProjectHelper { | |||||
*/ | */ | ||||
public InputSource resolveEntity(String publicId, | public InputSource resolveEntity(String publicId, | ||||
String systemId) { | String systemId) { | ||||
if (systemId.startsWith("file:")) { | if (systemId.startsWith("file:")) { | ||||
String path = systemId.substring(5); | String path = systemId.substring(5); | ||||
int index = path.indexOf("file:"); | |||||
// we only have to handle these for backward compatibility | |||||
// since they are in the FAQ. | |||||
while (index != -1) { | |||||
path = path.substring(0, index) + path.substring(index + 5); | |||||
index = path.indexOf("file:"); | |||||
} | |||||
String entitySystemId = path; | |||||
index = path.indexOf("%23"); | |||||
// convert these to # | |||||
while (index != -1) { | |||||
path = path.substring(0, index) + "#" + path.substring(index + 3); | |||||
index = path.indexOf("%23"); | |||||
} | |||||
File file = new File(path); | File file = new File(path); | ||||
if (!file.isAbsolute()) { | if (!file.isAbsolute()) { | ||||
file = new File(buildFileParent, path); | file = new File(buildFileParent, path); | ||||
} | } | ||||
try { | try { | ||||
return new InputSource(new FileInputStream(file)); | |||||
InputSource inputSource = new InputSource(new FileInputStream(file)); | |||||
inputSource.setSystemId("file:" + entitySystemId); | |||||
return inputSource; | |||||
} catch (FileNotFoundException fne) { | } catch (FileNotFoundException fne) { | ||||
project.log(file.getAbsolutePath()+" could not be found", | project.log(file.getAbsolutePath()+" could not be found", | ||||
Project.MSG_WARN); | Project.MSG_WARN); | ||||
@@ -428,8 +428,10 @@ public class Execute { | |||||
*/ | */ | ||||
public Process exec(Project project, String[] cmd, String[] env) throws IOException | public Process exec(Project project, String[] cmd, String[] env) throws IOException | ||||
{ | { | ||||
project.log("Execute:CommandLauncher: " + | |||||
Commandline.toString(cmd), Project.MSG_DEBUG); | |||||
if (project != null) { | |||||
project.log("Execute:CommandLauncher: " + | |||||
Commandline.toString(cmd), Project.MSG_DEBUG); | |||||
} | |||||
return Runtime.getRuntime().exec(cmd, env); | return Runtime.getRuntime().exec(cmd, env); | ||||
} | } | ||||
@@ -471,8 +473,10 @@ public class Execute { | |||||
for ( int i = 0; i < cmd.length; i++ ) { | for ( int i = 0; i < cmd.length; i++ ) { | ||||
newcmd[i] = Commandline.quoteArgument(cmd[i]); | newcmd[i] = Commandline.quoteArgument(cmd[i]); | ||||
} | } | ||||
project.log("Execute:Java11CommandLauncher: " + | |||||
Commandline.toString(newcmd), Project.MSG_DEBUG); | |||||
if (project != null) { | |||||
project.log("Execute:Java11CommandLauncher: " + | |||||
Commandline.toString(newcmd), Project.MSG_DEBUG); | |||||
} | |||||
return Runtime.getRuntime().exec(newcmd, env); | return Runtime.getRuntime().exec(newcmd, env); | ||||
} | } | ||||
} | } | ||||
@@ -497,8 +501,10 @@ public class Execute { | |||||
throws IOException | throws IOException | ||||
{ | { | ||||
try { | try { | ||||
project.log("Execute:Java13CommandLauncher: " + | |||||
Commandline.toString(cmd), Project.MSG_DEBUG); | |||||
if (project != null) { | |||||
project.log("Execute:Java13CommandLauncher: " + | |||||
Commandline.toString(cmd), Project.MSG_DEBUG); | |||||
} | |||||
Object[] arguments = { cmd, env, workingDir }; | Object[] arguments = { cmd, env, workingDir }; | ||||
return (Process)_execWithCWD.invoke(Runtime.getRuntime(), arguments); | return (Process)_execWithCWD.invoke(Runtime.getRuntime(), arguments); | ||||
} | } | ||||
@@ -571,13 +577,16 @@ public class Execute { | |||||
// Use cmd.exe to change to the specified directory before running | // Use cmd.exe to change to the specified directory before running | ||||
// the command | // the command | ||||
String[] newcmd = new String[cmd.length+5]; | |||||
final int preCmdLength = 6; | |||||
String[] newcmd = new String[cmd.length + preCmdLength]; | |||||
newcmd[0] = "cmd"; | newcmd[0] = "cmd"; | ||||
newcmd[1] = "/c"; | newcmd[1] = "/c"; | ||||
newcmd[2] = "cd"; | newcmd[2] = "cd"; | ||||
newcmd[3] = workingDir.getAbsolutePath(); | |||||
newcmd[4] = "&&"; | |||||
System.arraycopy(cmd, 0, newcmd, 5, cmd.length); | |||||
newcmd[3] = "/d"; | |||||
newcmd[4] = workingDir.getAbsolutePath(); | |||||
newcmd[5] = "&&"; | |||||
System.arraycopy(cmd, 0, newcmd, preCmdLength, cmd.length); | |||||
return exec(project, newcmd, env); | return exec(project, newcmd, env); | ||||
} | } | ||||
} | } | ||||
@@ -119,7 +119,8 @@ public class ExecuteJava { | |||||
if (classpath == null) { | if (classpath == null) { | ||||
target = Class.forName(classname); | target = Class.forName(classname); | ||||
} else { | } else { | ||||
AntClassLoader loader = new AntClassLoader(project, classpath); | |||||
AntClassLoader loader = new AntClassLoader(project, classpath, false); | |||||
loader.setIsolated(true); | |||||
target = loader.forceLoadClass(classname); | target = loader.forceLoadClass(classname); | ||||
} | } | ||||
final Method main = target.getMethod("main", param); | final Method main = target.getMethod("main", param); | ||||
@@ -88,6 +88,7 @@ cccheckin=org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckin | |||||
ccuncheckout=org.apache.tools.ant.taskdefs.optional.clearcase.CCUnCheckout | ccuncheckout=org.apache.tools.ant.taskdefs.optional.clearcase.CCUnCheckout | ||||
sound=org.apache.tools.ant.taskdefs.optional.sound.SoundTask | sound=org.apache.tools.ant.taskdefs.optional.sound.SoundTask | ||||
junitreport=org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator | junitreport=org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator | ||||
vsslabel=org.apache.tools.ant.taskdefs.optional.vss.MSVSSLABEL | |||||
# deprecated ant tasks (kept for back compatibility) | # deprecated ant tasks (kept for back compatibility) | ||||
javadoc2=org.apache.tools.ant.taskdefs.Javadoc | javadoc2=org.apache.tools.ant.taskdefs.Javadoc | ||||
@@ -243,7 +243,7 @@ public class DescriptorHandler extends org.xml.sax.HandlerBase { | |||||
// Get the filename into a String object | // Get the filename into a String object | ||||
File classFile = null; | File classFile = null; | ||||
String className = currentText; | |||||
String className = currentText.trim(); | |||||
// If it's a primitive wrapper then we shouldn't try and put | // If it's a primitive wrapper then we shouldn't try and put | ||||
// it into the jar, so ignore it. | // it into the jar, so ignore it. | ||||
@@ -521,9 +521,12 @@ public class WeblogicDeploymentTool extends GenericDeploymentTool { | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
//File other then class changed rebuild | |||||
log("Non class file " + genericEntry.getName() + " has changed",Project.MSG_VERBOSE); | |||||
rebuild = true; | |||||
// is it the manifest. If so ignore it | |||||
if (!genericEntry.getName().equals("META-INF/MANIFEST.MF")) { | |||||
//File other then class changed rebuild | |||||
log("Non class file " + genericEntry.getName() + " has changed",Project.MSG_VERBOSE); | |||||
rebuild = true; | |||||
} | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -95,7 +95,7 @@ import org.apache.tools.ant.types.FileSet; | |||||
* <td align="center" valign="top"><b>Required</b></td> | * <td align="center" valign="top"><b>Required</b></td> | ||||
* </tr> | * </tr> | ||||
* <tr> | * <tr> | ||||
* <td valign="top">project</td> | |||||
* <td valign="top">vajproject</td> | |||||
* <td valign="top">the name of the Project to import to</td> | * <td valign="top">the name of the Project to import to</td> | ||||
* <td align="center" valign="top">Yes</td> | * <td align="center" valign="top">Yes</td> | ||||
* </tr> | * </tr> | ||||
@@ -130,7 +130,7 @@ public class VAJImport extends Task { | |||||
/** | /** | ||||
* The VisualAge for Java Project name to import into. | * The VisualAge for Java Project name to import into. | ||||
*/ | */ | ||||
public void setProject(String projectName) { | |||||
public void setVajproject(String projectName) { | |||||
this.importProject = projectName; | this.importProject = projectName; | ||||
} | } | ||||
@@ -62,46 +62,89 @@ import org.apache.tools.ant.types.Commandline; | |||||
import org.apache.tools.ant.types.CommandlineJava; | import org.apache.tools.ant.types.CommandlineJava; | ||||
import org.apache.tools.ant.types.Path; | import org.apache.tools.ant.types.Path; | ||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.io.*; | |||||
import java.util.*; | |||||
/* | |||||
/** | |||||
* Simple Metamata MParse task based on the original written by | |||||
* <a href="mailto:thomas.haas@softwired-inc.com">Thomas Haas</a> | |||||
* | |||||
* This version was written for Metamata 2.0 available at | |||||
* <a href="http://www.metamata.com">http://www.metamata.com</a> | |||||
* | * | ||||
* @author thomas.haas@softwired-inc.com | |||||
* @author <a href="mailto:sbailliez@imediation.com">Stephane Bailliez</a> | |||||
*/ | */ | ||||
public class MParse extends Task { | public class MParse extends Task { | ||||
private Path userclasspath = null; | |||||
private Path classpath = null; | |||||
private Path sourcepath = null; | |||||
private File metahome = null; | private File metahome = null; | ||||
private File metaworkingdir = null; | |||||
private File target = null; | private File target = null; | ||||
private boolean cleanupHack = false; | |||||
private boolean verbose = false; | |||||
private boolean debugparser = false; | |||||
private boolean debugscanner = false; | |||||
private boolean cleanup = false; | |||||
private CommandlineJava cmdl = new CommandlineJava(); | private CommandlineJava cmdl = new CommandlineJava(); | ||||
private File optionsFile = null; | |||||
/** location of metamata dev environment */ | |||||
public void setMetamatahome(File metamatahome) { | public void setMetamatahome(File metamatahome) { | ||||
this.metahome = metamatahome; | this.metahome = metamatahome; | ||||
} | } | ||||
public void setWorkingdir(File workingdir) { | |||||
this.metaworkingdir = workingdir; | |||||
} | |||||
/** the .jj file to process */ | |||||
public void setTarget(File target) { | public void setTarget(File target) { | ||||
this.target = target; | this.target = target; | ||||
} | } | ||||
public Path createUserclasspath() { | |||||
if (userclasspath == null) { | |||||
userclasspath = new Path(project); | |||||
} | |||||
return userclasspath; | |||||
/** create a classpath entry */ | |||||
public Path createClasspath() { | |||||
if (classpath == null) { | |||||
classpath = new Path(project); | |||||
} | |||||
return classpath; | |||||
} | |||||
/** creates a sourcepath entry */ | |||||
public Path createSourcepath() { | |||||
if (sourcepath == null) { | |||||
sourcepath = new Path(project); | |||||
} | |||||
return sourcepath; | |||||
} | |||||
/** set verbose mode */ | |||||
public void setVerbose(boolean flag){ | |||||
verbose = flag; | |||||
} | |||||
/** set scanner debug mode */ | |||||
public void setDebugscanner(boolean flag){ | |||||
debugscanner = flag; | |||||
} | |||||
/** set parser debug mode */ | |||||
public void setDebugparser(boolean flag){ | |||||
debugparser = flag; | |||||
} | |||||
/** set the hack to cleanup the temp file */ | |||||
public void setCleanup(boolean value) { | |||||
cleanup = value; | |||||
} | } | ||||
/** Creates a nested jvmarg element. */ | |||||
public Commandline.Argument createJvmarg() { | |||||
return cmdl.createVmArgument(); | |||||
} | |||||
public void setCleanupHack(boolean value) { | |||||
cleanupHack = value; | |||||
/** -mx or -Xmx depending on VM version */ | |||||
public void setMaxmemory(String max){ | |||||
if (Project.getJavaVersion().startsWith("1.1")) { | |||||
createJvmarg().setValue("-mx" + max); | |||||
} else { | |||||
createJvmarg().setValue("-Xmx" + max); | |||||
} | |||||
} | } | ||||
public MParse() { | public MParse() { | ||||
@@ -109,81 +152,200 @@ public class MParse extends Task { | |||||
cmdl.setClassname("com.metamata.jj.MParse"); | cmdl.setClassname("com.metamata.jj.MParse"); | ||||
} | } | ||||
/** execute the command line */ | |||||
public void execute() throws BuildException { | public void execute() throws BuildException { | ||||
if (target == null || !target.isFile()) { | |||||
throw new BuildException("Invalid target: " + target); | |||||
} | |||||
final File javaFile = new File(target.toString().substring(0, | |||||
target.toString().indexOf(".jj")) + ".java"); | |||||
if (javaFile.exists() && target.lastModified() < javaFile.lastModified()) { | |||||
project.log("Target is already build - skipping (" + target + ")"); | |||||
return; | |||||
try { | |||||
setUp(); | |||||
ExecuteStreamHandler handler = createStreamHandler(); | |||||
_execute(handler); | |||||
} finally { | |||||
cleanUp(); | |||||
} | } | ||||
cmdl.createArgument().setValue(target.getAbsolutePath()); | |||||
} | |||||
/** return the default stream handler for this task */ | |||||
protected ExecuteStreamHandler createStreamHandler(){ | |||||
return new LogStreamHandler(this, Project.MSG_INFO, Project.MSG_INFO); | |||||
} | |||||
/** | |||||
* check the options and build the command line | |||||
*/ | |||||
protected void setUp() throws BuildException { | |||||
checkOptions(); | |||||
if (metahome == null || !metahome.isDirectory()) { | |||||
throw new BuildException("Metamatahome not valid."); | |||||
} | |||||
if (metaworkingdir == null || !metaworkingdir.isDirectory()) { | |||||
throw new BuildException("Workingdir not set."); | |||||
} | |||||
if (userclasspath == null) { | |||||
throw new BuildException("Userclasspath not set."); | |||||
// set the classpath as the jar files | |||||
File[] jars = getMetamataLibs(); | |||||
final Path classPath = cmdl.createClasspath(project); | |||||
for (int i = 0; i < jars.length; i++){ | |||||
classPath.createPathElement().setLocation(jars[i]); | |||||
} | } | ||||
final Path classpath = cmdl.createClasspath(project); | |||||
classpath.createPathElement().setLocation(new File(metahome.getAbsolutePath() + "/lib/metamatadebug.jar")); | |||||
classpath.createPathElement().setLocation(new File(metahome.getAbsolutePath() + "/lib/metamata.jar")); | |||||
classpath.createPathElement().setLocation(new File(metahome.getAbsolutePath() + "/lib/JavaCC.zip")); | |||||
// set the metamata.home property | |||||
final Commandline.Argument vmArgs = cmdl.createVmArgument(); | |||||
vmArgs.setValue("-Dmetamata.home=" + metahome.getAbsolutePath() ); | |||||
final Commandline.Argument arg = cmdl.createVmArgument(); | |||||
arg.setValue("-mx140M"); | |||||
arg.setValue("-Dmwp=" + metaworkingdir.getAbsolutePath()); | |||||
arg.setValue("-Dmetamata.home=" + metahome.getAbsolutePath()); | |||||
arg.setValue("-Dmetamata.java=java"); | |||||
arg.setValue("-Dmetamata.java.options=-mx140M"); | |||||
arg.setValue("-Dmetamata.java.options.classpath=-classpath"); | |||||
arg.setValue("-Dmetamata.java.compiler=javac"); | |||||
arg.setValue("-Dmetamata.java.compiler.options.0=-J-mx64M"); | |||||
arg.setValue("-Dmetamata.java.compiler.options.classpath=-classpath"); | |||||
arg.setValue("-Dmetamata.language=en"); | |||||
arg.setValue("-Dmetamata.country=US"); | |||||
arg.setValue("-Dmetamata.classpath=" + userclasspath); | |||||
final Execute process = new Execute(new LogStreamHandler(this, | |||||
Project.MSG_INFO, | |||||
Project.MSG_INFO), null); | |||||
// write all the options to a temp file and use it ro run the process | |||||
String[] options = getOptions(); | |||||
optionsFile = createTmpFile(); | |||||
generateOptionsFile(optionsFile, options); | |||||
Commandline.Argument args = cmdl.createArgument(); | |||||
args.setLine("-arguments " + optionsFile.getAbsolutePath()); | |||||
} | |||||
/** execute the process with a specific handler */ | |||||
protected void _execute(ExecuteStreamHandler handler) throws BuildException { | |||||
// target has been checked as a .jj, see if there is a matching | |||||
// java file and if it is needed to run to process the grammar | |||||
String pathname = target.getAbsolutePath(); | |||||
int pos = pathname.length() - ".jj".length(); | |||||
pathname = pathname.substring(0, pos) + ".java"; | |||||
File javaFile = new File(pathname); | |||||
if (javaFile.exists() && target.lastModified() < javaFile.lastModified()) { | |||||
project.log("Target is already build - skipping (" + target + ")"); | |||||
return; | |||||
} | |||||
final Execute process = new Execute(handler); | |||||
log(cmdl.toString(), Project.MSG_VERBOSE); | log(cmdl.toString(), Project.MSG_VERBOSE); | ||||
process.setCommandline(cmdl.getCommandline()); | process.setCommandline(cmdl.getCommandline()); | ||||
try { | try { | ||||
try { | |||||
if (process.execute() != 0) { | |||||
throw new BuildException("MParse failed."); | |||||
} | |||||
} finally { | |||||
if (cleanupHack) { | |||||
final File oo393 = new File(javaFile.getParent(), | |||||
"OO393.class"); | |||||
if (oo393.exists()) { | |||||
project.log("Removing stale file: " + oo393.getName()); | |||||
oo393.delete(); | |||||
} | |||||
final File sunjj = new File(javaFile.getParent(), | |||||
"__jj" + javaFile.getName().substring(0, | |||||
javaFile.getName().indexOf(".java")) + ".sunjj"); | |||||
if (sunjj.exists()) { | |||||
project.log("Removing stale file: " + sunjj.getName()); | |||||
sunjj.delete(); | |||||
} | |||||
} | |||||
if (process.execute() != 0) { | |||||
throw new BuildException("Metamata task failed."); | |||||
} | } | ||||
} catch (IOException e){ | |||||
throw new BuildException("Failed to launch Metamata task: " + e); | |||||
} | |||||
} | |||||
/** clean up all the mess that we did with temporary objects */ | |||||
protected void cleanUp(){ | |||||
if (optionsFile != null){ | |||||
optionsFile.delete(); | |||||
optionsFile = null; | |||||
} | |||||
if (cleanup) { | |||||
String name = target.getName(); | |||||
int pos = name.length() - ".jj".length(); | |||||
name = "__jj" + name.substring(0, pos) + ".sunjj"; | |||||
final File sunjj = new File(target.getParent(), name); | |||||
if (sunjj.exists()) { | |||||
project.log("Removing stale file: " + sunjj.getName()); | |||||
sunjj.delete(); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* return an array of files containing the path to the needed | |||||
* libraries to run metamata. The file are not checked for | |||||
* existence. You should do this yourself if needed or simply let the | |||||
* forked process do it for you. | |||||
* @return array of jars/zips needed to run metamata. | |||||
*/ | |||||
protected File[] getMetamataLibs(){ | |||||
Vector files = new Vector(); | |||||
files.addElement( new File(metahome, "lib/metamata.jar") ); | |||||
files.addElement( new File(metahome, "bin/lib/JavaCC.zip") ); | |||||
File[] array = new File[ files.size() ]; | |||||
files.copyInto(array); | |||||
return array; | |||||
} | |||||
/** | |||||
* validate options set and resolve files and paths | |||||
* @throws BuildException thrown if an option has an incorrect state. | |||||
*/ | |||||
protected void checkOptions() throws BuildException { | |||||
// check that the home is ok. | |||||
if (metahome == null || !metahome.exists()){ | |||||
throw new BuildException("'metamatahome' must point to Metamata home directory."); | |||||
} | |||||
metahome = project.resolveFile(metahome.getPath()); | |||||
// check that the needed jar exists. | |||||
File[] jars = getMetamataLibs(); | |||||
for (int i = 0; i < jars.length; i++){ | |||||
if (!jars[i].exists()){ | |||||
throw new BuildException( jars[i] + " does not exist. Check your metamata installation."); | |||||
} | |||||
} | |||||
// check that the target is ok and resolve it. | |||||
if (target == null || !target.isFile() || !target.getName().endsWith(".jj") ) { | |||||
throw new BuildException("Invalid target: " + target); | |||||
} | |||||
target = project.resolveFile(target.getPath()); | |||||
} | |||||
/** | |||||
* return all options of the command line as string elements | |||||
* @param an array of options corresponding to the setted options. | |||||
*/ | |||||
protected String[] getOptions(){ | |||||
Vector options = new Vector(); | |||||
if (verbose){ | |||||
options.addElement("-verbose"); | |||||
} | |||||
if (debugscanner){ | |||||
options.addElement("-ds"); | |||||
} | |||||
if (debugparser){ | |||||
options.addElement("-dp"); | |||||
} | |||||
if (classpath != null){ | |||||
options.addElement("-classpath"); | |||||
options.addElement(classpath.toString()); | |||||
} | } | ||||
catch (IOException e) { | |||||
throw new BuildException("Failed to launch MParse: " + e); | |||||
if (sourcepath != null){ | |||||
options.addElement("-sourcepath"); | |||||
options.addElement(sourcepath.toString()); | |||||
} | } | ||||
options.addElement(target.getAbsolutePath()); | |||||
String[] array = new String[options.size()]; | |||||
options.copyInto(array); | |||||
return array; | |||||
} | |||||
/** | |||||
* write all options to a file with one option / line | |||||
* @param tofile the file to write the options to. | |||||
* @param options the array of options element to write to the file. | |||||
* @throws BuildException thrown if there is a problem while writing | |||||
* to the file. | |||||
*/ | |||||
protected void generateOptionsFile(File tofile, String[] options) throws BuildException { | |||||
FileWriter fw = null; | |||||
try { | |||||
fw = new FileWriter(tofile); | |||||
PrintWriter pw = new PrintWriter(fw); | |||||
for (int i = 0; i < options.length; i++){ | |||||
pw.println( options[i] ); | |||||
} | |||||
pw.flush(); | |||||
} catch (IOException e){ | |||||
throw new BuildException("Error while writing options file " + tofile, e); | |||||
} finally { | |||||
if (fw != null){ | |||||
try { | |||||
fw.close(); | |||||
} catch (IOException ignored){} | |||||
} | |||||
} | |||||
} | |||||
/** create a temporary file in the current directory */ | |||||
protected final static File createTmpFile(){ | |||||
// must be compatible with JDK 1.1 !!!! | |||||
final long rand = (new Random(System.currentTimeMillis())).nextLong(); | |||||
File file = new File("metamata" + rand + ".tmp"); | |||||
return file; | |||||
} | } | ||||
} | } |
@@ -1,6 +1,8 @@ | |||||
@echo off | @echo off | ||||
# Change drive and directory to %1 (Win9X only for NT/2K use "cd /d") | |||||
cd %1 | cd %1 | ||||
%1\ | |||||
set ANT_RUN_CMD=%2 | set ANT_RUN_CMD=%2 | ||||
shift | shift | ||||
shift | shift | ||||
@@ -0,0 +1,94 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
* Foundation" must not be used to endorse or promote products derived | |||||
* from this software without prior written permission. For written | |||||
* permission, please contact apache@apache.org. | |||||
* | |||||
* 5. Products derived from this software may not be called "Apache" | |||||
* nor may "Apache" appear in their names without prior written | |||||
* permission of the Apache Group. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* ==================================================================== | |||||
* | |||||
* This software consists of voluntary contributions made by many | |||||
* individuals on behalf of the Apache Software Foundation. For more | |||||
* information on the Apache Software Foundation, please see | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.tools.ant; | |||||
import org.apache.tools.ant.taskdefs.TaskdefsTest; | |||||
/** | |||||
* Test the build file inclusion using XML entities. | |||||
* | |||||
* @author Conor MacNeill | |||||
*/ | |||||
public class IncludeTest extends TaskdefsTest { | |||||
public IncludeTest(String name) { | |||||
super(name); | |||||
} | |||||
public void test1() { | |||||
configureProject("src/etc/testcases/core/include/basic/include.xml"); | |||||
expectLog("test1", "from included entity"); | |||||
} | |||||
public void test2() { | |||||
configureProject("src/etc/testcases/core/include/frag#ment/include.xml"); | |||||
expectLog("test1", "from included entity"); | |||||
} | |||||
public void test3() { | |||||
configureProject("src/etc/testcases/core/include/frag#ment/simple.xml"); | |||||
expectLog("test1", "from simple buildfile"); | |||||
} | |||||
public void test4() { | |||||
configureProject("src/etc/testcases/core/include/basic/relative.xml"); | |||||
expectLog("test1", "from included entity"); | |||||
} | |||||
public void test5() { | |||||
configureProject("src/etc/testcases/core/include/frag#ment/relative.xml"); | |||||
expectLog("test1", "from included entity"); | |||||
} | |||||
} |
@@ -0,0 +1,74 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
* Foundation" must not be used to endorse or promote products derived | |||||
* from this software without prior written permission. For written | |||||
* permission, please contact apache@apache.org. | |||||
* | |||||
* 5. Products derived from this software may not be called "Apache" | |||||
* nor may "Apache" appear in their names without prior written | |||||
* permission of the Apache Group. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* ==================================================================== | |||||
* | |||||
* This software consists of voluntary contributions made by many | |||||
* individuals on behalf of the Apache Software Foundation. For more | |||||
* information on the Apache Software Foundation, please see | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.tools.ant.taskdefs; | |||||
/** | |||||
* @author Conor MacNeill | |||||
*/ | |||||
public class PropertyTest extends TaskdefsTest { | |||||
public PropertyTest(String name) { | |||||
super(name); | |||||
} | |||||
public void setUp() { | |||||
configureProject("src/etc/testcases/taskdefs/property.xml"); | |||||
} | |||||
public void test1() { | |||||
// should get no output at all | |||||
expectOutputAndError("test1", "", ""); | |||||
} | |||||
} |
@@ -67,6 +67,7 @@ public abstract class TaskdefsTest extends TestCase { | |||||
private StringBuffer logBuffer; | private StringBuffer logBuffer; | ||||
private StringBuffer outBuffer; | private StringBuffer outBuffer; | ||||
private StringBuffer errBuffer; | |||||
private BuildException buildException; | private BuildException buildException; | ||||
public TaskdefsTest(String name) { | public TaskdefsTest(String name) { | ||||
@@ -92,36 +93,54 @@ public abstract class TaskdefsTest extends TestCase { | |||||
assertEquals(output, realOutput); | assertEquals(output, realOutput); | ||||
} | } | ||||
protected void expectOutputAndError(String taskname, String output, String error) { | |||||
executeTarget(taskname); | |||||
String realOutput = getOutput(); | |||||
assertEquals(output, realOutput); | |||||
String realError = getError(); | |||||
assertEquals(error, realError); | |||||
} | |||||
protected void expectLog(String taskname, String log) { | protected void expectLog(String taskname, String log) { | ||||
executeTarget(taskname); | executeTarget(taskname); | ||||
String realLog = getLog(); | String realLog = getLog(); | ||||
assertEquals(log, realLog); | assertEquals(log, realLog); | ||||
} | } | ||||
protected String getOutput() { | |||||
StringBuffer cleanOut = new StringBuffer(); | |||||
protected String getOutput() { | |||||
return cleanBuffer(outBuffer); | |||||
} | |||||
protected String getError() { | |||||
return cleanBuffer(errBuffer); | |||||
} | |||||
private String cleanBuffer(StringBuffer buffer) { | |||||
StringBuffer cleanedBuffer = new StringBuffer(); | |||||
boolean cr = false; | boolean cr = false; | ||||
for (int i = 0; i < outBuffer.length(); i++) { | |||||
char ch = outBuffer.charAt(i); | |||||
for (int i = 0; i < buffer.length(); i++) { | |||||
char ch = buffer.charAt(i); | |||||
if (ch == '\r') { | if (ch == '\r') { | ||||
cr = true; | cr = true; | ||||
continue; | continue; | ||||
} | } | ||||
if (!cr) { | if (!cr) { | ||||
cleanOut.append(ch); | |||||
cleanedBuffer.append(ch); | |||||
} else { | } else { | ||||
if (ch == '\n') { | if (ch == '\n') { | ||||
cleanOut.append(ch); | |||||
cleanedBuffer.append(ch); | |||||
} else { | } else { | ||||
cleanOut.append('\r').append(ch); | |||||
cleanedBuffer.append('\r').append(ch); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
return cleanOut.toString(); | |||||
return cleanedBuffer.toString(); | |||||
} | } | ||||
protected void configureProject(String filename) { | protected void configureProject(String filename) { | ||||
logBuffer = new StringBuffer(); | |||||
project = new Project(); | project = new Project(); | ||||
project.init(); | project.init(); | ||||
project.setUserProperty( "ant.file" , new File(filename).getAbsolutePath() ); | project.setUserProperty( "ant.file" , new File(filename).getAbsolutePath() ); | ||||
@@ -131,16 +150,22 @@ public abstract class TaskdefsTest extends TestCase { | |||||
protected void executeTarget(String targetName) { | protected void executeTarget(String targetName) { | ||||
PrintStream sysOut = System.out; | PrintStream sysOut = System.out; | ||||
PrintStream sysErr = System.err; | |||||
try { | try { | ||||
outBuffer = new StringBuffer(); | |||||
sysOut.flush(); | sysOut.flush(); | ||||
sysErr.flush(); | |||||
outBuffer = new StringBuffer(); | |||||
PrintStream out = new PrintStream(new AntOutputStream()); | PrintStream out = new PrintStream(new AntOutputStream()); | ||||
System.setOut(out); | System.setOut(out); | ||||
errBuffer = new StringBuffer(); | |||||
PrintStream err = new PrintStream(new AntOutputStream()); | |||||
System.setErr(err); | |||||
logBuffer = new StringBuffer(); | logBuffer = new StringBuffer(); | ||||
buildException = null; | buildException = null; | ||||
project.executeTarget(targetName); | project.executeTarget(targetName); | ||||
} finally { | } finally { | ||||
System.setOut(sysOut); | System.setOut(sysOut); | ||||
System.setErr(sysErr); | |||||
} | } | ||||
} | } | ||||
@@ -87,7 +87,7 @@ public class ANTLRTest extends TaskdefsTest { | |||||
} | } | ||||
public void test4() { | public void test4() { | ||||
expectBuildException("test4", "ANTLR exited with an error code of 1 ( try forking )"); | |||||
executeTarget("test4"); | |||||
} | } | ||||
public void test5() { | public void test5() { | ||||