/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
Part of the Processing project - http://processing.org
Copyright (c) 2009-10 Ben Fry and Casey Reas
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package processing.app.exec;
import java.io.*;
import processing.core.PApplet;
/**
* Class to handle calling Runtime.exec() and stuffing output and error streams
* into Strings that can be dealt with more easily.
*
* @author Jonathan Feinberg <jdf@pobox.com>
*/
public class ProcessHelper {
private final String[] cmd;
// private final String exe;
// private final String[] args;
private final File dir;
public ProcessHelper(final String... cmd) {
this.cmd = cmd;
this.dir = null;
}
public ProcessHelper(File dir, final String... cmd) {
this.cmd = cmd;
this.dir = dir;
}
@Override
public String toString() {
return PApplet.join(cmd, " ");
}
/**
* Blocking execution.
* @return exit value of process
* @throws InterruptedException
* @throws IOException
*/
public ProcessResult execute() throws InterruptedException, IOException {
return execute(null);
}
/**
* Blocks execution, also passes a single line to the command's input stream.
* @return exit value of process
* @throws InterruptedException
* @throws IOException
*/
public ProcessResult execute(String outgoing) throws InterruptedException, IOException {
final StringWriter outWriter = new StringWriter();
final StringWriter errWriter = new StringWriter();
final long startTime = System.currentTimeMillis();
final String prettyCommand = toString();
// System.err.println("ProcessHelper: >>>>> " + Thread.currentThread().getId()
// + " " + prettyCommand);
// final Process process = Runtime.getRuntime().exec(cmd);
final Process process = dir == null ?
Runtime.getRuntime().exec(cmd) :
Runtime.getRuntime().exec(cmd, new String[] { }, dir);
ProcessRegistry.watch(process);
// Write a single line of output to the app... used to write 'no' to 'create avd'
if (outgoing != null) {
OutputStream os = process.getOutputStream();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
pw.println(outgoing);
pw.flush();
pw.close();
}
try {
String title = prettyCommand;
new StreamPump(process.getInputStream(), "out: " + title).addTarget(outWriter).start();
new StreamPump(process.getErrorStream(), "err: " + title).addTarget(errWriter).start();
try {
final int result = process.waitFor();
final long time = System.currentTimeMillis() - startTime;
// System.err.println("ProcessHelper: <<<<< "
// + Thread.currentThread().getId() + " " + cmd[0] + " (" + time
// + "ms)");
return new ProcessResult(prettyCommand, result, outWriter.toString(),
errWriter.toString(), time);
} catch (final InterruptedException e) {
System.err.println("Interrupted: " + prettyCommand);
throw e;
}
} finally {
process.destroy();
ProcessRegistry.unwatch(process);
}
}
static public boolean ffs(final String... cmd) {
try {
ProcessHelper helper = new ProcessHelper(cmd);
ProcessResult result = helper.execute();
if (result.succeeded()) {
return true;
}
System.out.println(result.getStdout());
System.err.println(result.getStderr());
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}