package fr.ens.biologie.genomique.eoulsan.util.process; import fr.ens.biologie.genomique.eoulsan.EoulsanLogger; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Map; /** * This class define how to easily launch a subprocess using the Java Process * API. * @author Laurent Jourdren * @since 2.0 */ public class SystemSimpleProcess extends AbstractSimpleProcess { @Override public AdvancedProcess start(final List<String> commandLine, final File executionDirectory, final Map<String, String> environmentVariables, final File temporaryDirectory, final File stdoutFile, final File stderrFile, final boolean redirectErrorStream, final File... filesUsed) throws IOException { EoulsanLogger.getLogger().fine(getClass().getName() + " : commandLine=" + commandLine + ", executionDirectory=" + executionDirectory + ", environmentVariables=" + environmentVariables + ", temporaryDirectory=" + temporaryDirectory + ", stdoutFile=" + stdoutFile + ", stderrFile=" + stderrFile + ", redirectErrorStream="+redirectErrorStream + ", filesUsed" + Arrays.toString(filesUsed)); final ProcessBuilder pb = new ProcessBuilder(commandLine); // Set execution directory if (executionDirectory != null) { pb.directory(executionDirectory); } // Set environment variables if (environmentVariables != null) { pb.environment().putAll(environmentVariables); } // Set temporary directory if (temporaryDirectory != null) { pb.environment().put(TMP_DIR_ENV_VARIABLE, temporaryDirectory.getAbsolutePath()); } // Redirect stdout if (stdoutFile != null) { pb.redirectOutput(stdoutFile); } // Redirect stderr if (redirectErrorStream) { pb.redirectErrorStream(true); } else if (stderrFile != null) { pb.redirectError(stderrFile); } final Process process = pb.start(); return new AdvancedProcess() { @Override public int waitFor() throws IOException { try { return process.waitFor(); } catch (InterruptedException e) { throw new IOException(e); } } }; } }