git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270357 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -9,21 +9,12 @@ package org.apache.tools.ant.taskdefs.exec; | |||||
| import java.io.File; | import java.io.File; | ||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.util.Locale; | |||||
| import java.io.OutputStream; | |||||
| import java.util.Properties; | import java.util.Properties; | ||||
| import org.apache.avalon.excalibur.io.FileUtil; | |||||
| import org.apache.myrmidon.api.TaskException; | 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.DefaultExecManager; | |||||
| import org.apache.myrmidon.framework.exec.ExecException; | import org.apache.myrmidon.framework.exec.ExecException; | ||||
| import org.apache.myrmidon.framework.exec.ExecMetaData; | import org.apache.myrmidon.framework.exec.ExecMetaData; | ||||
| import org.apache.myrmidon.framework.exec.ExecuteWatchdog; | |||||
| import org.apache.myrmidon.framework.exec.ProcessDestroyer; | |||||
| import org.apache.myrmidon.framework.exec.launchers.DefaultCommandLauncher; | |||||
| import org.apache.myrmidon.framework.exec.launchers.MacCommandLauncher; | |||||
| import org.apache.myrmidon.framework.exec.launchers.ScriptCommandLauncher; | |||||
| import org.apache.myrmidon.framework.exec.launchers.WinNTCommandLauncher; | |||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.Task; | import org.apache.tools.ant.Task; | ||||
| import org.apache.tools.ant.types.Commandline; | import org.apache.tools.ant.types.Commandline; | ||||
| @@ -35,96 +26,20 @@ import org.apache.tools.ant.types.Commandline; | |||||
| */ | */ | ||||
| public class Execute | public class Execute | ||||
| { | { | ||||
| private static final CommandLauncher c_launcher = new DefaultCommandLauncher(); | |||||
| private static final CommandLauncher c_shellLauncher = createShellLauncher(); | |||||
| /** | |||||
| * Used to destroy processes when the VM exits. | |||||
| */ | |||||
| private static final ProcessDestroyer c_processDestroyer = new ProcessDestroyer(); | |||||
| private ExecMetaData m_metaData; | |||||
| private String[] m_command; | private String[] m_command; | ||||
| private Properties m_environment = new Properties(); | private Properties m_environment = new Properties(); | ||||
| private File m_workingDirectory = new File( "." ); | private File m_workingDirectory = new File( "." ); | ||||
| private boolean m_newEnvironment; | private boolean m_newEnvironment; | ||||
| private OutputStream m_output; | |||||
| private OutputStream m_error; | |||||
| private long m_timeout; | |||||
| /** | /** | ||||
| * Controls whether the VM is used to launch commands, where possible | * Controls whether the VM is used to launch commands, where possible | ||||
| */ | */ | ||||
| private boolean m_useVMLauncher = true; | private boolean m_useVMLauncher = true; | ||||
| private ExecuteStreamHandler m_streamHandler; | |||||
| private ExecuteWatchdog m_watchdog; | |||||
| private static CommandLauncher createShellLauncher() | |||||
| { | |||||
| CommandLauncher launcher = null; | |||||
| try | |||||
| { | |||||
| if( Os.isFamily( "mac" ) ) | |||||
| { | |||||
| // Mac | |||||
| launcher = new MacCommandLauncher(); | |||||
| } | |||||
| else if( Os.isFamily( "os/2" ) ) | |||||
| { | |||||
| // OS/2 - use same mechanism as Windows 2000 | |||||
| launcher = new WinNTCommandLauncher(); | |||||
| } | |||||
| else if( Os.isFamily( "windows" ) ) | |||||
| { | |||||
| // Windows. Need to determine which JDK we're running in | |||||
| // Determine if we're running under 2000/NT or 98/95 | |||||
| final String osname = | |||||
| System.getProperty( "os.name" ).toLowerCase( Locale.US ); | |||||
| if( osname.indexOf( "nt" ) >= 0 || osname.indexOf( "2000" ) >= 0 ) | |||||
| { | |||||
| // Windows 2000/NT | |||||
| launcher = new WinNTCommandLauncher(); | |||||
| } | |||||
| else | |||||
| { | |||||
| // Windows 98/95 - need to use an auxiliary script | |||||
| final String script = resolveCommand( "bin/antRun.bat" ); | |||||
| launcher = new ScriptCommandLauncher( script ); | |||||
| } | |||||
| } | |||||
| else if( ( new Os( "netware" ) ).eval() ) | |||||
| { | |||||
| // NetWare. Need to determine which JDK we're running in | |||||
| final String perlScript = resolveCommand( "bin/antRun.pl" ); | |||||
| final String[] script = new String[]{"perl", perlScript}; | |||||
| launcher = new ScriptCommandLauncher( script ); | |||||
| } | |||||
| else | |||||
| { | |||||
| // Generic | |||||
| final String script = resolveCommand( "bin/antRun" ); | |||||
| launcher = new ScriptCommandLauncher( script ); | |||||
| } | |||||
| } | |||||
| catch( final TaskException te ) | |||||
| { | |||||
| te.printStackTrace(); | |||||
| } | |||||
| return launcher; | |||||
| } | |||||
| private static String resolveCommand( final String command ) | |||||
| { | |||||
| final File homeDir = getAntHomeDirectory(); | |||||
| final String script = | |||||
| FileUtil.resolveFile( homeDir, command ).toString(); | |||||
| return script; | |||||
| } | |||||
| /** | |||||
| * Retrieve the directory in which Myrmidon is installed. | |||||
| * This is used to determine the locaiton of scripts in various launchers. | |||||
| */ | |||||
| protected static File getAntHomeDirectory() | |||||
| private static File getAntHomeDirectory() | |||||
| { | { | ||||
| final String antHome = System.getProperty( "ant.home" ); | final String antHome = System.getProperty( "ant.home" ); | ||||
| if( null == antHome ) | if( null == antHome ) | ||||
| @@ -137,41 +52,6 @@ public class Execute | |||||
| return new File( antHome ); | return new File( antHome ); | ||||
| } | } | ||||
| /** | |||||
| * Creates a new execute object using <code>PumpStreamHandler</code> for | |||||
| * stream handling. | |||||
| */ | |||||
| public Execute() | |||||
| { | |||||
| this( new PumpStreamHandler() ); | |||||
| } | |||||
| /** | |||||
| * Creates a new execute object. | |||||
| * | |||||
| * @param streamHandler the stream handler used to handle the input and | |||||
| * output streams of the subprocess. | |||||
| */ | |||||
| public Execute( final ExecuteStreamHandler streamHandler ) | |||||
| { | |||||
| this( streamHandler, 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( final ExecuteStreamHandler streamHandler, | |||||
| final ExecuteWatchdog watchdog ) | |||||
| { | |||||
| m_streamHandler = streamHandler; | |||||
| m_watchdog = watchdog; | |||||
| } | |||||
| /** | /** | ||||
| * A utility method that runs an external command. Writes the output and | * A utility method that runs an external command. Writes the output and | ||||
| * error streams of the command to the project log. | * error streams of the command to the project log. | ||||
| @@ -186,10 +66,10 @@ public class Execute | |||||
| try | try | ||||
| { | { | ||||
| task.log( Commandline.toString( cmdline ), Project.MSG_VERBOSE ); | task.log( Commandline.toString( cmdline ), Project.MSG_VERBOSE ); | ||||
| final Execute exe = | |||||
| new Execute( new LogStreamHandler( task, | |||||
| Project.MSG_INFO, | |||||
| Project.MSG_ERR ) ); | |||||
| final Execute exe = new Execute(); | |||||
| exe.setOutput( new LogOutputStream( task, Project.MSG_INFO ) ); | |||||
| exe.setError( new LogOutputStream( task, Project.MSG_WARN ) ); | |||||
| exe.setCommandline( cmdline ); | exe.setCommandline( cmdline ); | ||||
| int retval = exe.execute(); | int retval = exe.execute(); | ||||
| if( retval != 0 ) | if( retval != 0 ) | ||||
| @@ -203,6 +83,36 @@ public class Execute | |||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * Creates a new execute object. | |||||
| * | |||||
| * @param streamHandler the stream handler used to handle the input and | |||||
| * output streams of the subprocess. | |||||
| */ | |||||
| public Execute( final ExecuteStreamHandler streamHandler ) | |||||
| { | |||||
| //m_streamHandler = streamHandler; | |||||
| } | |||||
| public Execute() | |||||
| { | |||||
| } | |||||
| public void setTimeout( final long timeout ) | |||||
| { | |||||
| m_timeout = timeout; | |||||
| } | |||||
| public void setOutput( final OutputStream output ) | |||||
| { | |||||
| m_output = output; | |||||
| } | |||||
| public void setError( final OutputStream error ) | |||||
| { | |||||
| m_error = error; | |||||
| } | |||||
| /** | /** | ||||
| * Sets the commandline of the subprocess to launch. | * Sets the commandline of the subprocess to launch. | ||||
| * | * | ||||
| @@ -255,17 +165,6 @@ public class Execute | |||||
| m_workingDirectory = workingDirectory; | m_workingDirectory = workingDirectory; | ||||
| } | } | ||||
| /** | |||||
| * test for an untimely death of the process | |||||
| * | |||||
| * @return true iff a watchdog had to kill the process | |||||
| * @since 1.5 | |||||
| */ | |||||
| public boolean killedProcess() | |||||
| { | |||||
| return m_watchdog != null && m_watchdog.killedProcess(); | |||||
| } | |||||
| /** | /** | ||||
| * Runs a process defined by the command line and returns its exit status. | * Runs a process defined by the command line and returns its exit status. | ||||
| * | * | ||||
| @@ -275,75 +174,19 @@ public class Execute | |||||
| public int execute() | public int execute() | ||||
| throws IOException, TaskException | throws IOException, TaskException | ||||
| { | { | ||||
| try | try | ||||
| { | { | ||||
| final DefaultExecManager manager = | |||||
| new DefaultExecManager( getAntHomeDirectory() ); | |||||
| final ExecMetaData metaData = | final ExecMetaData metaData = | ||||
| new ExecMetaData( m_command, m_environment, | new ExecMetaData( m_command, m_environment, | ||||
| m_workingDirectory, m_newEnvironment ); | m_workingDirectory, m_newEnvironment ); | ||||
| 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; | |||||
| } | |||||
| m_streamHandler.start(); | |||||
| // add the process to the list of those to destroy if the VM exits | |||||
| // | |||||
| c_processDestroyer.add( process ); | |||||
| 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(); | |||||
| return manager.execute( metaData, null, m_output, m_error, m_timeout ); | |||||
| } | } | ||||
| catch( final ExecException ee ) | catch( final ExecException ee ) | ||||
| { | { | ||||
| throw new TaskException( ee.getMessage(), ee ); | throw new TaskException( ee.getMessage(), ee ); | ||||
| } | } | ||||
| } | } | ||||
| private CommandLauncher getLauncher() | |||||
| { | |||||
| CommandLauncher launcher = c_launcher; | |||||
| if( !m_useVMLauncher ) | |||||
| { | |||||
| launcher = c_shellLauncher; | |||||
| } | |||||
| return launcher; | |||||
| } | |||||
| } | } | ||||
| @@ -9,21 +9,12 @@ package org.apache.tools.ant.taskdefs.exec; | |||||
| import java.io.File; | import java.io.File; | ||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.util.Locale; | |||||
| import java.io.OutputStream; | |||||
| import java.util.Properties; | import java.util.Properties; | ||||
| import org.apache.avalon.excalibur.io.FileUtil; | |||||
| import org.apache.myrmidon.api.TaskException; | 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.DefaultExecManager; | |||||
| import org.apache.myrmidon.framework.exec.ExecException; | import org.apache.myrmidon.framework.exec.ExecException; | ||||
| import org.apache.myrmidon.framework.exec.ExecMetaData; | import org.apache.myrmidon.framework.exec.ExecMetaData; | ||||
| import org.apache.myrmidon.framework.exec.ExecuteWatchdog; | |||||
| import org.apache.myrmidon.framework.exec.ProcessDestroyer; | |||||
| import org.apache.myrmidon.framework.exec.launchers.DefaultCommandLauncher; | |||||
| import org.apache.myrmidon.framework.exec.launchers.MacCommandLauncher; | |||||
| import org.apache.myrmidon.framework.exec.launchers.ScriptCommandLauncher; | |||||
| import org.apache.myrmidon.framework.exec.launchers.WinNTCommandLauncher; | |||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.Task; | import org.apache.tools.ant.Task; | ||||
| import org.apache.tools.ant.types.Commandline; | import org.apache.tools.ant.types.Commandline; | ||||
| @@ -35,96 +26,20 @@ import org.apache.tools.ant.types.Commandline; | |||||
| */ | */ | ||||
| public class Execute | public class Execute | ||||
| { | { | ||||
| private static final CommandLauncher c_launcher = new DefaultCommandLauncher(); | |||||
| private static final CommandLauncher c_shellLauncher = createShellLauncher(); | |||||
| /** | |||||
| * Used to destroy processes when the VM exits. | |||||
| */ | |||||
| private static final ProcessDestroyer c_processDestroyer = new ProcessDestroyer(); | |||||
| private ExecMetaData m_metaData; | |||||
| private String[] m_command; | private String[] m_command; | ||||
| private Properties m_environment = new Properties(); | private Properties m_environment = new Properties(); | ||||
| private File m_workingDirectory = new File( "." ); | private File m_workingDirectory = new File( "." ); | ||||
| private boolean m_newEnvironment; | private boolean m_newEnvironment; | ||||
| private OutputStream m_output; | |||||
| private OutputStream m_error; | |||||
| private long m_timeout; | |||||
| /** | /** | ||||
| * Controls whether the VM is used to launch commands, where possible | * Controls whether the VM is used to launch commands, where possible | ||||
| */ | */ | ||||
| private boolean m_useVMLauncher = true; | private boolean m_useVMLauncher = true; | ||||
| private ExecuteStreamHandler m_streamHandler; | |||||
| private ExecuteWatchdog m_watchdog; | |||||
| private static CommandLauncher createShellLauncher() | |||||
| { | |||||
| CommandLauncher launcher = null; | |||||
| try | |||||
| { | |||||
| if( Os.isFamily( "mac" ) ) | |||||
| { | |||||
| // Mac | |||||
| launcher = new MacCommandLauncher(); | |||||
| } | |||||
| else if( Os.isFamily( "os/2" ) ) | |||||
| { | |||||
| // OS/2 - use same mechanism as Windows 2000 | |||||
| launcher = new WinNTCommandLauncher(); | |||||
| } | |||||
| else if( Os.isFamily( "windows" ) ) | |||||
| { | |||||
| // Windows. Need to determine which JDK we're running in | |||||
| // Determine if we're running under 2000/NT or 98/95 | |||||
| final String osname = | |||||
| System.getProperty( "os.name" ).toLowerCase( Locale.US ); | |||||
| if( osname.indexOf( "nt" ) >= 0 || osname.indexOf( "2000" ) >= 0 ) | |||||
| { | |||||
| // Windows 2000/NT | |||||
| launcher = new WinNTCommandLauncher(); | |||||
| } | |||||
| else | |||||
| { | |||||
| // Windows 98/95 - need to use an auxiliary script | |||||
| final String script = resolveCommand( "bin/antRun.bat" ); | |||||
| launcher = new ScriptCommandLauncher( script ); | |||||
| } | |||||
| } | |||||
| else if( ( new Os( "netware" ) ).eval() ) | |||||
| { | |||||
| // NetWare. Need to determine which JDK we're running in | |||||
| final String perlScript = resolveCommand( "bin/antRun.pl" ); | |||||
| final String[] script = new String[]{"perl", perlScript}; | |||||
| launcher = new ScriptCommandLauncher( script ); | |||||
| } | |||||
| else | |||||
| { | |||||
| // Generic | |||||
| final String script = resolveCommand( "bin/antRun" ); | |||||
| launcher = new ScriptCommandLauncher( script ); | |||||
| } | |||||
| } | |||||
| catch( final TaskException te ) | |||||
| { | |||||
| te.printStackTrace(); | |||||
| } | |||||
| return launcher; | |||||
| } | |||||
| private static String resolveCommand( final String command ) | |||||
| { | |||||
| final File homeDir = getAntHomeDirectory(); | |||||
| final String script = | |||||
| FileUtil.resolveFile( homeDir, command ).toString(); | |||||
| return script; | |||||
| } | |||||
| /** | |||||
| * Retrieve the directory in which Myrmidon is installed. | |||||
| * This is used to determine the locaiton of scripts in various launchers. | |||||
| */ | |||||
| protected static File getAntHomeDirectory() | |||||
| private static File getAntHomeDirectory() | |||||
| { | { | ||||
| final String antHome = System.getProperty( "ant.home" ); | final String antHome = System.getProperty( "ant.home" ); | ||||
| if( null == antHome ) | if( null == antHome ) | ||||
| @@ -137,41 +52,6 @@ public class Execute | |||||
| return new File( antHome ); | return new File( antHome ); | ||||
| } | } | ||||
| /** | |||||
| * Creates a new execute object using <code>PumpStreamHandler</code> for | |||||
| * stream handling. | |||||
| */ | |||||
| public Execute() | |||||
| { | |||||
| this( new PumpStreamHandler() ); | |||||
| } | |||||
| /** | |||||
| * Creates a new execute object. | |||||
| * | |||||
| * @param streamHandler the stream handler used to handle the input and | |||||
| * output streams of the subprocess. | |||||
| */ | |||||
| public Execute( final ExecuteStreamHandler streamHandler ) | |||||
| { | |||||
| this( streamHandler, 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( final ExecuteStreamHandler streamHandler, | |||||
| final ExecuteWatchdog watchdog ) | |||||
| { | |||||
| m_streamHandler = streamHandler; | |||||
| m_watchdog = watchdog; | |||||
| } | |||||
| /** | /** | ||||
| * A utility method that runs an external command. Writes the output and | * A utility method that runs an external command. Writes the output and | ||||
| * error streams of the command to the project log. | * error streams of the command to the project log. | ||||
| @@ -186,10 +66,10 @@ public class Execute | |||||
| try | try | ||||
| { | { | ||||
| task.log( Commandline.toString( cmdline ), Project.MSG_VERBOSE ); | task.log( Commandline.toString( cmdline ), Project.MSG_VERBOSE ); | ||||
| final Execute exe = | |||||
| new Execute( new LogStreamHandler( task, | |||||
| Project.MSG_INFO, | |||||
| Project.MSG_ERR ) ); | |||||
| final Execute exe = new Execute(); | |||||
| exe.setOutput( new LogOutputStream( task, Project.MSG_INFO ) ); | |||||
| exe.setError( new LogOutputStream( task, Project.MSG_WARN ) ); | |||||
| exe.setCommandline( cmdline ); | exe.setCommandline( cmdline ); | ||||
| int retval = exe.execute(); | int retval = exe.execute(); | ||||
| if( retval != 0 ) | if( retval != 0 ) | ||||
| @@ -203,6 +83,36 @@ public class Execute | |||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * Creates a new execute object. | |||||
| * | |||||
| * @param streamHandler the stream handler used to handle the input and | |||||
| * output streams of the subprocess. | |||||
| */ | |||||
| public Execute( final ExecuteStreamHandler streamHandler ) | |||||
| { | |||||
| //m_streamHandler = streamHandler; | |||||
| } | |||||
| public Execute() | |||||
| { | |||||
| } | |||||
| public void setTimeout( final long timeout ) | |||||
| { | |||||
| m_timeout = timeout; | |||||
| } | |||||
| public void setOutput( final OutputStream output ) | |||||
| { | |||||
| m_output = output; | |||||
| } | |||||
| public void setError( final OutputStream error ) | |||||
| { | |||||
| m_error = error; | |||||
| } | |||||
| /** | /** | ||||
| * Sets the commandline of the subprocess to launch. | * Sets the commandline of the subprocess to launch. | ||||
| * | * | ||||
| @@ -255,17 +165,6 @@ public class Execute | |||||
| m_workingDirectory = workingDirectory; | m_workingDirectory = workingDirectory; | ||||
| } | } | ||||
| /** | |||||
| * test for an untimely death of the process | |||||
| * | |||||
| * @return true iff a watchdog had to kill the process | |||||
| * @since 1.5 | |||||
| */ | |||||
| public boolean killedProcess() | |||||
| { | |||||
| return m_watchdog != null && m_watchdog.killedProcess(); | |||||
| } | |||||
| /** | /** | ||||
| * Runs a process defined by the command line and returns its exit status. | * Runs a process defined by the command line and returns its exit status. | ||||
| * | * | ||||
| @@ -275,75 +174,19 @@ public class Execute | |||||
| public int execute() | public int execute() | ||||
| throws IOException, TaskException | throws IOException, TaskException | ||||
| { | { | ||||
| try | try | ||||
| { | { | ||||
| final DefaultExecManager manager = | |||||
| new DefaultExecManager( getAntHomeDirectory() ); | |||||
| final ExecMetaData metaData = | final ExecMetaData metaData = | ||||
| new ExecMetaData( m_command, m_environment, | new ExecMetaData( m_command, m_environment, | ||||
| m_workingDirectory, m_newEnvironment ); | m_workingDirectory, m_newEnvironment ); | ||||
| 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; | |||||
| } | |||||
| m_streamHandler.start(); | |||||
| // add the process to the list of those to destroy if the VM exits | |||||
| // | |||||
| c_processDestroyer.add( process ); | |||||
| 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(); | |||||
| return manager.execute( metaData, null, m_output, m_error, m_timeout ); | |||||
| } | } | ||||
| catch( final ExecException ee ) | catch( final ExecException ee ) | ||||
| { | { | ||||
| throw new TaskException( ee.getMessage(), ee ); | throw new TaskException( ee.getMessage(), ee ); | ||||
| } | } | ||||
| } | } | ||||
| private CommandLauncher getLauncher() | |||||
| { | |||||
| CommandLauncher launcher = c_launcher; | |||||
| if( !m_useVMLauncher ) | |||||
| { | |||||
| launcher = c_shellLauncher; | |||||
| } | |||||
| return launcher; | |||||
| } | |||||
| } | } | ||||