package junit.extensions.eclipse.quick.process.internal;
import java.util.ArrayList;
public class ProcessParser {
private static final String START_DOUBLE_QUOTE = "\"";
private static final String END_DOUBLE_QUOTE = ".*[^\\\\]\"$";
private static final String SPACE = " ";
public String[] parse(String command){
String[] parse = parse(command,null,null);
return parse;
}
public String[] parse(String command, String summary, String detail){
if(command == null) return new String[]{};
command = replaceResult(command,summary,detail);
String[] splited = command.split(SPACE);
ArrayList<String> results = new ArrayList<String>();
StringBuilder builder = null;
boolean appendMode = false;
for (String item : splited) {
if(appendMode){
builder.append(SPACE);
builder.append(item);
if(item.matches(END_DOUBLE_QUOTE)){
appendMode = false;
String string = builder.toString();
results.add(string.substring(0, string.length() - 1));
builder = null;
}
continue;
}
if(item.startsWith(START_DOUBLE_QUOTE)){
builder = new StringBuilder();
builder.append(item.substring(1, item.length()));
appendMode = true;
continue;
}
results.add(item);
}
if(appendMode){
results.add(builder.toString());
}
return results.toArray(new String[]{});
}
private String replaceResult(String command, String summary, String detail) {
command = command.replaceAll(key(ProcessKey.SUMMARY), quoted(summary));
command = command.replaceAll(key(ProcessKey.DETAIL), quoted(detail));
return command;
}
private String quoted(String target) {
return "\""+ target + "\"";
}
private String key(ProcessKey key){
return key.regexKey();
}
}