Browse Source

Rework it so that ExecManager does not shutdown streams.

Important when you pass in System.out/System.err or want to do something
special to stream after processing.

Submitted By: Darrell DeBoer <darrell@apache.org>


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271649 13f79535-47bb-0310-9956-ffa450edef68
master
Peter Donald 23 years ago
parent
commit
4ddd7dfef4
3 changed files with 50 additions and 11 deletions
  1. +1
    -1
      proposal/myrmidon/src/java/org/apache/aut/nativelib/impl/DefaultExecManager.java
  2. +11
    -6
      proposal/myrmidon/src/java/org/apache/aut/nativelib/impl/Environment.java
  3. +38
    -4
      proposal/myrmidon/src/java/org/apache/aut/nativelib/impl/ProcessMonitor.java

+ 1
- 1
proposal/myrmidon/src/java/org/apache/aut/nativelib/impl/DefaultExecManager.java View File

@@ -115,7 +115,7 @@ public class DefaultExecManager
final CommandLauncher launcher = getLauncher( command );
final Process process = launcher.exec( command );
final ProcessMonitor monitor =
new ProcessMonitor( process, input, output, error, timeout );
new ProcessMonitor( process, input, output, error, timeout, false );

final Thread thread = new Thread( monitor, "ProcessMonitor" );
thread.start();


+ 11
- 6
proposal/myrmidon/src/java/org/apache/aut/nativelib/impl/Environment.java View File

@@ -19,6 +19,7 @@ import org.apache.aut.nativelib.ExecManager;
import org.apache.aut.nativelib.ExecMetaData;
import org.apache.aut.nativelib.Os;
import org.apache.avalon.excalibur.util.StringUtil;
import org.apache.avalon.excalibur.io.IOUtil;

/**
* This is the class that can be used to retrieve the environment
@@ -157,13 +158,17 @@ final class Environment
final ExecMetaData metaData = new ExecMetaData( command, null, workingDirectory );

final ByteArrayOutputStream output = new ByteArrayOutputStream();
final int retval = m_execManager.execute( metaData, null, output, output, 0 );
if( retval != 0 )
{
// Just try to use what we got
}
try {
final int retval = m_execManager.execute( metaData, null, output, output, 0 );
if( retval != 0 )
{
// Just try to use what we got
}

return output.toString();
return output.toString();
} finally {
IOUtil.shutdownStream( output );
}
}

/**


+ 38
- 4
proposal/myrmidon/src/java/org/apache/aut/nativelib/impl/ProcessMonitor.java View File

@@ -72,11 +72,33 @@ class ProcessMonitor
*/
private final OutputStream m_error;

/**
* Specifies whether the monitor should shutdown
* input, output and error Streams when it finishes execution.
* This should be set to <code>true</code> for processes which
* will run asynchronously.
*/
private final boolean m_shutdownStreams;

/**
* Creates a monitor for a given {@link java.lang.Process}, which pipes
* input from the given input stream to the process, and pipes the process
* output to the given OutputStreams.
*
* @param process the Process to be monitored
* @param input is read into the Process' stdin
* @param output receives the Process' stdout
* @param error receives the Process' stderr
* @param timeoutDuration how long to let the Process run before killing it.
* @param shutdownStreams specifies if the monitor should shutdown the
* streams when the Process exits.
*/
public ProcessMonitor( final Process process,
final InputStream input,
final OutputStream output,
final OutputStream error,
final long timeoutDuration )
final long timeoutDuration,
final boolean shutdownStreams )
{
if( null == process )
{
@@ -100,6 +122,7 @@ class ProcessMonitor
m_output = output;
m_error = error;
m_timeout = timeout;
m_shutdownStreams = shutdownStreams;
}

/**
@@ -139,9 +162,20 @@ class ProcessMonitor
//that we have got all the data
processStreams();

IOUtil.shutdownStream( m_input );
IOUtil.shutdownStream( m_output );
IOUtil.shutdownStream( m_error );
cleanupStreams();
}

/**
* Utility method which cleans up all IO Streams, if required.
*/
private void cleanupStreams()
{
if( m_shutdownStreams )
{
IOUtil.shutdownStream( m_input );
IOUtil.shutdownStream( m_output );
IOUtil.shutdownStream( m_error );
}
}

/**


Loading…
Cancel
Save