/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.editor.codecompletion.shell; import java.io.File; import java.io.IOException; import java.util.Arrays; import org.python.pydev.core.log.Log; import org.python.pydev.shared_core.io.ThreadStreamReader; import org.python.pydev.shared_core.string.StringUtils; public class ProcessCreationInfo { public final String[] parameters; public final String[] envp; public final File workingDir; private final Process process; private ThreadStreamReader stdReader; private ThreadStreamReader errReader; public ProcessCreationInfo(String[] parameters, String[] envp, File workingDir, Process process) { this.parameters = parameters; if (envp != null) { Arrays.sort(envp); //Keep it sorted! } this.envp = envp; this.workingDir = workingDir; this.process = process; try { process.getOutputStream().close(); //we won't write to it... } catch (IOException e2) { } //will print things if we are debugging or just get it (and do nothing except emptying it) stdReader = new ThreadStreamReader(process.getInputStream()); errReader = new ThreadStreamReader(process.getErrorStream()); stdReader.setName("Shell reader (stdout)"); errReader.setName("Shell reader (stderr)"); stdReader.start(); errReader.start(); } public String getProcessLog() { String joinedParams = StringUtils.join(" ", parameters); String environment = "EMPTY ENVIRONMENT"; if (envp != null) { environment = StringUtils.join("\n", envp); } String workDir = "NULL WORK DIR"; if (workingDir != null) { workDir = workingDir.toString(); } String osName = System.getProperty("os.name"); if (osName == null) { osName = "Unknown OS!"; } String stdContents = stdReader.getContents(); String errContents = errReader.getContents(); //Pre-allocate it in a proper size. String[] splitted = new String[] { "ProcessInfo:\n\n - Executed: ", joinedParams, "\n\n - Environment:\n", environment, "\n\n - Working Dir:\n", workDir, "\n\n - OS:\n", osName, "\n\n - Std output:\n", stdContents, "\n\n - Err output:\n", errContents }; return StringUtils.join("", splitted); } public String getAndClearContents() { String stdContents = stdReader.getContents(); String errContents = errReader.getContents(); return StringUtils.join("", "STDOUT: ", stdContents, "\nESTDERR: ", errContents, "\n"); } private void stopGettingOutput() { if (stdReader != null) { stdReader.stopGettingOutput(); } stdReader = null; if (errReader != null) { errReader.stopGettingOutput(); } errReader = null; } public void destroy() { stopGettingOutput(); try { this.process.destroy(); } catch (Exception e) { Log.log(e); } } public int exitValue() { return this.process.exitValue(); } /** * Use to clear contents so that we don't become a heap sink! */ public void clearOutput() { if (this.stdReader != null) { this.stdReader.clearContents(); } if (this.errReader != null) { this.errReader.clearContents(); } } }