package de.mxro.process; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.concurrent.CountDownLatch; import de.mxro.process.internal.Engine; public class Spawn { /** * Start a new process. * * @param command * @param listener * @param folder * @return */ public static XProcess startProcess(final String command, final File folder, final ProcessListener listener) { return startProcess(command.split(" "), folder, listener); } public static XProcess startProcess(final String[] command, final File folder, final ProcessListener listener) { return Engine.startProcess(command, listener, folder); } public static String runCommand(final String command, final File folder) { return runCommand(command.split(" "), folder); } /** * Runs a command in a new process and stops the process thereafter. * * @param command * @param folder */ public static String runCommand(final String[] command, final File folder) { final CountDownLatch latch = new CountDownLatch(2); final List<Throwable> exceptions = Collections.synchronizedList(new LinkedList<Throwable>()); final List<String> output = Collections.synchronizedList(new LinkedList<String>()); latch.countDown(); final XProcess process = startProcess(command, folder, new ProcessListener() { @Override public void onProcessQuit(final int returnValue) { latch.countDown(); } @Override public void onOutputLine(final String line) { output.add(line); } @Override public void onErrorLine(final String line) { output.add(line); } @Override public void onError(final Throwable t) { exceptions.add(t); } }); try { latch.await(); // Thread.sleep(300); // just wait for input to gobble in } catch (final InterruptedException e) { throw new RuntimeException(e); } if (exceptions.size() > 0) { throw new RuntimeException(exceptions.get(0)); } final StringBuilder sb = new StringBuilder(); for (final String line : new ArrayList<String>(output)) { sb.append(line + "\n"); } process.destory(); return sb.toString(); } public interface Callback<Type> { public void onDone(Type t); } /** * Runs bash scripts (*.sh) in a UNIX environment. * * @param bashScriptFile * @return */ public static String runBashScript(final File bashScriptFile) { return runCommand("/bin/bash -c " + bashScriptFile.getAbsolutePath(), bashScriptFile.getParentFile()); } public static boolean isWindows() { return System.getProperty("os.name").startsWith("Windows"); } public static String sh(final File folder, final String bashCommand) { if (!isWindows()) { return runCommand(new String[] { "/bin/bash", "-c", bashCommand }, folder); } else { return runCommand(new String[] { "cmd.exe", "/C", bashCommand }, folder); } } /** * Executes a bash command. * * @param bashCommand * @return */ public static String sh(final String bashCommand) { return sh(null, bashCommand); } }