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() { | ||||