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"); | |||||
} | |||||
} | |||||
} | } |