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: | |||
@@ -72,6 +72,10 @@ Other changes: | |||
* 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: | |||
----------- | |||
@@ -298,7 +298,8 @@ | |||
<copy todir="${dist.lib}" file="${lib.dir}/optional/README"/> | |||
<copy todir="${dist.docs}"> | |||
<copy todir="${dist.docs}" | |||
filtering="on"> | |||
<fileset dir="${docs.dir}"/> | |||
</copy> | |||
@@ -15,7 +15,7 @@ Token filters are used by all tasks that perform file copying operations | |||
through the Project commodity methods.</p> | |||
<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 | |||
filterfile attribute.</p> | |||
filtersfile attribute.</p> | |||
<h3>Parameters</h3> | |||
<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 | |||
the <i>dest.dir</i> directory replacing all the occurences of the string <i>@year@</i> | |||
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 | |||
and set these as filters. | |||
@@ -157,7 +157,7 @@ classname in the "build.compiler" property. | |||
<tr> | |||
<td valign="top">includeAntRuntime</td> | |||
<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> | |||
</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 | |||
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 | |||
<a href="gzip.html">GZip</a> task to prepare a .tar.gz package.</p> | |||
@@ -55,9 +63,11 @@ with GNU tar.</p> | |||
</tr> | |||
<tr> | |||
<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> | |||
<td valign="top">includes</td> | |||
@@ -3,133 +3,619 @@ | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | |||
<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> | |||
<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> | |||
<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> | |||
Version 1.0 - 2000/11/09<br> | |||
Version 1.1 - 2001/02/14<br> | |||
<hr> | |||
<h2>Table of Contents</h2> | |||
<ul> | |||
<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="#va_versions">Visual Age Versions</a></li> | |||
<li><a href="#history">History</a><a href="#history"></a></li> | |||
</ul> | |||
<hr> | |||
<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> | |||
<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> | |||
<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 | |||
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"> | |||
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 | |||
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>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 | |||
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> | |||
<hr> | |||
<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> | |||
<li>A menubar with some options described later</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>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> | |||
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> | |||
<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> | |||
<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> | |||
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> | |||
<center><p>Copyright © 2000 Apache Software Foundation. | |||
All rights Reserved.</p></center> | |||
<center>Copyright © 2001 Apache Software Foundation. All rights Reserved.</center> | |||
</body> | |||
</html> | |||
@@ -1,16 +1,20 @@ | |||
<!-- saved from url=(0022)http://internet.e-mail --> | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Language" content="en-us"> | |||
<title>JavaCC Task</title> | |||
<title>MParse Task</title> | |||
</head> | |||
<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> | |||
<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> | |||
<p> | |||
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> | |||
</tr> | |||
<tr> | |||
<td valign="top">workingdir</td> | |||
<td valign="top">verbose</td> | |||
<td valign="top"> | |||
The temporary directory used by MParse. | |||
Enable all messages | |||
</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> | |||
<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> | |||
<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> | |||
</table> | |||
<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> | |||
<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> | |||
<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> | |||
<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>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>Phillip Wells (<a href="mailto:philwells@rocketmail.com">philwells@rocketmail.com</a>)</li> | |||
</ul> | |||
<center> | |||
@@ -33,7 +33,9 @@ | |||
<a href="OptionalTasks/stylebook.html">Stylebook</a><br> | |||
<a href="OptionalTasks/test.html">Test</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/vsslabel.html">VssLabel</a><br> | |||
</body> | |||
</html> | |||
@@ -17,7 +17,7 @@ | |||
<a href="ide.html" target="navFrame">IDE Integration</a><br> | |||
<a href="develop.html">Developing with Ant</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="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(); | |||
/** | |||
* 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 defineClassProtectionDomain = null; | |||
static { | |||
@@ -143,6 +149,16 @@ public class AntClassLoader extends ClassLoader { | |||
this(project, classpath); | |||
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 | |||
@@ -354,6 +370,9 @@ public class AntClassLoader extends ClassLoader { | |||
project.log("Class " + classname + " loaded from ant loader", Project.MSG_DEBUG); | |||
} | |||
catch (ClassNotFoundException cnfe) { | |||
if (ignoreBase) { | |||
throw cnfe; | |||
} | |||
theClass = findBaseClass(classname); | |||
project.log("Class " + classname + " loaded from system loader", Project.MSG_DEBUG); | |||
} | |||
@@ -99,13 +99,17 @@ public class ProjectHelper { | |||
*/ | |||
private void parse() throws BuildException { | |||
FileInputStream inputStream = null; | |||
InputSource inputSource = null; | |||
try { | |||
SAXParser saxParser = getParserFactory().newSAXParser(); | |||
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) { | |||
throw new BuildException("Parser has not been configured correctly", exc); | |||
@@ -208,16 +212,35 @@ public class ProjectHelper { | |||
*/ | |||
public InputSource resolveEntity(String publicId, | |||
String systemId) { | |||
if (systemId.startsWith("file:")) { | |||
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); | |||
if (!file.isAbsolute()) { | |||
file = new File(buildFileParent, path); | |||
} | |||
try { | |||
return new InputSource(new FileInputStream(file)); | |||
InputSource inputSource = new InputSource(new FileInputStream(file)); | |||
inputSource.setSystemId("file:" + entitySystemId); | |||
return inputSource; | |||
} catch (FileNotFoundException fne) { | |||
project.log(file.getAbsolutePath()+" could not be found", | |||
Project.MSG_WARN); | |||
@@ -428,8 +428,10 @@ public class Execute { | |||
*/ | |||
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); | |||
} | |||
@@ -471,8 +473,10 @@ public class Execute { | |||
for ( int i = 0; i < cmd.length; 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); | |||
} | |||
} | |||
@@ -497,8 +501,10 @@ public class Execute { | |||
throws IOException | |||
{ | |||
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 }; | |||
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 | |||
// the command | |||
String[] newcmd = new String[cmd.length+5]; | |||
final int preCmdLength = 6; | |||
String[] newcmd = new String[cmd.length + preCmdLength]; | |||
newcmd[0] = "cmd"; | |||
newcmd[1] = "/c"; | |||
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); | |||
} | |||
} | |||
@@ -119,7 +119,8 @@ public class ExecuteJava { | |||
if (classpath == null) { | |||
target = Class.forName(classname); | |||
} else { | |||
AntClassLoader loader = new AntClassLoader(project, classpath); | |||
AntClassLoader loader = new AntClassLoader(project, classpath, false); | |||
loader.setIsolated(true); | |||
target = loader.forceLoadClass(classname); | |||
} | |||
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 | |||
sound=org.apache.tools.ant.taskdefs.optional.sound.SoundTask | |||
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) | |||
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 | |||
File classFile = null; | |||
String className = currentText; | |||
String className = currentText.trim(); | |||
// If it's a primitive wrapper then we shouldn't try and put | |||
// it into the jar, so ignore it. | |||
@@ -521,9 +521,12 @@ public class WeblogicDeploymentTool extends GenericDeploymentTool { | |||
} | |||
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; | |||
} | |||
} | |||
@@ -95,7 +95,7 @@ import org.apache.tools.ant.types.FileSet; | |||
* <td align="center" valign="top"><b>Required</b></td> | |||
* </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 align="center" valign="top">Yes</td> | |||
* </tr> | |||
@@ -130,7 +130,7 @@ public class VAJImport extends Task { | |||
/** | |||
* The VisualAge for Java Project name to import into. | |||
*/ | |||
public void setProject(String projectName) { | |||
public void setVajproject(String 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.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 { | |||
private Path userclasspath = null; | |||
private Path classpath = null; | |||
private Path sourcepath = null; | |||
private File metahome = null; | |||
private File metaworkingdir = 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 File optionsFile = null; | |||
/** location of metamata dev environment */ | |||
public void setMetamatahome(File metamatahome) { | |||
this.metahome = metamatahome; | |||
} | |||
public void setWorkingdir(File workingdir) { | |||
this.metaworkingdir = workingdir; | |||
} | |||
/** the .jj file to process */ | |||
public void setTarget(File 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() { | |||
@@ -109,81 +152,200 @@ public class MParse extends Task { | |||
cmdl.setClassname("com.metamata.jj.MParse"); | |||
} | |||
/** execute the command line */ | |||
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); | |||
process.setCommandline(cmdl.getCommandline()); | |||
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 | |||
# Change drive and directory to %1 (Win9X only for NT/2K use "cd /d") | |||
cd %1 | |||
%1\ | |||
set ANT_RUN_CMD=%2 | |||
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 outBuffer; | |||
private StringBuffer errBuffer; | |||
private BuildException buildException; | |||
public TaskdefsTest(String name) { | |||
@@ -92,36 +93,54 @@ public abstract class TaskdefsTest extends TestCase { | |||
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) { | |||
executeTarget(taskname); | |||
String realLog = getLog(); | |||
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; | |||
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') { | |||
cr = true; | |||
continue; | |||
} | |||
if (!cr) { | |||
cleanOut.append(ch); | |||
cleanedBuffer.append(ch); | |||
} else { | |||
if (ch == '\n') { | |||
cleanOut.append(ch); | |||
cleanedBuffer.append(ch); | |||
} else { | |||
cleanOut.append('\r').append(ch); | |||
cleanedBuffer.append('\r').append(ch); | |||
} | |||
} | |||
} | |||
return cleanOut.toString(); | |||
return cleanedBuffer.toString(); | |||
} | |||
protected void configureProject(String filename) { | |||
logBuffer = new StringBuffer(); | |||
project = new Project(); | |||
project.init(); | |||
project.setUserProperty( "ant.file" , new File(filename).getAbsolutePath() ); | |||
@@ -131,16 +150,22 @@ public abstract class TaskdefsTest extends TestCase { | |||
protected void executeTarget(String targetName) { | |||
PrintStream sysOut = System.out; | |||
PrintStream sysErr = System.err; | |||
try { | |||
outBuffer = new StringBuffer(); | |||
sysOut.flush(); | |||
sysErr.flush(); | |||
outBuffer = new StringBuffer(); | |||
PrintStream out = new PrintStream(new AntOutputStream()); | |||
System.setOut(out); | |||
errBuffer = new StringBuffer(); | |||
PrintStream err = new PrintStream(new AntOutputStream()); | |||
System.setErr(err); | |||
logBuffer = new StringBuffer(); | |||
buildException = null; | |||
project.executeTarget(targetName); | |||
} finally { | |||
System.setOut(sysOut); | |||
System.setErr(sysErr); | |||
} | |||
} | |||
@@ -87,7 +87,7 @@ public class ANTLRTest extends TaskdefsTest { | |||
} | |||
public void test4() { | |||
expectBuildException("test4", "ANTLR exited with an error code of 1 ( try forking )"); | |||
executeTarget("test4"); | |||
} | |||
public void test5() { | |||