/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
*
Will be ignored if we are not forking a new VM. * * @since Ant 1.5 */ public void addEnv(Environment.Variable var) { env.addVariable(var); } /** * Use a completely new environment. * *
Will be ignored if we are not forking a new VM. * * @since Ant 1.5 */ public void setNewenvironment(boolean newenv) { newEnvironment = newenv; } /** * Shall we append to an existing file? * * @since Ant 1.5 */ public void setAppend(boolean append) { this.append = append; } /** * Timeout in milliseconds after which the process will be killed. * * @since Ant 1.5 */ public void setTimeout(Long value) { timeout = value; } /** * Pass output sent to System.out to specified output file. * * @since Ant 1.5 */ protected void handleOutput(String line) { if (outStream != null) { outStream.println(line); } else { super.handleOutput(line); } } /** * Pass output sent to System.err to specified output file. * * @since Ant 1.5 */ protected void handleErrorOutput(String line) { if (outStream != null) { outStream.println(line); } else { super.handleErrorOutput(line); } } /** * Executes the given classname with the given arguments as it * was a command line application. */ private void run(CommandlineJava command) throws BuildException { ExecuteJava exe = new ExecuteJava(); exe.setJavaCommand(command.getJavaCommand()); exe.setClasspath(command.getClasspath()); exe.setSystemProperties(command.getSystemProperties()); exe.setTimeout(timeout); if (out != null) { try { outStream = new PrintStream(new FileOutputStream(out.getAbsolutePath(), append)); exe.execute(project); } catch (IOException io) { throw new BuildException(io, location); } finally { if (outStream != null) { outStream.close(); } } } else { exe.execute(project); } } /** * Executes the given classname with the given arguments in a separate VM. */ private int run(String[] command) throws BuildException { FileOutputStream fos = null; try { Execute exe = null; if (out == null) { exe = new Execute(new LogStreamHandler(this, Project.MSG_INFO, Project.MSG_WARN), createWatchdog()); } else { fos = new FileOutputStream(out.getAbsolutePath(), append); exe = new Execute(new PumpStreamHandler(fos), createWatchdog()); } exe.setAntRun(project); if (dir == null) { dir = project.getBaseDir(); } else if (!dir.exists() || !dir.isDirectory()) { throw new BuildException(dir.getAbsolutePath() + " is not a valid directory", location); } exe.setWorkingDirectory(dir); String[] environment = env.getVariables(); if (environment != null) { for (int i = 0; i < environment.length; i++) { log("Setting environment variable: " + environment[i], Project.MSG_VERBOSE); } } exe.setNewenvironment(newEnvironment); exe.setEnvironment(environment); exe.setCommandline(command); try { int rc = exe.execute(); if (exe.killedProcess()) { log("Timeout: killed the sub-process", Project.MSG_WARN); } return rc; } catch (IOException e) { throw new BuildException(e, location); } } catch (IOException io) { throw new BuildException(io, location); } finally { if (fos != null) { try {fos.close();} catch (IOException io) {} } } } /** * Executes the given classname with the given arguments as it * was a command line application. */ protected void run(String classname, Vector args) throws BuildException { CommandlineJava cmdj = new CommandlineJava(); cmdj.setClassname(classname); for (int i = 0; i < args.size(); i++) { cmdj.createArgument().setValue((String) args.elementAt(i)); } run(cmdj); } /** * Clear out the arguments to this java task. */ public void clearArgs() { cmdl.clearJavaArgs(); } /** * Create the Watchdog to kill a runaway process. * * @since Ant 1.5 */ protected ExecuteWatchdog createWatchdog() throws BuildException { if (timeout == null) { return null; } return new ExecuteWatchdog(timeout.longValue()); } }