package org.opennms.util.ilr;
import java.io.PrintStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.LinkedHashMap;
import java.util.Map;
public class ArgumentParser {
private String m_programName;
private Object m_argHandler;
private Method m_argMethod;
private String m_argHelp;
PrintStream out = System.err;
private Map<Option, Method> m_options = new LinkedHashMap<Option, Method>();
public ArgumentParser(String programName, Object argHandler) {
m_programName = programName;
m_argHandler = argHandler;
Method [] methods = m_argHandler.getClass().getMethods();
for(Method m: methods){
if(m.isAnnotationPresent(Option.class)){
Option option = m.getAnnotation(Option.class);
m_options.put(option, m);
}
if(m.isAnnotationPresent(Arguments.class)) {
m_argMethod = m;
m_argHelp = m.getAnnotation(Arguments.class).help();
}
}
}
public void processArgs(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
for(int i = 0 ; i < args.length ; i++){
String arg = args[i];
if (arg.equals("-h") || arg.equals("--help")){
printHelpOptions();
}
else if(arg.startsWith("--")){
Option o = findOptionByLongName(arg.substring(2));
executeOption(o, arg);
}
else if(arg.startsWith("-")){
Option o = findOptionByShortName(arg.substring(1));
executeOption(o, arg);
}else{
m_argMethod.invoke(m_argHandler, arg);
}
}
}
public void printHelpOptions() {
out.printf("Usage: %s <options> <arguments> \n", m_programName);
out.printf(" where <arguments> is %s\n", m_argHelp);
out.printf("Options: \n");
out.printf(" -%-5s or --%-15s : %s\n", "h", "help", "print this help");
for(Option o : m_options.keySet()){
out.printf(" -%-5s or --%-15s : %s\n", o.shortName(), o.longName(), o.help());
}
}
public void executeOption(Option o, String arg) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
if(o != null){
Method m = m_options.get(o);
m.invoke(m_argHandler);
}else{
throw new IllegalArgumentException("Illegal Argument: " + arg);
}
}
public Option findOptionByShortName(String arg) {
for(Option o : m_options.keySet()){
if(arg.equals(o.shortName())){
return o;
}
}
return null;
}
public Option findOptionByLongName(String arg) {
for(Option o : m_options.keySet()){
if(arg.equals(o.longName())){
return o;
}
}
return null;
}
}