Java tutorial
/* * Copyright 2011 Jesper Terkelsen. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * */ package dk.deck.remoteconsole.proxy; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; /** * Executes commands on the local machine and redirects output to standard out and standard error of current program * * @author Jesper Terkelsen */ public class LocalExecutor { private static final String LOCAL_SCRIPT = "local-executor-temp.sh"; public void executeAsScript(String command, String[] arguments, final PrintStream out, final PrintStream error) throws IOException, InterruptedException { File scriptFile = new File(LOCAL_SCRIPT); String script = command; for (String argument : arguments) { script += " " + argument; } scriptFile.createNewFile(); FileUtils.writeStringToFile(scriptFile, script); Runtime.getRuntime().exec("chmod +x " + LOCAL_SCRIPT); execute("/bin/bash", new String[] { LOCAL_SCRIPT }, out, error); scriptFile.delete(); } public void execute(String command, String[] arguments, final PrintStream out, final PrintStream error) throws IOException, InterruptedException { List<String> args = new ArrayList<String>(); args.add(command); args.addAll(Arrays.asList(arguments)); ProcessBuilder builder = new ProcessBuilder(args); // Map<String, String> env = builder.environment(); // System.out.println("Env:"); // for (Map.Entry<String, String> entry : env.entrySet()) { // System.out.println(entry.getKey() + "=" + entry.getValue()); // } final Process p = builder.start(); Runnable copyOutput = new Runnable() { @Override public void run() { try { IOUtils.copyLarge(p.getInputStream(), out); } catch (IOException ex) { ex.printStackTrace(); } } }; Runnable copyError = new Runnable() { @Override public void run() { try { IOUtils.copyLarge(p.getErrorStream(), error); } catch (IOException ex) { ex.printStackTrace(); } } }; new Thread(copyOutput).start(); new Thread(copyError).start(); int exitValue = p.waitFor(); if (exitValue != 0) { throw new IllegalStateException("Exit value for dump was " + exitValue); } } }