blob: e2fb83744ebc87c974a348df556bcc3d9794e978 [file] [log] [blame]
package org.kohsuke.args4j.spi;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
import java.util.HashMap;
import java.util.Map;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.OptionDef;
/**
* Boolean {@link OptionHandler} that (unlike the standard {@link BooleanOptionHandler}
* allows values to be set to false explicitly (using e.g. '-myOpt false') rather
* than only returning false when the option is <em>omitted</em>.
*/
public class ExplicitBooleanOptionHandler extends OptionHandler<Boolean> {
// same values as BooleanOptionHandler
private static final Map<String, Boolean> ACCEPTABLE_VALUES;
static {
// I like the trick in BooleanOptionHandler but find this explicit map more readable
ACCEPTABLE_VALUES = new HashMap<String, Boolean>();
ACCEPTABLE_VALUES.put("true", TRUE);
ACCEPTABLE_VALUES.put("on", TRUE);
ACCEPTABLE_VALUES.put("yes", TRUE);
ACCEPTABLE_VALUES.put("1", TRUE);
ACCEPTABLE_VALUES.put("false", FALSE);
ACCEPTABLE_VALUES.put("off", FALSE);
ACCEPTABLE_VALUES.put("no", FALSE);
ACCEPTABLE_VALUES.put("0", FALSE);
}
public ExplicitBooleanOptionHandler(CmdLineParser parser,
OptionDef option, Setter<? super Boolean> setter) {
super(parser, option, setter);
}
@Override
public int parseArguments(Parameters params) throws CmdLineException {
// end of arg list or next arg is another option
if ((params.size() == 0) || params.getParameter(0).startsWith("-")) {
setter.addValue(TRUE);
return 0;
} else {
setter.addValue(getBoolean(params.getParameter(0)));
return 1;
}
}
private Boolean getBoolean(String parameter) throws CmdLineException {
String valueStr = parameter.toLowerCase();
if (!ACCEPTABLE_VALUES.containsKey(valueStr)) {
throw new CmdLineException(owner, Messages.ILLEGAL_BOOLEAN.format(valueStr));
}
return ACCEPTABLE_VALUES.get(valueStr);
}
@Override
public String getDefaultMetaVariable() {
return "[VAL]";
}
}