OSDN Git Service

Auto-save
authorTakeyuki NAGAO <nagaotakeyuki@gmail.com>
Mon, 26 Mar 2012 14:27:07 +0000 (23:27 +0900)
committerTakeyuki NAGAO <nagaotakeyuki@gmail.com>
Mon, 26 Mar 2012 14:27:07 +0000 (23:27 +0900)
src/jp/sourceforge/dvibrowser/dvi2epub/Dvi2EpubCmd.java
src/jp/sourceforge/dvibrowser/dvi2epub/cmd/AnnotatedCommand.java
src/jp/sourceforge/dvibrowser/dvi2epub/cmd/AnnotatedCommandLineParser.java
src/jp/sourceforge/dvibrowser/dvi2epub/cmd/Option.java
src/jp/sourceforge/dvibrowser/dvi2epub/cmd/OptionAdapter.java
src/jp/sourceforge/dvibrowser/dvi2epub/cmd/OptionMapper.java
src/jp/sourceforge/dvibrowser/dvi2epub/opt/DefaultOptionMapper.java

index f3e8286..546b379 100644 (file)
@@ -12,6 +12,10 @@ import jp.sourceforge.dvibrowser.dvi2epub.opt.StringValueOption;
 
 public class Dvi2EpubCmd extends AnnotatedCommand {
 
+       public Dvi2EpubCmd() throws CommandException {
+               super();
+       }
+
        @Override
        protected int processCommandLine() throws CommandException {
                System.out.println("Arguments: " + Arrays.toString(getArgs()));
index e83c688..7f05587 100644 (file)
@@ -26,7 +26,7 @@ public abstract class AnnotatedCommand extends AbstractCommand {
        private boolean wantHelp;
        private String[] args;
 
-       public AnnotatedCommand() {
+       public AnnotatedCommand() throws CommandException {
                parser = new AnnotatedCommandLineParser(this);
        }
 
@@ -84,7 +84,7 @@ public abstract class AnnotatedCommand extends AbstractCommand {
                this.args = args;
        }
        
-       protected OptionMapper createOptionMapper(ParserState state) {
-               return new DefaultOptionMapper(state);
+       protected OptionMapper createOptionMapper() {
+               return new DefaultOptionMapper();
        }
 }
index 52376fd..0280b6a 100644 (file)
@@ -1,21 +1,36 @@
 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();
@@ -69,13 +84,23 @@ public class AnnotatedCommandLineParser implements CommandLineParser {
        {
                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;
+                       }
+
                }
        }
 
@@ -88,13 +113,19 @@ public class AnnotatedCommandLineParser implements CommandLineParser {
                // 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;
+       }
 }
index f6c25dc..ba3c1f5 100644 (file)
@@ -1,15 +1,18 @@
 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;
@@ -40,4 +43,8 @@ public class Option {
        public String getDescription() {
                return description;
        }
+
+       public Method getMethod() {
+               return method;
+       }
 }
index 61c8b36..f55cad1 100644 (file)
@@ -1,17 +1,17 @@
 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;
        }
 
@@ -19,19 +19,10 @@ final class OptionAdapter extends MemberWalkerAdapter {
                        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);
                }
        }
        
@@ -40,4 +31,8 @@ final class OptionAdapter extends MemberWalkerAdapter {
                return mapper;
        }
 
+       public List<Option> getOptions() {
+               return options;
+       }
+
 }
\ No newline at end of file
index 793a521..30ca6eb 100644 (file)
@@ -3,6 +3,5 @@ package jp.sourceforge.dvibrowser.dvi2epub.cmd;
 import java.lang.reflect.Method;
 
 public interface OptionMapper {
-       ParserState getState() throws CommandException;
        Option getOption(Method method) throws CommandException;
 }
index 9e1a281..070f9ab 100644 (file)
@@ -1,7 +1,6 @@
 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;
@@ -12,28 +11,25 @@ import jp.sourceforge.dvibrowser.dvi2epub.cmd.ParserState;
 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 };
        }
@@ -46,14 +42,10 @@ implements OptionMapper
                        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;
-       }
 }