package jetbrains.mps.execution.configurations.implementation.plugin.plugin; /*Generated by MPS */ import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import java.io.PrintStream; import java.io.PipedInputStream; import java.io.InputStream; import java.io.BufferedInputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PipedOutputStream; import java.io.BufferedOutputStream; import org.apache.log4j.Level; import com.intellij.util.WaitFor; /** * The buffer size value is chosen arbitrarily without any reasonable argumentation * Just that default 1024 in the pipe stream classes seem to be too small */ public class FakeProcess extends Process { private static final Logger LOG = LogManager.getLogger(FakeProcess.class); public static final int TERMINATION_CODE = 137; private static final int BUFFER_SIZE = 65535; private final PrintStream myOldOut; private final PrintStream myOldErr; private final PipedInputStream myInputOut = new PipedInputStream(BUFFER_SIZE); private final PipedInputStream myInputErr = new PipedInputStream(BUFFER_SIZE); private final InputStream myBufIn = new BufferedInputStream(myInputOut); private final InputStream myBufErr = new BufferedInputStream(myInputErr); private int myExitCode = -1; private boolean myDestroyed = false; public FakeProcess() { myOldOut = System.out; myOldErr = System.err; } public void init() throws IOException { System.setOut(createCompositeWrapper(myInputOut)); System.setErr(createCompositeWrapper(myInputErr)); } private PrintStream createCompositeWrapper(PipedInputStream pipeInput) throws IOException { OutputStream newOut = new PipedOutputStream(pipeInput); return new PrintStream(new BufferedOutputStream(newOut)); } public void setExitCode(int code) { myExitCode = code; } @Override public void destroy() { if (myDestroyed) { if (LOG.isEnabledFor(Level.ERROR)) { LOG.error("Already destroyed"); } return; } myDestroyed = true; closeOutAndErr(); } private void closeOutAndErr() { PrintStream newOut = System.out; PrintStream newErr = System.err; System.setOut(myOldOut); System.setErr(myOldErr); newOut.close(); newErr.close(); } @Override public int exitValue() { return myExitCode; } @Override public InputStream getErrorStream() { return myBufErr; } @Override public InputStream getInputStream() { return myBufIn; } @Override public OutputStream getOutputStream() { throw new UnsupportedOperationException("No output stream here"); } @Override public int waitFor() throws InterruptedException { new WaitFor() { protected boolean condition() { return myDestroyed; } }; return myExitCode; } @Override public String toString() { return "in-process.execution"; } }