git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270266 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -0,0 +1,66 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.types.Commandline; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import java.io.IOException; | |||||
| import java.io.File; | |||||
| /** | |||||
| * A command launcher for a particular JVM/OS platform. This class is a | |||||
| * general purpose command launcher which can only launch commands in the | |||||
| * current working directory. | |||||
| */ | |||||
| class CommandLauncher | |||||
| { | |||||
| /** | |||||
| * Launches the given command in a new process. | |||||
| * | |||||
| * @param project The project that the command is part of | |||||
| * @param cmd The command to execute | |||||
| * @param env The environment for the new process. If null, the | |||||
| * environment of the current proccess is used. | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| if( project != null ) | |||||
| { | |||||
| project.log( "Execute:CommandLauncher: " + | |||||
| Commandline.toString( cmd ), Project.MSG_DEBUG ); | |||||
| } | |||||
| return Runtime.getRuntime().exec( cmd, env ); | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process, in the given working | |||||
| * directory. | |||||
| * | |||||
| * @param project The project that the command is part of | |||||
| * @param cmd The command to execute | |||||
| * @param env The environment for the new process. If null, the | |||||
| * environment of the current proccess is used. | |||||
| * @param workingDir The directory to start the command in. If null, the | |||||
| * current directory is used | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env, File workingDir ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| if( workingDir == null ) | |||||
| { | |||||
| return exec( project, cmd, env ); | |||||
| } | |||||
| throw new IOException( "Cannot execute a process in different directory under this JVM" ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,44 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * A command launcher that proxies another command launcher. Sub-classes | |||||
| * override exec(args, env, workdir) | |||||
| */ | |||||
| class CommandLauncherProxy | |||||
| extends CommandLauncher | |||||
| { | |||||
| private CommandLauncher _launcher; | |||||
| CommandLauncherProxy( CommandLauncher launcher ) | |||||
| { | |||||
| _launcher = launcher; | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process. Delegates this method to | |||||
| * the proxied launcher | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| return _launcher.exec( project, cmd, env ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,48 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.types.Commandline; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * A command launcher for JDK/JRE 1.1 under Windows. Fixes quoting problems | |||||
| * in Runtime.exec(). Can only launch commands in the current working | |||||
| * directory | |||||
| */ | |||||
| class Java11CommandLauncher | |||||
| extends CommandLauncher | |||||
| { | |||||
| /** | |||||
| * Launches the given command in a new process. Needs to quote arguments | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| // Need to quote arguments with spaces, and to escape quote characters | |||||
| String[] newcmd = new String[ cmd.length ]; | |||||
| for( int i = 0; i < cmd.length; i++ ) | |||||
| { | |||||
| newcmd[ i ] = Commandline.quoteArgument( cmd[ i ] ); | |||||
| } | |||||
| if( project != null ) | |||||
| { | |||||
| project.log( "Execute:Java11CommandLauncher: " + | |||||
| Commandline.toString( newcmd ), Project.MSG_DEBUG ); | |||||
| } | |||||
| return Runtime.getRuntime().exec( newcmd, env ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,83 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import java.lang.reflect.Method; | |||||
| import java.lang.reflect.InvocationTargetException; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.types.Commandline; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| /** | |||||
| * A command launcher for JDK/JRE 1.3 (and higher). Uses the built-in | |||||
| * Runtime.exec() command | |||||
| * | |||||
| * @author RT | |||||
| */ | |||||
| class Java13CommandLauncher | |||||
| extends CommandLauncher | |||||
| { | |||||
| private Method _execWithCWD; | |||||
| public Java13CommandLauncher() | |||||
| throws NoSuchMethodException | |||||
| { | |||||
| // Locate method Runtime.exec(String[] cmdarray, String[] envp, File dir) | |||||
| _execWithCWD = Runtime.class.getMethod( "exec", new Class[]{String[].class, String[].class, File.class} ); | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process, in the given working | |||||
| * directory | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @param workingDir Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env, File workingDir ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| try | |||||
| { | |||||
| if( project != null ) | |||||
| { | |||||
| project.log( "Execute:Java13CommandLauncher: " + | |||||
| Commandline.toString( cmd ), Project.MSG_DEBUG ); | |||||
| } | |||||
| Object[] arguments = {cmd, env, workingDir}; | |||||
| return (Process)_execWithCWD.invoke( Runtime.getRuntime(), arguments ); | |||||
| } | |||||
| catch( InvocationTargetException exc ) | |||||
| { | |||||
| Throwable realexc = exc.getTargetException(); | |||||
| if( realexc instanceof ThreadDeath ) | |||||
| { | |||||
| throw (ThreadDeath)realexc; | |||||
| } | |||||
| else if( realexc instanceof IOException ) | |||||
| { | |||||
| throw (IOException)realexc; | |||||
| } | |||||
| else | |||||
| { | |||||
| throw new TaskException( "Unable to execute command", realexc ); | |||||
| } | |||||
| } | |||||
| catch( Exception exc ) | |||||
| { | |||||
| // IllegalAccess, IllegalArgument, ClassCast | |||||
| throw new TaskException( "Unable to execute command", exc ); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,56 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * A command launcher for Mac that uses a dodgy mechanism to change working | |||||
| * directory before launching commands. | |||||
| */ | |||||
| class MacCommandLauncher | |||||
| extends CommandLauncherProxy | |||||
| { | |||||
| MacCommandLauncher( CommandLauncher launcher ) | |||||
| { | |||||
| super( launcher ); | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process, in the given working | |||||
| * directory | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @param workingDir Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env, File workingDir ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| if( workingDir == null ) | |||||
| { | |||||
| return exec( project, cmd, env ); | |||||
| } | |||||
| System.getProperties().put( "user.dir", workingDir.getAbsolutePath() ); | |||||
| try | |||||
| { | |||||
| return exec( project, cmd, env ); | |||||
| } | |||||
| finally | |||||
| { | |||||
| System.getProperties().put( "user.dir", Execute.antWorkingDirectory ); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,78 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import org.apache.avalon.excalibur.io.FileUtil; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * A command launcher that uses an auxiliary perl script to launch commands | |||||
| * in directories other than the current working directory. | |||||
| */ | |||||
| class PerlScriptCommandLauncher | |||||
| extends CommandLauncherProxy | |||||
| { | |||||
| private String _script; | |||||
| PerlScriptCommandLauncher( String script, CommandLauncher launcher ) | |||||
| { | |||||
| super( launcher ); | |||||
| _script = script; | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process, in the given working | |||||
| * directory | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @param workingDir Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env, File workingDir ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| if( project == null ) | |||||
| { | |||||
| if( workingDir == null ) | |||||
| { | |||||
| return exec( project, cmd, env ); | |||||
| } | |||||
| throw new IOException( "Cannot locate antRun script: No project provided" ); | |||||
| } | |||||
| // Locate the auxiliary script | |||||
| String antHome = project.getProperty( "ant.home" ); | |||||
| if( antHome == null ) | |||||
| { | |||||
| throw new IOException( "Cannot locate antRun script: Property 'ant.home' not found" ); | |||||
| } | |||||
| String antRun = FileUtil. | |||||
| resolveFile( project.getBaseDir(), antHome + File.separator + _script ).toString(); | |||||
| // Build the command | |||||
| File commandDir = workingDir; | |||||
| if( workingDir == null && project != null ) | |||||
| { | |||||
| commandDir = project.getBaseDir(); | |||||
| } | |||||
| String[] newcmd = new String[ cmd.length + 3 ]; | |||||
| newcmd[ 0 ] = "perl"; | |||||
| newcmd[ 1 ] = antRun; | |||||
| newcmd[ 2 ] = commandDir.getAbsolutePath(); | |||||
| System.arraycopy( cmd, 0, newcmd, 3, cmd.length ); | |||||
| return exec( project, newcmd, env ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,77 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import org.apache.avalon.excalibur.io.FileUtil; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * A command launcher that uses an auxiliary script to launch commands in | |||||
| * directories other than the current working directory. | |||||
| */ | |||||
| class ScriptCommandLauncher | |||||
| extends CommandLauncherProxy | |||||
| { | |||||
| private String _script; | |||||
| ScriptCommandLauncher( String script, CommandLauncher launcher ) | |||||
| { | |||||
| super( launcher ); | |||||
| _script = script; | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process, in the given working | |||||
| * directory | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @param workingDir Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env, File workingDir ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| if( project == null ) | |||||
| { | |||||
| if( workingDir == null ) | |||||
| { | |||||
| return exec( project, cmd, env ); | |||||
| } | |||||
| throw new IOException( "Cannot locate antRun script: No project provided" ); | |||||
| } | |||||
| // Locate the auxiliary script | |||||
| String antHome = project.getProperty( "ant.home" ); | |||||
| if( antHome == null ) | |||||
| { | |||||
| throw new IOException( "Cannot locate antRun script: Property 'ant.home' not found" ); | |||||
| } | |||||
| String antRun = FileUtil. | |||||
| resolveFile( project.getBaseDir(), antHome + File.separator + _script ).toString(); | |||||
| // Build the command | |||||
| File commandDir = workingDir; | |||||
| if( workingDir == null && project != null ) | |||||
| { | |||||
| commandDir = project.getBaseDir(); | |||||
| } | |||||
| String[] newcmd = new String[ cmd.length + 2 ]; | |||||
| newcmd[ 0 ] = antRun; | |||||
| newcmd[ 1 ] = commandDir.getAbsolutePath(); | |||||
| System.arraycopy( cmd, 0, newcmd, 2, cmd.length ); | |||||
| return exec( project, newcmd, env ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,68 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * A command launcher for Windows 2000/NT that uses 'cmd.exe' when launching | |||||
| * commands in directories other than the current working directory. | |||||
| */ | |||||
| class WinNTCommandLauncher | |||||
| extends CommandLauncherProxy | |||||
| { | |||||
| WinNTCommandLauncher( CommandLauncher launcher ) | |||||
| { | |||||
| super( launcher ); | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process, in the given working | |||||
| * directory. | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @param workingDir Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env, File workingDir ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| File commandDir = workingDir; | |||||
| if( workingDir == null ) | |||||
| { | |||||
| if( project != null ) | |||||
| { | |||||
| commandDir = project.getBaseDir(); | |||||
| } | |||||
| else | |||||
| { | |||||
| return exec( project, cmd, env ); | |||||
| } | |||||
| } | |||||
| // Use cmd.exe to change to the specified directory before running | |||||
| // the command | |||||
| final int preCmdLength = 6; | |||||
| String[] newcmd = new String[ cmd.length + preCmdLength ]; | |||||
| newcmd[ 0 ] = "cmd"; | |||||
| newcmd[ 1 ] = "/c"; | |||||
| newcmd[ 2 ] = "cd"; | |||||
| newcmd[ 3 ] = "/d"; | |||||
| newcmd[ 4 ] = commandDir.getAbsolutePath(); | |||||
| newcmd[ 5 ] = "&&"; | |||||
| System.arraycopy( cmd, 0, newcmd, preCmdLength, cmd.length ); | |||||
| return exec( project, newcmd, env ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,66 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.types.Commandline; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import java.io.IOException; | |||||
| import java.io.File; | |||||
| /** | |||||
| * A command launcher for a particular JVM/OS platform. This class is a | |||||
| * general purpose command launcher which can only launch commands in the | |||||
| * current working directory. | |||||
| */ | |||||
| class CommandLauncher | |||||
| { | |||||
| /** | |||||
| * Launches the given command in a new process. | |||||
| * | |||||
| * @param project The project that the command is part of | |||||
| * @param cmd The command to execute | |||||
| * @param env The environment for the new process. If null, the | |||||
| * environment of the current proccess is used. | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| if( project != null ) | |||||
| { | |||||
| project.log( "Execute:CommandLauncher: " + | |||||
| Commandline.toString( cmd ), Project.MSG_DEBUG ); | |||||
| } | |||||
| return Runtime.getRuntime().exec( cmd, env ); | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process, in the given working | |||||
| * directory. | |||||
| * | |||||
| * @param project The project that the command is part of | |||||
| * @param cmd The command to execute | |||||
| * @param env The environment for the new process. If null, the | |||||
| * environment of the current proccess is used. | |||||
| * @param workingDir The directory to start the command in. If null, the | |||||
| * current directory is used | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env, File workingDir ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| if( workingDir == null ) | |||||
| { | |||||
| return exec( project, cmd, env ); | |||||
| } | |||||
| throw new IOException( "Cannot execute a process in different directory under this JVM" ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,44 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * A command launcher that proxies another command launcher. Sub-classes | |||||
| * override exec(args, env, workdir) | |||||
| */ | |||||
| class CommandLauncherProxy | |||||
| extends CommandLauncher | |||||
| { | |||||
| private CommandLauncher _launcher; | |||||
| CommandLauncherProxy( CommandLauncher launcher ) | |||||
| { | |||||
| _launcher = launcher; | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process. Delegates this method to | |||||
| * the proxied launcher | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| return _launcher.exec( project, cmd, env ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,48 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.types.Commandline; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * A command launcher for JDK/JRE 1.1 under Windows. Fixes quoting problems | |||||
| * in Runtime.exec(). Can only launch commands in the current working | |||||
| * directory | |||||
| */ | |||||
| class Java11CommandLauncher | |||||
| extends CommandLauncher | |||||
| { | |||||
| /** | |||||
| * Launches the given command in a new process. Needs to quote arguments | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| // Need to quote arguments with spaces, and to escape quote characters | |||||
| String[] newcmd = new String[ cmd.length ]; | |||||
| for( int i = 0; i < cmd.length; i++ ) | |||||
| { | |||||
| newcmd[ i ] = Commandline.quoteArgument( cmd[ i ] ); | |||||
| } | |||||
| if( project != null ) | |||||
| { | |||||
| project.log( "Execute:Java11CommandLauncher: " + | |||||
| Commandline.toString( newcmd ), Project.MSG_DEBUG ); | |||||
| } | |||||
| return Runtime.getRuntime().exec( newcmd, env ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,83 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import java.lang.reflect.Method; | |||||
| import java.lang.reflect.InvocationTargetException; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.types.Commandline; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| /** | |||||
| * A command launcher for JDK/JRE 1.3 (and higher). Uses the built-in | |||||
| * Runtime.exec() command | |||||
| * | |||||
| * @author RT | |||||
| */ | |||||
| class Java13CommandLauncher | |||||
| extends CommandLauncher | |||||
| { | |||||
| private Method _execWithCWD; | |||||
| public Java13CommandLauncher() | |||||
| throws NoSuchMethodException | |||||
| { | |||||
| // Locate method Runtime.exec(String[] cmdarray, String[] envp, File dir) | |||||
| _execWithCWD = Runtime.class.getMethod( "exec", new Class[]{String[].class, String[].class, File.class} ); | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process, in the given working | |||||
| * directory | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @param workingDir Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env, File workingDir ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| try | |||||
| { | |||||
| if( project != null ) | |||||
| { | |||||
| project.log( "Execute:Java13CommandLauncher: " + | |||||
| Commandline.toString( cmd ), Project.MSG_DEBUG ); | |||||
| } | |||||
| Object[] arguments = {cmd, env, workingDir}; | |||||
| return (Process)_execWithCWD.invoke( Runtime.getRuntime(), arguments ); | |||||
| } | |||||
| catch( InvocationTargetException exc ) | |||||
| { | |||||
| Throwable realexc = exc.getTargetException(); | |||||
| if( realexc instanceof ThreadDeath ) | |||||
| { | |||||
| throw (ThreadDeath)realexc; | |||||
| } | |||||
| else if( realexc instanceof IOException ) | |||||
| { | |||||
| throw (IOException)realexc; | |||||
| } | |||||
| else | |||||
| { | |||||
| throw new TaskException( "Unable to execute command", realexc ); | |||||
| } | |||||
| } | |||||
| catch( Exception exc ) | |||||
| { | |||||
| // IllegalAccess, IllegalArgument, ClassCast | |||||
| throw new TaskException( "Unable to execute command", exc ); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,56 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * A command launcher for Mac that uses a dodgy mechanism to change working | |||||
| * directory before launching commands. | |||||
| */ | |||||
| class MacCommandLauncher | |||||
| extends CommandLauncherProxy | |||||
| { | |||||
| MacCommandLauncher( CommandLauncher launcher ) | |||||
| { | |||||
| super( launcher ); | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process, in the given working | |||||
| * directory | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @param workingDir Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env, File workingDir ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| if( workingDir == null ) | |||||
| { | |||||
| return exec( project, cmd, env ); | |||||
| } | |||||
| System.getProperties().put( "user.dir", workingDir.getAbsolutePath() ); | |||||
| try | |||||
| { | |||||
| return exec( project, cmd, env ); | |||||
| } | |||||
| finally | |||||
| { | |||||
| System.getProperties().put( "user.dir", Execute.antWorkingDirectory ); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,78 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import org.apache.avalon.excalibur.io.FileUtil; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * A command launcher that uses an auxiliary perl script to launch commands | |||||
| * in directories other than the current working directory. | |||||
| */ | |||||
| class PerlScriptCommandLauncher | |||||
| extends CommandLauncherProxy | |||||
| { | |||||
| private String _script; | |||||
| PerlScriptCommandLauncher( String script, CommandLauncher launcher ) | |||||
| { | |||||
| super( launcher ); | |||||
| _script = script; | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process, in the given working | |||||
| * directory | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @param workingDir Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env, File workingDir ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| if( project == null ) | |||||
| { | |||||
| if( workingDir == null ) | |||||
| { | |||||
| return exec( project, cmd, env ); | |||||
| } | |||||
| throw new IOException( "Cannot locate antRun script: No project provided" ); | |||||
| } | |||||
| // Locate the auxiliary script | |||||
| String antHome = project.getProperty( "ant.home" ); | |||||
| if( antHome == null ) | |||||
| { | |||||
| throw new IOException( "Cannot locate antRun script: Property 'ant.home' not found" ); | |||||
| } | |||||
| String antRun = FileUtil. | |||||
| resolveFile( project.getBaseDir(), antHome + File.separator + _script ).toString(); | |||||
| // Build the command | |||||
| File commandDir = workingDir; | |||||
| if( workingDir == null && project != null ) | |||||
| { | |||||
| commandDir = project.getBaseDir(); | |||||
| } | |||||
| String[] newcmd = new String[ cmd.length + 3 ]; | |||||
| newcmd[ 0 ] = "perl"; | |||||
| newcmd[ 1 ] = antRun; | |||||
| newcmd[ 2 ] = commandDir.getAbsolutePath(); | |||||
| System.arraycopy( cmd, 0, newcmd, 3, cmd.length ); | |||||
| return exec( project, newcmd, env ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,77 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import org.apache.avalon.excalibur.io.FileUtil; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * A command launcher that uses an auxiliary script to launch commands in | |||||
| * directories other than the current working directory. | |||||
| */ | |||||
| class ScriptCommandLauncher | |||||
| extends CommandLauncherProxy | |||||
| { | |||||
| private String _script; | |||||
| ScriptCommandLauncher( String script, CommandLauncher launcher ) | |||||
| { | |||||
| super( launcher ); | |||||
| _script = script; | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process, in the given working | |||||
| * directory | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @param workingDir Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env, File workingDir ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| if( project == null ) | |||||
| { | |||||
| if( workingDir == null ) | |||||
| { | |||||
| return exec( project, cmd, env ); | |||||
| } | |||||
| throw new IOException( "Cannot locate antRun script: No project provided" ); | |||||
| } | |||||
| // Locate the auxiliary script | |||||
| String antHome = project.getProperty( "ant.home" ); | |||||
| if( antHome == null ) | |||||
| { | |||||
| throw new IOException( "Cannot locate antRun script: Property 'ant.home' not found" ); | |||||
| } | |||||
| String antRun = FileUtil. | |||||
| resolveFile( project.getBaseDir(), antHome + File.separator + _script ).toString(); | |||||
| // Build the command | |||||
| File commandDir = workingDir; | |||||
| if( workingDir == null && project != null ) | |||||
| { | |||||
| commandDir = project.getBaseDir(); | |||||
| } | |||||
| String[] newcmd = new String[ cmd.length + 2 ]; | |||||
| newcmd[ 0 ] = antRun; | |||||
| newcmd[ 1 ] = commandDir.getAbsolutePath(); | |||||
| System.arraycopy( cmd, 0, newcmd, 2, cmd.length ); | |||||
| return exec( project, newcmd, env ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,68 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.exec; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * A command launcher for Windows 2000/NT that uses 'cmd.exe' when launching | |||||
| * commands in directories other than the current working directory. | |||||
| */ | |||||
| class WinNTCommandLauncher | |||||
| extends CommandLauncherProxy | |||||
| { | |||||
| WinNTCommandLauncher( CommandLauncher launcher ) | |||||
| { | |||||
| super( launcher ); | |||||
| } | |||||
| /** | |||||
| * Launches the given command in a new process, in the given working | |||||
| * directory. | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param cmd Description of Parameter | |||||
| * @param env Description of Parameter | |||||
| * @param workingDir Description of Parameter | |||||
| * @return Description of the Returned Value | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public Process exec( Project project, String[] cmd, String[] env, File workingDir ) | |||||
| throws IOException, TaskException | |||||
| { | |||||
| File commandDir = workingDir; | |||||
| if( workingDir == null ) | |||||
| { | |||||
| if( project != null ) | |||||
| { | |||||
| commandDir = project.getBaseDir(); | |||||
| } | |||||
| else | |||||
| { | |||||
| return exec( project, cmd, env ); | |||||
| } | |||||
| } | |||||
| // Use cmd.exe to change to the specified directory before running | |||||
| // the command | |||||
| final int preCmdLength = 6; | |||||
| String[] newcmd = new String[ cmd.length + preCmdLength ]; | |||||
| newcmd[ 0 ] = "cmd"; | |||||
| newcmd[ 1 ] = "/c"; | |||||
| newcmd[ 2 ] = "cd"; | |||||
| newcmd[ 3 ] = "/d"; | |||||
| newcmd[ 4 ] = commandDir.getAbsolutePath(); | |||||
| newcmd[ 5 ] = "&&"; | |||||
| System.arraycopy( cmd, 0, newcmd, preCmdLength, cmd.length ); | |||||
| return exec( project, newcmd, env ); | |||||
| } | |||||
| } | |||||