]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.gnuplot/src/org/simantics/gnuplot/GnuplotSession.java
Added missing plug-ins from old SVN repository trunk
[simantics/platform.git] / bundles / org.simantics.gnuplot / src / org / simantics / gnuplot / GnuplotSession.java
diff --git a/bundles/org.simantics.gnuplot/src/org/simantics/gnuplot/GnuplotSession.java b/bundles/org.simantics.gnuplot/src/org/simantics/gnuplot/GnuplotSession.java
new file mode 100644 (file)
index 0000000..32534e0
--- /dev/null
@@ -0,0 +1,79 @@
+package org.simantics.gnuplot;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+/**
+ * @author Tuukka Lehtonen
+ * @since 1.24
+ */
+public class GnuplotSession implements Closeable {
+
+    private Process process;
+    private PrintStream out;
+
+    private Thread stdoutDumper;
+    private Thread stderrDumper;
+
+    GnuplotSession(Path workingDirectory, Path stdout, Path stderr, Process process) {
+        this.process = process;
+        this.out = new PrintStream(process.getOutputStream());
+        stdoutDumper = new Thread(new InputStreamToFileCopier(process.getInputStream(), stdout));
+        stderrDumper = new Thread(new InputStreamToFileCopier(process.getErrorStream(), stderr));
+        stdoutDumper.start();
+        stderrDumper.start();
+    }
+
+    private void assertAlive() {
+        if (process == null)
+            throw new IllegalStateException("session has been closed already");
+    }
+
+    public void evaluate(String commands) throws IOException {
+        assertAlive();
+        out.println(commands);
+    }
+
+    public void evaluateFile(Path file) throws IOException {
+        try {
+            Files.lines(file).forEachOrdered(l -> {
+                try {
+                    evaluate(l);
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        } catch (RuntimeException e) {
+            Throwable t = e.getCause();
+            if (t instanceof IOException)
+                throw (IOException) t;
+            throw e;
+        }
+    }
+
+    @Override
+    public void close() throws IOException {
+        Process p = process;
+        synchronized (this) {
+            if (process == null)
+                return;
+            process = null;
+        }
+
+        // Inform the process that its stdin has closed, i.e. is done.
+        out.close();
+        try {
+            // Wait for the outputs to be closed by the process itself.
+            stdoutDumper.join();
+            stderrDumper.join();
+            p.waitFor();
+            //System.out.println("gnuplot process ended");
+        } catch (InterruptedException e) {
+            throw new IOException(e);
+        }
+    }
+
+}