// Copyright 2011 Google Inc. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package com.google.typography.font.compression; import com.google.common.io.ByteStreams; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * This is a simple wrapper to run a commandline as a pipe. It's not * particularly efficient, robust, or featureful. */ public class Command { private class StreamConsumer extends Thread { private final InputStream is; private byte[] result = null; public StreamConsumer(InputStream is) { this.is = is; } @Override public void run() { try { result = ByteStreams.toByteArray(is); } catch (IOException e) { // TODO: handle this well } } public byte[] getResult() { return result; } } private final ProcessBuilder processBuilder; public Command(String[] args) { processBuilder = new ProcessBuilder(args); } public CommandResult execute(byte[] input) throws CommandException { Process process; try { process = processBuilder.start(); } catch (IOException e) { throw new CommandException("exec failed"); } StreamConsumer sc = new StreamConsumer(process.getInputStream()); sc.start(); OutputStream stdin = process.getOutputStream(); try { stdin.write(input); stdin.close(); } catch (IOException e) { throw new CommandException("error writing input"); } try { process.waitFor(); sc.join(); } catch (InterruptedException e) { throw new CommandException("interrupted"); } return new CommandResult(sc.getResult()); } }