package de.skuzzle.polly.core.commandline; import java.util.Arrays; import java.util.HashSet; import java.util.Set; public abstract class AbstractArgumentParser { protected Set<Argument> arguments; private String canonical = ""; //$NON-NLS-1$ public AbstractArgumentParser() { this.arguments = new HashSet<Argument>(); } public void addArgument(Argument a) { if (!this.arguments.add(a)) { throw new IllegalArgumentException("argument already exists: " + a.getName()); //$NON-NLS-1$ } } public final void parse(String[] args) throws ParameterException { Set<String> tmp = new HashSet<String>(); int i = 0; while (i < args.length) { String param = args[i]; ++i; boolean found = false; for (Argument arg : arguments) { if (param.equals(arg.getName())) { if (!arg.filter() && !tmp.contains(arg.getName())) { this.canonical += arg.getName() + " "; //$NON-NLS-1$ for (int j = i; j < arg.getParameters() + i; ++j) { this.canonical += args[j] + " "; //$NON-NLS-1$ } } tmp.add(arg.getName()); checkParam(args, i, arg.getParameters()); String[] p = Arrays.copyOfRange(args, i, i + arg.getParameters() + 1); arg.getAction().execute(p); i += arg.getParameters(); found = true; } } if (!found) { throw new ParameterException(MSG.bind(MSG.unknownParameter, param)); } } this.canonical = this.canonical.trim(); } public String getCanonicalArguments() { return this.canonical; } private static void checkParam(String[] args, int current, int expected) throws ParameterException { if (args.length < current + expected) { throw new ParameterException(MSG.tooLessParameters); } } }