X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=support%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fio%2FSimpleProcess.java;h=3e0e7f853eade21fb9fa57b45c7bbfd1c3893f3d;hb=ddd261f331280640c5b53c7128230b629ebcd268;hp=744386445d15c1e7d6fa1ce63876e712c55f5100;hpb=92e23e5ecf9614f2ab770a8cdedc0b21ddf1e127;p=utils diff --git a/support/general/src/main/java/org/wamblee/io/SimpleProcess.java b/support/general/src/main/java/org/wamblee/io/SimpleProcess.java index 74438644..3e0e7f85 100644 --- a/support/general/src/main/java/org/wamblee/io/SimpleProcess.java +++ b/support/general/src/main/java/org/wamblee/io/SimpleProcess.java @@ -1,20 +1,23 @@ /* * Copyright 2007 the original author or authors. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ + */ package org.wamblee.io; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import java.io.BufferedReader; import java.io.File; import java.io.IOException; @@ -25,144 +28,211 @@ import java.io.PrintStream; import java.io.StringWriter; import java.io.Writer; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +/** + * DOCUMENT ME! + * + * @author $author$ + * @version $Revision$ + */ public class SimpleProcess { + /** + * DOCUMENT ME! + */ + private static final Log LOG = LogFactory.getLog(SimpleProcess.class); - private static final Log LOG = LogFactory.getLog(SimpleProcess.class); + /** + * DOCUMENT ME! + */ + private File directory; + + /** + * DOCUMENT ME! + */ + private String[] cmd; - private File directory; + /** + * DOCUMENT ME! + */ + private String stdout; - private String[] cmd; - - private String stdout; - private String stderr; + /** + * DOCUMENT ME! + */ + private String stderr; - public SimpleProcess(File aDirectory, String[] aCmd) { - directory = aDirectory; - cmd = aCmd; - } +/** + * Creates a new SimpleProcess object. + * + * @param aDirectory DOCUMENT ME! + * @param aCmd DOCUMENT ME! + */ + public SimpleProcess(File aDirectory, String[] aCmd) { + directory = aDirectory; + cmd = aCmd; + } /** + * DOCUMENT ME! + * * @return the stdout */ public String getStdout() { return stdout; } - + /** + * DOCUMENT ME! + * * @return the stderr */ public String getStderr() { return stderr; } - - /** - * Runs the process and blocks until it is done. - * - * @return Exit status of the process. - * @throws IOException - * In case of problems. - */ - public int run() throws IOException { - return runImpl(); - } - - private int runImpl() throws IOException { - try { - String fullcmd = ""; - for (String part: cmd) { - fullcmd += " " + part; - } - LOG.debug("Executing '" + fullcmd + "' in directory '" + directory - + "'"); - java.lang.Process proc = Runtime.getRuntime().exec(cmd, null, directory); - - // Read standard output and error in separate threads to avoid - // deadlock. - - StringWriter myStdout = new StringWriter(); - StringWriter myStderr = new StringWriter(); - Thread stdoutReader = readAndLogStream("STDOUT> ", proc - .getInputStream(), myStdout); - Thread stderrReader = readAndLogStream("STDERR> ", proc - .getErrorStream(), myStderr); - - try { - proc.waitFor(); - } catch (InterruptedException e) { - IOException exception = new IOException( - "Process was terminated: " + this); - exception.initCause(e); - throw exception; - } - waitForReader(stdoutReader); - waitForReader(stderrReader); - - stdout = myStdout.toString(); - stderr = myStderr.toString(); - - if (proc.exitValue() != 0) { - LOG.warn("Exit value was non-zero: " + this); - } else { - LOG.debug("Process finished"); - } - return proc.exitValue(); - } catch (IOException e) { - IOException exception = new IOException("Error executing process: " - + this); - exception.initCause(e); - throw exception; - } - } - - private void waitForReader(Thread aReaderThread) { - try { - aReaderThread.join(); - } catch (InterruptedException e) { - LOG - .warn(this - + ": error waiting for output stream reader of process to finish"); - } - } - - private Thread readAndLogStream(final String aPrefix, - final InputStream aStream, final Writer aOutput) { - Thread inputReader = new Thread() { - @Override - public void run() { - BufferedReader br = null; - try { - br = new BufferedReader(new InputStreamReader(aStream)); - String str; - while ((str = br.readLine()) != null) { - LOG.debug(aPrefix + str); - aOutput.write(str); - } - } catch (IOException e) { - LOG.warn(SimpleProcess.this + ": error reading input stream", e); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException e) { - LOG.warn("Error closing stream " + aPrefix); - } - } - } - } - }; - inputReader.start(); - return inputReader; - } - - @Override - public String toString() { + + /** + * Runs the process and blocks until it is done. + * + * @return Exit status of the process. + * + * @throws IOException In case of problems. + */ + public int run() throws IOException { + return runImpl(); + } + + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + * + * @throws IOException DOCUMENT ME! + */ + private int runImpl() throws IOException { + try { + String fullcmd = ""; + + for (String part : cmd) { + fullcmd += (" " + part); + } + + LOG.debug("Executing '" + fullcmd + "' in directory '" + directory + + "'"); + + java.lang.Process proc = Runtime.getRuntime() + .exec(cmd, null, directory); + + // Read standard output and error in separate threads to avoid + // deadlock. + StringWriter myStdout = new StringWriter(); + StringWriter myStderr = new StringWriter(); + Thread stdoutReader = readAndLogStream("STDOUT> ", + proc.getInputStream(), myStdout); + Thread stderrReader = readAndLogStream("STDERR> ", + proc.getErrorStream(), myStderr); + + try { + proc.waitFor(); + } catch (InterruptedException e) { + IOException exception = new IOException( + "Process was terminated: " + this); + exception.initCause(e); + throw exception; + } + + waitForReader(stdoutReader); + waitForReader(stderrReader); + + stdout = myStdout.toString(); + stderr = myStderr.toString(); + + if (proc.exitValue() != 0) { + LOG.warn("Exit value was non-zero: " + this); + } else { + LOG.debug("Process finished"); + } + + return proc.exitValue(); + } catch (IOException e) { + IOException exception = new IOException("Error executing process: " + + this); + exception.initCause(e); + throw exception; + } + } + + /** + * DOCUMENT ME! + * + * @param aReaderThread DOCUMENT ME! + */ + private void waitForReader(Thread aReaderThread) { + try { + aReaderThread.join(); + } catch (InterruptedException e) { + LOG.warn(this + + ": error waiting for output stream reader of process to finish"); + } + } + + /** + * DOCUMENT ME! + * + * @param aPrefix DOCUMENT ME! + * @param aStream DOCUMENT ME! + * @param aOutput DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + private Thread readAndLogStream(final String aPrefix, + final InputStream aStream, final Writer aOutput) { + Thread inputReader = new Thread() { + @Override + public void run() { + BufferedReader br = null; + + try { + br = new BufferedReader(new InputStreamReader(aStream)); + + String str; + + while ((str = br.readLine()) != null) { + LOG.debug(aPrefix + str); + aOutput.write(str); + } + } catch (IOException e) { + LOG.warn(SimpleProcess.this + + ": error reading input stream", e); + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException e) { + LOG.warn("Error closing stream " + aPrefix); + } + } + } + } + }; + + inputReader.start(); + + return inputReader; + } + + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + @Override + public String toString() { String fullcmd = ""; - for (String part: cmd) { - fullcmd += part + " "; + + for (String part : cmd) { + fullcmd += (part + " "); } - return "process(dir = '" + directory + "', cmd = '" + fullcmd + "')"; - } + + return "process(dir = '" + directory + "', cmd = '" + fullcmd + "')"; + } }