/* * 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", "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 * . */ package org.apache.tools.ant.taskdefs; import org.apache.tools.ant.Task; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.Commandline; import org.apache.tools.ant.types.Environment; import java.io.File; import java.io.FileOutputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.BufferedReader; import java.io.StringReader; import java.io.FileNotFoundException; /** * 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 Stefan Bodewig * @author Mariusz Nowostawski */ public class ExecTask extends Task { private static String lSep = System.getProperty("line.separator"); private String os; private File out; private File dir; protected boolean failOnError = false; protected boolean newEnvironment = false; private Integer timeout = null; private Environment env = new Environment(); protected Commandline cmdl = new Commandline(); private FileOutputStream fos = null; private ByteArrayOutputStream baos = null; private String outputprop; /** Controls whether the VM (1.3 and above) is used to execute the command */ private boolean vmLauncher = true; /** * Timeout in milliseconds after which the process will be killed. */ public void setTimeout(Integer value) { timeout = value; } /** * The command to execute. */ public void setExecutable(String value) { cmdl.setExecutable(value); } /** * The working directory of the process */ public void setDir(File d) { this.dir = d; } /** * Only execute the process if os.name is included in this string. */ public void setOs(String os) { this.os = os; } /** * The full commandline to execute, executable + arguments. */ public void setCommand(Commandline cmdl) { log("The command attribute is deprecated. " + "Please use the executable attribute and nested arg elements.", Project.MSG_WARN); this.cmdl = cmdl; } /** * File the output of the process is redirected to. */ public void setOutput(File out) { this.out = out; } /** * Property name whose value should be set to the output of * the process */ public void setOutputproperty(String outputprop) { this.outputprop = outputprop; } /** * Throw a BuildException if process returns non 0. */ public void setFailonerror(boolean fail) { failOnError = fail; } /** * Use a completely new environment */ public void setNewenvironment(boolean newenv) { newEnvironment = newenv; } /** * Add a nested env element - an environment variable. */ public void addEnv(Environment.Variable var) { env.addVariable(var); } /** * Add a nested arg element - a command line argument. */ public Commandline.Argument createArg() { return cmdl.createArgument(); } /** * Do the work. */ public void execute() throws BuildException { checkConfiguration(); if (isValidOs()) { runExec(prepareExec()); } } /** * Has the user set all necessary attributes? */ protected void checkConfiguration() throws BuildException { if (cmdl.getExecutable() == null) { throw new BuildException("no executable specified", location); } if (dir != null && !dir.exists()) { throw new BuildException("The directory you specified does not exist"); } if (dir != null && !dir.isDirectory()) { throw new BuildException("The directory you specified is not a directory"); } } /** * Is this the OS the user wanted? */ protected boolean isValidOs() { // test if os match String myos = System.getProperty("os.name"); log("Current OS is " + myos, Project.MSG_VERBOSE); if ((os != null) && (os.indexOf(myos) < 0)){ // this command will be executed only on the specified OS log("This OS, " + myos + " was not found in the specified list of valid OSes: " + os, Project.MSG_VERBOSE); return false; } return true; } /** * Control whether the VM is used to launch the new process or * whether the OS's shell is used. */ public void setVMLauncher(boolean vmLauncher) { this.vmLauncher = vmLauncher; } /** * Create an Execute instance with the correct working directory set. */ protected Execute prepareExec() throws BuildException { // default directory to the project's base directory if (dir == null) dir = project.getBaseDir(); // show the command log(cmdl.toString(), Project.MSG_VERBOSE); Execute exe = new Execute(createHandler(), createWatchdog()); exe.setAntRun(project); exe.setWorkingDirectory(dir); exe.setVMLauncher(vmLauncher); String[] environment = env.getVariables(); if (environment != null) { for (int i=0; i