package com.brightgenerous.cli.delegate;
import java.io.PrintWriter;
import java.io.Serializable;
import java.io.StringWriter;
import java.util.List;
import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import com.brightgenerous.cli.CliException;
import com.brightgenerous.cli.CliOption;
import com.brightgenerous.cli.ParseResult;
class CliDelegaterImpl implements CliDelegater {
{
check();
}
private static void check() {
try {
Class.forName(BasicParser.class.getName());
Class.forName(CommandLine.class.getName());
Class.forName(CommandLineParser.class.getName());
Class.forName(Option.class.getName());
Class.forName(Options.class.getName());
Class.forName(ParseException.class.getName());
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
@Override
public ParseResult parse(List<CliOption> options, String[] args) throws CliException {
CommandLineParser parser = new BasicParser();
Options opts = convert(options);
CommandLine line;
try {
line = parser.parse(opts, args);
} catch (ParseException e) {
throw new CliException(e);
}
return new ParseResultImpl(line);
}
private static final int DEFAULT_WIDTH = HelpFormatter.DEFAULT_WIDTH;
private static final int DEFAULT_LEFT_PAD = HelpFormatter.DEFAULT_LEFT_PAD;
private static final int DEFAULT_DESC_PAD = HelpFormatter.DEFAULT_DESC_PAD;
private static final String DEFAULT_HEADER = null;
private static final String DEFAULT_FOOTER = null;
@Override
public String options(List<CliOption> options) {
Options opts = convert(options);
StringWriter sw = new StringWriter();
try (PrintWriter pw = new PrintWriter(sw)) {
new HelpFormatter().printOptions(pw, DEFAULT_WIDTH, opts, DEFAULT_LEFT_PAD,
DEFAULT_DESC_PAD);
}
return sw.toString();
}
@Override
public String help(String cmdLineSyntax, List<CliOption> options) {
Options opts = convert(options);
StringWriter sw = new StringWriter();
try (PrintWriter pw = new PrintWriter(sw)) {
new HelpFormatter().printHelp(pw, DEFAULT_WIDTH, cmdLineSyntax, DEFAULT_HEADER, opts,
DEFAULT_LEFT_PAD, DEFAULT_DESC_PAD, DEFAULT_FOOTER, true);
}
return sw.toString();
}
@Override
public String usage(String cmdLineSyntax, List<CliOption> options) {
Options opts = convert(options);
StringWriter sw = new StringWriter();
try (PrintWriter pw = new PrintWriter(sw)) {
new HelpFormatter().printUsage(pw, DEFAULT_WIDTH, cmdLineSyntax, opts);
}
return sw.toString();
}
private Options convert(List<CliOption> options) {
Options opts = new Options();
if ((options != null) && !options.isEmpty()) {
for (CliOption option : options) {
Option opt = new Option(option.opt(), option.description());
if (option.longOpt() != null) {
opt.setLongOpt(option.longOpt());
}
if (option.args() != null) {
opt.setArgs(option.args().intValue());
}
if (option.required() != null) {
opt.setRequired(option.required().booleanValue());
}
if (option.optionalArg() != null) {
opt.setOptionalArg(option.optionalArg().booleanValue());
}
if (option.argName() != null) {
opt.setArgName(option.argName());
}
if (option.valueSeparator() != null) {
opt.setValueSeparator(option.valueSeparator().charValue());
}
opts.addOption(opt);
}
}
return opts;
}
static class ParseResultImpl implements ParseResult, Serializable {
private static final long serialVersionUID = 4178476031707976593L;
private final CommandLine commandLine;
public ParseResultImpl(CommandLine commandLine) {
this.commandLine = commandLine;
}
@Override
public boolean has(char opt) {
return commandLine.hasOption(opt);
}
@Override
public boolean has(String opt) {
return commandLine.hasOption(opt);
}
@Override
public String value(char opt) {
return commandLine.getOptionValue(opt);
}
@Override
public String value(String opt) {
return commandLine.getOptionValue(opt);
}
@Override
public String[] values(char opt) {
return commandLine.getOptionValues(opt);
}
@Override
public String[] values(String opt) {
return commandLine.getOptionValues(opt);
}
}
}