package com.sandwich.koan.cmdline;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.logging.Logger;
import com.sandwich.koan.ApplicationSettings;
import com.sandwich.koan.constant.ArgumentType;
import com.sandwich.koan.ui.SuitePresenter;
import com.sandwich.koan.util.ApplicationUtils;
public class CommandLineArgumentBuilder extends LinkedHashMap<ArgumentType, CommandLineArgument> {
private static final long serialVersionUID = 7635285665311420603L;
public CommandLineArgumentBuilder(String...args){
args = filterOutNullElements(args);
if(args.length == 0){
put(ArgumentType.RUN_KOANS, new CommandLineArgument(ArgumentType.RUN_KOANS, new String[0]));
} else if (args.length == 1 && ArgumentType.findTypeByString(args[0]) == null){
put(ArgumentType.CLASS_ARG, new CommandLineArgument(ArgumentType.CLASS_ARG, args[0]));
} else if (args.length == 2 && ArgumentType.findTypeByString(args[0]) == null && ArgumentType.findTypeByString(args[1]) == null){
put(ArgumentType.CLASS_ARG, new CommandLineArgument(ArgumentType.CLASS_ARG, args[0]));
put(ArgumentType.METHOD_ARG, new CommandLineArgument(ArgumentType.METHOD_ARG, args[1]));
} else {
ArgumentType type = null;
List<String> params = null;
for(int index = 0; index < args.length; index++){
ArgumentType tmpType = ArgumentType.findTypeByString(args[index]);
if(tmpType == null){
if(type == null){
Logger.getAnonymousLogger().warning("The argument: " + args[index] + " is not recognized, it will be ignored");
}else{
params.add(args[index]);
}
}else{
if(type == null){
type = tmpType;
params = new ArrayList<String>();
}else{
put(type, new CommandLineArgument(type, params.toArray(new String[params.size()])));
type = null;
params = new ArrayList<String>();
}
}
}
if(type != null && params != null){
put(type, new CommandLineArgument(type, params.toArray(new String[params.size()])));
}
}
applyAssumedStartupBehaviors();
}
private String[] filterOutNullElements(String... args) {
List<String> tempArgs = new ArrayList<String>();
for(String arg : args){
if(arg != null && arg.trim().length() > 0){
tempArgs.add(arg.trim());
}
}
return tempArgs.toArray(new String[tempArgs.size()]);
}
void applyAssumedStartupBehaviors() {
if(ApplicationUtils.isFirstTimeAppHasBeenRun()){
ArgumentType.BACKUP.run(new String[0]);
ApplicationUtils.getPresenter().clearMessages();
}
if(isEmpty() || !containsKey(ArgumentType.RUN_KOANS) && (
containsKey(ArgumentType.CLASS_ARG) ||
containsKey(ArgumentType.DEBUG))){
if(ApplicationSettings.isDebug()){
SuitePresenter presenter = ApplicationUtils.getPresenter();
presenter.displayMessage("Planting default run target.");
for(Entry<ArgumentType, CommandLineArgument> argEntry : entrySet()){
presenter.displayMessage("Key: '"+argEntry.getKey()+"'");
presenter.displayMessage("Value: '"+argEntry.getValue()+"'");
}
}
put(ArgumentType.RUN_KOANS, new CommandLineArgument(ArgumentType.RUN_KOANS, true, new String[0]));
}
}
}