/** * Author: Bettina Koenighofer <bettina.koenighofer@iaik.tugraz.at> */ package at.iaik.suraq.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import at.iaik.suraq.main.SuraqOptions; /** * Utility functions for running external executables. * * @author Bettina Koenighofer <bettina.koenighofer@iaik.tugraz.at> * */ public class ProcessUtil { /** * Runs an external process and gets the output and error stream. * * @param executable * path to the external executable * @return structure containing the process results. */ public static ProcessResult runExternalProcess(String executable) { int exitCode = -1; String outputStream = null; String errorStream = null; try { Process p = Runtime.getRuntime().exec(executable); BufferedReader input = new BufferedReader(new InputStreamReader( p.getInputStream())); BufferedReader error = new BufferedReader(new InputStreamReader( p.getErrorStream())); StringBuffer resultBuffer = new StringBuffer(); String line; line = input.readLine(); while (line != null && !line.trim().equals("--EOF--")) { resultBuffer.append(line + "\n"); line = input.readLine(); } try { exitCode = p.waitFor(); } catch (InterruptedException exc) { throw new RuntimeException("InterruptedException...", exc); } outputStream = resultBuffer.toString(); resultBuffer = new StringBuffer(); line = error.readLine(); while (line != null && !line.trim().equals("--EOF--")) { resultBuffer.append(line + "\n"); line = error.readLine(); } errorStream = resultBuffer.toString(); } catch (IOException e) { e.printStackTrace(); } return new ProcessResult(outputStream, errorStream, exitCode); } /** * Runs an external process and gets the output and error stream as real * streams, instead of strings. * * @param executable * path to the external executable * @return structure containing the process results. */ public static ProcessResultStreams runExternalProcessWithStreamResult( String executable) { int exitCode = -1; ProcessResultStreams result = null; try { // Process p = Runtime.getRuntime().exec(executable); // // BufferedReader input = new BufferedReader(new InputStreamReader( // p.getInputStream())); ProcessBuilder pb = new ProcessBuilder(executable.split(" ")); File resultFile = File.createTempFile("z3Result", ".smt2", new File("./")); if (!SuraqOptions.getInstance().getKeepTemFiles()) resultFile.deleteOnExit(); System.out.println("z3 Result file: " + resultFile.toString()); pb.redirectOutput(resultFile); Process p = pb.start(); BufferedReader error = new BufferedReader(new InputStreamReader( p.getErrorStream())); try { exitCode = p.waitFor(); } catch (InterruptedException exc) { throw new RuntimeException("InterruptedException...", exc); } FileReader freader = new FileReader(resultFile); BufferedReader input = new BufferedReader(freader); result = new ProcessResultStreams(input, error, exitCode); } catch (IOException exc) { throw new RuntimeException("IOException...", exc); } return result; } /** * Runs an external process writes a string to stdin and gets the output and * error stream. * * @param executable * path to the external executable * @param inputStr * String to write to the process' stdin * @return structure containing the process results. */ public static ProcessResult runExternalProcess(String executable, String inputStr) { int exitCode = -1; String outputStream = null; String errorStream = null; try { Process p = Runtime.getRuntime().exec(executable); BufferedReader input = new BufferedReader(new InputStreamReader( p.getInputStream())); BufferedReader error = new BufferedReader(new InputStreamReader( p.getErrorStream())); BufferedWriter stdin = new BufferedWriter(new OutputStreamWriter( p.getOutputStream())); stdin.write(inputStr); stdin.flush(); stdin.close(); StringBuffer resultBuffer = new StringBuffer(); String line; line = input.readLine(); while (line != null && !line.trim().equals("--EOF--")) { resultBuffer.append(line + "\n"); line = input.readLine(); } try { exitCode = p.waitFor(); } catch (InterruptedException exc) { throw new RuntimeException("InterruptedException...", exc); } outputStream = resultBuffer.toString(); resultBuffer = new StringBuffer(); line = error.readLine(); while (line != null && !line.trim().equals("--EOF--")) { resultBuffer.append(line + "\n"); line = error.readLine(); } errorStream = resultBuffer.toString(); } catch (IOException e) { e.printStackTrace(); } return new ProcessResult(outputStream, errorStream, exitCode); } }