package javacodebook.io.startextern;

import java.io.*;

/**
 * Externe Programme können von Java aus gestartet werden. Dabei ist es
 * möglich, ein Programm zu starten, die Ausgaben abzufangen und auf das
 * Ende der Programmausführung zu warten.
 */
public class ProgramController {

    /*
     * Ein externes Programm wird gestartet, ohne weitere Kontrolle darüber
     * auszuüben. Dies kann z.B. der Aufruf des Browsers sein, um eine
     * HTML-Datei anzuzeigen.
     */
    public static void startProgram(String command)
    throws IOException {
        Runtime runtime = Runtime.getRuntime();
        runtime.exec(command);
    }

    /*
     * Ein externes Programm wird gestartet. Anschliessend wird auf das
     * Ende der Ausführung gewartet.
     */
    public static int startAndWaitForProgram(String command)
    throws IOException {
        Runtime runtime = Runtime.getRuntime();
        Process p = runtime.exec(command);
        try {
            p.waitFor();
        } catch(InterruptedException e) {
            return -1;
        }
        return p.exitValue();
    }

    /*
     * Ein externes Programm wird gestartet, die Ausgabe wird abgefangen und
     * in die Standardausgabe geschrieben.
     */
    public static int startProgramAndWriteOutput(String command)
    throws IOException {
        Runtime runtime = Runtime.getRuntime();
        Process p = runtime.exec(command);
        BufferedReader brstdout = new BufferedReader(
            new InputStreamReader(p.getInputStream()));
        StringBuffer buffer = new StringBuffer();
        String line = "";
        while((line = brstdout.readLine()) != null) {
            System.out.println(line);
        }
        try {
            p.waitFor();
        } catch(InterruptedException e) {
            return -1;
        }
        return p.exitValue();
    }
}