< prev index next >

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

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

*** 21,59 **** * questions. */ package jdk.test.lib.process; ! public class OutputBuffer { ! private final String stdout; ! private final String stderr; ! /** ! * 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; } /** * Returns the stdout result * * @return stdout result */ ! public String getStdout() { ! return stdout; ! } ! /** * Returns the stderr result * * @return stderr result */ public String getStderr() { return stderr; } } --- 21,147 ---- * questions. */ package jdk.test.lib.process; ! import java.io.ByteArrayOutputStream; ! import java.io.InputStream; ! import java.util.concurrent.CancellationException; ! import java.util.concurrent.ExecutionException; ! import java.util.concurrent.Future; ! 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(); /** * 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 >