/* * $Id$ * * Copyright (c) 2010 by Joel Uckelman * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.tools.io; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import VASSAL.tools.concurrent.DaemonThreadFactory; /** * * * @author Joel Uckelman * @since 3.2.0 */ public class ProcessLauncher { private static final Logger logger = LoggerFactory.getLogger(ProcessLauncher.class); protected final ExecutorService exec; public ProcessLauncher() { this(Executors.newCachedThreadPool( new DaemonThreadFactory(ProcessLauncher.class.getSimpleName()))); } ProcessLauncher(ExecutorService exec) { this.exec = exec; } /** * Launches a process. * * @param args the command-line arguments * * @throws IOException if the process fails to launch */ public ProcessWrapper launch(String... args) throws IOException { return launch(null, System.out, System.err, args); } /** * Launches a process. * * @param workDir the process' working directory * @param stdout the stream where the process' STDOUT is redirected * @param stderr the stream where the process' STDERR is redirected * @param args the command-line arguments * * @throws IOException if the process fails to launch */ public ProcessWrapper launch( File workDir, OutputStream stdout, OutputStream stderr, String... args) throws IOException { final InputOutputStreamPump outP = new InputOutputStreamPump(null, stdout); final InputOutputStreamPump errP = new InputOutputStreamPump(null, stderr); return launch(null, outP, errP, args); } /** * Launches a process. * * @param workDir the process' working directory * @param stdout the stream where the process' STDOUT is redirected * @param stderr the stream where the process' STDERR is redirected * @param args the command-line arguments * * @throws IOException if the process fails to launch */ public ProcessWrapper launch( File workDir, InputStreamPump stdoutPump, InputStreamPump stderrPump, String... args) throws IOException { logger.info("launching " + StringUtils.join(args, ' ')); final ProcessBuilder pb = new ProcessBuilder(args); pb.directory(workDir); final Process proc = pb.start(); final ProcessCallable pcall = new ProcessCallable(proc, stdoutPump, stderrPump, exec); final Future<Integer> future = exec.submit(pcall); return new ProcessWrapper( future, proc.getInputStream(), proc.getErrorStream(), proc.getOutputStream() ); } }