tikhomirov@61: /* tikhomirov@61: * Copyright (c) 2011 Artem Tikhomirov tikhomirov@61: */ tikhomirov@61: package com.tmate.hgkit; tikhomirov@61: tikhomirov@61: import java.io.File; tikhomirov@61: import java.io.IOException; tikhomirov@61: import java.io.InputStreamReader; tikhomirov@61: import java.nio.CharBuffer; tikhomirov@61: import java.util.LinkedList; tikhomirov@61: tikhomirov@61: /** tikhomirov@61: * tikhomirov@61: * @author artem tikhomirov@61: */ tikhomirov@61: public class ExecHelper { tikhomirov@61: tikhomirov@61: private final OutputParser parser; tikhomirov@61: private final File dir; tikhomirov@61: tikhomirov@61: public ExecHelper(OutputParser outParser, File workingDir) { tikhomirov@61: parser = outParser; tikhomirov@61: dir = workingDir; tikhomirov@61: } tikhomirov@61: tikhomirov@61: public void run(String... cmd) throws IOException, InterruptedException { tikhomirov@61: Process p = new ProcessBuilder(cmd).directory(dir).redirectErrorStream(true).start(); tikhomirov@61: // Process p = Runtime.getRuntime().exec(cmd, null, dir); tikhomirov@61: InputStreamReader stdOut = new InputStreamReader(p.getInputStream()); tikhomirov@61: LinkedList l = new LinkedList(); tikhomirov@61: int r = -1; tikhomirov@61: CharBuffer b = null; tikhomirov@61: do { tikhomirov@61: if (b == null || b.remaining() < b.capacity() / 3) { tikhomirov@61: b = CharBuffer.allocate(512); tikhomirov@61: l.add(b); tikhomirov@61: } tikhomirov@61: r = stdOut.read(b); tikhomirov@61: } while (r != -1); tikhomirov@61: int total = 0; tikhomirov@61: for (CharBuffer cb : l) { tikhomirov@61: total += cb.position(); tikhomirov@61: cb.flip(); tikhomirov@61: } tikhomirov@61: CharBuffer res = CharBuffer.allocate(total); tikhomirov@61: for (CharBuffer cb : l) { tikhomirov@61: res.put(cb); tikhomirov@61: } tikhomirov@61: res.flip(); tikhomirov@61: p.waitFor(); tikhomirov@61: parser.parse(res); tikhomirov@61: } tikhomirov@61: }