package org.jmeld.vc.util;
import org.jmeld.util.*;
import java.io.*;
import java.util.*;
public abstract class VcCmd<T> {
// Class variables:
static private boolean debug = true;
// Instance variables:
private Result result;
private T resultData;
protected File workingDirectory;
public void initWorkingDirectory(File file) {
file = file.getAbsoluteFile();
if(!file.isDirectory()) {
file = file.getParentFile();
}
if(file.isDirectory()) {
workingDirectory = file;
} else {
workingDirectory = null;
}
}
public void execute(String... command) {
setResult(_execute(command));
}
protected final Result _execute(String... command) {
ProcessBuilder pb;
Process p;
BufferedReader br;
InputStream is;
int count;
ByteArrayOutputStream baos;
String text;
StringBuilder errorText;
byte[] data;
try {
pb = new ProcessBuilder(command);
if(workingDirectory != null) {
pb = pb.directory(workingDirectory);
System.out.println("wd=" + workingDirectory);
}
System.out.println("wd2=" + pb.directory());
p = pb.start();
debug("execute: " + Arrays.asList(command));
data = new byte[4096];
baos = new ByteArrayOutputStream();
is = new BufferedInputStream(p.getInputStream());
while ((count = is.read(data, 0, data.length)) != -1) {
baos.write(data, 0, count);
}
is.close();
p.waitFor();
debug(" exitValue = " + p.exitValue());
if (p.exitValue() != 0) {
errorText = new StringBuilder();
br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((text = br.readLine()) != null) {
errorText.append(text);
}
br.close();
return Result.FALSE(errorText.toString() + " (exitvalue="
+ p.exitValue() + ")");
}
build(baos.toByteArray());
baos.close();
} catch (Exception ex) {
result = Result.FALSE(ex.getMessage(), ex);
return result;
}
return Result.TRUE();
}
protected abstract void build(byte[] data);
public void printError() {
System.out.println(result.getDescription());
if (result.hasException()) {
result.getException().printStackTrace();
}
}
public Result getResult() {
return result;
}
protected void setResult(Result result) {
this.result = result;
}
protected void setResultData(T resultData) {
this.resultData = resultData;
}
public T getResultData() {
return resultData;
}
private void debug(String text) {
if(debug) {
System.out.println(text);
}
}
public static final File parseFile(String[] args) {
return parseFile(args, 0);
}
public static final File parseFile(String[] args, int pos) {
int arglength = pos + 1;
if (args.length < arglength) {
System.err.printf("few arguments given. At least %d is required%n", arglength);
return null;
}
String filename = args[pos];
File file = new File(filename);
if (!file.exists()) {
System.err.printf("File %s not exists%n", filename);
return null;
}
return file;
}
}