Author: krosenvold
Date: Mon Jan 21 18:53:53 2013
New Revision: 1436551
URL: http://svn.apache.org/viewvc?rev=1436551&view=rev
Log:
[SUREFIRE-946] Allow execution of a callback after the process finished, or the
timeout ran up.
The callback is invoked, before calling waitForPumpers, allowing clients to
release possible locks on or in the in/out streams.
Patch by Andreas Gudian, applied unmodified
Modified:
maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/cli/CommandLineUtils.java
Modified:
maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/cli/CommandLineUtils.java
URL:
http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/cli/CommandLineUtils.java?rev=1436551&r1=1436550&r2=1436551&view=diff
==============================================================================
---
maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/cli/CommandLineUtils.java
(original)
+++
maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/cli/CommandLineUtils.java
Mon Jan 21 18:53:53 2013
@@ -28,6 +28,7 @@ import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;
+
import org.apache.maven.shared.utils.Os;
import org.apache.maven.shared.utils.StringUtils;
@@ -110,8 +111,28 @@ public abstract class CommandLineUtils
StreamConsumer systemErr, int
timeoutInSeconds )
throws CommandLineException
{
+ return executeCommandLine( cl, systemIn, systemOut, systemErr,
timeoutInSeconds, null );
+ }
+
+ /**
+ * @param cl The command line to execute
+ * @param systemIn The input to read from, must be thread safe
+ * @param systemOut A consumer that receives output, must be thread
safe
+ * @param systemErr A consumer that receives system error stream
output, must be thread safe
+ * @param timeoutInSeconds Positive integer to specify timeout, zero and
negative integers for no timeout.
+ * @param runAfterProcessTermination Optional callback to run after the
process terminated or the the timeout was
+ * exceeded, but before waiting on the stream feeder and pumpers to
finish.
+ * @return A return value, see {@link Process#exitValue()}
+ * @throws CommandLineException or CommandLineTimeOutException if time out
occurs
+ * @noinspection ThrowableResultOfMethodCallIgnored
+ */
+ public static int executeCommandLine( Commandline cl, InputStream
systemIn, StreamConsumer systemOut,
+ StreamConsumer systemErr, int
timeoutInSeconds,
+ Runnable runAfterProcessTermination )
+ throws CommandLineException
+ {
final CommandLineCallable future =
- executeCommandLineAsCallable( cl, systemIn, systemOut, systemErr,
timeoutInSeconds );
+ executeCommandLineAsCallable( cl, systemIn, systemOut, systemErr,
timeoutInSeconds, runAfterProcessTermination );
return future.call();
}
@@ -123,6 +144,7 @@ public abstract class CommandLineUtils
* @param systemOut A consumer that receives output, must be thread
safe
* @param systemErr A consumer that receives system error stream
output, must be thread safe
* @param timeoutInSeconds Positive integer to specify timeout, zero and
negative integers for no timeout.
+ * @param runAfterProcessTermination Optional callback to run after the
process terminated or the the timeout was
* @return A CommandLineCallable that provides the process return value,
see {@link Process#exitValue()}. "call" must be called on
* this to be sure the forked process has terminated, no
guarantees is made about
* any internal state before after the completion of the call
statements
@@ -132,7 +154,8 @@ public abstract class CommandLineUtils
private static CommandLineCallable executeCommandLineAsCallable( final
Commandline cl, final InputStream systemIn,
final
StreamConsumer systemOut,
final
StreamConsumer systemErr,
- final int
timeoutInSeconds )
+ final int
timeoutInSeconds,
+ final
Runnable runAfterProcessTermination )
throws CommandLineException
{
if ( cl == null )
@@ -191,6 +214,11 @@ public abstract class CommandLineUtils
returnValue = p.exitValue();
}
+ if ( runAfterProcessTermination != null )
+ {
+ runAfterProcessTermination.run();
+ }
+
waitForAllPumpers( inputFeeder, outputPumper, errorPumper
);
if ( outputPumper.getException() != null )