summaryrefslogtreecommitdiffstats
path: root/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java
diff options
context:
space:
mode:
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.java88
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);
}
}