git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271711 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -24,13 +24,20 @@ | |||
| <path refid="classpath"/> | |||
| </classpath> | |||
| </taskdef> | |||
| <!-- Make stuff available relative to current location --> | |||
| <mkdir dir="${basedir}/xdocs" /> | |||
| <copy todir="${basedir}/xdocs"> | |||
| <fileset dir="${docs.src}" includes="stylesheets/project.xml" /> | |||
| </copy> | |||
| </target> | |||
| <target name="taskdocs" depends="init" | |||
| description="Generate Task Documentation"> | |||
| <dvsl basedir="${taskdocs.src}" destdir="${manual.dest}" | |||
| style="task.dvsl" extension=".html" | |||
| includes="**/*.xml" /> | |||
| style="task.dvsl" extension=".html" | |||
| includes="**/*.xml"> | |||
| <velconfig name="velocimacro.library" value="" /> | |||
| </dvsl> | |||
| </target> | |||
| </project> | |||
| @@ -2,7 +2,7 @@ | |||
| * DVSL Stylesheet to format the Ant Task documentation. | |||
| *# | |||
| #set( $relative-path = "." ) | |||
| #set( $relative-path = "../../" ) | |||
| #if (false) | |||
| #set( $body-bg = '#ffffff' ) | |||
| #set( $body-fg = '#000000' ) | |||
| @@ -44,115 +44,124 @@ | |||
| #if ( $test )$output#end | |||
| #end | |||
| #match( "task" ) | |||
| #set( $task_name = $attrib.name ) | |||
| ## Create task title with first letter in upper case | |||
| #set( $task_title = "$task_name.substring(0,1).toUpperCase()$task_name.substring(1)" ) | |||
| <html> | |||
| <head> | |||
| <meta http-equiv="Content-Language" content="en-us"> | |||
| <title>$task_title Task</title> | |||
| </head> | |||
| <body bgcolor="$body-bg" text="$body-fg" link="$body-link" | |||
| alink="$body-link" vlink="$body-link"> | |||
| <table border="0" width="100%" cellspacing="4"> | |||
| ## PAGE HEADER | |||
| <tr> | |||
| <td> | |||
| ## JAKARTA LOGO | |||
| <a href="http://jakarta.apache.org/"> | |||
| <img src="http://jakarta.apache.org/images/jakarta-logo.gif" | |||
| align="left" alt="The Jakarta Project" border="0"/> | |||
| </a> | |||
| #if( $project.logo ) | |||
| #set( $alt = $project.logo ) | |||
| #set( $home = $project.attribute("href") ) | |||
| #set( $src = $project.logo.attribute( "href" ) ) | |||
| ## PROJECT LOGO | |||
| <a href="$home"> | |||
| <img src="$src" align="right" alt="$alt" border="0"/> | |||
| </a> | |||
| #end | |||
| ## Macro to capitalize a word making the first letter upper case | |||
| #macro(capitalize $word) | |||
| $word.substring(0,1).toUpperCase()$word.substring(1) | |||
| #end | |||
| </td> | |||
| </tr> | |||
| ## HEADER SEPARATOR | |||
| <tr> | |||
| ##<td colspan="2"> | |||
| <td> | |||
| <hr noshade="" size="1"/> | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| <!-- RIGHT SIDE MAIN BODY --> | |||
| <td valign="top" align="left"> | |||
| $context.applyTemplates("long-description") | |||
| $context.applyTemplates("structure/attributes") | |||
| $context.applyTemplates("structure/elements") | |||
| </td> | |||
| </tr> | |||
| #match( "task" ) | |||
| #set( $project = $node.selectSingleNode("document('xdocs/stylesheets/project.xml')/project" ) ) | |||
| #if ($node.name().equals("task")) | |||
| #set( $title = "#capitalize($attrib.name) Task" ) | |||
| #set( $summary = $node.short-description ) | |||
| #end | |||
| <html> | |||
| <head> | |||
| <meta http-equiv="Content-Language" content="en-us"> | |||
| <title>$title</title> | |||
| </head> | |||
| <body bgcolor="$body-bg" text="$body-fg" link="$body-link" | |||
| alink="$body-link" vlink="$body-link"> | |||
| <table border="0" width="100%" cellspacing="4"> | |||
| <!-- PAGE HEADER --> | |||
| <tr> | |||
| <td> | |||
| <table border="0" width="100%"><tr> | |||
| <td valign="bottom"> | |||
| <font size="+3" face="arial,helvetica,sanserif"><strong>$title</strong></font> | |||
| #* *##if( $summary ) | |||
| <br><font face="arial,helvetica,sanserif">$summary</font> | |||
| #* *##end | |||
| </td> | |||
| <td> | |||
| #* *##if( $project.logo ) | |||
| #set( $alt = $project.logo ) | |||
| #set( $home = $project.attribute("href") ) | |||
| #set( $src = $project.logo.attribute( "href" ) ) | |||
| <!-- PROJECT LOGO --> | |||
| <a href="$home"> | |||
| <img src="${relative-path}$src" align="right" alt="$alt" border="0"/> | |||
| </a> | |||
| #* *##end | |||
| </td> | |||
| </tr></table> | |||
| </td> | |||
| </tr> | |||
| <!-- START RIGHT SIDE MAIN BODY --> | |||
| <tr> | |||
| <td valign="top" align="left"> | |||
| #* *##if ($node.name().equals("task")) | |||
| #* Use description from merged XML if available, else javadoc comment *# | |||
| #* *##if ($node.external.description) | |||
| <!-- Applying task/description --> | |||
| #* *#$context.applyTemplates("external/description") | |||
| #* *##else | |||
| <!-- Applying task/long-description --> | |||
| #* *#$context.applyTemplates("long-description") | |||
| #* *##end | |||
| #* *#$context.applyTemplates("structure/attributes") | |||
| #* *#$context.applyTemplates("structure/elements") | |||
| #* *#$context.applyTemplates("external/section") | |||
| #* *##end | |||
| </td> | |||
| </tr> | |||
| <!-- END RIGHT SIDE MAIN BODY --> | |||
| <!-- FOOTER SEPARATOR --> | |||
| <tr> | |||
| <td> | |||
| <hr noshade="" size="1"/> | |||
| </td> | |||
| </tr> | |||
| <!-- PAGE FOOTER --> | |||
| <tr> | |||
| <td> | |||
| <div align="center"><font color="$body-link" size="-1"><em> | |||
| Copyright © 2000-2002, Apache Software Foundation | |||
| </em></font></div> | |||
| </td> | |||
| </tr> | |||
| <!-- FOOTER SEPARATOR --> | |||
| <tr> | |||
| <td> | |||
| <hr noshade="" size="1"/> | |||
| </td> | |||
| </tr> | |||
| <!-- PAGE FOOTER --> | |||
| <tr> | |||
| <td> | |||
| <div align="center"><font color="$body-link" size="-1"><em> | |||
| Copyright © 2000-2002, Apache Software Foundation | |||
| </em></font></div> | |||
| </td> | |||
| </tr> | |||
| </table> | |||
| </table> | |||
| </body> | |||
| </html> | |||
| </body> | |||
| </html> | |||
| #end | |||
| #* | |||
| Macro to format a table heading cell | |||
| *# | |||
| #macro( th $text ) | |||
| <td bgcolor="$table-th-bg" valign="top" align="left"> | |||
| <font color="#000000" size="-1" face="arial,helvetica,sanserif"> | |||
| <b>$text</b></font> | |||
| </td> | |||
| <td bgcolor="$table-th-bg" valign="top" align="left"> | |||
| <font color="#000000" size="-1" face="arial,helvetica,sanserif"><b>$text</b></font> | |||
| </td> | |||
| #end | |||
| #* | |||
| Macro to format a table body cell | |||
| *# | |||
| #macro( td $text ) | |||
| <td bgcolor="$table-td-bg" valign="top" align="left"> | |||
| <font color="#000000" size="-1" face="arial,helvetica,sanserif"> | |||
| $text | |||
| </font> | |||
| </td> | |||
| <td bgcolor="$table-td-bg" valign="top" align="left"> | |||
| <font color="#000000" size="-1" face="arial,helvetica,sanserif">$text</font> | |||
| </td> | |||
| #end | |||
| #* | |||
| Macro to format a section banner | |||
| *# | |||
| #macro( section $anchor $name ) | |||
| <tr><td bgcolor="$banner-bg"> | |||
| <font color="$banner-fg" face="arial,helvetica.sanserif"> | |||
| <a name="$anchor"> | |||
| <strong>$name</strong></a></font> | |||
| </td></tr> | |||
| <tr><td bgcolor="$banner-bg"> | |||
| <font color="$banner-fg" face="arial,helvetica.sanserif"> | |||
| <a name="$anchor"> | |||
| <strong>$name</strong></a></font> | |||
| </td></tr> | |||
| #end | |||
| #* | |||
| @@ -168,75 +177,136 @@ | |||
| #* | |||
| Match long-description section | |||
| Process javadoc long description section | |||
| *# | |||
| #match( "long-description" ) | |||
| <!-- Start Description --> | |||
| <table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
| <tr><td> </td></tr> | |||
| #section($task_name "$task_title Task Description") | |||
| #* *##section("description" "Description") | |||
| <tr><td><blockquote> | |||
| $node.value() | |||
| $node.value().trim() | |||
| </blockquote></td></tr> | |||
| </table> | |||
| <!-- End Description --> | |||
| #end | |||
| #* | |||
| Match structure/attributes section | |||
| Process external desciption | |||
| *# | |||
| #match( "structure/attributes" ) | |||
| #match( "external/description" ) | |||
| <!-- Start Description --> | |||
| <table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
| <tr><td> </td></tr> | |||
| #section("attributes" "Parameters") | |||
| #* *##section("description" "Description") | |||
| <tr><td><blockquote> | |||
| <table> | |||
| <tr> | |||
| #th("Attribute") | |||
| #th("Description") | |||
| #th("Type") | |||
| </tr> | |||
| $context.applyTemplates("*") | |||
| </table> | |||
| #* *#$context.applyTemplates("*") | |||
| </blockquote></td></tr> | |||
| </table> | |||
| <!-- End Description --> | |||
| #end | |||
| #* | |||
| Match structure/elements section | |||
| Process top level attributes | |||
| *# | |||
| #match( "structure/elements" ) | |||
| #match( "structure/attributes" ) | |||
| <!-- Start Attributes --> | |||
| <table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
| <tr><td> </td></tr> | |||
| #section("elements" "Parameters as nested elements") | |||
| #* *##section("attributes" "Parameters") | |||
| <tr><td><blockquote> | |||
| $context.applyTemplates("*") | |||
| <table> | |||
| <tr> | |||
| #* *##th("Attribute") | |||
| #* *##th("Description") | |||
| #* *##th("Type") | |||
| </tr> | |||
| #* *#$context.applyTemplates("*") | |||
| </table> | |||
| </blockquote></td></tr> | |||
| </table> | |||
| <!-- End Attributes --> | |||
| #end | |||
| #* | |||
| Process a single attribute | |||
| *# | |||
| #match( "attribute" ) | |||
| <!-- Attribute --> | |||
| <tr> | |||
| #td($attrib.name) | |||
| #td($node.description) | |||
| #td($attrib.type) | |||
| #* *##td($attrib.name) | |||
| #* *##td($node.description) | |||
| #* *##td($attrib.type) | |||
| </tr> | |||
| #end | |||
| #* | |||
| Process all elements | |||
| *# | |||
| #match( "elements" ) | |||
| <!-- Start Elements --> | |||
| <table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
| <tr><td> </td></tr> | |||
| #* *##section("elements" "Parameters as nested elements") | |||
| <tr><td><blockquote> | |||
| #* *#$context.applyTemplates("*") | |||
| </blockquote></td></tr> | |||
| </table> | |||
| <!-- End Elements --> | |||
| #end | |||
| #* | |||
| Process a single element | |||
| *# | |||
| #match( "element" ) | |||
| <!-- Start Element --> | |||
| <table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
| #subsection($attrib.name $attrib.name) | |||
| <tr><td> </td></tr> | |||
| <tr><td bgcolor="$sub-banner-bg"> | |||
| <font color="$sub-banner-fg" face="arial,helvetica.sanserif" size="-1"> | |||
| <strong>$attrib.name</strong> ($attrib.type)</font> | |||
| </td></tr> | |||
| <tr><td><blockquote> | |||
| $node.description | |||
| $node.description.toString().trim() | |||
| #* *#$context.applyTemplates("*") | |||
| </blockquote></td></tr> | |||
| </table> | |||
| <!-- End Element --> | |||
| #end | |||
| #* | |||
| Process attributes within elements | |||
| *# | |||
| #match( "element/attributes" ) | |||
| <!-- Start Attributes --> | |||
| <table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
| <tr><td> </td></tr> | |||
| <tr><td> | |||
| <table> | |||
| <tr> | |||
| #* *##th("Attribute") | |||
| #* *##th("Description") | |||
| #* *##th("Type") | |||
| </tr> | |||
| #* *#$context.applyTemplates("*") | |||
| </table> | |||
| </td></tr> | |||
| </table> | |||
| <!-- End Attributes --> | |||
| #end | |||
| @@ -0,0 +1,54 @@ | |||
| <!-- Condition task --> | |||
| <external> | |||
| <description> | |||
| <p>Sets a property if a certain condition holds true - this is a | |||
| generalization of <a href="available.html">Available</a> and <a | |||
| href="uptodate.html">Uptodate</a>.</p> | |||
| <p>If the condition holds true, the property value is set to true by | |||
| default; otherwise, the property is not set. You can set the value to | |||
| something other than the default by specifying the <code>value</code> | |||
| attribute.</p> | |||
| <p>Conditions are specified as <a href="#nested">nested elements</a>, | |||
| you must specify exactly one condition.</p> | |||
| </description> | |||
| <section anchor="examples" name="Examples"> | |||
| <pre> | |||
| <condition property="javamail.complete"> | |||
| <and> | |||
| <available classname="javax.activation.DataHandler" /> | |||
| <available classname="javax.mail.Transport" /> | |||
| </and> | |||
| </condition> | |||
| </pre> | |||
| <p>sets the property <code>javamail.complete</code> if both the | |||
| JavaBeans Activation Framework and JavaMail are available in the | |||
| classpath.</p> | |||
| <pre> | |||
| <condition property="isMacOsButNotMacOsX"> | |||
| <and> | |||
| <os family="mac" /> | |||
| <not> | |||
| <os family="unix" /> | |||
| </not> | |||
| </and> | |||
| </condition> | |||
| </pre> | |||
| <p>sets the property <code>isMacOsButNotMacOsX</code> if the current | |||
| operating system is MacOS, but not MacOS X - which Ant considers to be | |||
| in the Unix family as well.</p> | |||
| <pre> | |||
| <condition property="isSunOSonSparc"> | |||
| <os name="SunOS" arch="sparc" /> | |||
| </condition> | |||
| </pre> | |||
| <p>sets the property <code>isSunOSonSparc</code> if the current | |||
| operating system is SunOS and if it is running on a sparc architecture.</p> | |||
| </section> | |||
| </external> | |||
| @@ -0,0 +1,195 @@ | |||
| <!-- javac task --> | |||
| <external> | |||
| <description> | |||
| <p>Compiles a Java source tree.</p> | |||
| <p>The source and destination directory will be recursively scanned for Java | |||
| source files to compile. Only Java files that have no corresponding class file | |||
| or where the class file is older than the java file will be compiled.</p> | |||
| <p>Note: Ant uses only the names of the source and class files to find | |||
| the classes that need a rebuild. It will not scan the source and therefor | |||
| will have no knowledge about nested classes, classes that are named different | |||
| from the source file and so on.</p> | |||
| <p>The directory structure of the source tree should follow the package | |||
| hierarchy.</p> | |||
| <p>It is possible to refine the set of files that are being compiled/copied. | |||
| This can be done with the <i>includes</i>, <i>includesfile</i>, <i>excludes</i>, <i>excludesfile</i> and <i>defaultexcludes</i> | |||
| attributes. With the <i>includes</i> or <i>includesfile</i> attribute you specify the files you want to | |||
| have included by using patterns. The <i>exclude</i> or <i>excludesfile</i> attribute is used to specify | |||
| the files you want to have excluded. This is also done with patterns. And | |||
| finally with the <i>defaultexcludes</i> attribute, you can specify whether you | |||
| want to use default exclusions or not. See the section on <a | |||
| href="../dirtasks.html#directorybasedtasks">directory based tasks</a>, on how the | |||
| inclusion/exclusion of files works, and how to write patterns.</p> | |||
| <p>It is possible to use different compilers. This can be selected with the | |||
| "build.compiler" property or the compiler attribute. Here are the choices:-</p> | |||
| <ul> | |||
| <li>classic (the standard compiler of JDK 1.1/1.2) - javac1.1 and | |||
| javac1.2 can be used as aliases</li> | |||
| <li>modern (the standard compiler of JDK 1.3/1.4) - javac1.3 and | |||
| javac1.4 can be used as aliases</li> | |||
| <li>jikes (the <a | |||
| href="http://oss.software.ibm.com/developerworks/opensource/jikes/project" target="_top">Jikes</a> | |||
| compiler)</li> | |||
| <li>jvc (the Command-Line Compiler from Microsoft's SDK for Java / | |||
| Visual J++) - microsoft can be used as an alias</li> | |||
| <li>kjc (the <a href="http://www.dms.at/kopi/" target="_top">kopi</a> | |||
| compiler)</li> | |||
| <li>gcj (the gcj compiler from gcc)</li> | |||
| <li>sj (Symantec java compiler) - symantec can be used as an alias</li> | |||
| <li>extJavac (run either modern or classic in a JVM of its own)</li> | |||
| </ul> | |||
| <p>For JDK 1.1/1.2, classic is the default. For JDK 1.3/1.4, modern is the default. | |||
| If you wish to use a different compiler interface than those | |||
| supplied, write a class that implements the CompilerAdapter interface | |||
| (package org.apache.tools.ant.taskdefs.compilers). Supply the full | |||
| classname in the "build.compiler" property.</p> | |||
| <p>The fork attribute overrides the build.compiler setting and expects | |||
| a JDK1.1 or higher to be set in java.home.</p> | |||
| <p>This task will drop all entries that point to non-existent | |||
| files/directories from the CLASSPATH it passes to the compiler.</p> | |||
| <p><strong>Windows Note:</strong>When the modern compiler is used | |||
| in unforked mode on Windows, it locks up the files present in the | |||
| classpath of the <javac> task, and does not release them. The side | |||
| effect of this is that you will not be able to delete or move | |||
| those files later on in the build. The workaround is to fork when | |||
| invoking the compiler.</p> | |||
| </description> | |||
| <section anchor="examples" name="Examples"> | |||
| <pre> <javac srcdir="${src}" | |||
| destdir="${build}" | |||
| classpath="xyz.jar" | |||
| debug="on" | |||
| /></pre> | |||
| <p>compiles all <code>.java</code> files under the <code>${src}</code> | |||
| directory, and stores | |||
| the <code>.class</code> files in the <code>${build}</code> directory. | |||
| The classpath used contains <code>xyz.jar</code>, and debug information is on.</p> | |||
| <pre> <javac srcdir="${src}" | |||
| destdir="${build}" | |||
| fork="true" | |||
| /></pre> | |||
| <p>compiles all <code>.java</code> files under the <code>${src}</code> | |||
| directory, and stores the <code>.class</code> files in the | |||
| <code>${build}</code> directory. This will fork off the javac | |||
| compiler using the default javac executable.</p> | |||
| <pre> <javac srcdir="${src}" | |||
| destdir="${build}" | |||
| fork="java$$javac.exe" | |||
| /></pre> | |||
| <p>compiles all <code>.java</code> files under the <code>${src}</code> | |||
| directory, and stores the <code>.class</code> files in the | |||
| <code>${build}</code> directory. This will fork off the javac | |||
| compiler using the executable named <code>java$javac.exe</code>. Note | |||
| that the <code>$</code> sign needs to be escaped by a second one.</p> | |||
| <pre> <javac srcdir="${src}" | |||
| destdir="${build}" | |||
| includes="mypackage/p1/**,mypackage/p2/**" | |||
| excludes="mypackage/p1/testpackage/**" | |||
| classpath="xyz.jar" | |||
| debug="on" | |||
| /></pre> | |||
| <p>compiles <code>.java</code> files under the <code>${src}</code> | |||
| directory, and stores the | |||
| <code>.class</code> files in the <code>${build}</code> directory. | |||
| The classpath used contains <code>xyz.jar</code>, and debug information is on. | |||
| Only files under <code>mypackage/p1</code> and <code>mypackage/p2</code> are | |||
| used. Files in the <code>mypackage/p1/testpackage</code> directory are excluded | |||
| from compilation.</p> | |||
| <pre> <javac srcdir="${src}:${src2}" | |||
| destdir="${build}" | |||
| includes="mypackage/p1/**,mypackage/p2/**" | |||
| excludes="mypackage/p1/testpackage/**" | |||
| classpath="xyz.jar" | |||
| debug="on" | |||
| /></pre> | |||
| <p>is the same as the previous example, with the addition of a second | |||
| source path, defined by | |||
| the property <code>src2</code>. This can also be represented using nested | |||
| <code><src></code> elements as follows:</p> | |||
| <pre> <javac destdir="${build}" | |||
| classpath="xyz.jar" | |||
| debug="on"> | |||
| <src path="${src}"/> | |||
| <src path="${src2}"/> | |||
| <include name="mypackage/p1/**"/> | |||
| <include name="mypackage/p2/**"/> | |||
| <exclude name="mypackage/p1/testpackage/**"/> | |||
| </javac></pre> | |||
| <p><b>Note:</b> If you are using Ant on Windows and a new DOS window pops up | |||
| for every use of an external compiler, this may be a problem of the JDK you are using. | |||
| This problem may occur with all JDKs < 1.2.</p> | |||
| <p><b>Note:</b> If you wish to compile only source-files located in some packages below a | |||
| common root you should not include these packages in the srcdir-attribute. Use include/exclude-attributes | |||
| or elements to filter for these packages. If you include part of your package-structure inside the srcdir-attribute | |||
| (or nested src-elements) Ant will start to recompile your sources every time you call it.</p> | |||
| </section> | |||
| <section anchor="jikes" name="Jikes Notes"> | |||
| <p>Jikes supports some extra options, which can be set be defining | |||
| properties prior to invoking the task. The ant developers are aware that | |||
| this is ugly and inflexible -expect a better solution in the future. All | |||
| the options are boolean, and must be set to "true" or "yes" to be | |||
| interpreted as anything other than false; by default | |||
| build.compiler.warnings is "true" while all others are "false"</p> | |||
| <table border="1" cellpadding="2" cellspacing="0"> | |||
| <tr> | |||
| <td valign="top"> | |||
| build.compiler.emacs | |||
| </td> | |||
| <td valign="top"> | |||
| Enable emacs compatible error messages | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top"> | |||
| build.compiler.warnings<br /> | |||
| <b>This property has been deprecated, use the nowarn attribute | |||
| instead</b> | |||
| </td> | |||
| <td valign="top"> | |||
| don't disable warning messages | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top"> | |||
| build.compiler.pedantic | |||
| </td> | |||
| <td valign="top"> | |||
| enable pedantic warnings | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top"> | |||
| build.compiler.fulldepend | |||
| </td> | |||
| <td valign="top"> | |||
| enable full dependency checking,<br /> | |||
| "+F" in the jikes manual. | |||
| </td> | |||
| </tr> | |||
| </table> | |||
| </section> | |||
| </external> | |||
| @@ -0,0 +1,59 @@ | |||
| <!-- javadoc task --> | |||
| <external> | |||
| <description> | |||
| <p>Generates code documentation using the javadoc tool.</p> | |||
| <p>The source directory will be recursively scanned for Java source files to process | |||
| but only those matching the inclusion rules, and not matching the exclusions rules | |||
| will be passed to the javadoc tool. This | |||
| allows wildcards to be used to choose between package names, reducing verbosity | |||
| and management costs over time. This task, however, has no notion of | |||
| "changed" files, unlike the <a href="javac.html">javac</a> task. This means | |||
| all packages will be processed each time this task is run. In general, however, | |||
| this task is used much less frequently.</p> | |||
| <p>This task works seamlessly between different javadoc versions (1.1 and 1.2), | |||
| with the obvious restriction that the 1.2 attributes will be ignored if run in a | |||
| 1.1 VM.</p> | |||
| <p>NOTE: since javadoc calls System.exit(), javadoc cannot be run inside the | |||
| same VM as ant without breaking functionality. For this reason, this task | |||
| always forks the VM. This overhead is not significant since javadoc is normally a heavy | |||
| application and will be called infrequently.</p> | |||
| <p>NOTE: the packagelist attribute allows you to specify the list of packages to | |||
| document outside of the Ant file. It's a much better practice to include everything | |||
| inside the build.xml file. This option was added in order to make it easier to | |||
| migrate from regular makefiles, where you would use this option of javadoc. | |||
| The packages listed in packagelist are not checked, so the task performs even | |||
| if some packages are missing or broken. Use this option if you wish to convert from | |||
| an existing makefile. Once things are running you should then switch to the regular | |||
| notation. </p> | |||
| <p><i><b>DEPRECATION:</b> the javadoc2 task simply points to the javadoc task and it's | |||
| there for back compatibility reasons. Since this task will be removed in future | |||
| versions, you are strongly encouraged to use <a href="javadoc.html">javadoc</a> | |||
| instead.</i></p> | |||
| </description> | |||
| <section anchor="examples" name="Example"> | |||
| <pre> <javadoc packagenames="com.dummy.test.*" | |||
| sourcepath="src" | |||
| excludepackagenames="com.dummy.test.doc-files.*" | |||
| defaultexcludes="yes" | |||
| destdir="docs/api" | |||
| author="true" | |||
| version="true" | |||
| use="true" | |||
| windowtitle="Test API"> | |||
| <doctitle><![CDATA[<h1>Test</h1>]]></doctitle> | |||
| <bottom><![CDATA[<i>Copyright &#169; 2000 Dummy Corp. All Rights Reserved.</i>]]></bottom> | |||
| <tag name="todo" scope="all" description="To do:" /> | |||
| <group title="Group 1 Packages" packages="com.dummy.test.a*"/> | |||
| <group title="Group 2 Packages" packages="com.dummy.test.b*:com.dummy.test.c*"/> | |||
| <link offline="true" href="http://java.sun.com/products/jdk/1.2/docs/api/" packagelistLoc="C:\tmp"/> | |||
| <link href="http://developer.java.sun.com/developer/products/xml/docs/api/"/> | |||
| </javadoc></pre> | |||
| </section> | |||
| </external> | |||
| @@ -0,0 +1,111 @@ | |||
| <!-- tar task --> | |||
| <external> | |||
| <description> | |||
| <p>Creates a tar archive.</p> | |||
| <p>The <i>basedir</i> attribute is the reference directory from where to tar.</p> | |||
| <p>This task is a <a href="../dirtasks.html#directorybasedtasks">directory based task</a> | |||
| and, as such, forms an implicit <a href="../CoreTypes/fileset.html">Fileset</a>. This | |||
| defines which files, relative to the <i>basedir</i>, will be included in the | |||
| archive. The tar task supports all the attributes of Fileset to refine the | |||
| set of files to be included in the implicit fileset.</p> | |||
| <p>In addition to the implicit fileset, the tar task supports nested filesets. These | |||
| filesets are extended to allow control over the access mode, username and groupname | |||
| to be applied to the tar entries. This is useful, for example, when preparing archives for | |||
| Unix systems where some files need to have execute permission.</p> | |||
| <p>Early versions of tar did not support path lengths greater than 100 | |||
| characters. Modern versions of tar do so, but in incompatible ways. | |||
| The behaviour of the tar task when it encounters such paths is | |||
| controlled by the <i>longfile</i> attribute. | |||
| If the longfile attribute is set to <code>fail</code>, any long paths will | |||
| cause the tar task to fail. If the longfile attribute is set to | |||
| <code>truncate</code>, any long paths will be truncated to the 100 character | |||
| maximum length prior to adding to the archive. If the value of the longfile | |||
| attribute is set to <code>omit</code> then files containing long paths will be | |||
| omitted from the archive. Either option ensures that the archive can be | |||
| untarred by any compliant version of tar. If the loss of path or file | |||
| information is not acceptable, and it rarely is, longfile may be set to the | |||
| value <code>gnu</code>. The tar task will then produce a GNU tar file which | |||
| can have arbitrary length paths. Note however, that the resulting archive will | |||
| only be able to be untarred with GNU tar. The default for the longfile | |||
| attribute is <code>warn</code> which behaves just like the gnu option except | |||
| that it produces a warning for each file path encountered that does not match | |||
| the limit.</p> | |||
| <p>Note that this task does not perform compression. You might want to use the | |||
| <a href="gzip.html">GZip</a> task to prepare a .tar.gz package.</p> | |||
| </description> | |||
| <section anchor="examples" name="Examples"> | |||
| <pre> <tar tarfile="${dist}/manual.tar" basedir="htdocs/manual"/> | |||
| <gzip zipfile="${dist}/manual.tar.gz" src="${dist}/manual.tar"/></pre> | |||
| <p>tars all files in the <code>htdocs/manual</code> directory into a file called <code>manual.tar</code> | |||
| in the <code>${dist}</code> directory, then applies the gzip task to compress | |||
| it.</p> | |||
| <pre> <tar destfile="${dist}/manual.tar" | |||
| basedir="htdocs/manual" | |||
| excludes="mydocs/**, **/todo.html" | |||
| /></pre> | |||
| <p>tars all files in the <code>htdocs/manual</code> directory into a file called <code>manual.tar</code> | |||
| in the <code>${dist}</code> directory. Files in the directory <code>mydocs</code>, | |||
| or files with the name <code>todo.html</code> are excluded.</p> | |||
| <pre> | |||
| <tar destfile="${basedir}/docs.tar"> | |||
| <tarfileset dir="${dir.src}/docs" | |||
| fullpath="/usr/doc/ant/README" | |||
| preserveLeadingSlashes="true"> | |||
| <include name="readme.txt"/> | |||
| </tarfileset> | |||
| <tarfileset dir="${dir.src}/docs" | |||
| prefix="/usr/doc/ant" | |||
| preserveLeadingSlashes="true"> | |||
| <include name="*.html"/> | |||
| </tarfileset> | |||
| </tar></pre> | |||
| <p> | |||
| Writes the file <code>docs/readme.txt</code> as | |||
| <code>/usr/doc/ant/README</code> into the archive. All | |||
| <code>*.html</code> files in the <code>docs</code> directory are | |||
| prefixed by <code>/usr/doc/ant</code>, so for example | |||
| <code>docs/index.html</code> is written as | |||
| <code>/usr/doc/ant/index.html</code> to the archive. | |||
| </p> | |||
| <pre><tar longfile="gnu" | |||
| destfile="${dist.base}/${dist.name}-src.tar" > | |||
| <tarfileset dir="${dist.name}/.." mode="755" username="ant" group="ant"> | |||
| <include name="${dist.name}/bootstrap.sh"/> | |||
| <include name="${dist.name}/build.sh"/> | |||
| </tarfileset> | |||
| <tarfileset dir="${dist.name}/.." username="ant" group="ant"> | |||
| <include name="${dist.name}/**"/> | |||
| <exclude name="${dist.name}/bootstrap.sh"/> | |||
| <exclude name="${dist.name}/build.sh"/> | |||
| </tarfileset> | |||
| </tar> </pre> | |||
| <p>This example shows building a tar which uses the GNU extensions for long paths and | |||
| where some files need to be marked as executable (mode 755) | |||
| and the rest are use the default mode (read-write by owner). The first | |||
| fileset selects just the executable files. The second fileset must exclude | |||
| the executable files and include all others. </p> | |||
| <p><strong>Note: </strong> The tar task does not ensure that a file is only selected | |||
| by one fileset. If the same file is selected by more than one fileset, it will be included in the | |||
| tar file twice, with the same path.</p> | |||
| <p><strong>Note:</strong> The patterns in the include and exclude | |||
| elements are considered to be relative to the corresponding dir | |||
| attribute as with all other filesets. In the example above, | |||
| <code>${dist.name}</code> is not an absolute path, but a simple name | |||
| of a directory, so <code>${dist.name}</code> is a valid path relative | |||
| to <code>${dist.name}/..</code>.</p> | |||
| </section> | |||
| </external> | |||
| @@ -55,6 +55,9 @@ package org.apache.tools.ant.xdoclet; | |||
| import com.sun.javadoc.ClassDoc; | |||
| import com.sun.javadoc.MethodDoc; | |||
| import com.sun.javadoc.Parameter; | |||
| import com.sun.javadoc.Type; | |||
| import xdoclet.XDocletException; | |||
| import xdoclet.XDocletTagSupport; | |||
| import xdoclet.tags.AbstractProgramElementTagsHandler; | |||
| @@ -122,6 +125,25 @@ public class AntTagsHandler extends XDocletTagSupport { | |||
| } | |||
| } | |||
| /** | |||
| * Determines if there's at least one Ant attribute. | |||
| * | |||
| *@param template XDoclet template | |||
| *@param attributes Tag parameters | |||
| *@exception XDocletException Oops! | |||
| */ | |||
| public void ifHasAttributes(String template, Properties attributes) throws XDocletException { | |||
| // throw exception if not an Ant task | |||
| ClassDoc cur_class = getCurrentClass(); | |||
| MethodDoc[] methods = getAttributeMethods(cur_class); | |||
| if (methods.length > 0) { | |||
| generate(template); | |||
| } | |||
| } | |||
| /** | |||
| * Iterates over all Ant nested element methods (addXXX, addConfiguredXXX, addXXX) | |||
| * | |||
| @@ -161,11 +183,43 @@ public class AntTagsHandler extends XDocletTagSupport { | |||
| return elementName.toLowerCase(); | |||
| } | |||
| /** | |||
| * Provides the element type for the current method | |||
| */ | |||
| public String elementType() throws XDocletException { | |||
| ClassDoc classDoc = elementClassDoc(); | |||
| if (classDoc == null) { | |||
| throw new XDocletException("Method is not an Ant element!"); | |||
| } | |||
| return classDoc.qualifiedName(); | |||
| } | |||
| /** | |||
| * Provides the element type for the current method. If the return type | |||
| * is null, the first parameter is used. | |||
| */ | |||
| private ClassDoc elementClassDoc() throws XDocletException { | |||
| ClassDoc classDoc = null; | |||
| String methodName = getCurrentMethod().name(); | |||
| if (methodName.startsWith("addConfigured") || | |||
| methodName.startsWith("add") || | |||
| methodName.startsWith("create")) | |||
| { | |||
| classDoc = getCurrentMethod().returnType().asClassDoc(); | |||
| if (classDoc == null) { | |||
| Parameter[] params = getCurrentMethod().parameters(); | |||
| if (params.length == 1) { | |||
| classDoc = params[0].type().asClassDoc(); | |||
| } | |||
| } | |||
| } | |||
| return classDoc; | |||
| } | |||
| /** | |||
| * Provides the Ant task name. | |||
| * | |||
| * @see getTaskName | |||
| * @see #getTaskName(ClassDoc) | |||
| * @doc:tag type="content" | |||
| */ | |||
| public String taskName() throws XDocletException { | |||
| @@ -204,7 +258,7 @@ public class AntTagsHandler extends XDocletTagSupport { | |||
| /** | |||
| * Provides the Ant category name. | |||
| * | |||
| * @see getCategoryName | |||
| * @see #getCategoryName(ClassDoc) | |||
| */ | |||
| public String categoryName() throws XDocletException { | |||
| return getCategoryName(getCurrentClass()); | |||
| @@ -273,6 +327,12 @@ public class AntTagsHandler extends XDocletTagSupport { | |||
| continue; | |||
| } | |||
| // ensure method only has one parameter | |||
| Parameter[] params = methods[i].parameters(); | |||
| if (params.length != 1) { | |||
| continue; | |||
| } | |||
| attributeMethods.add(methods[i]); | |||
| } | |||
| @@ -291,6 +351,18 @@ public class AntTagsHandler extends XDocletTagSupport { | |||
| for (int i = 0; i < methods.length; i++) { | |||
| String name = methods[i].name(); | |||
| // ensure if there are no parameters, there is a return type, | |||
| // otherwise ensure there's only one parameter. | |||
| Parameter[] params = methods[i].parameters(); | |||
| if (params.length == 0) { | |||
| if (methods[i].returnType().asClassDoc() == null) { | |||
| continue; | |||
| } | |||
| } | |||
| else if (params.length != 1) { | |||
| continue; | |||
| } | |||
| if ((name.startsWith("add") && !name.equals("addTask")) || | |||
| name.startsWith("create")) { | |||
| attributeMethods.add(methods[i]); | |||
| @@ -1,8 +1,9 @@ | |||
| <XDtTagDef:tagDef namespace="Ant" handler="org.apache.tools.ant.xdoclet.AntTagsHandler"/> | |||
| <task name="<XDtAnt:taskName/>" category="<XDtAnt:categoryName/>" | |||
| classname="<XDtClass:fullClassName/>"> | |||
| <XDtMerge:merge file="{0}.xml" generateMergedFile="false"></XDtMerge:merge> | |||
| <short-description><![CDATA[<XDtClass:firstSentenceDescription/>]]></short-description> | |||
| <long-description> | |||
| <![CDATA[<XDtClass:classComment no-comment-signs="true"/>]]> | |||
| @@ -11,23 +12,37 @@ | |||
| <structure> | |||
| <attributes> | |||
| <XDtAnt:forAllAttributes> | |||
| <attribute name="<XDtMethod:propertyName/>" type="<XDtParameter:forAllMethodParams><XDtParameter:methodParamType/></XDtParameter:forAllMethodParams>"> | |||
| <description><![CDATA[ | |||
| <XDtMethod:methodComment no-comment-signs="true"/> | |||
| ]]></description> | |||
| </attribute> | |||
| </XDtAnt:forAllAttributes> | |||
| <XDtAnt:forAllAttributes> | |||
| <attribute name="<XDtMethod:propertyName/>" type="<XDtParameter:forAllMethodParams><XDtParameter:methodParamType/></XDtParameter:forAllMethodParams>"> | |||
| <description><![CDATA[ | |||
| <XDtMethod:methodComment no-comment-signs="true"/> | |||
| ]]></description> | |||
| </attribute> | |||
| </XDtAnt:forAllAttributes> | |||
| </attributes> | |||
| <elements> | |||
| <XDtAnt:forAllElements> | |||
| <element name="<XDtAnt:elementName/>"> | |||
| <description><![CDATA[ | |||
| <XDtMethod:methodComment no-comment-signs="true"/> | |||
| ]]></description> | |||
| </element> | |||
| </XDtAnt:forAllElements> | |||
| <XDtAnt:forAllElements> | |||
| <element name="<XDtAnt:elementName/>" type="<XDtAnt:elementType/>"> | |||
| <description> | |||
| <![CDATA[<XDtMethod:methodComment no-comment-signs="true"/>]]> | |||
| </description> | |||
| <XDtClass:pushClass value="<XDtAnt:elementType/>"> | |||
| <XDtAnt:ifHasAttributes> | |||
| <attributes> | |||
| <XDtAnt:forAllAttributes> | |||
| <attribute name="<XDtMethod:propertyName/>" type="<XDtParameter:forAllMethodParams><XDtParameter:methodParamType/></XDtParameter:forAllMethodParams>"> | |||
| <description><![CDATA[ | |||
| <XDtMethod:methodComment no-comment-signs="true"/> | |||
| ]]></description> | |||
| </attribute> | |||
| </XDtAnt:forAllAttributes> | |||
| </attributes> | |||
| </XDtAnt:ifHasAttributes> | |||
| </XDtClass:pushClass> | |||
| </element> | |||
| </XDtAnt:forAllElements> | |||
| </elements> | |||
| <!-- @todo: wrap setCurrentMethod inside AntTagsHandler --> | |||
| @@ -41,7 +56,6 @@ | |||
| </structure> | |||
| <!-- merge point for samples? --> | |||
| </task> | |||