TimeoutProcessBuilder.java
/*
* TimeoutProcessBuilder
*
* $Id$
* $URL$
*/
package gov.usgs.util;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
/**
* The TimeoutProcessBuilder wraps a ProcessBuilder, adding support for a
* command time out.
*
* This class does not support a full command String complete with arguments.
* You can use the StringUtils.split method to get around this.
*
* @see java.lang.ProcessBuilder
* @see TimeoutProcess
*/
public class TimeoutProcessBuilder {
/** The wrapped process builder. */
private ProcessBuilder builder = null;
/** The timeout for this process. */
private long timeout = -1;
/**
* Create a new TimeoutProcessBuilder with a timeout and an array of
* strings.
*
* @param timeout
* timeout in milliseconds for process, or <= 0 for no timeout.
* @param command
* array of strings that represent command. The first element
* must be the full path to the executable, without arguments.
*/
public TimeoutProcessBuilder(long timeout, String... command) {
builder = new ProcessBuilder(command);
this.timeout = timeout;
}
/**
* Create a new TimeoutProcessBuilder with a timeout and an array of
* strings.
*
* @param timeout
* timeout in milliseconds for process, or <= 0 for no timeout.
* @param command
* list of strings that represent command.
*/
public TimeoutProcessBuilder(long timeout, List<String> command) {
builder = new ProcessBuilder(command);
this.timeout = timeout;
}
/**
* This signature is preserved, but calls the alternate constructor with
* argument order swapped.
* @param command
* list of strings that represent command.
* @param timeout
* timeout in milliseconds for process, or <= 0 for no timeout.
*/
@Deprecated
public TimeoutProcessBuilder(List<String> command, long timeout) {
this(timeout, command);
}
/** @return list of builder commands */
public List<String> command() {
return builder.command();
}
/**
* @param command give builder a list of commands
* @return TimeoutProcessBuilder
*/
public TimeoutProcessBuilder command(List<String> command) {
builder.command(command);
return this;
}
/**
* @param command give builder a single command
* @return TimeoutProcessBuilder
*/
public TimeoutProcessBuilder command(String command) {
builder.command(command);
return this;
}
/** @return builder directory */
public File directory() {
return builder.directory();
}
/**
* @param directory to set
* @return TimeoutProcessBuilder
*/
public TimeoutProcessBuilder directory(File directory) {
builder.directory(directory);
return this;
}
/** @return builder environment */
public Map<String, String> environment() {
return builder.environment();
}
/** @return boolean redirectErrorStream */
public boolean redirectErrorStream() {
return builder.redirectErrorStream();
}
/**
* @param redirectErrorStream to set
* @return TimeoutProcessBuilder
*/
public TimeoutProcessBuilder redirectErrorStream(boolean redirectErrorStream) {
builder.redirectErrorStream(redirectErrorStream);
return this;
}
/**
* @return a TimeoutProcess
* @throws IOException if IO error occurs
*/
public TimeoutProcess start() throws IOException {
final TimeoutProcess process = new TimeoutProcess(builder.start());
if (timeout > 0) {
// set up the timeout for this process
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
process.setTimeoutElapsed(true);
process.destroy();
}
}, timeout);
process.setTimer(timer);
}
return process;
}
/** @return timeout */
public long getTimeout() {
return this.timeout;
}
/** @param timeout to set */
public void setTimeout(final long timeout) {
this.timeout = timeout;
}
}