// ProcessUtil.java
package net.sf.gogui.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
class ExitWaiter
extends Thread
{
public ExitWaiter(Object monitor, Process process)
{
m_monitor = monitor;
m_process = process;
}
public boolean isFinished()
{
synchronized (m_mutex)
{
return m_isFinished;
}
}
public void run()
{
try
{
m_process.waitFor();
}
catch (InterruptedException e)
{
}
synchronized (m_mutex)
{
m_isFinished = true;
}
synchronized (m_monitor)
{
m_monitor.notifyAll();
}
}
private boolean m_isFinished;
private final Object m_monitor;
private final Object m_mutex = new Object();
private final Process m_process;
};
/** Static utility functions and classes related to processes. */
public class ProcessUtil
{
/** Copies standard error of a process to System.err. */
public static class StdErrThread
extends Thread
{
public StdErrThread(Process process)
{
super(new StreamCopy(false, process.getErrorStream(), System.err,
false));
}
}
/** Run a process and return its standard output as a string. */
public static String runCommand(String[] cmdArray) throws IOException
{
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(cmdArray);
Thread discardErr = new StreamDiscard(process.getErrorStream());
discardErr.start();
InputStream in = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
try
{
StringBuilder result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null)
{
result.append(line);
result.append('\n');
}
try
{
if (process.waitFor() != 0)
throw new IOException("Process returned error status");
}
catch (InterruptedException e)
{
throw new IOException("InterruptedException");
}
return result.toString();
}
finally
{
reader.close();
}
}
/** Run a process.
Forwards the stdout/stderr of the child process to stderr of the
calling process. */
public static void runProcess(String[] cmdArray) throws IOException
{
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(cmdArray);
Thread copyOut =
new Thread(new StreamCopy(false, process.getInputStream(),
System.err, false));
copyOut.start();
Thread copyErr =
new Thread(new StreamCopy(false, process.getErrorStream(),
System.err, false));
copyErr.start();
}
public static boolean waitForExit(Process process, long timeout)
{
Object monitor = new Object();
ExitWaiter exitWaiter = new ExitWaiter(monitor, process);
synchronized (monitor)
{
exitWaiter.start();
try
{
monitor.wait(timeout);
return exitWaiter.isFinished();
}
catch (InterruptedException e)
{
return false;
}
}
}
}