diff options
Diffstat (limited to 'gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java')
-rw-r--r-- | gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java | 88 |
1 files changed, 55 insertions, 33 deletions
diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java index a9f5229fa0..69598ce12e 100644 --- a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java +++ b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java @@ -34,6 +34,10 @@ package com.google.gerrit.util.cli; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Key; @@ -54,11 +58,9 @@ import java.io.StringWriter; import java.io.Writer; import java.lang.annotation.Annotation; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.ResourceBundle; -import java.util.Set; /** * Extended command line parser which handles --foo=value arguments. @@ -76,6 +78,9 @@ public class CmdLineParser { private final Injector injector; private final MyParser parser; + @SuppressWarnings("rawtypes") + private Map<String, OptionHandler> options; + /** * Creates a new command line owner that parses arguments/options and set them * into the given object. @@ -186,7 +191,7 @@ public class CmdLineParser { } public void parseArgument(final String... args) throws CmdLineException { - final ArrayList<String> tmp = new ArrayList<String>(args.length); + List<String> tmp = Lists.newArrayListWithCapacity(args.length); for (int argi = 0; argi < args.length; argi++) { final String str = args[argi]; if (str.equals("--")) { @@ -211,36 +216,32 @@ public class CmdLineParser { public void parseOptionMap(Map<String, String[]> parameters) throws CmdLineException { - parseOptionMap(parameters, Collections.<String>emptySet()); + Multimap<String, String> map = LinkedHashMultimap.create(); + for (Map.Entry<String, String[]> ent : parameters.entrySet()) { + for (String val : ent.getValue()) { + map.put(ent.getKey(), val); + } + } + parseOptionMap(map); } - public void parseOptionMap(Map<String, String[]> parameters, - Set<String> argNames) + public void parseOptionMap(Multimap<String, String> params) throws CmdLineException { - ArrayList<String> tmp = new ArrayList<String>(); - for (Map.Entry<String, String[]> ent : parameters.entrySet()) { - String name = ent.getKey(); - if (!name.startsWith("-")) { - if (name.length() == 1) { - name = "-" + name; - } else { - name = "--" + name; - } - } + List<String> tmp = Lists.newArrayListWithCapacity(2 * params.size()); + for (final String key : params.keySet()) { + String name = makeOption(key); - if (findHandler(name) instanceof BooleanOptionHandler) { + if (isBoolean(name)) { boolean on = false; - for (String value : ent.getValue()) { - on = toBoolean(ent.getKey(), value); + for (String value : params.get(key)) { + on = toBoolean(key, value); } if (on) { tmp.add(name); } } else { - for (String value : ent.getValue()) { - if (!argNames.contains(ent.getKey())) { - tmp.add(name); - } + for (String value : params.get(key)) { + tmp.add(name); tmp.add(value); } } @@ -248,22 +249,44 @@ public class CmdLineParser { parser.parseArgument(tmp.toArray(new String[tmp.size()])); } + public boolean isBoolean(String name) { + return findHandler(makeOption(name)) instanceof BooleanOptionHandler; + } + + private String makeOption(String name) { + if (!name.startsWith("-")) { + if (name.length() == 1) { + name = "-" + name; + } else { + name = "--" + name; + } + } + return name; + } + @SuppressWarnings("rawtypes") private OptionHandler findHandler(String name) { - for (OptionHandler handler : parser.options) { + if (options == null) { + options = index(parser.options); + } + return options.get(name); + } + + @SuppressWarnings("rawtypes") + private static Map<String, OptionHandler> index(List<OptionHandler> in) { + Map<String, OptionHandler> m = Maps.newHashMap(); + for (OptionHandler handler : in) { if (handler.option instanceof NamedOptionDef) { NamedOptionDef def = (NamedOptionDef) handler.option; - if (name.equals(def.name())) { - return handler; - } - for (String alias : def.aliases()) { - if (name.equals(alias)) { - return handler; + if (!def.isArgument()) { + m.put(def.name(), handler); + for (String alias : def.aliases()) { + m.put(alias, handler); } } } } - return null; + return m; } private boolean toBoolean(String name, String value) throws CmdLineException { @@ -324,11 +347,10 @@ public class CmdLineParser { return handler; } - @SuppressWarnings("rawtypes") private void ensureOptionsInitialized() { if (options == null) { help = new HelpOption(); - options = new ArrayList<OptionHandler>(); + options = Lists.newArrayList(); addOption(help, help); } } |