This new framework should ease development of tasks that need to execute external processes. <exec> now invokes ExecTask, a reimplementation of Exec that uses the new framework but has some additional features. Submitted by: Thomas Hass <thomas.haas@softwired-inc.com> git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267799 13f79535-47bb-0310-9956-ffa450edef68master
@@ -44,7 +44,7 @@ mkdir %CLASSDIR% | |||
echo. | |||
echo ... Compiling Ant Classes | |||
%JAVAC% -d %CLASSDIR% %TOOLS%\tar\*.java %TOOLS%\ant\*.java %TOOLS%\ant\taskdefs\*.java | |||
%JAVAC% -d %CLASSDIR% %TOOLS%\tar\*.java %TOOLS%\ant\*.java %TOOLS%\ant\types\*.java %TOOLS%\ant\taskdefs\*.java | |||
echo. | |||
echo ... Copying Required Files | |||
@@ -39,6 +39,7 @@ echo ... Compiling Ant Classes | |||
javac -d ${CLASSDIR} ${TOOLS}/tar/*.java | |||
javac -d ${CLASSDIR} ${TOOLS}/ant/*.java | |||
javac -d ${CLASSDIR} ${TOOLS}/ant/types/*.java | |||
javac -d ${CLASSDIR} ${TOOLS}/ant/taskdefs/*.java | |||
echo ... Copying Required Files | |||
@@ -171,6 +171,7 @@ public class IntrospectionHelper { | |||
} else if (name.startsWith("add") | |||
&& java.lang.Void.TYPE.equals(returnType) | |||
&& args.length == 1 | |||
&& !java.lang.String.class.equals(args[0]) | |||
&& !args[0].isArray() | |||
&& !args[0].isPrimitive()) { | |||
@@ -85,6 +85,7 @@ import java.text.StringCharacterIterator; | |||
* to define a path from an environment variable. | |||
* | |||
* @author Thomas.Haas@softwired-inc.com | |||
* @author <a href="mailto:stefan.bodewig@megabit.net">Stefan Bodewig</a> | |||
*/ | |||
public class Path { | |||
@@ -221,4 +222,8 @@ public class Path { | |||
} | |||
return false; | |||
} | |||
public int size() { | |||
return definition.size(); | |||
} | |||
} |
@@ -0,0 +1,218 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs; | |||
import org.apache.tools.ant.*; | |||
import org.apache.tools.ant.types.*; | |||
import java.io.*; | |||
/** | |||
* Executes a given command if the os platform is appropriate. | |||
* | |||
* @author duncan@x180.com | |||
* @author rubys@us.ibm.com | |||
* @author thomas.haas@softwired-inc.com | |||
* @author <a href="mailto:stefan.bodewig@megabit.net">Stefan Bodewig</a> | |||
*/ | |||
public class ExecTask extends Task { | |||
private String os; | |||
private File out; | |||
private File dir; | |||
private boolean failOnError = false; | |||
private Integer timeout = null; | |||
private Environment env = new Environment(); | |||
private Commandline cmdl = new Commandline(); | |||
private FileOutputStream fos = null; | |||
public void setTimeout(Integer value) { | |||
timeout = value; | |||
} | |||
public void setExecutable(String value) { | |||
cmdl.setExecutable(value); | |||
} | |||
public void setDir(File d) { | |||
this.dir = d; | |||
} | |||
public void setOs(String os) { | |||
this.os = os; | |||
} | |||
public void setCommand(Commandline cmdl) { | |||
this.cmdl = cmdl; | |||
} | |||
public void setOutput(File out) { | |||
this.out = out; | |||
} | |||
public void setFailonerror(boolean fail) { | |||
failOnError = fail; | |||
} | |||
public void addEnv(Environment.Variable var) { | |||
env.addVariable(var); | |||
} | |||
public void execute() throws BuildException { | |||
if (cmdl.getExecutable() == null) { | |||
throw new BuildException("no executable specified", location); | |||
} | |||
String[] orig = cmdl.getCommandline(); | |||
int err = -1; // assume the worst | |||
// test if os match | |||
String myos = System.getProperty("os.name"); | |||
log("Myos = " + myos, Project.MSG_VERBOSE); | |||
if ((os != null) && (os.indexOf(myos) < 0)){ | |||
// this command will be executed only on the specified OS | |||
log("Not found in " + os, Project.MSG_VERBOSE); | |||
return; | |||
} | |||
// default directory to the project's base directory | |||
if (dir == null) dir = project.getBaseDir(); | |||
if (myos.toLowerCase().indexOf("windows") >= 0) { | |||
if (!dir.equals(project.resolveFile("."))) { | |||
if (myos.toLowerCase().indexOf("nt") >= 0) { | |||
cmdl = new Commandline(); | |||
cmdl.setExecutable("cmd"); | |||
cmdl.addValue("/c"); | |||
cmdl.addValue("cd"); | |||
cmdl.addValue(dir.getAbsolutePath()); | |||
cmdl.addValue("&&"); | |||
cmdl.addLine(orig); | |||
} else { | |||
String ant = project.getProperty("ant.home"); | |||
if (ant == null) { | |||
throw new BuildException("Property 'ant.home' not found", location); | |||
} | |||
String antRun = project.resolveFile(ant + "/bin/antRun.bat").toString(); | |||
cmdl = new Commandline(); | |||
cmdl.setExecutable(antRun); | |||
cmdl.addValue(dir.getAbsolutePath()); | |||
cmdl.addLine(orig); | |||
} | |||
} | |||
} else { | |||
String ant = project.getProperty("ant.home"); | |||
if (ant == null) throw new BuildException("Property 'ant.home' not found", location); | |||
String antRun = project.resolveFile(ant + "/bin/antRun").toString(); | |||
cmdl = new Commandline(); | |||
cmdl.setExecutable(antRun); | |||
cmdl.addValue(dir.getAbsolutePath()); | |||
cmdl.addLine(orig); | |||
} | |||
try { | |||
// show the command | |||
log(cmdl.toString(), Project.MSG_VERBOSE); | |||
final Execute exe = new Execute(createHandler(), createWatchdog()); | |||
exe.setCommandline(cmdl.getCommandline()); | |||
exe.setEnvironment(env.getVariables()); | |||
err = exe.execute(); | |||
if (err != 0) { | |||
if (failOnError) { | |||
throw new BuildException("Exec returned: "+err, location); | |||
} else { | |||
log("Result: " + err, Project.MSG_ERR); | |||
} | |||
} | |||
} catch (IOException e) { | |||
throw new BuildException("Execute failed: " + e, e, location); | |||
} finally { | |||
// close the output file if required | |||
logFlush(); | |||
} | |||
} | |||
protected ExecuteStreamHandler createHandler() throws BuildException { | |||
if(out!=null) { | |||
try { | |||
fos = new FileOutputStream(out); | |||
log("Output redirected to " + out, Project.MSG_VERBOSE); | |||
return new PumpStreamHandler(fos); | |||
} catch (FileNotFoundException fne) { | |||
throw new BuildException("Cannot write to "+out, fne, location); | |||
} | |||
} else { | |||
return new LogStreamHandler(this, | |||
Project.MSG_INFO, Project.MSG_WARN); | |||
} | |||
} | |||
protected ExecuteWatchdog createWatchdog() throws BuildException { | |||
if (timeout == null) return null; | |||
return new ExecuteWatchdog(timeout.intValue()); | |||
} | |||
protected void logFlush() { | |||
try { | |||
if (fos != null) fos.close(); | |||
} catch (IOException io) {} | |||
} | |||
} |
@@ -0,0 +1,185 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.io.OutputStream; | |||
/** | |||
* Runs an external program. | |||
* | |||
* @author thomas.haas@softwired-inc.com | |||
*/ | |||
public class Execute { | |||
/** Invalid exit code. **/ | |||
public final static int INVALID = Integer.MAX_VALUE; | |||
private String[] cmdl = null; | |||
private String[] env = null; | |||
private int exitValue = INVALID; | |||
private ExecuteStreamHandler streamHandler; | |||
private ExecuteWatchdog watchdog; | |||
/** | |||
* Creates a new execute object using <code>PumpStreamHandler</code> for | |||
* stream handling. | |||
*/ | |||
public Execute() { | |||
this(new PumpStreamHandler(), null); | |||
} | |||
/** | |||
* Creates a new execute object. | |||
* | |||
* @param streamHandler the stream handler used to handle the input and | |||
* output streams of the subprocess. | |||
* @param watchdog a watchdog for the subprocess or <code>null</code> to | |||
* to disable a timeout for the subprocess. | |||
*/ | |||
public Execute(ExecuteStreamHandler streamHandler, ExecuteWatchdog watchdog) { | |||
this.streamHandler = streamHandler; | |||
this.watchdog = watchdog; | |||
} | |||
/** | |||
* Returns the commandline used to create a subprocess. | |||
* | |||
* @return the commandline used to create a subprocess | |||
*/ | |||
public String[] getCommandline() { | |||
return cmdl; | |||
} | |||
/** | |||
* Sets the commandline of the subprocess to launch. | |||
* | |||
* @param commandline the commandline of the subprocess to launch | |||
*/ | |||
public void setCommandline(String[] commandline) { | |||
cmdl = commandline; | |||
} | |||
/** | |||
* Returns the commandline used to create a subprocess. | |||
* | |||
* @return the commandline used to create a subprocess | |||
*/ | |||
public String[] getEnvironment() { | |||
return env; | |||
} | |||
/** | |||
* Sets the commandline of the subprocess to launch. | |||
* | |||
* @param commandline the commandline of the subprocess to launch | |||
*/ | |||
public void setEnvironment(String[] env) { | |||
this.env = env; | |||
} | |||
/** | |||
* Runs a process defined by the command line and returns its exit status. | |||
* | |||
* @return the exit status of the subprocess or <code>INVALID</code> | |||
* @exception java.io.IOExcpetion The exception is thrown, if launching | |||
* of the subprocess failed | |||
*/ | |||
public int execute() throws IOException { | |||
final Process process = exec(); | |||
try { | |||
streamHandler.setProcessInputStream(process.getOutputStream()); | |||
streamHandler.setProcessOutputStream(process.getInputStream()); | |||
streamHandler.setProcessErrorStream(process.getErrorStream()); | |||
} catch (IOException e) { | |||
process.destroy(); | |||
throw e; | |||
} | |||
streamHandler.start(); | |||
if (watchdog != null) watchdog.start(process); | |||
waitFor(process); | |||
if (watchdog != null) watchdog.stop(); | |||
streamHandler.stop(); | |||
if (watchdog != null) watchdog.checkException(); | |||
return getExitValue(); | |||
} | |||
protected Process exec() throws IOException { | |||
return Runtime.getRuntime().exec(getCommandline(), getEnvironment()); | |||
} | |||
protected void waitFor(Process process) { | |||
try { | |||
process.waitFor(); | |||
setExitValue(process.exitValue()); | |||
} catch (InterruptedException e) {} | |||
} | |||
protected void setExitValue(int value) { | |||
exitValue = value; | |||
} | |||
protected int getExitValue() { | |||
return exitValue; | |||
} | |||
} |
@@ -0,0 +1,100 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.Path; | |||
import org.apache.tools.ant.types.Commandline; | |||
import java.lang.reflect.InvocationTargetException; | |||
import java.lang.reflect.Method; | |||
/* | |||
* | |||
* @author thomas.haas@softwired-inc.com | |||
*/ | |||
public class ExecuteJava { | |||
private Commandline javaCommand = null; | |||
public void setJavaCommand(Commandline javaCommand) { | |||
this.javaCommand = javaCommand; | |||
} | |||
public void execute() throws BuildException{ | |||
final String classname = javaCommand.getExecutable(); | |||
final Object[] argument = { javaCommand.getArguments() }; | |||
final Class[] param = { argument[0].getClass() }; | |||
try { | |||
final Class target = Class.forName(classname); | |||
final Method main = target.getMethod("main", param); | |||
main.invoke(null, argument); | |||
} catch (NullPointerException e) { | |||
throw new BuildException("Could not find main() method in " + classname); | |||
} catch (ClassNotFoundException e) { | |||
throw new BuildException("Could not find " + classname + ". Make sure you have it in your classpath"); | |||
} catch (InvocationTargetException e) { | |||
Throwable t = e.getTargetException(); | |||
if (!(t instanceof SecurityException)) { | |||
throw new BuildException(t.toString()); | |||
} | |||
// else ignore because the security exception is thrown | |||
// if the invoked application tried to call System.exit() | |||
} catch (Exception e) { | |||
throw new BuildException(e); | |||
} | |||
} | |||
} |
@@ -0,0 +1,100 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs; | |||
import java.io.InputStream; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
/** | |||
* Used by <code>Execute</code> to handle input and output stream of | |||
* subprocesses. | |||
* | |||
* @author thomas.haas@softwired-inc.com | |||
*/ | |||
public interface ExecuteStreamHandler { | |||
/** | |||
* Install a handler for the input stream of the subprocess. | |||
* | |||
* @param os output stream to write to the standard input stream of the | |||
* subprocess | |||
*/ | |||
public void setProcessInputStream(OutputStream os) throws IOException; | |||
/** | |||
* Install a handler for the error stream of the subprocess. | |||
* | |||
* @param is input stream to read from the error stream from the subprocess | |||
*/ | |||
public void setProcessErrorStream(InputStream is) throws IOException; | |||
/** | |||
* Install a handler for the output stream of the subprocess. | |||
* | |||
* @param is input stream to read from the error stream from the subprocess | |||
*/ | |||
public void setProcessOutputStream(InputStream is) throws IOException; | |||
/** | |||
* Start handling of the streams. | |||
*/ | |||
public void start() throws IOException; | |||
/** | |||
* Stop handling of the streams - will not be restarted. | |||
*/ | |||
public void stop(); | |||
} |
@@ -0,0 +1,145 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs; | |||
import org.apache.tools.ant.BuildException; | |||
/** | |||
* Destroys a process running for too long. | |||
* | |||
* @author thomas.haas@softwired-inc.com | |||
*/ | |||
public class ExecuteWatchdog implements Runnable { | |||
private Process process; | |||
private int timeout; | |||
private boolean watch = true; | |||
private Exception caught = null; | |||
/** | |||
* Creates a new watchdog. | |||
* | |||
* @param timeout the timeout for the process. | |||
*/ | |||
public ExecuteWatchdog(int timeout) { | |||
if (timeout < 1) { | |||
throw new IllegalArgumentException("timeout lesser than 1."); | |||
} | |||
this.timeout = timeout; | |||
} | |||
/** | |||
* Watches the given process and terminates it, if it runs for to long. | |||
* | |||
* @param process the process to watch. | |||
*/ | |||
public synchronized void start(Process process) { | |||
if (process == null) { | |||
throw new NullPointerException("process is null."); | |||
} | |||
if (this.process != null) { | |||
throw new IllegalStateException("Already running."); | |||
} | |||
watch = true; | |||
this.process = process; | |||
final Thread thread = new Thread(this, "WATCHDOG"); | |||
thread.setDaemon(true); | |||
thread.start(); | |||
} | |||
/** | |||
* Stops the watcher. | |||
*/ | |||
public synchronized void stop() { | |||
watch = false; | |||
notifyAll(); | |||
process = null; | |||
} | |||
/** | |||
* Watches the process and terminates it, if it runs for to long. | |||
*/ | |||
public synchronized void run() { | |||
try { | |||
// This isn't a Task, don't have a Project object to log. | |||
// project.log("ExecuteWatchdog: timeout = "+timeout+" msec", Project.MSG_VERBOSE); | |||
final long until = System.currentTimeMillis() + timeout; | |||
long now; | |||
while (watch && until > (now = System.currentTimeMillis())) { | |||
try { | |||
wait(until - now); | |||
} catch (InterruptedException e) {} | |||
} | |||
if (watch) { | |||
process.destroy(); | |||
} | |||
stop(); | |||
} catch(Exception e) { | |||
caught = e; | |||
} | |||
} | |||
public void checkException() throws BuildException { | |||
if (caught != null) { | |||
throw new BuildException("Exception in ExecuteWatchdog.run: " | |||
+ caught.getMessage(), caught); | |||
} | |||
} | |||
} | |||
@@ -0,0 +1,134 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.Task; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.io.ByteArrayOutputStream; | |||
/** | |||
* Logs each line written to this stream to the log system of ant. | |||
* | |||
* Tries to be smart about line separators.<br> | |||
* TODO: This class can be split to implement other line based processing | |||
* of data written to the stream. | |||
* | |||
* @author thomas.haas@softwired-inc.com | |||
*/ | |||
public class LogOutputStream extends OutputStream { | |||
private ByteArrayOutputStream buffer = new ByteArrayOutputStream(); | |||
private boolean skip = false; | |||
private Task task; | |||
private int level = Project.MSG_INFO; | |||
/** | |||
* Creates a new instance of this class. | |||
* | |||
* @param task the task for whom to log | |||
* @param level loglevel used to log data written to this stream. | |||
*/ | |||
public LogOutputStream(Task task, int level) { | |||
this.task = task; | |||
this.level = level; | |||
} | |||
/** | |||
* Write the data to the buffer and flush the buffer, if a line | |||
* separator is detected. | |||
* | |||
* @param cc data to log (byte). | |||
*/ | |||
public void write(int cc) throws IOException { | |||
final byte c = (byte)cc; | |||
if ((c == '\n') || (c == '\r')) { | |||
if (!skip) processBuffer(); | |||
} else buffer.write(cc); | |||
skip = (c == '\r'); | |||
} | |||
/** | |||
* Converts the buffer to a string and sends it to <code>processLine</code> | |||
*/ | |||
protected void processBuffer() { | |||
processLine(buffer.toString()); | |||
buffer.reset(); | |||
} | |||
/** | |||
* Logs a line to the log system of ant. | |||
* | |||
* @param line the line to log. | |||
*/ | |||
protected void processLine(String line) { | |||
task.log(line, level); | |||
} | |||
/** | |||
* Writes all remaining | |||
*/ | |||
public void close() throws IOException { | |||
if (buffer.size() > 0) processBuffer(); | |||
super.close(); | |||
} | |||
} |
@@ -0,0 +1,82 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.Task; | |||
import java.io.OutputStream; | |||
import java.io.InputStream; | |||
/** | |||
* Logs standard output and error of a subprocess to the log system of ant. | |||
* | |||
* @author thomas.haas@softwired-inc.com | |||
*/ | |||
public class LogStreamHandler extends PumpStreamHandler { | |||
/** | |||
* Creates a new instance of this class. | |||
* | |||
* @param task the task for whom to log | |||
* @param outlevel the loglevel used to log standard output | |||
* @param errlevel the loglevel used to log standard error | |||
*/ | |||
public LogStreamHandler(Task task, int outlevel, int errlevel) { | |||
super(new LogOutputStream(task, outlevel), | |||
new LogOutputStream(task, errlevel)); | |||
} | |||
} |
@@ -0,0 +1,136 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs; | |||
import java.io.InputStream; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
/** | |||
* Copies standard output and error of subprocesses to standard output and | |||
* error of the parent process. | |||
* | |||
* TODO: standard input of the subprocess is not implemented. | |||
* | |||
* @author thomas.haas@softwired-inc.com | |||
*/ | |||
public class PumpStreamHandler implements ExecuteStreamHandler { | |||
private Thread inputThread; | |||
private Thread errorThread; | |||
private OutputStream out, err; | |||
public PumpStreamHandler(OutputStream out, OutputStream err) { | |||
this.out = out; | |||
this.err = err; | |||
} | |||
public PumpStreamHandler(OutputStream outAndErr) { | |||
this(outAndErr, outAndErr); | |||
} | |||
public PumpStreamHandler() { | |||
this(System.out, System.err); | |||
} | |||
public void setProcessOutputStream(InputStream is) { | |||
createProcessOutputPump(is, out); | |||
} | |||
public void setProcessErrorStream(InputStream is) { | |||
createProcessErrorPump(is, err); | |||
} | |||
public void setProcessInputStream(OutputStream os) { | |||
} | |||
public void start() { | |||
inputThread.start(); | |||
errorThread.start(); | |||
} | |||
public void stop() { | |||
try { | |||
inputThread.join(); | |||
} catch(InterruptedException e) {} | |||
try { | |||
errorThread.join(); | |||
} catch(InterruptedException e) {} | |||
} | |||
protected void createProcessOutputPump(InputStream is, OutputStream os) { | |||
inputThread = createPump(is, os); | |||
} | |||
protected void createProcessErrorPump(InputStream is, OutputStream os) { | |||
errorThread = createPump(is, os); | |||
} | |||
/** | |||
* Creates a stream pumper to copy the given input stream to the given output stream. | |||
*/ | |||
protected Thread createPump(InputStream is, OutputStream os) { | |||
final Thread result = new Thread(new StreamPumper(is, os)); | |||
result.setDaemon(true); | |||
return result; | |||
} | |||
} |
@@ -0,0 +1,107 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.io.OutputStream; | |||
/** | |||
* Copies all data from an input stream to an output stream. | |||
* | |||
* @author thomas.haas@softwired-inc.com | |||
*/ | |||
public class StreamPumper implements Runnable { | |||
// TODO: make SIZE and SLEEP instance variables. | |||
// TODO: add a status flag to note if an error occured in run. | |||
private final static int SLEEP = 5; | |||
private final static int SIZE = 128; | |||
private InputStream is; | |||
private OutputStream os; | |||
/** | |||
* Create a new stream pumper. | |||
* | |||
* @param is input stream to read data from | |||
* @param os output stream to write data to. | |||
*/ | |||
public StreamPumper(InputStream is, OutputStream os) { | |||
this.is = is; | |||
this.os = os; | |||
} | |||
/** | |||
* Copies data from the input stream to the output stream. | |||
* | |||
* Terminates as soon as the input stream is closed or an error occurs. | |||
*/ | |||
public void run() { | |||
final byte[] buf = new byte[SIZE]; | |||
int length; | |||
try { | |||
while ((length = is.read(buf)) > 0) { | |||
os.write(buf, 0, length); | |||
try { | |||
Thread.sleep(SLEEP); | |||
} catch (InterruptedException e) {} | |||
} | |||
} catch(IOException e) {} | |||
} | |||
} |
@@ -23,7 +23,7 @@ tstamp=org.apache.tools.ant.taskdefs.Tstamp | |||
property=org.apache.tools.ant.taskdefs.Property | |||
taskdef=org.apache.tools.ant.taskdefs.Taskdef | |||
ant=org.apache.tools.ant.taskdefs.Ant | |||
exec=org.apache.tools.ant.taskdefs.Exec | |||
exec=org.apache.tools.ant.taskdefs.ExecTask | |||
tar=org.apache.tools.ant.taskdefs.Tar | |||
untar=org.apache.tools.ant.taskdefs.Untar | |||
available=org.apache.tools.ant.taskdefs.Available | |||
@@ -47,6 +47,7 @@ wlrun=org.apache.tools.ant.taskdefs.optional.ejb.WLRun | |||
wlstop=org.apache.tools.ant.taskdefs.optional.ejb.WLStop | |||
vssget=org.apache.tools.ant.taskdefs.optional.vss.MSVSSGET | |||
ejbjar=org.apache.tools.ant.taskdefs.optional.ejb.EjbJar | |||
javacc=org.apache.tools.ant.taskdefs.optional.javacc.JavaCC | |||
# deprecated ant tasks (kept for back compatibility) | |||
javadoc2=org.apache.tools.ant.taskdefs.Javadoc | |||
@@ -0,0 +1,300 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.types; | |||
import org.apache.tools.ant.BuildException; | |||
import java.util.Vector; | |||
import java.util.StringTokenizer; | |||
/** | |||
* Commandline objects help handling command lines specifying processes to | |||
* execute. | |||
* | |||
* The class can be used to define a command line as nested elements or as a | |||
* helper to define a command line by an application. | |||
* <p> | |||
* <code> | |||
* <someelement><br> | |||
* <acommandline executable="/executable/to/run"><br> | |||
* <argument value="argument 1" /><br> | |||
* <argument line="argument_1 argument_2 argument_3" /><br> | |||
* <argument value="argument 4" /><br> | |||
* </acommandline><br> | |||
* </someelement><br> | |||
* </code> | |||
* The element <code>someelement</code> must provide a method | |||
* <code>createAcommandline</code> which returns an instance of this class. | |||
* | |||
* @author thomas.haas@softwired-inc.com | |||
* @author <a href="mailto:stefan.bodewig@megabit.net">Stefan Bodewig</a> | |||
*/ | |||
public class Commandline { | |||
private Vector definition = new Vector(); | |||
private String executable = null; | |||
private Argument argument = null; | |||
public Commandline(String to_process) { | |||
super(); | |||
String[] tmp = translateCommandline(to_process); | |||
if (tmp != null && tmp.length > 0) { | |||
setExecutable(tmp[0]); | |||
for (int i=1; i<tmp.length; i++) { | |||
addValue(tmp[i]); | |||
} | |||
} | |||
} | |||
public Commandline() { | |||
super(); | |||
} | |||
/** | |||
* Used for nested xml command line definitions. | |||
*/ | |||
public class Argument { | |||
/** | |||
* Sets a single commandline argument. | |||
* | |||
* @param value a single commandline argument. | |||
*/ | |||
public void setValue(String value) { | |||
Commandline.this.addValue(value); | |||
} | |||
/** | |||
* Line to split into several commandline arguments. | |||
* | |||
* @param line line to split into several commandline arguments | |||
*/ | |||
public void setLine(String line) { | |||
Commandline.this.addLine(translateCommandline(line)); | |||
} | |||
} | |||
/** | |||
* Creates an argument object. | |||
* Each commandline object has at most one instance of the argument class. | |||
* @return the argument object. | |||
*/ | |||
public Argument createArgument() { | |||
if (argument == null) { | |||
argument = new Argument(); | |||
} | |||
return argument; | |||
} | |||
/** | |||
* Sets the executable to run. | |||
*/ | |||
public void setExecutable(String executable) { | |||
if (executable == null || executable.length() == 0) return; | |||
this.executable = executable; | |||
} | |||
public String getExecutable() { | |||
return executable; | |||
} | |||
public void addValue(String value) { | |||
if (value == null || value.length() == 0) return; | |||
definition.addElement(value); | |||
} | |||
public void addLine(String[] line) { | |||
for (int i=0; i < line.length; i++) { | |||
createArgument().setValue(line[i]); | |||
} | |||
} | |||
/** | |||
* Returns the executable and all defined arguments. | |||
*/ | |||
public String[] getCommandline() { | |||
if (executable == null) return getArguments(); | |||
final String[] args = getArguments(); | |||
final String[] result = new String[args.length+1]; | |||
result[0] = executable; | |||
System.arraycopy(args, 0, result, 1, args.length); | |||
return result; | |||
} | |||
/** | |||
* Returns all arguments defined by <code>addLine</code>, | |||
* <code>addValue</code> or the argument object. | |||
*/ | |||
public String[] getArguments() { | |||
final String [] result; | |||
result = new String[definition.size()]; | |||
definition.copyInto(result); | |||
return result; | |||
} | |||
public String toString() { | |||
return toString(getCommandline()); | |||
} | |||
public static String toString(String [] line) { | |||
// empty path return empty string | |||
if (line == null || line.length == 0) return ""; | |||
// path containing one or more elements | |||
final StringBuffer result = new StringBuffer(); | |||
for (int i=0; i < line.length; i++) { | |||
if (i > 0) { | |||
result.append(' '); | |||
} | |||
// try to place quotes around arguments that need them | |||
if (line[i].indexOf("\"") > -1) { | |||
if (line[i].indexOf("\'") > -1) { | |||
throw new BuildException("Can\'t handle single and double quotes in same argument"); | |||
} else { | |||
result.append('\'').append(line[i]).append('\''); | |||
} | |||
} else if (line[i].indexOf("\'") > -1 | |||
|| line[i].indexOf(" ") > -1) { | |||
result.append('\"').append(line[i]).append('\"'); | |||
} else { | |||
result.append(line[i]); | |||
} | |||
} | |||
return result.toString(); | |||
} | |||
public static String[] translateCommandline(String to_process) { | |||
if (to_process == null || to_process.length() == 0) { | |||
return new String[0]; | |||
} | |||
// parse with a simple finite state machine | |||
final int normal = 0; | |||
final int inQuote = 1; | |||
final int inDoubleQuote = 2; | |||
int state = normal; | |||
StringTokenizer tok = new StringTokenizer(to_process, "\\\"\' ", true); | |||
Vector v = new Vector(); | |||
StringBuffer current = new StringBuffer(); | |||
while (tok.hasMoreTokens()) { | |||
String nextTok = tok.nextToken(); | |||
switch (state) { | |||
case inQuote: | |||
if ("\'".equals(nextTok)) { | |||
state = normal; | |||
} else { | |||
current.append(nextTok); | |||
} | |||
break; | |||
case inDoubleQuote: | |||
if ("\"".equals(nextTok)) { | |||
state = normal; | |||
} else { | |||
current.append(nextTok); | |||
} | |||
break; | |||
default: | |||
if ("\'".equals(nextTok)) { | |||
state = inQuote; | |||
} else if ("\"".equals(nextTok)) { | |||
state = inDoubleQuote; | |||
} else if (" ".equals(nextTok)) { | |||
if (current.length() != 0) { | |||
v.addElement(current.toString()); | |||
current.setLength(0); | |||
} | |||
} else if ("\\".equals(nextTok)) { | |||
if (tok.hasMoreTokens()) { | |||
current.append(tok.nextToken()); | |||
} else { | |||
throw new BuildException("stray backslash in " | |||
+ to_process); | |||
} | |||
} else { | |||
current.append(nextTok); | |||
} | |||
break; | |||
} | |||
} | |||
if (current.length() != 0) { | |||
v.addElement(current.toString()); | |||
} | |||
if (state == inQuote || state == inDoubleQuote) { | |||
throw new BuildException("unbalanced quotes in " + to_process); | |||
} | |||
String[] args = new String[v.size()]; | |||
v.copyInto(args); | |||
return args; | |||
} | |||
public int size() { | |||
return definition.size() + (executable == null ? 0 : 1); | |||
} | |||
} |
@@ -0,0 +1,135 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.types; | |||
import org.apache.tools.ant.Path; | |||
/* | |||
* | |||
* @author thomas.haas@softwired-inc.com | |||
*/ | |||
public class CommandlineJava { | |||
private Commandline vmCommand = new Commandline(); | |||
private Commandline javaCommand = new Commandline(); | |||
private Path classpath = new Path(); | |||
private String vmVersion; | |||
public CommandlineJava() { | |||
setVm("java"); | |||
setVmversion(org.apache.tools.ant.Project.getJavaVersion()); | |||
} | |||
public Commandline.Argument createArgument() { | |||
return javaCommand.createArgument(); | |||
} | |||
public Commandline.Argument createVmArgument() { | |||
return vmCommand.createArgument(); | |||
} | |||
public void setVm(String vm) { | |||
vmCommand.setExecutable(vm); | |||
} | |||
public void setVmversion(String value) { | |||
vmVersion = value; | |||
} | |||
public void setClassname(String classname) { | |||
javaCommand.setExecutable(classname); | |||
} | |||
public Path createClasspath() { | |||
return classpath; | |||
} | |||
public String getVmversion() { | |||
return vmVersion; | |||
} | |||
public String[] getCommandline() { | |||
int size = vmCommand.size() + javaCommand.size(); | |||
if (classpath.size() > 0) { | |||
size += 2; | |||
} | |||
String[] result = new String[size]; | |||
System.arraycopy(vmCommand.getCommandline(), 0, | |||
result, 0, vmCommand.size()); | |||
if (classpath.size() > 0) { | |||
result[vmCommand.size()] = "-classpath"; | |||
result[vmCommand.size()+1] = classpath.toString(); | |||
} | |||
System.arraycopy(javaCommand.getCommandline(), 0, | |||
result, result.length-javaCommand.size(), | |||
javaCommand.size()); | |||
return result; | |||
} | |||
public String toString() { | |||
return Commandline.toString(getCommandline()); | |||
} | |||
public int size() { | |||
int size = vmCommand.size() + javaCommand.size(); | |||
if (classpath.size() > 0) { | |||
size += 2; | |||
} | |||
return size; | |||
} | |||
} |
@@ -0,0 +1,110 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.types; | |||
import org.apache.tools.ant.BuildException; | |||
import java.util.Vector; | |||
/** | |||
* Wrapper for environment variables. | |||
* | |||
* @author <a href="mailto:stefan.bodewig@megabit.net">Stefan Bodewig</a> | |||
*/ | |||
public class Environment { | |||
private Vector variables; | |||
public static class Variable { | |||
private String key, value; | |||
public Variable() { | |||
super(); | |||
} | |||
public void setKey(String key) { | |||
this.key = key; | |||
} | |||
public void setValue(String value) { | |||
this.value = value; | |||
} | |||
public String getContent() throws BuildException { | |||
if (key == null || value == null) { | |||
throw new BuildException("key and value must be specified for environment variables."); | |||
} | |||
StringBuffer sb = new StringBuffer(key.trim()); | |||
sb.append("=").append(value.trim()); | |||
return sb.toString(); | |||
} | |||
} | |||
public Environment() { | |||
variables = new Vector(); | |||
} | |||
public void addVariable(Variable var) { | |||
variables.addElement(var); | |||
} | |||
public String[] getVariables() throws BuildException { | |||
if (variables.size() == 0) { | |||
return null; | |||
} | |||
String[] result = new String[variables.size()]; | |||
for (int i=0; i<result.length; i++) { | |||
result[i] = ((Variable) variables.elementAt(i)).getContent(); | |||
} | |||
return result; | |||
} | |||
} |
@@ -73,6 +73,7 @@ public class AllJUnitTests extends TestCase { | |||
TestSuite suite = new TestSuite(IntrospectionHelperTest.class); | |||
suite.addTest(new TestSuite(EnumeratedAttributeTest.class)); | |||
suite.addTest(new TestSuite(PathTest.class)); | |||
suite.addTest(org.apache.tools.ant.types.AllJUnitTests.suite()); | |||
return suite; | |||
} | |||
} |
@@ -183,8 +183,8 @@ public class IntrospectionHelperTest extends TestCase { | |||
Hashtable h = new Hashtable(); | |||
h.put("six", java.lang.String.class); | |||
h.put("thirteen", java.lang.StringBuffer.class); | |||
h.put("fourteen", java.lang.String.class); | |||
h.put("fifteen", java.lang.String.class); | |||
h.put("fourteen", java.lang.StringBuffer.class); | |||
h.put("fifteen", java.lang.StringBuffer.class); | |||
IntrospectionHelper ih = IntrospectionHelper.getHelper(getClass()); | |||
Enumeration enum = ih.getNestedElements(); | |||
while (enum.hasMoreElements()) { | |||
@@ -216,7 +216,7 @@ public class IntrospectionHelperTest extends TestCase { | |||
return "test"; | |||
} | |||
public String createFifteen() { | |||
public StringBuffer createFifteen() { | |||
throw new NullPointerException(); | |||
} | |||
@@ -238,7 +238,7 @@ public class IntrospectionHelperTest extends TestCase { | |||
sb.append("test"); | |||
} | |||
public void addFourteen(String s) { | |||
public void addFourteen(StringBuffer s) { | |||
throw new NullPointerException(); | |||
} | |||
@@ -0,0 +1,77 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.types; | |||
import junit.framework.Test; | |||
import junit.framework.TestCase; | |||
import junit.framework.TestSuite; | |||
/** | |||
* Simple class to build a TestSuite out of the individual test classes. | |||
* | |||
* @author Stefan Bodewig <a href="mailto:stefan.bodewig@megabit.net">stefan.bodewig@megabit.net</a> | |||
*/ | |||
public class AllJUnitTests extends TestCase { | |||
public AllJUnitTests(String name) { | |||
super(name); | |||
} | |||
public static Test suite() { | |||
TestSuite suite = new TestSuite(CommandlineTest.class); | |||
suite.addTest(new TestSuite(CommandlineJavaTest.class)); | |||
return suite; | |||
} | |||
} |
@@ -0,0 +1,100 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.types; | |||
import junit.framework.TestCase; | |||
import junit.framework.AssertionFailedError; | |||
import java.io.File; | |||
/** | |||
* JUnit 3 testcases for org.apache.tools.ant.CommandlineJava | |||
* | |||
* @author Stefan Bodewig <a href="mailto:stefan.bodewig@megabit.net">stefan.bodewig@megabit.net</a> | |||
*/ | |||
public class CommandlineJavaTest extends TestCase { | |||
public CommandlineJavaTest(String name) { | |||
super(name); | |||
} | |||
public void testGetCommandline() { | |||
CommandlineJava c = new CommandlineJava(); | |||
c.createArgument().setValue("org.apache.tools.ant.CommandlineJavaTest"); | |||
c.setClassname("junit.textui.TestRunner"); | |||
c.createVmArgument().setValue("-Djava.compiler=NONE"); | |||
String[] s = c.getCommandline(); | |||
assertEquals("no classpath", 4, s.length); | |||
assertEquals("no classpath", "java", s[0]); | |||
assertEquals("no classpath", "-Djava.compiler=NONE", s[1]); | |||
assertEquals("no classpath", "junit.textui.TestRunner", s[2]); | |||
assertEquals("no classpath", | |||
"org.apache.tools.ant.CommandlineJavaTest", s[3]); | |||
c.createClasspath().setLocation("junit.jar"); | |||
c.createClasspath().setLocation("ant.jar"); | |||
s = c.getCommandline(); | |||
assertEquals("with classpath", 6, s.length); | |||
assertEquals("with classpath", "java", s[0]); | |||
assertEquals("with classpath", "-Djava.compiler=NONE", s[1]); | |||
assertEquals("with classpath", "-classpath", s[2]); | |||
assertEquals("with classpath", | |||
"junit.jar"+java.io.File.pathSeparator+"ant.jar", s[3]); | |||
assertEquals("with classpath", "junit.textui.TestRunner", s[4]); | |||
assertEquals("with classpath", | |||
"org.apache.tools.ant.CommandlineJavaTest", s[5]); | |||
} | |||
} |
@@ -0,0 +1,161 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.types; | |||
import org.apache.tools.ant.BuildException; | |||
import junit.framework.TestCase; | |||
import junit.framework.AssertionFailedError; | |||
import java.io.File; | |||
/** | |||
* JUnit 3 testcases for org.apache.tools.ant.CommandLine | |||
* | |||
* @author Stefan Bodewig <a href="mailto:stefan.bodewig@megabit.net">stefan.bodewig@megabit.net</a> | |||
*/ | |||
public class CommandlineTest extends TestCase { | |||
public CommandlineTest(String name) { | |||
super(name); | |||
} | |||
public void testTokenizer() { | |||
String[] s = Commandline.translateCommandline("1 2 3"); | |||
assertEquals("Simple case", 3, s.length); | |||
for (int i=0; i<3; i++) { | |||
assertEquals(""+(i+1), s[i]); | |||
} | |||
s = Commandline.translateCommandline(""); | |||
assertEquals("empty string", 0, s.length); | |||
s = Commandline.translateCommandline(null); | |||
assertEquals("null", 0, s.length); | |||
s = Commandline.translateCommandline("1 \'2\' 3"); | |||
assertEquals("Simple case with single quotes", 3, s.length); | |||
assertEquals("Single quotes have been stripped", "2", s[1]); | |||
s = Commandline.translateCommandline("1 \"2\" 3"); | |||
assertEquals("Simple case with double quotes", 3, s.length); | |||
assertEquals("Double quotes have been stripped", "2", s[1]); | |||
s = Commandline.translateCommandline("1 \"2 3\" 4"); | |||
assertEquals("Case with double quotes and whitespace", 3, s.length); | |||
assertEquals("Double quotes stripped, space included", "2 3", s[1]); | |||
s = Commandline.translateCommandline("1 \"2\'3\" 4"); | |||
assertEquals("Case with double quotes around single quote", 3, s.length); | |||
assertEquals("Double quotes stripped, single quote included", "2\'3", | |||
s[1]); | |||
s = Commandline.translateCommandline("1 \'2 3\' 4"); | |||
assertEquals("Case with single quotes and whitespace", 3, s.length); | |||
assertEquals("Single quotes stripped, space included", "2 3", s[1]); | |||
s = Commandline.translateCommandline("1 \'2\"3\' 4"); | |||
assertEquals("Case with single quotes around double quote", 3, s.length); | |||
assertEquals("Single quotes stripped, double quote included", "2\"3", | |||
s[1]); | |||
s = Commandline.translateCommandline("1 2\\ 3 4"); | |||
assertEquals("Case with quoted whitespace", 3, s.length); | |||
assertEquals("space included", "2 3", s[1]); | |||
s = Commandline.translateCommandline("1 2\\\'3 4"); | |||
assertEquals("Case with quoted single quote", 3, s.length); | |||
assertEquals("single quote included", "2\'3", s[1]); | |||
s = Commandline.translateCommandline("1 2\\\"3 4"); | |||
assertEquals("Case with quoted double quote", 3, s.length); | |||
assertEquals("double quote included", "2\"3", s[1]); | |||
s = Commandline.translateCommandline("1 2\\\\3 4"); | |||
assertEquals("Case with quoted backslash", 3, s.length); | |||
assertEquals("backslash included", "2\\3", s[1]); | |||
// now to the expected failures | |||
try { | |||
s = Commandline.translateCommandline("a \\"); | |||
fail("stray \\ undetected"); | |||
} catch (BuildException be) { | |||
assertEquals("stray backslash in a \\", be.getMessage()); | |||
} | |||
try { | |||
s = Commandline.translateCommandline("a \'b c"); | |||
fail("unbalanced single quotes undetected"); | |||
} catch (BuildException be) { | |||
assertEquals("unbalanced quotes in a \'b c", be.getMessage()); | |||
} | |||
try { | |||
s = Commandline.translateCommandline("a \"b c"); | |||
fail("unbalanced double quotes undetected"); | |||
} catch (BuildException be) { | |||
assertEquals("unbalanced quotes in a \"b c", be.getMessage()); | |||
} | |||
} | |||
public void testToString() { | |||
assertEquals("", Commandline.toString(new String[0])); | |||
assertEquals("", Commandline.toString(null)); | |||
assertEquals("1 2 3", Commandline.toString(new String[] {"1", "2", "3"})); | |||
assertEquals("1 \"2 3\"", Commandline.toString(new String[] {"1", "2 3"})); | |||
assertEquals("1 \"2\'3\"", Commandline.toString(new String[] {"1", "2\'3"})); | |||
assertEquals("1 \'2\"3\'", Commandline.toString(new String[] {"1", "2\"3"})); | |||
} | |||
} |