Support parsing command line options from a map
Given a map of String to String[], like to what an HttpServletRequest makes available from the query string, feed the values into the parser and update the bean with the parsed state. This makes parsing from a query string rather trivial. Change-Id: I41829d35e59594770c1b6512c241b92182a03afe
This commit is contained in:
@@ -42,6 +42,7 @@ import com.google.inject.assistedinject.Assisted;
|
|||||||
import org.kohsuke.args4j.Argument;
|
import org.kohsuke.args4j.Argument;
|
||||||
import org.kohsuke.args4j.CmdLineException;
|
import org.kohsuke.args4j.CmdLineException;
|
||||||
import org.kohsuke.args4j.IllegalAnnotationError;
|
import org.kohsuke.args4j.IllegalAnnotationError;
|
||||||
|
import org.kohsuke.args4j.NamedOptionDef;
|
||||||
import org.kohsuke.args4j.Option;
|
import org.kohsuke.args4j.Option;
|
||||||
import org.kohsuke.args4j.OptionDef;
|
import org.kohsuke.args4j.OptionDef;
|
||||||
import org.kohsuke.args4j.spi.BooleanOptionHandler;
|
import org.kohsuke.args4j.spi.BooleanOptionHandler;
|
||||||
@@ -53,6 +54,7 @@ import java.io.Writer;
|
|||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -64,6 +66,7 @@ import java.util.ResourceBundle;
|
|||||||
* args4j style format prior to invoking args4j for parsing.
|
* args4j style format prior to invoking args4j for parsing.
|
||||||
*/
|
*/
|
||||||
public class CmdLineParser {
|
public class CmdLineParser {
|
||||||
|
|
||||||
public interface Factory {
|
public interface Factory {
|
||||||
CmdLineParser create(Object bean);
|
CmdLineParser create(Object bean);
|
||||||
}
|
}
|
||||||
@@ -140,10 +143,78 @@ public class CmdLineParser {
|
|||||||
|
|
||||||
tmp.add(str);
|
tmp.add(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
parser.parseArgument(tmp.toArray(new String[tmp.size()]));
|
parser.parseArgument(tmp.toArray(new String[tmp.size()]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void parseOptionMap(Map<String, String[]> parameters)
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (findHandler(name) instanceof BooleanOptionHandler) {
|
||||||
|
boolean on = false;
|
||||||
|
for (String value : ent.getValue()) {
|
||||||
|
on = toBoolean(ent.getKey(), value);
|
||||||
|
}
|
||||||
|
if (on) {
|
||||||
|
tmp.add(name);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (String value : ent.getValue()) {
|
||||||
|
tmp.add(name);
|
||||||
|
tmp.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parser.parseArgument(tmp.toArray(new String[tmp.size()]));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
private OptionHandler findHandler(String name) {
|
||||||
|
for (OptionHandler handler : parser.options) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean toBoolean(String name, String value) throws CmdLineException {
|
||||||
|
if ("true".equals(value) || "t".equals(value)
|
||||||
|
|| "yes".equals(value) || "y".equals(value)
|
||||||
|
|| "on".equals(value)
|
||||||
|
|| "1".equals(value)
|
||||||
|
|| value == null || "".equals(value)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("false".equals(value) || "f".equals(value)
|
||||||
|
|| "no".equals(value) || "n".equals(value)
|
||||||
|
|| "off".equals(value)
|
||||||
|
|| "0".equals(value)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new CmdLineException(parser, String.format(
|
||||||
|
"invalid boolean \"%s=%s\"", name, value));
|
||||||
|
}
|
||||||
|
|
||||||
private class MyParser extends org.kohsuke.args4j.CmdLineParser {
|
private class MyParser extends org.kohsuke.args4j.CmdLineParser {
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
private List<OptionHandler> options;
|
private List<OptionHandler> options;
|
||||||
|
|||||||
Reference in New Issue
Block a user