git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268748 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -44,7 +44,7 @@ filtersfile attribute.</p> | |||||
| <p>* see notes 1 and 2 above parameters table.</p> | <p>* see notes 1 and 2 above parameters table.</p> | ||||
| <h3>Examples</h3> | <h3>Examples</h3> | ||||
| <pre> <filter token="year" value="2000"/> | <pre> <filter token="year" value="2000"/> | ||||
| <copy todir="${dest.dir}"> | |||||
| <copy todir="${dest.dir}" filtering="true"> | |||||
| <fileset dir="${src.dir}"/> | <fileset dir="${src.dir}"/> | ||||
| </copy></pre> | </copy></pre> | ||||
| <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 | ||||
| @@ -339,7 +339,9 @@ instead.</p> | |||||
| </tr> | </tr> | ||||
| <tr> | <tr> | ||||
| <td valign="top">additionalparam</td> | <td valign="top">additionalparam</td> | ||||
| <td valign="top">Lets you add additional parameters to the javadoc command line. Useful for doclets</td> | |||||
| <td valign="top">Lets you add additional parameters to the javadoc | |||||
| command line. Useful for doclets. Parameters containing | |||||
| spaces need to be quoted using &quot;.</td> | |||||
| <td align="center" valign="top">1.2</td> | <td align="center" valign="top">1.2</td> | ||||
| <td align="center" valign="top">No</td> | <td align="center" valign="top">No</td> | ||||
| </tr> | </tr> | ||||
| @@ -0,0 +1,117 @@ | |||||
| <html> | |||||
| <head> | |||||
| <meta http-equiv="Content-Language" content="en-us"> | |||||
| <title>Ant</title> | |||||
| </head> | |||||
| <body> | |||||
| <h2><a name="zip">Javah</a></h2> | |||||
| <h3>Description</h3> | |||||
| <p>Generates JNI headers from a Java class.</p> | |||||
| <p> When this task executes, it will generate the C header and source files that | |||||
| are needed to implement native methods. JNI operates differently depending on | |||||
| whether <a href="http://java.sun.com/j2se/1.3/docs/tooldocs/win32/javah.html">JDK1.2</a> | |||||
| (or later) or <a href="http://java.sun.com/products/jdk/1.1/docs/tooldocs/win32/javah.html">pre-JDK1.2</a> | |||||
| systems are used.</p> | |||||
| <h3>Parameters</h3> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td valign="top" align="center"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">class</td> | |||||
| <td valign="top">the fully-qualified name of the class (or classes, | |||||
| separated by commas)</td> | |||||
| <td align="center" valign="top">Yes</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">outputFile</td> | |||||
| <td valign="top">concatenates the resulting header or source files for all the classes listed into this file</td> | |||||
| <td align="center" valign="middle" rowspan="2">Yes</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">destdir</td> | |||||
| <td valign="top">sets the directory where javah saves the header files or the | |||||
| stub files.</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">force</td> | |||||
| <td valign="top">specifies that output files should always be written (JDK1.2 only)</td> | |||||
| <td valign="top" align="center">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">old</td> | |||||
| <td valign="top">specifies that old JDK1.0-style header files should be generated | |||||
| (otherwise output file contain JNI-style native method function prototypes) (JDK1.2 only)</td> | |||||
| <td valign="top" align="center">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">stubs</td> | |||||
| <td valign="top">generate C declarations from the Java object file (used with old)</td> | |||||
| <td valign="top" align="center">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">verbose</td> | |||||
| <td valign="top">causes Javah to print a message concerning the status of the generated files</td> | |||||
| <td valign="top" align="center">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">classpath</td> | |||||
| <td valign="top">the classpath to use.</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">bootclasspath</td> | |||||
| <td valign="top">location of bootstrap class files.</td> | |||||
| <td valign="top" align="center">No</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">extdirs</td> | |||||
| <td valign="top"> location of installed extensions.</td> | |||||
| <td valign="top" align="center">No</td> | |||||
| </tr> | |||||
| </table> | |||||
| <p>Either outputFile or destdir must be supplied, but not both. </p> | |||||
| <h3>Examples</h3> | |||||
| <pre> <javah destdir="c" class="org.foo.bar.Wibble" /></pre> | |||||
| <p>makes a JNI header of the named class, using the JDK1.2 JNI model. Assuming | |||||
| the directory 'c' already exists, the file <tt>org_foo_bar_Wibble.h</tt> | |||||
| is created there. If this file already exists, it is left unchanged.</p> | |||||
| <pre> <javah outputFile="wibble.h"> | |||||
| <class name="org.foo.bar.Wibble,org.foo.bar.Bobble"/> | |||||
| </javah></pre> | |||||
| <p>is similar to the previous example, except the output is written to a file | |||||
| called <tt>wibble.h</tt> | |||||
| in the current directory.</p> | |||||
| <pre> <javah destdir="c" force="yes"> | |||||
| <class name="org.foo.bar.Wibble"/> | |||||
| <class name="org.foo.bar.Bobble"/> | |||||
| <class name="org.foo.bar.Tribble"/> | |||||
| </javah></pre> | |||||
| <p>writes three header files, one for each of the classes named. Because the | |||||
| force option is set, these header files are always written when the Javah task | |||||
| is invoked, even if they already exist.</p> | |||||
| <pre> <javah destdir="c" verbose="yes" old="yes" force="yes"> | |||||
| <class name="org.foo.bar.Wibble"/> | |||||
| <class name="org.foo.bar.Bobble"/> | |||||
| <class name="org.foo.bar.Tribble"/> | |||||
| </javah> | |||||
| <javah destdir="c" verbose="yes" stubs="yes" old="yes" force="yes"> | |||||
| <class name="org.foo.bar.Wibble"/> | |||||
| <class name="org.foo.bar.Bobble"/> | |||||
| <class name="org.foo.bar.Tribble"/> | |||||
| </javah></pre> | |||||
| <p>writes the headers for the three classes using the 'old' JNI format, then | |||||
| writes the corresponding .c stubs. The verbose option will cause Javah to | |||||
| describe its progress.</p> | |||||
| <hr> | |||||
| </body> | |||||
| </html> | |||||
| @@ -15,10 +15,12 @@ | |||||
| <a href="OptionalTasks/antlr.html">ANTLR</a><br> | <a href="OptionalTasks/antlr.html">ANTLR</a><br> | ||||
| <a href="OptionalTasks/cab.html">Cab</a><br> | <a href="OptionalTasks/cab.html">Cab</a><br> | ||||
| <a href="OptionalTasks/clearcase.html">Clearcase Tasks</a><br> | <a href="OptionalTasks/clearcase.html">Clearcase Tasks</a><br> | ||||
| <a href="OptionalTasks/depend.html">Depend</a><br> | |||||
| <a href="OptionalTasks/ejb.html">EJB Tasks</a><br> | <a href="OptionalTasks/ejb.html">EJB Tasks</a><br> | ||||
| <a href="OptionalTasks/ftp.html">FTP</a><br> | <a href="OptionalTasks/ftp.html">FTP</a><br> | ||||
| <a href="OptionalTasks/javacc.html">JavaCC</a><br> | |||||
| <a href="OptionalTasks/icontract.html">IContract</a><br> | <a href="OptionalTasks/icontract.html">IContract</a><br> | ||||
| <a href="OptionalTasks/javacc.html">JavaCC</a><br> | |||||
| <a href="OptionalTasks/javah.html">Javah</a><br> | |||||
| <a href="OptionalTasks/jjtree.html">JJTree</a><br> | <a href="OptionalTasks/jjtree.html">JJTree</a><br> | ||||
| <a href="OptionalTasks/jlink.html">Jlink</a><br> | <a href="OptionalTasks/jlink.html">Jlink</a><br> | ||||
| <a href="OptionalTasks/junit.html">JUnit</a><br> | <a href="OptionalTasks/junit.html">JUnit</a><br> | ||||
| @@ -26,15 +28,15 @@ | |||||
| <a href="OptionalTasks/mparse.html">MParse</a><br> | <a href="OptionalTasks/mparse.html">MParse</a><br> | ||||
| <a href="OptionalTasks/native2ascii.html">Native2Ascii</a><br> | <a href="OptionalTasks/native2ascii.html">Native2Ascii</a><br> | ||||
| <a href="OptionalTasks/netrexxc.html">NetRexxC</a><br> | <a href="OptionalTasks/netrexxc.html">NetRexxC</a><br> | ||||
| <a href="OptionalTasks/propertyfile.html">PropertyFile</a><br> | |||||
| <a href="OptionalTasks/perforce.html">Perforce Tasks</a><br> | <a href="OptionalTasks/perforce.html">Perforce Tasks</a><br> | ||||
| <a href="OptionalTasks/propertyfile.html">PropertyFile</a><br> | |||||
| <a href="OptionalTasks/pvcstask.html">Pvcs</a><br> | <a href="OptionalTasks/pvcstask.html">Pvcs</a><br> | ||||
| <a href="OptionalTasks/renameextensions.html"><i>RenameExtensions</i></a><br> | <a href="OptionalTasks/renameextensions.html"><i>RenameExtensions</i></a><br> | ||||
| <a href="OptionalTasks/script.html">Script</a><br> | <a href="OptionalTasks/script.html">Script</a><br> | ||||
| <a href="OptionalTasks/sound.html">Sound</a><br> | <a href="OptionalTasks/sound.html">Sound</a><br> | ||||
| <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/telnet.html">Telnet</a><br> | <a href="OptionalTasks/telnet.html">Telnet</a><br> | ||||
| <a href="OptionalTasks/test.html">Test</a><br> | |||||
| <a href="Integration/VAJAntTool.html#tasks">Visual Age for Java Tasks</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> | <a href="OptionalTasks/vsslabel.html">VssLabel</a><br> | ||||
| @@ -1,6 +1,6 @@ | |||||
| <?xml version="1.0"?> | <?xml version="1.0"?> | ||||
| <project name="xxx-test" basedir="." default="test1"> | |||||
| <project name="tar-test" basedir="." default="test1"> | |||||
| <target name="test1"> | <target name="test1"> | ||||
| <tar/> | <tar/> | ||||
| @@ -14,4 +14,14 @@ | |||||
| <tar basedir=""/> | <tar basedir=""/> | ||||
| </target> | </target> | ||||
| <target name="test4"> | |||||
| <touch file="test4.tar"/> | |||||
| <tar tarfile="test4.tar" | |||||
| basedir="."/> | |||||
| </target> | |||||
| <target name="cleanup"> | |||||
| <delete file="test4.tar"/> | |||||
| </target> | |||||
| </project> | </project> | ||||
| @@ -1,6 +1,6 @@ | |||||
| <?xml version="1.0"?> | <?xml version="1.0"?> | ||||
| <project name="xxx-test" basedir="." default="test1"> | |||||
| <project name="zip-test" basedir="." default="test1"> | |||||
| <target name="test1"> | <target name="test1"> | ||||
| <zip/> | <zip/> | ||||
| @@ -10,4 +10,24 @@ | |||||
| <zip zipfile="zip.tmp"/> | <zip zipfile="zip.tmp"/> | ||||
| </target> | </target> | ||||
| <!-- Test when the zip file includes itself | |||||
| when target file exists before the zip task is run --> | |||||
| <target name="test3"> | |||||
| <touch file="test3.zip"/> | |||||
| <zip zipfile="test3.zip" | |||||
| basedir="."/> | |||||
| </target> | |||||
| <!-- Test when the zip file includes itself | |||||
| when target file does not exist before the zip task is run --> | |||||
| <target name="test4"> | |||||
| <zip zipfile="test4.zip" | |||||
| basedir="."/> | |||||
| </target> | |||||
| <target name="cleanup"> | |||||
| <delete file="test3.zip"/> | |||||
| <delete file="test4.zip"/> | |||||
| </target> | |||||
| </project> | </project> | ||||
| @@ -0,0 +1,19 @@ | |||||
| <?xml version="1.0"?> | |||||
| <project name="copy-test" basedir="." default="test1"> | |||||
| <target name="test1"> | |||||
| <delete dir="copytest" /> | |||||
| <mkdir dir="copytest" /> | |||||
| <copy todir="copytest"> | |||||
| <fileset dir="../../../main"> | |||||
| <include name="**/taskdefs/*.java" /> | |||||
| </fileset> | |||||
| <fileset dir="../../../testcases"> | |||||
| <include name="**/taskdefs/*.java" /> | |||||
| </fileset> | |||||
| <mapper type="flatten" /> | |||||
| </copy> | |||||
| </target> | |||||
| </project> | |||||
| @@ -736,7 +736,7 @@ strLoop: | |||||
| * (2) an IO error occurred (why doesn't it throw an exception | * (2) an IO error occurred (why doesn't it throw an exception | ||||
| * then???) | * then???) | ||||
| */ | */ | ||||
| throw new BuildException("IO error scanning directory" | |||||
| throw new BuildException("IO error scanning directory " | |||||
| + dir.getAbsolutePath()); | + dir.getAbsolutePath()); | ||||
| } | } | ||||
| @@ -104,12 +104,17 @@ public class ProjectHelper { | |||||
| try { | try { | ||||
| SAXParser saxParser = getParserFactory().newSAXParser(); | SAXParser saxParser = getParserFactory().newSAXParser(); | ||||
| parser = saxParser.getParser(); | parser = saxParser.getParser(); | ||||
| String uri = "file:" + buildFile.getAbsolutePath().replace('\\', '/'); | String uri = "file:" + buildFile.getAbsolutePath().replace('\\', '/'); | ||||
| for (int index = uri.indexOf('#'); index != -1; index = uri.indexOf('#')) { | for (int index = uri.indexOf('#'); index != -1; index = uri.indexOf('#')) { | ||||
| uri = uri.substring(0, index) + "%23" + uri.substring(index+1); | uri = uri.substring(0, index) + "%23" + uri.substring(index+1); | ||||
| } | } | ||||
| saxParser.parse(uri, new RootHandler()); | |||||
| inputStream = new FileInputStream(buildFile); | |||||
| inputSource = new InputSource(inputStream); | |||||
| inputSource.setSystemId(uri); | |||||
| project.log("parsing buildfile " + buildFile + " with URI = " + uri, Project.MSG_VERBOSE); | |||||
| saxParser.parse(inputSource, 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); | ||||
| @@ -213,6 +218,8 @@ public class ProjectHelper { | |||||
| public InputSource resolveEntity(String publicId, | public InputSource resolveEntity(String publicId, | ||||
| String systemId) { | String systemId) { | ||||
| project.log("resolving systemId: " + systemId, Project.MSG_VERBOSE); | |||||
| if (systemId.startsWith("file:")) { | if (systemId.startsWith("file:")) { | ||||
| String path = systemId.substring(5); | String path = systemId.substring(5); | ||||
| int index = path.indexOf("file:"); | int index = path.indexOf("file:"); | ||||
| @@ -175,6 +175,19 @@ public class Javadoc extends Task { | |||||
| } | } | ||||
| } | } | ||||
| private void add12ArgIfNotEmpty(String key, String value) { | |||||
| if (!javadoc1) { | |||||
| if (value != null && value.length() != 0) { | |||||
| cmd.createArgument().setValue(key); | |||||
| cmd.createArgument().setValue(value); | |||||
| } else { | |||||
| project.log(this, | |||||
| "Warning: Leaving out empty argument '" + key + "'", | |||||
| Project.MSG_WARN); | |||||
| } | |||||
| } | |||||
| } | |||||
| private void add11ArgIf(boolean b, String arg) { | private void add11ArgIf(boolean b, String arg) { | ||||
| if (javadoc1 && b) { | if (javadoc1 && b) { | ||||
| cmd.createArgument().setValue(arg); | cmd.createArgument().setValue(arg); | ||||
| @@ -226,7 +239,7 @@ public class Javadoc extends Task { | |||||
| } | } | ||||
| public void setAdditionalparam(String add){ | public void setAdditionalparam(String add){ | ||||
| cmd.createArgument().setValue(add); | |||||
| cmd.createArgument().setLine(add); | |||||
| } | } | ||||
| public void setSourcepath(Path src) { | public void setSourcepath(Path src) { | ||||
| @@ -387,35 +400,23 @@ public class Javadoc extends Task { | |||||
| add12ArgIf(b, "-splitindex"); | add12ArgIf(b, "-splitindex"); | ||||
| } | } | ||||
| public void setWindowtitle(String src) { | public void setWindowtitle(String src) { | ||||
| if (!javadoc1) { | |||||
| cmd.createArgument().setValue("-windowtitle"); | |||||
| cmd.createArgument().setValue(src); | |||||
| } | |||||
| add12ArgIfNotEmpty("-windowtitle", src); | |||||
| } | } | ||||
| public void setDoctitle(String src) { | public void setDoctitle(String src) { | ||||
| if (!javadoc1) { | |||||
| cmd.createArgument().setValue("-doctitle"); | |||||
| cmd.createArgument().setValue(src); | |||||
| } | |||||
| add12ArgIfNotEmpty("-doctitle", src); | |||||
| } | } | ||||
| public void setHeader(String src) { | public void setHeader(String src) { | ||||
| if (!javadoc1) { | |||||
| cmd.createArgument().setValue("-header"); | |||||
| cmd.createArgument().setValue(src); | |||||
| } | |||||
| add12ArgIfNotEmpty("-header", src); | |||||
| } | } | ||||
| public void setFooter(String src) { | public void setFooter(String src) { | ||||
| if (!javadoc1) { | |||||
| cmd.createArgument().setValue("-footer"); | |||||
| cmd.createArgument().setValue(src); | |||||
| } | |||||
| add12ArgIfNotEmpty("-footer", src); | |||||
| } | } | ||||
| public void setBottom(String src) { | public void setBottom(String src) { | ||||
| if (!javadoc1) { | |||||
| cmd.createArgument().setValue("-bottom"); | |||||
| cmd.createArgument().setValue(src); | |||||
| } | |||||
| add12ArgIfNotEmpty("-bottom", src); | |||||
| } | } | ||||
| public void setLinkoffline(String src) { | public void setLinkoffline(String src) { | ||||
| if (!javadoc1) { | if (!javadoc1) { | ||||
| LinkArgument le = createLink(); | LinkArgument le = createLink(); | ||||
| @@ -553,10 +554,7 @@ public class Javadoc extends Task { | |||||
| } | } | ||||
| public void setCharset(String src) { | public void setCharset(String src) { | ||||
| if (!javadoc1) { | |||||
| cmd.createArgument().setValue("-charset"); | |||||
| cmd.createArgument().setValue(src); | |||||
| } | |||||
| this.add12ArgIfNotEmpty("-charset", src); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -175,7 +175,12 @@ public class Tar extends MatchingTask { | |||||
| if (!archiveIsUpToDate(files)) { | if (!archiveIsUpToDate(files)) { | ||||
| upToDate = false; | upToDate = false; | ||||
| break; | |||||
| } | |||||
| for (int i = 0; i < files.length; ++i) { | |||||
| if (tarFile.equals(new File(fs.getDir(project), files[i]))) { | |||||
| throw new BuildException("A tar file cannot include itself", location); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -334,6 +334,12 @@ public class Zip extends MatchingTask { | |||||
| return true; | return true; | ||||
| } | } | ||||
| } else { | } else { | ||||
| for (int i = 0; i < files.length; ++i) { | |||||
| if (files[i].equals(zipFile)) { | |||||
| throw new BuildException("A zip file cannot include itself", location); | |||||
| } | |||||
| } | |||||
| if (!zipFile.exists()) return false; | if (!zipFile.exists()) return false; | ||||
| SourceFileScanner sfs = new SourceFileScanner(this); | SourceFileScanner sfs = new SourceFileScanner(this); | ||||
| @@ -459,6 +465,10 @@ public class Zip extends MatchingTask { | |||||
| protected void zipFile(File file, ZipOutputStream zOut, String vPath) | protected void zipFile(File file, ZipOutputStream zOut, String vPath) | ||||
| throws IOException | throws IOException | ||||
| { | { | ||||
| if (file.equals(zipFile)) { | |||||
| throw new BuildException("A zip file cannot include itself", location); | |||||
| } | |||||
| FileInputStream fIn = new FileInputStream(file); | FileInputStream fIn = new FileInputStream(file); | ||||
| try { | try { | ||||
| zipFile(fIn, zOut, vPath, file.lastModified()); | zipFile(fIn, zOut, vPath, file.lastModified()); | ||||
| @@ -73,31 +73,7 @@ public class ClassFileUtils { | |||||
| * @return the class name in dot notation (eg. java.lang.Object). | * @return the class name in dot notation (eg. java.lang.Object). | ||||
| */ | */ | ||||
| static public String convertSlashName(String name) { | static public String convertSlashName(String name) { | ||||
| String dotName = null; | |||||
| int startIndex = 0; | |||||
| int sepIndex = 0; | |||||
| String slashName = name.replace('\\', '/'); | |||||
| do { | |||||
| String component = null; | |||||
| sepIndex = slashName.indexOf('/', startIndex); | |||||
| if (sepIndex == -1) { | |||||
| component = slashName.substring(startIndex); | |||||
| } else { | |||||
| component = slashName.substring(startIndex, sepIndex); | |||||
| startIndex = sepIndex + 1; | |||||
| } | |||||
| if (dotName == null) { | |||||
| dotName = component; | |||||
| } else { | |||||
| dotName += "." + component; | |||||
| } | |||||
| } while (sepIndex != -1); | |||||
| return dotName; | |||||
| return name.replace('\\', '.').replace( '/', '.' ); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -108,31 +84,7 @@ public class ClassFileUtils { | |||||
| * @return the class name in slash notation (eg. java/lang/Object). | * @return the class name in slash notation (eg. java/lang/Object). | ||||
| */ | */ | ||||
| static public String convertDotName(String dotName) { | static public String convertDotName(String dotName) { | ||||
| String slashName = null; | |||||
| int startIndex = 0; | |||||
| int sepIndex = 0; | |||||
| do { | |||||
| String component = null; | |||||
| sepIndex = dotName.indexOf('.', startIndex); | |||||
| if (sepIndex == -1) { | |||||
| component = dotName.substring(startIndex); | |||||
| } else { | |||||
| component = dotName.substring(startIndex, sepIndex); | |||||
| startIndex = sepIndex + 1; | |||||
| } | |||||
| if (slashName == null) { | |||||
| slashName = component; | |||||
| } else { | |||||
| slashName += "/" + component; | |||||
| } | |||||
| } while (sepIndex != -1); | |||||
| return slashName; | |||||
| return dotName.replace( '.', '/'); | |||||
| } | } | ||||
| } | } | ||||
| @@ -367,7 +367,7 @@ public class WeblogicDeploymentTool extends GenericDeploymentTool { | |||||
| args += " -compiler " + compiler; | args += " -compiler " + compiler; | ||||
| } | } | ||||
| args += " -noexit " + sourceJar.getPath() + " " + destJar.getPath(); | |||||
| args += " " + sourceJar.getPath() + " " + destJar.getPath(); | |||||
| javaTask = (Java) getTask().getProject().createTask("java"); | javaTask = (Java) getTask().getProject().createTask("java"); | ||||
| javaTask.setTaskName("ejbc"); | javaTask.setTaskName("ejbc"); | ||||
| @@ -384,7 +384,7 @@ public class WeblogicDeploymentTool extends GenericDeploymentTool { | |||||
| javaTask.setFork(true); | javaTask.setFork(true); | ||||
| } | } | ||||
| else { | else { | ||||
| javaTask.setFork(false); | |||||
| javaTask.setFork(true); | |||||
| } | } | ||||
| @@ -171,18 +171,22 @@ public class JJTree extends Task { | |||||
| cmdl.createArgument().setValue("-"+name+":"+value.toString()); | cmdl.createArgument().setValue("-"+name+":"+value.toString()); | ||||
| } | } | ||||
| // load command line with required attributes | |||||
| if (outputDirectory != null) { | |||||
| if (!outputDirectory.isDirectory()) { | |||||
| throw new BuildException("Outputdir not a directory."); | |||||
| } | |||||
| cmdl.createArgument().setValue( | |||||
| "-OUTPUT_DIRECTORY:"+outputDirectory.getAbsolutePath()); | |||||
| } | |||||
| if (target == null || !target.isFile()) { | if (target == null || !target.isFile()) { | ||||
| throw new BuildException("Invalid target: " + target); | throw new BuildException("Invalid target: " + target); | ||||
| } | } | ||||
| // use the directory containing the target as the output directory | |||||
| if (outputDirectory == null) { | |||||
| outputDirectory = new File(target.getParent()); | |||||
| } | |||||
| if (!outputDirectory.isDirectory() ) { | |||||
| throw new BuildException("'outputdirectory' " + outputDirectory + " is not a directory."); | |||||
| } | |||||
| // convert backslashes to slashes, otherwise jjtree will put this as | |||||
| // comments and this seems to confuse javacc | |||||
| cmdl.createArgument().setValue( | |||||
| "-OUTPUT_DIRECTORY:"+outputDirectory.getAbsolutePath().replace('\\', '/')); | |||||
| final File javaFile = new File( | final File javaFile = new File( | ||||
| target.toString().substring(0, target.toString().indexOf(".jjt")) + ".jj"); | target.toString().substring(0, target.toString().indexOf(".jjt")) + ".jj"); | ||||
| if (javaFile.exists() && target.lastModified() < javaFile.lastModified()) { | if (javaFile.exists() && target.lastModified() < javaFile.lastModified()) { | ||||
| @@ -281,19 +281,25 @@ public class AggregateTransformer { | |||||
| } | } | ||||
| protected void createCascadingStyleSheet() throws IOException, SAXException { | protected void createCascadingStyleSheet() throws IOException, SAXException { | ||||
| InputStream in = null; | |||||
| if (styleDir == null) { | if (styleDir == null) { | ||||
| InputStream in = getResourceAsStream("html/stylesheet.css"); | |||||
| OutputStream out = new FileOutputStream( new File(toDir, "stylesheet.css")); | |||||
| copy(in, out); | |||||
| in = getResourceAsStream("html/stylesheet.css"); | |||||
| } else { | |||||
| in = new FileInputStream(new File(styleDir, "stylesheet.css")); | |||||
| } | } | ||||
| OutputStream out = new FileOutputStream( new File(toDir, "stylesheet.css")); | |||||
| copy(in, out); | |||||
| } | } | ||||
| protected void createFrameStructure() throws IOException, SAXException{ | protected void createFrameStructure() throws IOException, SAXException{ | ||||
| InputStream in = null; | |||||
| if (styleDir == null) { | if (styleDir == null) { | ||||
| InputStream in = getResourceAsStream("html/index.html"); | |||||
| OutputStream out = new FileOutputStream( new File(toDir, "index.html") ); | |||||
| copy(in, out); | |||||
| in = getResourceAsStream("html/index.html"); | |||||
| } else { | |||||
| in = new FileInputStream(new File(styleDir, "index.html")); | |||||
| } | } | ||||
| OutputStream out = new FileOutputStream( new File(toDir, "index.html") ); | |||||
| copy(in, out); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -161,15 +161,22 @@ public class JUnitTestRunner implements TestListener { | |||||
| testClass = loader.loadClass(test.getName()); | testClass = loader.loadClass(test.getName()); | ||||
| } | } | ||||
| Method suiteMethod = null; | |||||
| try { | try { | ||||
| Method suiteMethod= testClass.getMethod("suite", new Class[0]); | |||||
| suite = (Test)suiteMethod.invoke(null, new Class[0]); | |||||
| } catch(NoSuchMethodException e) { | |||||
| } catch(InvocationTargetException e) { | |||||
| } catch(IllegalAccessException e) { | |||||
| // check if there is a suite method | |||||
| suiteMethod= testClass.getMethod("suite", new Class[0]); | |||||
| } catch(Exception e) { | |||||
| // no appropriate suite method found. We don't report any | |||||
| // error here since it might be perfectly normal. We don't | |||||
| // know exactly what is the cause, but we're doing exactly | |||||
| // the same as JUnit TestRunner do. We swallow the exceptions. | |||||
| } | } | ||||
| if (suite == null) { | |||||
| if (suiteMethod != null){ | |||||
| // if there is a suite method available, then try | |||||
| // to extract the suite from it. If there is an error | |||||
| // here it will be caught below and reported. | |||||
| suite = (Test)suiteMethod.invoke(null, new Class[0]); | |||||
| } else { | |||||
| // try to extract a test suite automatically | // try to extract a test suite automatically | ||||
| // this will generate warnings if the class is no suitable Test | // this will generate warnings if the class is no suitable Test | ||||
| suite= new TestSuite(testClass); | suite= new TestSuite(testClass); | ||||
| @@ -28,8 +28,11 @@ H6 { | |||||
| MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica | MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica | ||||
| } | } | ||||
| .Error { | .Error { | ||||
| font-weight:bold; color:red; | |||||
| font-weight:bold; background:#EEEEE0; color:purple; | |||||
| } | } | ||||
| .Failure { | .Failure { | ||||
| font-weight:bold; color:purple; | |||||
| font-weight:bold; background:#EEEEE0; color:red; | |||||
| } | |||||
| .Pass { | |||||
| background:#EEEEE0; | |||||
| } | } | ||||
| @@ -1,10 +1,11 @@ | |||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <!-- This style sheet should contain just a named templates that used in the other specific templates --> | |||||
| <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | ||||
| <xsl:include href="toolkit.xsl"/> | <xsl:include href="toolkit.xsl"/> | ||||
| <!-- | |||||
| Display the whole list of testsuite | |||||
| --> | |||||
| <xsl:template match="testsuites"> | <xsl:template match="testsuites"> | ||||
| <HTML> | <HTML> | ||||
| <HEAD> | <HEAD> | ||||
| @@ -23,6 +24,10 @@ | |||||
| </HTML> | </HTML> | ||||
| </xsl:template> | </xsl:template> | ||||
| <!-- | |||||
| Display each testsuite name with an hyperlink to the package frame. | |||||
| The hyperlink is made of the {packagename} + {classname} + "-details.html" | |||||
| --> | |||||
| <xsl:template match="testsuite"> | <xsl:template match="testsuite"> | ||||
| <tr> | <tr> | ||||
| <td nowrap="nowrap"> | <td nowrap="nowrap"> | ||||
| @@ -37,4 +42,4 @@ | |||||
| </tr> | </tr> | ||||
| </xsl:template> | </xsl:template> | ||||
| </xsl:stylesheet> | |||||
| </xsl:stylesheet> | |||||
| @@ -1,9 +1,6 @@ | |||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <!-- This style sheet should contain just a named templates that used in the other specific templates --> | |||||
| <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | ||||
| <!-- import the commun templates --> | |||||
| <xsl:include href="toolkit.xsl"/> | <xsl:include href="toolkit.xsl"/> | ||||
| <xsl:template match="testsuites"> | <xsl:template match="testsuites"> | ||||
| @@ -39,4 +36,4 @@ | |||||
| </tr> | </tr> | ||||
| </xsl:template> | </xsl:template> | ||||
| </xsl:stylesheet> | |||||
| </xsl:stylesheet> | |||||
| @@ -34,4 +34,4 @@ | |||||
| </HTML> | </HTML> | ||||
| </xsl:template> | </xsl:template> | ||||
| </xsl:stylesheet> | |||||
| </xsl:stylesheet> | |||||
| @@ -1,6 +1,4 @@ | |||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <!-- This style sheet should contain just a named templates that used in the other specific templates --> | |||||
| <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | ||||
| <!-- import the commun templates --> | <!-- import the commun templates --> | ||||
| @@ -43,4 +41,4 @@ | |||||
| </tr> | </tr> | ||||
| </xsl:template> | </xsl:template> | ||||
| </xsl:stylesheet> | |||||
| </xsl:stylesheet> | |||||
| @@ -1,17 +1,8 @@ | |||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <!-- This style sheet should contain just a named templates that used in the other specific templates --> | |||||
| <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | ||||
| <xsl:include href="toolkit.xsl"/> | <xsl:include href="toolkit.xsl"/> | ||||
| <!-- Calculate all summary values --> | |||||
| <xsl:variable name="testCount" select="sum(//testsuite/@tests)"/> | |||||
| <xsl:variable name="errorCount" select="sum(//testsuite/@errors)"/> | |||||
| <xsl:variable name="failureCount" select="sum(//testsuite/@failures)"/> | |||||
| <xsl:variable name="timeCount" select="sum(//testsuite/@time)"/> | |||||
| <xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/> | |||||
| <xsl:template match="testsuites"> | <xsl:template match="testsuites"> | ||||
| <HTML> | <HTML> | ||||
| <HEAD> | <HEAD> | ||||
| @@ -59,8 +50,18 @@ | |||||
| <xsl:template match="testsuite" mode="package"> | <xsl:template match="testsuite" mode="package"> | ||||
| <xsl:variable name="isError" select="(sum(//testsuite[@package = current()/@package]/@errors) + sum(//testsuite[@package = current()/@package]/@failures))>0"/> | <xsl:variable name="isError" select="(sum(//testsuite[@package = current()/@package]/@errors) + sum(//testsuite[@package = current()/@package]/@failures))>0"/> | ||||
| <!-- write a summary for the package --> | <!-- write a summary for the package --> | ||||
| <tr bgcolor="#EEEEE" valign="top"> | |||||
| <td><xsl:if test="$isError"><xsl:attribute name="class">Error</xsl:attribute></xsl:if><a href="{translate(@package,'.','/')}/package-summary.html"><xsl:value-of select="@package"/></a></td> | |||||
| <tr valign="top"> | |||||
| <xsl:attribute name="class"> | |||||
| <xsl:choose> | |||||
| <xsl:when test="$isError">Failure</xsl:when> | |||||
| <xsl:otherwise>Pass</xsl:otherwise> | |||||
| </xsl:choose> | |||||
| </xsl:attribute> | |||||
| <td> | |||||
| <a href="{translate(@package,'.','/')}/package-summary.html"> | |||||
| <xsl:value-of select="@package"/> | |||||
| </a> | |||||
| </td> | |||||
| <xsl:call-template name="statistics"> | <xsl:call-template name="statistics"> | ||||
| <xsl:with-param name="isError" select="$isError"/> | <xsl:with-param name="isError" select="$isError"/> | ||||
| </xsl:call-template> | </xsl:call-template> | ||||
| @@ -70,8 +71,19 @@ | |||||
| <xsl:template match="testsuite" mode="class"> | <xsl:template match="testsuite" mode="class"> | ||||
| <xsl:variable name="isError" select="(@errors + @failures)>0"/> | <xsl:variable name="isError" select="(@errors + @failures)>0"/> | ||||
| <!-- write a summary for the package --> | <!-- write a summary for the package --> | ||||
| <tr bgcolor="#EEEEE" valign="top"> | |||||
| <td><xsl:if test="$isError"><xsl:attribute name="class">Error</xsl:attribute></xsl:if><a href="{translate(@package,'.','/')}/summary.html"><xsl:value-of select="@name"/></a></td> | |||||
| <tr valign="top"> | |||||
| <xsl:attribute name="class"> | |||||
| <xsl:choose> | |||||
| <xsl:when test="$isError">Failure</xsl:when> | |||||
| <xsl:otherwise>Pass</xsl:otherwise> | |||||
| </xsl:choose> | |||||
| </xsl:attribute> | |||||
| <td> | |||||
| <a href="{translate(@package,'.','/')}/summary.html"> | |||||
| <xsl:value-of select="@name"/> | |||||
| </a> | |||||
| </td> | |||||
| <xsl:call-template name="statistics"> | <xsl:call-template name="statistics"> | ||||
| <xsl:with-param name="isError" select="$isError"/> | <xsl:with-param name="isError" select="$isError"/> | ||||
| </xsl:call-template> | </xsl:call-template> | ||||
| @@ -81,10 +93,17 @@ | |||||
| <xsl:template name="statistics"> | <xsl:template name="statistics"> | ||||
| <xsl:variable name="isError"/> | <xsl:variable name="isError"/> | ||||
| <td><xsl:if test="$isError"><xsl:attribute name="class">Error</xsl:attribute></xsl:if><xsl:value-of select="sum(//testsuite[@package = current()/@package]/@tests)"/></td> | |||||
| <td><xsl:if test="$isError"><xsl:attribute name="class">Error</xsl:attribute></xsl:if><xsl:value-of select="sum(//testsuite[@package = current()/@package]/@errors)"/></td> | |||||
| <td><xsl:if test="$isError"><xsl:attribute name="class">Error</xsl:attribute></xsl:if><xsl:value-of select="sum(//testsuite[@package = current()/@package]/@failures)"/></td> | |||||
| <td><xsl:if test="$isError"><xsl:attribute name="class">Error</xsl:attribute></xsl:if><xsl:value-of select="format-number(sum(//testsuite[@package = current()/@package]/@time),'#,###0.000')"/></td> | |||||
| <td> | |||||
| <xsl:value-of select="sum(//testsuite[@package = current()/@package]/@tests)"/></td> | |||||
| <td> | |||||
| <xsl:value-of select="sum(//testsuite[@package = current()/@package]/@errors)"/></td> | |||||
| <td> | |||||
| <xsl:value-of select="sum(//testsuite[@package = current()/@package]/@failures)"/></td> | |||||
| <td> | |||||
| <xsl:call-template name="display-time"> | |||||
| <xsl:with-param name="value" select="sum(//testsuite[@package = current()/@package]/@time)"/> | |||||
| </xsl:call-template> | |||||
| </td> | |||||
| </xsl:template> | </xsl:template> | ||||
| </xsl:stylesheet> | |||||
| </xsl:stylesheet> | |||||
| @@ -1,5 +1,4 @@ | |||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:html="http://www.w3.org/Profiles/XHTML-transitional"> | <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:html="http://www.w3.org/Profiles/XHTML-transitional"> | ||||
| <xsl:include href="toolkit.xsl"/> | <xsl:include href="toolkit.xsl"/> | ||||
| @@ -43,13 +42,16 @@ | |||||
| } | } | ||||
| H6 { | H6 { | ||||
| MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica | MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica | ||||
| } | |||||
| .Error { | |||||
| font-weight:bold; color:red; | |||||
| } | |||||
| .Failure { | |||||
| font-weight:bold; color:purple; | |||||
| } | |||||
| } | |||||
| .Error { | |||||
| font-weight:bold; background:#EEEEE0; color:purple; | |||||
| } | |||||
| .Failure { | |||||
| font-weight:bold; background:#EEEEE0; color:red; | |||||
| } | |||||
| .Pass { | |||||
| background:#EEEEE0; | |||||
| } | |||||
| </style> | </style> | ||||
| </HEAD> | </HEAD> | ||||
| <body text="#000000" bgColor="#ffffff"> | <body text="#000000" bgColor="#ffffff"> | ||||
| @@ -95,19 +97,24 @@ | |||||
| <xsl:variable name="timeCount" select="sum(../testsuite[./@package = current()/@package]/@time)"/> | <xsl:variable name="timeCount" select="sum(../testsuite[./@package = current()/@package]/@time)"/> | ||||
| <!-- write a summary for the package --> | <!-- write a summary for the package --> | ||||
| <tr bgcolor="#EEEEE" valign="top"> | |||||
| <tr valign="top"> | |||||
| <!-- set a nice color depending if there is an error/failure --> | <!-- set a nice color depending if there is an error/failure --> | ||||
| <xsl:attribute name="class"> | <xsl:attribute name="class"> | ||||
| <xsl:choose> | <xsl:choose> | ||||
| <xsl:when test="$failureCount > 0">Failure</xsl:when> | |||||
| <xsl:when test="$errorCount > 0">Error</xsl:when> | <xsl:when test="$errorCount > 0">Error</xsl:when> | ||||
| <xsl:when test="$failureCount > 0">Failure</xsl:when> | |||||
| <xsl:otherwise>Pass</xsl:otherwise> | |||||
| </xsl:choose> | </xsl:choose> | ||||
| </xsl:attribute> | </xsl:attribute> | ||||
| <td><a href="#{@package}"><xsl:value-of select="@package"/></a></td> | <td><a href="#{@package}"><xsl:value-of select="@package"/></a></td> | ||||
| <td><xsl:value-of select="$testCount"/></td> | <td><xsl:value-of select="$testCount"/></td> | ||||
| <td><xsl:value-of select="$errorCount"/></td> | <td><xsl:value-of select="$errorCount"/></td> | ||||
| <td><xsl:value-of select="$failureCount"/></td> | <td><xsl:value-of select="$failureCount"/></td> | ||||
| <td><xsl:value-of select="format-number($timeCount,'#,###0.000')"/></td> | |||||
| <td> | |||||
| <xsl:call-template name="display-time"> | |||||
| <xsl:with-param name="value" select="$timeCount"/> | |||||
| </xsl:call-template> | |||||
| </td> | |||||
| </tr> | </tr> | ||||
| </xsl:for-each> | </xsl:for-each> | ||||
| </table> | </table> | ||||
| @@ -145,12 +152,13 @@ | |||||
| <!-- It must match the table definition at the package level --> | <!-- It must match the table definition at the package level --> | ||||
| <!-- ================================================================== --> | <!-- ================================================================== --> | ||||
| <xsl:template match="testsuite"> | <xsl:template match="testsuite"> | ||||
| <tr bgcolor="#EEEEE" valign="top"> | |||||
| <tr valign="top"> | |||||
| <!-- set a nice color depending if there is an error/failure --> | <!-- set a nice color depending if there is an error/failure --> | ||||
| <xsl:attribute name="class"> | <xsl:attribute name="class"> | ||||
| <xsl:choose> | <xsl:choose> | ||||
| <xsl:when test="@failures[.> 0]">Failure</xsl:when> | |||||
| <xsl:when test="@errors[.> 0]">Error</xsl:when> | <xsl:when test="@errors[.> 0]">Error</xsl:when> | ||||
| <xsl:when test="@failures[.> 0]">Failure</xsl:when> | |||||
| <xsl:otherwise>Pass</xsl:otherwise> | |||||
| </xsl:choose> | </xsl:choose> | ||||
| </xsl:attribute> | </xsl:attribute> | ||||
| @@ -159,7 +167,11 @@ | |||||
| <td><xsl:value-of select="@tests"/></td> | <td><xsl:value-of select="@tests"/></td> | ||||
| <td><xsl:value-of select="@errors"/></td> | <td><xsl:value-of select="@errors"/></td> | ||||
| <td><xsl:value-of select="@failures"/></td> | <td><xsl:value-of select="@failures"/></td> | ||||
| <td><xsl:value-of select="format-number(@time,'#,###0.000')"/></td> | |||||
| <td> | |||||
| <xsl:call-template name="display-time"> | |||||
| <xsl:with-param name="value" select="@time"/> | |||||
| </xsl:call-template> | |||||
| </td> | |||||
| </tr> | </tr> | ||||
| </xsl:template> | </xsl:template> | ||||
| @@ -1,6 +1,4 @@ | |||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <!-- This style sheet should contain just a named templates that used in the other specific templates --> | |||||
| <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | ||||
| <!-- import the commun templates --> | <!-- import the commun templates --> | ||||
| @@ -26,7 +24,16 @@ | |||||
| <xsl:call-template name="packageSummaryHeader"/> | <xsl:call-template name="packageSummaryHeader"/> | ||||
| <!-- write a summary for the package --> | <!-- write a summary for the package --> | ||||
| <tr bgcolor="#EEEEE" valign="top"> | |||||
| <tr valign="top"> | |||||
| <xsl:variable name="errorCount" select="sum(testsuite/@errors)"/> | |||||
| <xsl:variable name="failureCount" select="sum(testsuite/@failures)"/> | |||||
| <xsl:attribute name="class"> | |||||
| <xsl:choose> | |||||
| <xsl:when test="$failureCount > 0">Failure</xsl:when> | |||||
| <xsl:when test="$errorCount > 0">Error</xsl:when> | |||||
| <xsl:otherwise>Pass</xsl:otherwise> | |||||
| </xsl:choose> | |||||
| </xsl:attribute> | |||||
| <td><xsl:value-of select="testsuite/@package"/></td> | <td><xsl:value-of select="testsuite/@package"/></td> | ||||
| <td><xsl:value-of select="sum(testsuite/@tests)"/></td> | <td><xsl:value-of select="sum(testsuite/@tests)"/></td> | ||||
| <td><xsl:value-of select="sum(testsuite/@errors)"/></td> | <td><xsl:value-of select="sum(testsuite/@errors)"/></td> | ||||
| @@ -52,12 +59,13 @@ | |||||
| </xsl:template> | </xsl:template> | ||||
| <xsl:template match="testsuite"> | <xsl:template match="testsuite"> | ||||
| <tr bgcolor="#EEEEE" valign="top"> | |||||
| <tr valign="top"> | |||||
| <!-- set a nice color depending if there is an error/failure --> | <!-- set a nice color depending if there is an error/failure --> | ||||
| <xsl:attribute name="class"> | <xsl:attribute name="class"> | ||||
| <xsl:choose> | <xsl:choose> | ||||
| <xsl:when test="@failures[.> 0]">Failure</xsl:when> | |||||
| <xsl:when test="@errors[.> 0]">Error</xsl:when> | <xsl:when test="@errors[.> 0]">Error</xsl:when> | ||||
| <xsl:when test="@failures[.> 0]">Failure</xsl:when> | |||||
| <xsl:otherwise>Pass</xsl:otherwise> | |||||
| </xsl:choose> | </xsl:choose> | ||||
| </xsl:attribute> | </xsl:attribute> | ||||
| @@ -66,8 +74,12 @@ | |||||
| <td><xsl:value-of select="@tests"/></td> | <td><xsl:value-of select="@tests"/></td> | ||||
| <td><xsl:value-of select="@errors"/></td> | <td><xsl:value-of select="@errors"/></td> | ||||
| <td><xsl:value-of select="@failures"/></td> | <td><xsl:value-of select="@failures"/></td> | ||||
| <td><xsl:value-of select="format-number(@time,'#,###0.000')"/></td> | |||||
| <td> | |||||
| <xsl:call-template name="display-time"> | |||||
| <xsl:with-param name="value" select="@time"/> | |||||
| </xsl:call-template> | |||||
| </td> | |||||
| </tr> | </tr> | ||||
| </xsl:template> | </xsl:template> | ||||
| </xsl:stylesheet> | |||||
| </xsl:stylesheet> | |||||
| @@ -1,9 +1,28 @@ | |||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
| <!-- This style sheet should contain just a named templates that used in the other specific templates --> | |||||
| <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | ||||
| <!-- transform string like a.b.c to ../../../ --> | |||||
| <!-- | |||||
| format a number in to display its value in percent | |||||
| @param value the number to format | |||||
| --> | |||||
| <xsl:template name="display-time"> | |||||
| <xsl:param name="value"/> | |||||
| <xsl:value-of select="format-number($value,'0.000')"/> | |||||
| </xsl:template> | |||||
| <!-- | |||||
| format a number in to display its value in percent | |||||
| @param value the number to format | |||||
| --> | |||||
| <xsl:template name="display-percent"> | |||||
| <xsl:param name="value"/> | |||||
| <xsl:value-of select="format-number($value,'0.00%')"/> | |||||
| </xsl:template> | |||||
| <!-- | |||||
| transform string like a.b.c to ../../../ | |||||
| @param path the path to transform into a descending directory path | |||||
| --> | |||||
| <xsl:template name="path"> | <xsl:template name="path"> | ||||
| <xsl:param name="path"/> | <xsl:param name="path"/> | ||||
| <xsl:if test="contains($path,'.')"> | <xsl:if test="contains($path,'.')"> | ||||
| @@ -119,18 +138,27 @@ | |||||
| <xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/> | <xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/> | ||||
| <table border="0" cellpadding="5" cellspacing="2" width="95%"> | <table border="0" cellpadding="5" cellspacing="2" width="95%"> | ||||
| <xsl:call-template name="summaryHeader"/> | <xsl:call-template name="summaryHeader"/> | ||||
| <tr bgcolor="#EEEEE" valign="top"> | |||||
| <tr valign="top"> | |||||
| <xsl:attribute name="class"> | <xsl:attribute name="class"> | ||||
| <xsl:choose> | |||||
| <xsl:when test="./failure | ./error">Error</xsl:when> | |||||
| <xsl:otherwise>TableRowColor</xsl:otherwise> | |||||
| </xsl:choose> | |||||
| <xsl:choose> | |||||
| <xsl:when test="$failureCount > 0">Failure</xsl:when> | |||||
| <xsl:when test="$errorCount > 0">Error</xsl:when> | |||||
| <xsl:otherwise>Pass</xsl:otherwise> | |||||
| </xsl:choose> | |||||
| </xsl:attribute> | </xsl:attribute> | ||||
| <td><xsl:value-of select="$testCount"/></td> | <td><xsl:value-of select="$testCount"/></td> | ||||
| <td><xsl:value-of select="$failureCount"/></td> | <td><xsl:value-of select="$failureCount"/></td> | ||||
| <td><xsl:value-of select="$errorCount"/></td> | <td><xsl:value-of select="$errorCount"/></td> | ||||
| <td><xsl:value-of select="format-number($successRate,'#,##0.00%')"/></td> | |||||
| <td><xsl:value-of select="format-number($timeCount,'#,###0.000')"/></td> | |||||
| <td> | |||||
| <xsl:call-template name="display-percent"> | |||||
| <xsl:with-param name="value" select="$successRate"/> | |||||
| </xsl:call-template> | |||||
| </td> | |||||
| <td> | |||||
| <xsl:call-template name="display-time"> | |||||
| <xsl:with-param name="value" select="$timeCount"/> | |||||
| </xsl:call-template> | |||||
| </td> | |||||
| </tr> | </tr> | ||||
| </table> | </table> | ||||
| Note: <i>failures</i> are anticipated and checked for with assertions while <i>errors</i> are unanticipated. | Note: <i>failures</i> are anticipated and checked for with assertions while <i>errors</i> are unanticipated. | ||||
| @@ -142,10 +170,12 @@ | |||||
| ===================================================================== | ===================================================================== | ||||
| --> | --> | ||||
| <xsl:template match="testcase"> | <xsl:template match="testcase"> | ||||
| <TR bgcolor="#EEEEE" valign="top"><xsl:attribute name="class"> | |||||
| <TR valign="top"> | |||||
| <xsl:attribute name="class"> | |||||
| <xsl:choose> | <xsl:choose> | ||||
| <xsl:when test="./failure | ./error">Error</xsl:when> | |||||
| <xsl:otherwise>TableRowColor</xsl:otherwise> | |||||
| <xsl:when test="./failure">Failure</xsl:when> | |||||
| <xsl:when test="./error">Error</xsl:when> | |||||
| <xsl:otherwise>Pass</xsl:otherwise> | |||||
| </xsl:choose> | </xsl:choose> | ||||
| </xsl:attribute> | </xsl:attribute> | ||||
| <TD><xsl:value-of select="./@name"/></TD> | <TD><xsl:value-of select="./@name"/></TD> | ||||
| @@ -160,10 +190,14 @@ | |||||
| </xsl:when> | </xsl:when> | ||||
| <xsl:otherwise> | <xsl:otherwise> | ||||
| <TD>Success</TD> | <TD>Success</TD> | ||||
| <TD></TD> | |||||
| <TD><xsl:apply-templates select="./pass"/></TD> | |||||
| </xsl:otherwise> | </xsl:otherwise> | ||||
| </xsl:choose> | </xsl:choose> | ||||
| <td><xsl:value-of select="format-number(@time,'#,###0.000')"/></td> | |||||
| <td> | |||||
| <xsl:call-template name="display-time"> | |||||
| <xsl:with-param name="value" select="@time"/> | |||||
| </xsl:call-template> | |||||
| </td> | |||||
| </TR> | </TR> | ||||
| </xsl:template> | </xsl:template> | ||||
| @@ -201,4 +235,4 @@ | |||||
| <xsl:apply-templates/> | <xsl:apply-templates/> | ||||
| </xsl:template> | </xsl:template> | ||||
| </xsl:stylesheet> | |||||
| </xsl:stylesheet> | |||||
| @@ -189,7 +189,7 @@ public class CommandlineJava implements Cloneable { | |||||
| result, pos, sysProperties.size()); | result, pos, sysProperties.size()); | ||||
| pos += sysProperties.size(); | pos += sysProperties.size(); | ||||
| } | } | ||||
| if (fullClasspath != null && fullClasspath.size() > 0) { | |||||
| if (fullClasspath != null && fullClasspath.toString().trim().length() > 0) { | |||||
| result[pos++] = "-classpath"; | result[pos++] = "-classpath"; | ||||
| result[pos++] = fullClasspath.toString(); | result[pos++] = fullClasspath.toString(); | ||||
| } | } | ||||
| @@ -213,6 +213,10 @@ public class Mapper extends DataType { | |||||
| throw be; | throw be; | ||||
| } catch (Throwable t) { | } catch (Throwable t) { | ||||
| throw new BuildException(t); | throw new BuildException(t); | ||||
| } finally { | |||||
| if (type != null) { | |||||
| classname = null; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -79,4 +79,11 @@ public class TarTest extends TaskdefsTest { | |||||
| expectBuildException("test3", "required argument not specified"); | expectBuildException("test3", "required argument not specified"); | ||||
| } | } | ||||
| public void test4() { | |||||
| expectBuildException("test4", "tar cannot include itself"); | |||||
| } | |||||
| public void tearDown() { | |||||
| executeTarget("cleanup"); | |||||
| } | |||||
| } | } | ||||
| @@ -74,4 +74,17 @@ public class ZipTest extends TaskdefsTest { | |||||
| public void test2() { | public void test2() { | ||||
| expectBuildException("test2", "required argument not specified"); | expectBuildException("test2", "required argument not specified"); | ||||
| } | } | ||||
| public void test3() { | |||||
| expectBuildException("test3", "zip cannot include itself"); | |||||
| } | |||||
| public void test4() { | |||||
| expectBuildException("test4", "zip cannot include itself"); | |||||
| } | |||||
| public void tearDown() { | |||||
| executeTarget("cleanup"); | |||||
| } | |||||
| } | } | ||||
| @@ -57,6 +57,7 @@ package org.apache.tools.ant.types; | |||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.util.*; | import org.apache.tools.ant.util.*; | ||||
| import org.apache.tools.ant.taskdefs.TaskdefsTest; | |||||
| import junit.framework.TestCase; | import junit.framework.TestCase; | ||||
| import junit.framework.AssertionFailedError; | import junit.framework.AssertionFailedError; | ||||
| @@ -174,4 +175,24 @@ public class MapperTest extends TestCase { | |||||
| assertEquals("a.java should match", 1, result.length); | assertEquals("a.java should match", 1, result.length); | ||||
| assertEquals("a.class", result[0]); | assertEquals("a.class", result[0]); | ||||
| } | } | ||||
| public void testCopyTaskWithTwoFilesets() { | |||||
| TaskdefForCopyTest t = new TaskdefForCopyTest("test1"); | |||||
| t.setUp(); | |||||
| t.test1(); | |||||
| } | |||||
| private class TaskdefForCopyTest extends TaskdefsTest { | |||||
| TaskdefForCopyTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| public void setUp() { | |||||
| configureProject("src/etc/testcases/types/mapper.xml"); | |||||
| } | |||||
| public void test1() { | |||||
| executeTarget("test1"); | |||||
| } | |||||
| } | |||||
| } | } | ||||