package cz.nkp.differ.plugins.tools; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; /** * * @author xrosecky */ public class CommandRunner { public static CommandOutput runCommandAndWaitForExit(File workingDir, List<String> arguments) throws IOException, InterruptedException { ProcessBuilder pb = new ProcessBuilder(arguments); pb.directory(workingDir); Process process = pb.start(); ByteArrayOutputStream stderr = new ByteArrayOutputStream(); ByteArrayOutputStream stdout = new ByteArrayOutputStream(); StreamGobbler sgerr = new StreamGobbler(process.getErrorStream(), stderr); StreamGobbler sgout = new StreamGobbler(process.getInputStream(), stdout); sgerr.start(); sgout.start(); int exitCode = process.waitFor(); sgerr.join(); sgout.join(); CommandOutput result = new CommandOutput(stdout.toByteArray(), stderr.toByteArray()); result.setExitCode(exitCode); return result; } public static class CommandOutput { private byte[] stdout; private byte[] stderr; private int exitCode = -1; public CommandOutput(byte[] stdout, byte[] stderr) { this.stdout = stdout; this.stderr = stderr; } public int getExitCode() { return exitCode; } public void setExitCode(int exitCode) { this.exitCode = exitCode; } public byte[] getStderr() { return stderr; } public byte[] getStdout() { return stdout; } } public static class StreamGobbler extends Thread { InputStream is; OutputStream os; StreamGobbler(InputStream is, OutputStream os) { this.is = is; this.os = os; } @Override public void run() { try { int c; while ((c = is.read()) != -1) { os.write(c); os.flush(); } } catch (IOException x) { throw new RuntimeException(x); } } } }