public class Dvi2EpubCmd extends AnnotatedCommand {
+ public Dvi2EpubCmd() throws CommandException {
+ super();
+ }
+
@Override
protected int processCommandLine() throws CommandException {
System.out.println("Arguments: " + Arrays.toString(getArgs()));
private boolean wantHelp;
private String[] args;
- public AnnotatedCommand() {
+ public AnnotatedCommand() throws CommandException {
parser = new AnnotatedCommandLineParser(this);
}
this.args = args;
}
- protected OptionMapper createOptionMapper(ParserState state) {
- return new DefaultOptionMapper(state);
+ protected OptionMapper createOptionMapper() {
+ return new DefaultOptionMapper();
}
}
package jp.sourceforge.dvibrowser.dvi2epub.cmd;
import java.io.PrintWriter;
+import java.util.List;
+import jp.sourceforge.dvibrowser.dvi2epub.reflect.Dispatcher;
import jp.sourceforge.dvibrowser.dvi2epub.reflect.MemberWalker;
import jp.sourceforge.dvibrowser.dvi2epub.reflect.MemberWalkerException;
public class AnnotatedCommandLineParser implements CommandLineParser {
private final AnnotatedCommand command;
+ private final OptionMapper mapper;
+ private List<Option> options;
- public AnnotatedCommandLineParser(AnnotatedCommand cmd) {
+ public AnnotatedCommandLineParser(AnnotatedCommand cmd) throws CommandException {
this.command = cmd;
+ this.mapper = command.createOptionMapper();
+ scanOptions();
+ }
+
+ protected void scanOptions() throws CommandException {
+ OptionAdapter adapter = new OptionAdapter(mapper);
+ MemberWalker walker = new MemberWalker(adapter);
+ try {
+ walker.walk(command);
+ } catch (MemberWalkerException e) {
+ throw new CommandException(e);
+ }
+ options = adapter.getOptions();
}
@Override
public void parse(String[] args) throws CommandException {
-
-
ParserState state = new ParserState(args);
while (!state.wantStop()) {
String arg1 = state.shift();
{
state.setOptionName(name);
state.setOptionParameter(parameter);
- OptionMapper mapper = command.createOptionMapper(state);
- MemberWalker walker = new MemberWalker(new OptionAdapter(state, mapper));
- try {
- walker.walk(command);
- } catch (MemberWalkerException e) {
- throw new CommandException(e);
+ for (Option option : getOptions()) {
+ try {
+ if (option != null && option.matches(name)) {
+ Dispatcher<Object[]> d = new Dispatcher<Object[]>(getMapper(),
+ "map", option.getAnnotation(), state);
+ if (d.dispatch()) {
+ Object[] args = d.getResult();
+ option.getMethod().invoke(getCommand(), args);
+ return;
+ }
+ }
+ } catch (Exception ex) {
+ state.stopWithError(ex);
+ return;
+ }
+
}
}
// pw may not be null.
pw.println("Usage: " + command.getApplicationName() + " " + command.getCommandLineSyntax());
- MemberWalker walker = new MemberWalker(new FormatAdapter(pw));
- try {
- walker.walk(command);
- } catch (MemberWalkerException e) {
- throw new CommandException(e);
+ for (Option option : getOptions()) {
+ pw.println(" -" + option.getShortName() + "\t" + option.getDescription());
+ pw.println(" --" + option.getLongName() + "\t" + option.getDescription());
}
pw.flush();
}
+
+ public List<Option> getOptions() {
+ return options;
+ }
+
+ public OptionMapper getMapper() {
+ return mapper;
+ }
}
package jp.sourceforge.dvibrowser.dvi2epub.cmd;
import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
public class Option {
private final String shortName;
private final String longName;
private final Annotation annotation;
private final String description;
+ private final Method method;
- public Option(Annotation annotation, String shortName, String longName, String description) {
+ public Option(Annotation annotation, Method method, String shortName, String longName, String description) {
this.annotation = annotation;
+ this.method = method;
this.shortName = shortName;
this.longName = longName;
this.description = description;
public String getDescription() {
return description;
}
+
+ public Method getMethod() {
+ return method;
+ }
}
package jp.sourceforge.dvibrowser.dvi2epub.cmd;
import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
-import jp.sourceforge.dvibrowser.dvi2epub.reflect.Dispatcher;
import jp.sourceforge.dvibrowser.dvi2epub.reflect.MemberWalkerAdapter;
import jp.sourceforge.dvibrowser.dvi2epub.reflect.MemberWalkerException;
final class OptionAdapter extends MemberWalkerAdapter {
- private final ParserState state;
+ private final List<Option> options = new ArrayList<Option>();
private final OptionMapper mapper;
- OptionAdapter(ParserState state, OptionMapper mapper) {
- this.state = state;
+ OptionAdapter(OptionMapper mapper) {
this.mapper = mapper;
}
throws MemberWalkerException {
try {
Option option = mapper.getOption(method);
- if (option != null && option.matches(state.getOptionName())) {
- Dispatcher<Object[]> d = new Dispatcher<Object[]>(mapper, "map", option.getAnnotation());
- if (d.dispatch()) {
- Object[] args = d.getResult();
- method.invoke(o, args);
- setDone(true);
- return;
- }
- }
+ if (option != null)
+ options.add(option);
} catch (Exception ex) {
-// ex.printStackTrace();
- state.stopWithError(ex);
- return;
+ throw new MemberWalkerException(ex);
}
}
return mapper;
}
+ public List<Option> getOptions() {
+ return options;
+ }
+
}
\ No newline at end of file
import java.lang.reflect.Method;
public interface OptionMapper {
- ParserState getState() throws CommandException;
Option getOption(Method method) throws CommandException;
}
package jp.sourceforge.dvibrowser.dvi2epub.opt;
import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import jp.sourceforge.dvibrowser.dvi2epub.cmd.CommandUtils;
public class DefaultOptionMapper
implements OptionMapper
{
- private final ParserState state;
-
- public DefaultOptionMapper(ParserState state) {
- this.state = state;
+ public DefaultOptionMapper() {
}
- public Object[] map(IntValueOption p) {
- String param = getState().getOptionParameter();
- String a = (param == null) ? getState().shift() : param;
+ public Object[] map(IntValueOption p, ParserState state) {
+ String param = state.getOptionParameter();
+ String a = (param == null) ? state.shift() : param;
int value = (a == null) ? p.value() : Integer.parseInt(a);
return new Object[] { value };
}
- public Object[] map(StringValueOption p) {
- String param = getState().getOptionParameter();
+ public Object[] map(StringValueOption p, ParserState state) {
+ String param = state.getOptionParameter();
String value = CommandUtils.unescapeNull((CommandUtils
.unescapeNull(param) == null) ? p.value() : param);
return new Object[] { value };
}
- public Object[] map(BooleanValueOption p) {
- String param = getState().getOptionParameter();
+ public Object[] map(BooleanValueOption p, ParserState state) {
+ String param = state.getOptionParameter();
boolean value = CommandUtils.parseBoolean(param, p.value());
return new Object[] { value };
}
String description = CommandUtils.readValue(String.class, a, "description");
if (longName != null || shortName != null) {
- Option option = new Option(a, shortName, longName, description);
+ Option option = new Option(a, method, shortName, longName, description);
return option;
}
}
return null;
}
-
- public ParserState getState() {
- return state;
- }
}