/******************************************************************************* * Copyright (c) 2002 - 2006 IBM Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package com.ibm.wala.util.processes; import java.io.BufferedOutputStream; import java.io.IOException; import java.util.logging.Logger; /** * A generic process launcher */ public class BasicLauncher extends Launcher { protected String cmd; public BasicLauncher(boolean captureOutput, boolean captureErr, Logger logger) { super(captureOutput, captureErr, logger); } public String getCmd() { return cmd; } public void setCmd(String newCmd) { cmd = newCmd; } @Override public String toString() { StringBuffer result = new StringBuffer(super.toString()); result.append(" (cmd: "); result.append(cmd); return result.toString(); } /** * Launch the process and wait until it is finished. Returns the exit value of the process. */ public int launch() throws IllegalArgumentException, IOException { Process p = spawnProcess(getCmd()); Thread d1 = isCaptureErr() ? captureStdErr(p) : drainStdErr(p); Thread d2 = isCaptureOutput() ? captureStdOut(p) : drainStdOut(p); if (getInput() != null) { final BufferedOutputStream input = new BufferedOutputStream(p.getOutputStream()); try { input.write(getInput(), 0, getInput().length); input.flush(); input.close(); } catch (IOException e) { e.printStackTrace(); throw new IOException("error priming stdin", e); } } try { d1.join(); d2.join(); } catch (InterruptedException e) { throw new Error("Internal error", e); } if (isCaptureErr()) { Drainer d = (Drainer) d1; setStdErr(d.getCapture().toByteArray()); } if (isCaptureOutput()) { Drainer d = (Drainer) d2; setStdOut(d.getCapture().toByteArray()); } return p.exitValue(); } }