TimeoutProcess.java
- /*
- * TimeoutProcess
- *
- * $Id$
- * $URL$
- */
- package gov.usgs.util;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.util.Timer;
- /**
- * TimeoutProcess wraps a Process object.
- *
- * It is most commonly used with TimeoutProcessBuilder, which configures the
- * process timeout (and sets the timed out state once the timeout is reached).
- *
- * @see java.lang.Process
- * @see TimeoutProcessBuilder
- * @see ProcessTimeoutException
- */
- public class TimeoutProcess {
- /** The wrapped process */
- private Process process;
- /** Whether this process timed out. */
- private boolean timeoutElapsed = false;
- /** Timer object that will destroy this process. */
- private Timer timer = null;
- /** Standard error output. */
- private byte[] errorOutput;
- /**
- * Construct a new TimeoutProcess.
- *
- * @param process
- * the wrapped process.
- */
- protected TimeoutProcess(Process process) {
- this.process = process;
- }
- /** Destroys a process */
- public void destroy() {
- process.destroy();
- }
- /** @return errorOutput byte array */
- public byte[] errorOutput() {
- return errorOutput;
- }
- /** @return exit value */
- public int exitValue() {
- return process.exitValue();
- }
- /** @return InputStream of error stream */
- public InputStream getErrorStream() {
- return process.getErrorStream();
- }
- /** @return InputStream */
- public InputStream getInputStream() {
- return process.getInputStream();
- }
- /** @return OutputStream */
- public OutputStream getOutputStream() {
- return process.getOutputStream();
- }
- /**
- * Wait for the process to complete, either normally or because its timeout
- * was reached.
- *
- * @return exitStatus.
- * @throws InterruptedException
- * if thread interruption occurs
- * @throws IOException
- * if IO error occurs
- * @throws ProcessTimeoutException
- * if the process timed out before exiting.
- */
- public int waitFor() throws InterruptedException, IOException, ProcessTimeoutException {
- int status = -1;
- try {
- status = process.waitFor();
- if (timeoutElapsed()) {
- throw new ProcessTimeoutException("The process has timed out.");
- }
- } finally {
- if (timer != null) {
- // the timer hasn't destroyed this process already, cancel it.
- timer.cancel();
- }
- }
- try {
- errorOutput = StreamUtils.readStream(getErrorStream());
- } finally {
- // close streams
- StreamUtils.closeStream(getErrorStream());
- StreamUtils.closeStream(getInputStream());
- StreamUtils.closeStream(getOutputStream());
- }
- return status;
- }
- /** @param timeoutElapsed to set */
- protected void setTimeoutElapsed(boolean timeoutElapsed) {
- this.timeoutElapsed = timeoutElapsed;
- }
- /** @return timeoutElapsed boolean */
- protected boolean timeoutElapsed() {
- return timeoutElapsed;
- }
- /** @param timer to set */
- protected void setTimer(final Timer timer) {
- this.timer = timer;
- }
- }