blob: 5e7796fa41ffb4bfac0628b0c16d7e934333c973 [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* 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.
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* An out of process executable.
*/
class Command {
private final List<String> args;
private final boolean permitNonZeroExitStatus;
Command(String... args) {
this(Arrays.asList(args));
}
Command(List<String> args) {
this.args = new ArrayList<String>(args);
this.permitNonZeroExitStatus = false;
}
private Command(Builder builder) {
this.args = new ArrayList<String>(builder.args);
this.permitNonZeroExitStatus = builder.permitNonZeroExitStatus;
}
static class Builder {
private final List<String> args = new ArrayList<String>();
private boolean permitNonZeroExitStatus = false;
public Builder args(String... args) {
return args(Arrays.asList(args));
}
public Builder args(Collection<String> args) {
this.args.addAll(args);
return this;
}
public Builder permitNonZeroExitStatus() {
permitNonZeroExitStatus = true;
return this;
}
public Command build() {
return new Command(this);
}
public List<String> execute() {
return build().execute();
}
}
public List<String> execute() {
try {
Process process = new ProcessBuilder()
.command(args)
.redirectErrorStream(true)
.start();
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
List<String> outputLines = new ArrayList<String>();
String outputLine;
while ((outputLine = in.readLine()) != null) {
outputLines.add(outputLine);
}
if (process.waitFor() != 0 && !permitNonZeroExitStatus) {
StringBuilder message = new StringBuilder();
for (String line : outputLines) {
message.append("\n").append(line);
}
throw new RuntimeException("Process failed: " + args + message);
}
return outputLines;
} catch (IOException e) {
throw new RuntimeException("Process failed: " + args, e);
} catch (InterruptedException e) {
throw new RuntimeException("Process failed: " + args, e);
}
}
}