/*
- * Copyright 2007 the original author or authors.
- *
+ * Copyright 2005-2010 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;
import java.io.InputStream;
import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.PrintStream;
import java.io.StringWriter;
import java.io.Writer;
+import java.util.Arrays;
+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);
- /**
- * DOCUMENT ME!
- */
private File directory;
- /**
- * DOCUMENT ME!
- */
private String[] cmd;
- /**
- * DOCUMENT ME!
- */
private String stdout;
- /**
- * DOCUMENT ME!
- */
private String stderr;
-/**
+ /**
* Creates a new SimpleProcess object.
- *
- * @param aDirectory DOCUMENT ME!
- * @param aCmd DOCUMENT ME!
+ *
*/
public SimpleProcess(File aDirectory, String[] aCmd) {
- directory = aDirectory;
- cmd = aCmd;
+ directory = aDirectory;
+ cmd = Arrays.copyOf(aCmd, aCmd.length);
}
/**
- * DOCUMENT ME!
- *
+ *
* @return the stdout
*/
public String getStdout() {
}
/**
- * DOCUMENT ME!
- *
+ *
* @return the stderr
*/
public String getStderr() {
/**
* Runs the process and blocks until it is done.
- *
+ *
* @return Exit status of the process.
- *
- * @throws IOException In case of problems.
+ *
+ * @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 = "";
+ StringBuffer fullcmd = new StringBuffer();
for (String part : cmd) {
- fullcmd += (" " + part);
+ fullcmd.append(" " + part);
}
- LOG.debug("Executing '" + fullcmd + "' in directory '" + directory
- + "'");
+ LOG.debug("Executing '" + fullcmd + "' in directory '" + directory +
+ "'");
- java.lang.Process proc = Runtime.getRuntime()
- .exec(cmd, null, 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);
+ 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);
+ "Process was terminated: " + this);
exception.initCause(e);
throw exception;
}
waitForReader(stdoutReader);
waitForReader(stderrReader);
- stdout = myStdout.toString();
- stderr = myStderr.toString();
+ stdout = myStdout.toString();
+ stderr = myStderr.toString();
if (proc.exitValue() != 0) {
LOG.warn("Exit value was non-zero: " + this);
return proc.exitValue();
} catch (IOException e) {
- IOException exception = new IOException("Error executing process: "
- + this);
+ 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");
+ 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;
+ @Override
+ public void run() {
+ BufferedReader br = null;
- try {
- br = new BufferedReader(new InputStreamReader(aStream));
+ try {
+ br = new BufferedReader(new InputStreamReader(aStream));
- String str;
+ 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);
- }
+ 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 = "";
+ StringBuffer fullcmd = new StringBuffer();
for (String part : cmd) {
- fullcmd += (part + " ");
+ fullcmd.append(part + " ");
}
return "process(dir = '" + directory + "', cmd = '" + fullcmd + "')";