ProcessTools.java
package eu.javaexperience.process;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import eu.javaexperience.io.IOTools;
import eu.javaexperience.multithread.Job;
public class ProcessTools
{
public static byte[] processStdoutResult(String... prog) throws IOException, InterruptedException
{
ProcessBuilder pb = new ProcessBuilder(prog);
Process p = pb.start();
byte[] data = IOTools.loadAllFromInputStream(p.getInputStream());
p.waitFor();
return data;
}
public static byte[] processStderrResult(String... prog) throws IOException, InterruptedException
{
ProcessBuilder pb = new ProcessBuilder(prog);
Process p = pb.start();
byte[] data = IOTools.loadAllFromInputStream(p.getErrorStream());
p.waitFor();
return data;
}
public static int processExitStatus(String... prog) throws IOException, InterruptedException
{
ProcessBuilder pb = new ProcessBuilder(prog);
Process p = pb.start();
return p.waitFor();
}
public static Process processRun(String... prog) throws IOException, InterruptedException
{
ProcessBuilder pb = new ProcessBuilder(prog);
return pb.start();
}
protected static final Job<InputStream> READ_ALL = new Job<InputStream>()
{
@Override
public void exec(InputStream param) throws Throwable
{
IOTools.copyStream(param, IOTools.nullOutputStream);
}
};
//XXX: Oh boy... use the PATH enverinment variable like real `which`. TODO Test
@Deprecated
protected static final String[] PATHS = new String[]
{
"/usr/local/bin/",
"/usr/bin/",
"/bin/",
"/usr/local/games/",
"/usr/games/",
"/usr/lib/jvm/java-7-oracle/bin/",
"/usr/lib/jvm/java-7-oracle/db/bin/",
"/usr/lib/jvm/java-7-oracle/jre/bin/"
};
public static String which(String prog)
{
return which(prog, PATHS);
}
public static String which(String prog, String... paths)
{
for(String path:paths)
{
String file = path+prog;
if(new File(file).exists())
{
return file;
}
}
return null;
}
public static void assertedProcessExitStatus(String... prog) throws IOException, InterruptedException
{
int exit = processExitStatus(prog);
if(0 != exit)
{
throw new RuntimeException("Process Exit status not zero: "+exit+" "+Arrays.toString(prog));
}
}
public static void assertedProcessExitStatusWithWorkingDirectory(File wd, String... prog) throws InterruptedException, IOException
{
ProcessBuilder pb = new ProcessBuilder(prog);
pb.directory(wd);
int exit = pb.start().waitFor();
if(0 != exit)
{
throw new RuntimeException("Process Exit status not zero: "+exit+" "+Arrays.toString(prog));
}
}
public static int processWithWorkingDirectory(File wd, String... prog) throws InterruptedException, IOException
{
ProcessBuilder pb = new ProcessBuilder(prog);
pb.directory(wd);
return pb.start().waitFor();
}
}