< prev index next >

test/lib/jdk/test/lib/process/OutputBuffer.java

Print this page
rev 51638 : [mq]: 8210112
rev 51639 : [mq]: 8210112-1

@@ -21,39 +21,127 @@
  * questions.
  */
 
 package jdk.test.lib.process;
 
-public class OutputBuffer {
-  private final String stdout;
-  private final String stderr;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 
-  /**
-   * Create an OutputBuffer, a class for storing and managing stdout and stderr
-   * results separately
-   *
-   * @param stdout stdout result
-   * @param stderr stderr result
-   */
-  public OutputBuffer(String stdout, String stderr) {
-    this.stdout = stdout;
-    this.stderr = stderr;
+public interface OutputBuffer {
+  public static class OutputBufferException extends RuntimeException {
+    private static final long serialVersionUID = 8528687792643129571L;
+
+    public OutputBufferException(Throwable cause) {
+      super(cause);
+    }
   }
 
   /**
    * Returns the stdout result
    *
    * @return stdout result
    */
-  public String getStdout() {
-    return stdout;
-  }
-
+  public String getStdout();
   /**
    * Returns the stderr result
    *
    * @return stderr result
    */
+  public String getStderr();
+  public int getExitValue();
+
+  public static OutputBuffer of(Process p) {
+    return new LazyOutputBuffer(p);
+  }
+
+  public static OutputBuffer of(String stdout, String stderr, int exitValue) {
+    return new EagerOutputBuffer(stdout, stderr, exitValue);
+  }
+
+  public static OutputBuffer of(String stdout, String stderr) {
+    return of(stdout, stderr, -1);
+  }
+
+  class LazyOutputBuffer implements OutputBuffer {
+    private static class StreamTask {
+      private final ByteArrayOutputStream buffer;
+      private final Future<Void> future;
+
+      private StreamTask(InputStream stream) {
+        this.buffer = new ByteArrayOutputStream();
+        this.future = new StreamPumper(stream, buffer).process();
+      }
+
+      public String get() {
+        try {
+          future.get();
+          return buffer.toString();
+        } catch (InterruptedException e) {
+          Thread.currentThread().interrupt();
+          throw new OutputBufferException(e);
+        } catch (ExecutionException | CancellationException e) {
+          throw new OutputBufferException(e);
+        }
+      }
+    }
+
+    private final StreamTask outTask;
+    private final StreamTask errTask;
+    private final Process p;
+
+    private LazyOutputBuffer(Process p) {
+      this.p = p;
+      outTask = new StreamTask(p.getInputStream());
+      errTask = new StreamTask(p.getErrorStream());
+    }
+
+    @Override
+    public String getStdout() {
+      return outTask.get();
+    }
+
+    @Override
+    public String getStderr() {
+      return errTask.get();
+    }
+
+    @Override
+    public int getExitValue() {
+      try {
+        return p.waitFor();
+      } catch (InterruptedException e) {
+        Thread.currentThread().interrupt();
+        throw new OutputBufferException(e);
+      }
+    }
+  }
+
+  class EagerOutputBuffer implements OutputBuffer {
+    private final String stdout;
+    private final String stderr;
+    private final int exitValue;
+
+    private EagerOutputBuffer(String stdout, String stderr, int exitValue) {
+      this.stdout = stdout;
+      this.stderr = stderr;
+      this.exitValue = exitValue;
+    }
+
+    @Override
+    public String getStdout() {
+      return stdout;
+    }
+
+    @Override
   public String getStderr() {
     return stderr;
   }
+
+    @Override
+    public int getExitValue() {
+      return exitValue;
+    }
+  }
 }
< prev index next >