package edu.berkeley.nlp.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.concurrent.Semaphore;
/**
* Runs stuff in a shell
*
* @author denero
*/
public class Shell {
private static class StreamGobbler extends Thread {
InputStream is;
String output;
Semaphore semaphore;
String prefix;
boolean echo;
StreamGobbler(InputStream is, String prefix, boolean echo) {
this.is = is;
semaphore = new Semaphore(1);
semaphore.acquireUninterruptibly();
this.echo = echo;
this.prefix = prefix;
}
public void run() {
StringBuilder outputBuilder = new StringBuilder();
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
outputBuilder.append(line + "\n");
if(echo) System.out.println(prefix + line);
}
} catch (IOException ioe) {
throw new RuntimeException(ioe);
}
output = outputBuilder.toString();
semaphore.release();
}
public String getOutput() {
semaphore.acquireUninterruptibly();
semaphore.release();
return output;
}
}
public static String execute(String cmd) {
return execute(cmd, false);
}
public static String execute(String cmd, boolean echo) {
try {
Process proc = Runtime.getRuntime().exec(cmd);
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERR> ", echo);
StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUT> ", echo);
// kick them off
errorGobbler.start();
outputGobbler.start();
proc.waitFor();
return outputGobbler.getOutput();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}