git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270335 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -8,7 +8,6 @@ | |||
| package org.apache.myrmidon.framework.exec; | |||
| import java.io.IOException; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * This is the interface implemented by objects which are capable of | |||
| @@ -32,9 +31,9 @@ public interface CommandLauncher | |||
| * launch the application for some reason. Usually due | |||
| * to the command not being fully specified and not in | |||
| * the PATH env var. | |||
| * @exception TaskException if the command launcher detects that | |||
| * @exception ExecException if the command launcher detects that | |||
| * it can not execute the native command for some reason. | |||
| */ | |||
| Process exec( ExecMetaData metaData ) | |||
| throws IOException, TaskException; | |||
| throws IOException, ExecException; | |||
| } | |||
| @@ -15,8 +15,8 @@ import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| import java.util.Locale; | |||
| import java.util.Properties; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.Os; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.tools.ant.taskdefs.exec.Execute; | |||
| import org.apache.tools.ant.taskdefs.exec.PumpStreamHandler; | |||
| @@ -49,7 +49,7 @@ public final class Environment | |||
| } | |||
| public static String[] toNativeFormat( final Properties environment ) | |||
| throws TaskException | |||
| throws ExecException | |||
| { | |||
| final ArrayList newEnvironment = new ArrayList(); | |||
| @@ -68,7 +68,7 @@ public final class Environment | |||
| * @deprecated Dont use me!!! | |||
| */ | |||
| public static Properties createEnvVars( final String[] environment ) | |||
| throws TaskException | |||
| throws ExecException | |||
| { | |||
| final Properties newEnvironment = new Properties(); | |||
| @@ -82,7 +82,7 @@ public final class Environment | |||
| } | |||
| public static void addNativeEnvironment( final Properties environment ) | |||
| throws TaskException, IOException | |||
| throws ExecException, IOException | |||
| { | |||
| final Properties nativeEnvironment = getEnvironmentVariables(); | |||
| final Iterator nativeKeys = nativeEnvironment.keySet().iterator(); | |||
| @@ -105,7 +105,7 @@ public final class Environment | |||
| * native EnvironmentData Variables for the current process. | |||
| */ | |||
| private static String[] getNativeEnvironmentAsArray() | |||
| throws IOException, TaskException | |||
| throws IOException, ExecException | |||
| { | |||
| final Properties environment = getEnvironmentVariables(); | |||
| @@ -128,7 +128,7 @@ public final class Environment | |||
| * native EnvironmentData Variables for the current process. | |||
| */ | |||
| public static Properties getNativeEnvironment() | |||
| throws IOException, TaskException | |||
| throws IOException, ExecException | |||
| { | |||
| return new Properties( getEnvironmentVariables() ); | |||
| } | |||
| @@ -138,7 +138,7 @@ public final class Environment | |||
| * attempt to load it if it has not already been loaded. | |||
| */ | |||
| private synchronized static Properties getEnvironmentVariables() | |||
| throws IOException, TaskException | |||
| throws IOException, ExecException | |||
| { | |||
| if( null == c_procEnvironment ) | |||
| { | |||
| @@ -152,7 +152,7 @@ public final class Environment | |||
| * Retrieve a last of environment variables from the native OS. | |||
| */ | |||
| private static synchronized Properties retrieveEnvironmentVariables() | |||
| throws IOException, TaskException | |||
| throws IOException, ExecException | |||
| { | |||
| final Properties properties = new Properties(); | |||
| final String data = getEnvironmentText(); | |||
| @@ -198,7 +198,7 @@ public final class Environment | |||
| */ | |||
| private static void addProperty( final Properties properties, | |||
| final String data ) | |||
| throws TaskException | |||
| throws ExecException | |||
| { | |||
| final int index = data.indexOf( '=' ); | |||
| if( -1 == index ) | |||
| @@ -206,7 +206,7 @@ public final class Environment | |||
| //Our env variable does not have any = in it. | |||
| final String message = "EnvironmentData variable '" + data + | |||
| "' does not have a '=' character in it"; | |||
| throw new TaskException( message ); | |||
| throw new ExecException( message ); | |||
| } | |||
| else | |||
| { | |||
| @@ -221,7 +221,7 @@ public final class Environment | |||
| * running the environment command. | |||
| */ | |||
| private static String getEnvironmentText() | |||
| throws IOException, TaskException | |||
| throws IOException, ExecException | |||
| { | |||
| final ByteArrayOutputStream output = new ByteArrayOutputStream(); | |||
| final Execute exe = new Execute( new PumpStreamHandler( output ) ); | |||
| @@ -230,10 +230,17 @@ public final class Environment | |||
| // Make sure we do not recurse forever | |||
| exe.setNewenvironment( true ); | |||
| final int retval = exe.execute(); | |||
| if( retval != 0 ) | |||
| try | |||
| { | |||
| final int retval = exe.execute(); | |||
| if( retval != 0 ) | |||
| { | |||
| // Just try to use what we got | |||
| } | |||
| } | |||
| catch( final TaskException te ) | |||
| { | |||
| // Just try to use what we got | |||
| throw new ExecException( te.getMessage(), te ); | |||
| } | |||
| return output.toString(); | |||
| @@ -244,7 +251,7 @@ public final class Environment | |||
| * variables. | |||
| */ | |||
| private static String[] getEnvCommand() | |||
| throws TaskException | |||
| throws ExecException | |||
| { | |||
| if( Os.isFamily( "os/2" ) ) | |||
| { | |||
| @@ -280,7 +287,7 @@ public final class Environment | |||
| { | |||
| final String message = | |||
| "Unable to determine native environment variables"; | |||
| throw new TaskException( message ); | |||
| throw new ExecException( message ); | |||
| } | |||
| } | |||
| } | |||
| @@ -10,7 +10,6 @@ package org.apache.myrmidon.framework.exec; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.io.OutputStream; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * Interface via which clients can request that a native | |||
| @@ -53,5 +52,5 @@ public interface ExecManager | |||
| OutputStream output, | |||
| OutputStream error, | |||
| long timeout ) | |||
| throws IOException, TaskException /*TimeoutException*/; | |||
| throws IOException, ExecException /*TimeoutException*/; | |||
| } | |||
| @@ -11,8 +11,8 @@ import java.io.File; | |||
| import java.io.IOException; | |||
| import java.lang.reflect.InvocationTargetException; | |||
| import java.lang.reflect.Method; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.exec.CommandLauncher; | |||
| import org.apache.myrmidon.framework.exec.ExecException; | |||
| import org.apache.myrmidon.framework.exec.ExecMetaData; | |||
| /** | |||
| @@ -56,11 +56,11 @@ public class DefaultCommandLauncher | |||
| * launch the application for some reason. Usually due | |||
| * to the command not being fully specified and not in | |||
| * the PATH env var. | |||
| * @exception TaskException if the command launcher detects that | |||
| * @exception ExecException if the command launcher detects that | |||
| * it can not execute the native command for some reason. | |||
| */ | |||
| public Process exec( final ExecMetaData metaData ) | |||
| throws IOException, TaskException | |||
| throws IOException, ExecException | |||
| { | |||
| if( ExecUtil.isCwd( metaData.getWorkingDirectory() ) ) | |||
| { | |||
| @@ -71,7 +71,7 @@ public class DefaultCommandLauncher | |||
| { | |||
| final String message = "Unable to launch native command in a " + | |||
| "working directory other than \".\""; | |||
| throw new TaskException( message ); | |||
| throw new ExecException( message ); | |||
| } | |||
| else | |||
| { | |||
| @@ -85,7 +85,7 @@ public class DefaultCommandLauncher | |||
| * under 1.2. | |||
| */ | |||
| private Process execJava13( final ExecMetaData metaData ) | |||
| throws IOException, TaskException | |||
| throws IOException, ExecException | |||
| { | |||
| final Object[] args = | |||
| {metaData.getCommand(), | |||
| @@ -97,11 +97,11 @@ public class DefaultCommandLauncher | |||
| } | |||
| catch( final IllegalAccessException iae ) | |||
| { | |||
| throw new TaskException( iae.getMessage(), iae ); | |||
| throw new ExecException( iae.getMessage(), iae ); | |||
| } | |||
| catch( final IllegalArgumentException iae ) | |||
| { | |||
| throw new TaskException( iae.getMessage(), iae ); | |||
| throw new ExecException( iae.getMessage(), iae ); | |||
| } | |||
| catch( final InvocationTargetException ite ) | |||
| { | |||
| @@ -113,7 +113,7 @@ public class DefaultCommandLauncher | |||
| } | |||
| else | |||
| { | |||
| throw new TaskException( t.getMessage(), t ); | |||
| throw new ExecException( t.getMessage(), t ); | |||
| } | |||
| } | |||
| } | |||
| @@ -9,8 +9,8 @@ package org.apache.myrmidon.framework.exec.launchers; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.exec.CommandLauncher; | |||
| import org.apache.myrmidon.framework.exec.ExecException; | |||
| import org.apache.myrmidon.framework.exec.ExecMetaData; | |||
| /** | |||
| @@ -31,7 +31,7 @@ public class MacCommandLauncher | |||
| * Execute the specified native command. | |||
| */ | |||
| public Process exec( final ExecMetaData metaData ) | |||
| throws IOException, TaskException | |||
| throws IOException, ExecException | |||
| { | |||
| final File directory = metaData.getWorkingDirectory().getCanonicalFile(); | |||
| if( ExecUtil.isCwd( directory ) ) | |||
| @@ -8,8 +8,8 @@ | |||
| package org.apache.myrmidon.framework.exec.launchers; | |||
| import java.io.IOException; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.exec.CommandLauncher; | |||
| import org.apache.myrmidon.framework.exec.ExecException; | |||
| import org.apache.myrmidon.framework.exec.ExecMetaData; | |||
| /** | |||
| @@ -59,7 +59,7 @@ public class ScriptCommandLauncher | |||
| * set the working directory. | |||
| */ | |||
| public Process exec( final ExecMetaData metaData ) | |||
| throws IOException, TaskException | |||
| throws IOException, ExecException | |||
| { | |||
| // Build the command | |||
| final String[] prefix = new String[ m_script.length + 1 ]; | |||
| @@ -8,8 +8,8 @@ | |||
| package org.apache.myrmidon.framework.exec.launchers; | |||
| import java.io.IOException; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.exec.CommandLauncher; | |||
| import org.apache.myrmidon.framework.exec.ExecException; | |||
| import org.apache.myrmidon.framework.exec.ExecMetaData; | |||
| /** | |||
| @@ -28,7 +28,7 @@ public class WinNTCommandLauncher | |||
| * set the working directory. | |||
| */ | |||
| public Process exec( final ExecMetaData metaData ) | |||
| throws IOException, TaskException | |||
| throws IOException, ExecException | |||
| { | |||
| // Use cmd.exe to change to the specified directory before running | |||
| // the command | |||
| @@ -16,6 +16,7 @@ import java.util.Iterator; | |||
| import java.util.Properties; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.exec.Environment; | |||
| import org.apache.myrmidon.framework.exec.ExecException; | |||
| import org.apache.tools.ant.AntClassLoader; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.Task; | |||
| @@ -232,6 +233,10 @@ public class Property extends Task | |||
| } | |||
| } | |||
| } | |||
| catch( final ExecException ee ) | |||
| { | |||
| throw new TaskException( ee.getMessage(), ee ); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| throw new TaskException( ioe.getMessage(), ioe ); | |||
| @@ -16,6 +16,7 @@ import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.Os; | |||
| import org.apache.myrmidon.framework.exec.CommandLauncher; | |||
| import org.apache.myrmidon.framework.exec.Environment; | |||
| import org.apache.myrmidon.framework.exec.ExecException; | |||
| import org.apache.myrmidon.framework.exec.ExecMetaData; | |||
| import org.apache.myrmidon.framework.exec.launchers.DefaultCommandLauncher; | |||
| import org.apache.myrmidon.framework.exec.launchers.MacCommandLauncher; | |||
| @@ -269,58 +270,65 @@ public class Execute | |||
| throws IOException, TaskException | |||
| { | |||
| final ExecMetaData metaData = | |||
| new ExecMetaData( m_command, getNativeEnvironment(), | |||
| m_workingDirectory, false ); | |||
| final CommandLauncher launcher = getLauncher(); | |||
| final Process process = launcher.exec( metaData ); | |||
| try | |||
| { | |||
| m_streamHandler.setProcessInputStream( process.getOutputStream() ); | |||
| m_streamHandler.setProcessOutputStream( process.getInputStream() ); | |||
| m_streamHandler.setProcessErrorStream( process.getErrorStream() ); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| process.destroy(); | |||
| throw ioe; | |||
| } | |||
| final ExecMetaData metaData = | |||
| new ExecMetaData( m_command, getNativeEnvironment(), | |||
| m_workingDirectory, false ); | |||
| m_streamHandler.start(); | |||
| final CommandLauncher launcher = getLauncher(); | |||
| final Process process = launcher.exec( metaData ); | |||
| // add the process to the list of those to destroy if the VM exits | |||
| // | |||
| c_processDestroyer.add( process ); | |||
| try | |||
| { | |||
| m_streamHandler.setProcessInputStream( process.getOutputStream() ); | |||
| m_streamHandler.setProcessOutputStream( process.getInputStream() ); | |||
| m_streamHandler.setProcessErrorStream( process.getErrorStream() ); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| process.destroy(); | |||
| throw ioe; | |||
| } | |||
| if( m_watchdog != null ) | |||
| { | |||
| m_watchdog.start( process ); | |||
| } | |||
| try | |||
| { | |||
| process.waitFor(); | |||
| } | |||
| catch( final InterruptedException ie ) | |||
| { | |||
| //shu\ould never happen | |||
| } | |||
| m_streamHandler.start(); | |||
| // remove the process to the list of those to destroy if the VM exits | |||
| // | |||
| c_processDestroyer.remove( process ); | |||
| // add the process to the list of those to destroy if the VM exits | |||
| // | |||
| c_processDestroyer.add( process ); | |||
| if( m_watchdog != null ) | |||
| { | |||
| m_watchdog.stop(); | |||
| if( m_watchdog != null ) | |||
| { | |||
| m_watchdog.start( process ); | |||
| } | |||
| try | |||
| { | |||
| process.waitFor(); | |||
| } | |||
| catch( final InterruptedException ie ) | |||
| { | |||
| //shu\ould never happen | |||
| } | |||
| // remove the process to the list of those to destroy if the VM exits | |||
| // | |||
| c_processDestroyer.remove( process ); | |||
| if( m_watchdog != null ) | |||
| { | |||
| m_watchdog.stop(); | |||
| } | |||
| m_streamHandler.stop(); | |||
| if( m_watchdog != null ) | |||
| { | |||
| m_watchdog.checkException(); | |||
| } | |||
| return process.exitValue(); | |||
| } | |||
| m_streamHandler.stop(); | |||
| if( m_watchdog != null ) | |||
| catch( final ExecException ee ) | |||
| { | |||
| m_watchdog.checkException(); | |||
| throw new TaskException( ee.getMessage(), ee ); | |||
| } | |||
| return process.exitValue(); | |||
| } | |||
| private CommandLauncher getLauncher() | |||
| @@ -339,7 +347,7 @@ public class Execute | |||
| * @return the environment used to create a subprocess | |||
| */ | |||
| private String[] getNativeEnvironment() | |||
| throws TaskException | |||
| throws ExecException | |||
| { | |||
| if( m_newEnvironment ) | |||
| { | |||
| @@ -354,7 +362,7 @@ public class Execute | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| throw new TaskException( ioe.getMessage(), ioe ); | |||
| throw new ExecException( ioe.getMessage(), ioe ); | |||
| } | |||
| } | |||
| } | |||
| @@ -13,6 +13,7 @@ import java.util.Properties; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.Os; | |||
| import org.apache.myrmidon.framework.exec.Environment; | |||
| import org.apache.myrmidon.framework.exec.ExecException; | |||
| import org.apache.tools.ant.Project; | |||
| /** | |||
| @@ -355,7 +356,15 @@ public class CommandlineJava implements Cloneable | |||
| public String[] getJavaVariables() | |||
| throws TaskException | |||
| { | |||
| String props[] = Environment.toNativeFormat( super.getVariables() ); | |||
| String props[] = new String[ 0 ]; | |||
| try | |||
| { | |||
| props = Environment.toNativeFormat( super.getVariables() ); | |||
| } | |||
| catch( final ExecException ee ) | |||
| { | |||
| throw new TaskException( ee.getMessage(), ee ); | |||
| } | |||
| if( props == null ) | |||
| return null; | |||
| @@ -16,6 +16,7 @@ import java.util.Iterator; | |||
| import java.util.Properties; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.exec.Environment; | |||
| import org.apache.myrmidon.framework.exec.ExecException; | |||
| import org.apache.tools.ant.AntClassLoader; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.Task; | |||
| @@ -232,6 +233,10 @@ public class Property extends Task | |||
| } | |||
| } | |||
| } | |||
| catch( final ExecException ee ) | |||
| { | |||
| throw new TaskException( ee.getMessage(), ee ); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| throw new TaskException( ioe.getMessage(), ioe ); | |||
| @@ -16,6 +16,7 @@ import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.Os; | |||
| import org.apache.myrmidon.framework.exec.CommandLauncher; | |||
| import org.apache.myrmidon.framework.exec.Environment; | |||
| import org.apache.myrmidon.framework.exec.ExecException; | |||
| import org.apache.myrmidon.framework.exec.ExecMetaData; | |||
| import org.apache.myrmidon.framework.exec.launchers.DefaultCommandLauncher; | |||
| import org.apache.myrmidon.framework.exec.launchers.MacCommandLauncher; | |||
| @@ -269,58 +270,65 @@ public class Execute | |||
| throws IOException, TaskException | |||
| { | |||
| final ExecMetaData metaData = | |||
| new ExecMetaData( m_command, getNativeEnvironment(), | |||
| m_workingDirectory, false ); | |||
| final CommandLauncher launcher = getLauncher(); | |||
| final Process process = launcher.exec( metaData ); | |||
| try | |||
| { | |||
| m_streamHandler.setProcessInputStream( process.getOutputStream() ); | |||
| m_streamHandler.setProcessOutputStream( process.getInputStream() ); | |||
| m_streamHandler.setProcessErrorStream( process.getErrorStream() ); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| process.destroy(); | |||
| throw ioe; | |||
| } | |||
| final ExecMetaData metaData = | |||
| new ExecMetaData( m_command, getNativeEnvironment(), | |||
| m_workingDirectory, false ); | |||
| m_streamHandler.start(); | |||
| final CommandLauncher launcher = getLauncher(); | |||
| final Process process = launcher.exec( metaData ); | |||
| // add the process to the list of those to destroy if the VM exits | |||
| // | |||
| c_processDestroyer.add( process ); | |||
| try | |||
| { | |||
| m_streamHandler.setProcessInputStream( process.getOutputStream() ); | |||
| m_streamHandler.setProcessOutputStream( process.getInputStream() ); | |||
| m_streamHandler.setProcessErrorStream( process.getErrorStream() ); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| process.destroy(); | |||
| throw ioe; | |||
| } | |||
| if( m_watchdog != null ) | |||
| { | |||
| m_watchdog.start( process ); | |||
| } | |||
| try | |||
| { | |||
| process.waitFor(); | |||
| } | |||
| catch( final InterruptedException ie ) | |||
| { | |||
| //shu\ould never happen | |||
| } | |||
| m_streamHandler.start(); | |||
| // remove the process to the list of those to destroy if the VM exits | |||
| // | |||
| c_processDestroyer.remove( process ); | |||
| // add the process to the list of those to destroy if the VM exits | |||
| // | |||
| c_processDestroyer.add( process ); | |||
| if( m_watchdog != null ) | |||
| { | |||
| m_watchdog.stop(); | |||
| if( m_watchdog != null ) | |||
| { | |||
| m_watchdog.start( process ); | |||
| } | |||
| try | |||
| { | |||
| process.waitFor(); | |||
| } | |||
| catch( final InterruptedException ie ) | |||
| { | |||
| //shu\ould never happen | |||
| } | |||
| // remove the process to the list of those to destroy if the VM exits | |||
| // | |||
| c_processDestroyer.remove( process ); | |||
| if( m_watchdog != null ) | |||
| { | |||
| m_watchdog.stop(); | |||
| } | |||
| m_streamHandler.stop(); | |||
| if( m_watchdog != null ) | |||
| { | |||
| m_watchdog.checkException(); | |||
| } | |||
| return process.exitValue(); | |||
| } | |||
| m_streamHandler.stop(); | |||
| if( m_watchdog != null ) | |||
| catch( final ExecException ee ) | |||
| { | |||
| m_watchdog.checkException(); | |||
| throw new TaskException( ee.getMessage(), ee ); | |||
| } | |||
| return process.exitValue(); | |||
| } | |||
| private CommandLauncher getLauncher() | |||
| @@ -339,7 +347,7 @@ public class Execute | |||
| * @return the environment used to create a subprocess | |||
| */ | |||
| private String[] getNativeEnvironment() | |||
| throws TaskException | |||
| throws ExecException | |||
| { | |||
| if( m_newEnvironment ) | |||
| { | |||
| @@ -354,7 +362,7 @@ public class Execute | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| throw new TaskException( ioe.getMessage(), ioe ); | |||
| throw new ExecException( ioe.getMessage(), ioe ); | |||
| } | |||
| } | |||
| } | |||
| @@ -13,6 +13,7 @@ import java.util.Properties; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.Os; | |||
| import org.apache.myrmidon.framework.exec.Environment; | |||
| import org.apache.myrmidon.framework.exec.ExecException; | |||
| import org.apache.tools.ant.Project; | |||
| /** | |||
| @@ -355,7 +356,15 @@ public class CommandlineJava implements Cloneable | |||
| public String[] getJavaVariables() | |||
| throws TaskException | |||
| { | |||
| String props[] = Environment.toNativeFormat( super.getVariables() ); | |||
| String props[] = new String[ 0 ]; | |||
| try | |||
| { | |||
| props = Environment.toNativeFormat( super.getVariables() ); | |||
| } | |||
| catch( final ExecException ee ) | |||
| { | |||
| throw new TaskException( ee.getMessage(), ee ); | |||
| } | |||
| if( props == null ) | |||
| return null; | |||