Index: lutinutil/src/java/org/codelutin/util/OptionParserUtil.java diff -u lutinutil/src/java/org/codelutin/util/OptionParserUtil.java:1.1 lutinutil/src/java/org/codelutin/util/OptionParserUtil.java:1.2 --- lutinutil/src/java/org/codelutin/util/OptionParserUtil.java:1.1 Sun Dec 2 07:08:52 2007 +++ lutinutil/src/java/org/codelutin/util/OptionParserUtil.java Sun Dec 2 07:13:24 2007 @@ -2,6 +2,9 @@ import org.codelutin.log.LutinLog; import org.codelutin.log.LutinLogFactory; +import org.codelutin.util.OptionDefinitionParser.OptionArgumentContext; +import org.codelutin.util.OptionDefinitionParser.OptionContext; +import org.codelutin.util.OptionDefinitionParser.OptionGroupArgumentContext; import org.codelutin.util.OptionParserAnnotationHelper.OptionA; import org.codelutin.util.OptionParserAnnotationHelper.OptionArgumentA; import org.codelutin.util.OptionParserAnnotationHelper.OptionGroupArgumentA; @@ -93,7 +96,7 @@ /** le contexte parent (peut être null) */ protected final P parent; - /** la liste des contextes enfants (peut être null)*/ + /** la liste des contextes enfants (peut être null) */ protected final List contexts; /** flag pour marquer l'état du context */ @@ -141,4 +144,171 @@ } } } + + /** + * This class defines a Walker on {@link OptionDefinitionParser} contexts. + * + * @author chemit + */ + + public static abstract class OptionDefinitionParserWalker { + + public void walk(OptionContext[] options) { + for (int optionIndex = 0, length = options.length; optionIndex < length; optionIndex++) + { + OptionContext option = options[optionIndex]; + enterOption(option, optionIndex); + for (int groupIndex = 0; groupIndex < option.contexts.size(); groupIndex++) + { + OptionGroupArgumentContext group = option.contexts.get(groupIndex); + enterGroup(group, groupIndex); + for (int argumentIndex = 0; argumentIndex < group.contexts.size(); argumentIndex++) + { + OptionArgumentContext argument = group.contexts.get(argumentIndex); + enterArgument(argument, argumentIndex); + exitArgument(argument, argumentIndex); + } + exitGroup(group, groupIndex); + } + exitOption(option, optionIndex); + } + } + + protected void enterOption(OptionContext option, int optionIndex) { + } + + protected void enterGroup(OptionGroupArgumentContext group, int groupIndex) { + } + + protected void enterArgument(OptionArgumentContext argument, int argumentIndex) { + } + + protected void exitGroup(OptionGroupArgumentContext group, int groupIndex) { + } + + protected void exitOption(OptionContext option, int optionIndex) { + } + + protected void exitArgument(OptionArgumentContext argument, int argumentIndex) { + } + } + + static class ToAnnotationWalker extends OptionDefinitionParserWalker { + + static ToAnnotationWalker instance; + + public static ToAnnotationWalker getInstance() { + if (instance == null) { + instance = new ToAnnotationWalker(); + } + return instance; + } + + OptionParserA parserA; + OptionA[] optionAs; + OptionGroupArgumentA[] groupArgumentAs; + OptionArgumentA[] argumentAs; + + public OptionParserA run(OptionContext[] options) { + optionAs = new OptionA[options.length]; + walk(options); + parserA = OptionParserAnnotationHelper.newOptionParserA(optionAs); + return parserA; + } + + @Override + protected void enterOption(OptionContext option, int optionIndex) { + groupArgumentAs = new OptionGroupArgumentA[option.contexts.size()]; + } + + @Override + protected void enterGroup(OptionGroupArgumentContext group, int groupIndex) { + argumentAs = new OptionArgumentA[group.contexts.size()]; + } + + @Override + protected void enterArgument(OptionArgumentContext argument, int argumentIndex) { + super.enterArgument(argument, argumentIndex); + } + + @Override + protected void exitOption(OptionContext option, int optionIndex) { + OptionA optionA = OptionParserAnnotationHelper.newOptionA(option.key, + option.description, option.min, option.max, option.alias, + option.impl, groupArgumentAs); + optionAs[optionIndex] = optionA; + } + + @Override + protected void exitGroup(OptionGroupArgumentContext group, int groupIndex) { + OptionGroupArgumentA groupArgumentA; + groupArgumentA = OptionParserAnnotationHelper.newOptionGroupArgumentA(group.min, + group.max, group.pos, argumentAs); + groupArgumentAs[groupIndex] = groupArgumentA; + } + + @Override + protected void exitArgument(OptionArgumentContext argument, int argumentIndex) { + OptionArgumentA argumentA = OptionParserAnnotationHelper.newOptionArgumentA( + argument.type, argument.valueType, argument.key, argument.min, + argument.max); + argumentAs[argumentIndex] = argumentA; + } + } + + static class ToDefinitionWalker extends OptionDefinitionParserWalker { + + static ToDefinitionWalker instance; + + static ToDefinitionWalker getInstance() { + if (instance == null) { + instance = new ToDefinitionWalker(); + } + return instance; + } + + OptionDefinition[] optionAs; + OptionGroupArgumentDefinition[] groupArgumentAs; + OptionArgumentDefinition[] argumentAs; + + public OptionDefinition[] run(OptionContext[] options) { + optionAs = new OptionDefinition[options.length]; + walk(options); + return optionAs; + } + + @Override + protected void enterOption(OptionContext option, int optionIndex) { + groupArgumentAs = new OptionGroupArgumentDefinition[option.contexts.size()]; + } + + @Override + protected void enterGroup(OptionGroupArgumentContext group, int groupIndex) { + argumentAs = new OptionArgumentDefinition[group.contexts.size()]; + } + + @Override + protected void exitOption(OptionContext option, int optionIndex) { + OptionDefinition optionA = new OptionDefinition(option.key, + option.description, option.min, option.max, option.alias, + option.impl, groupArgumentAs); + optionAs[optionIndex] = optionA; + } + + @Override + protected void exitGroup(OptionGroupArgumentContext group, int groupIndex) { + OptionGroupArgumentDefinition groupArgumentA; + groupArgumentA = new OptionGroupArgumentDefinition(group.min, + group.max, group.pos, argumentAs); + groupArgumentAs[groupIndex] = groupArgumentA; + } + + @Override + protected void exitArgument(OptionArgumentContext argument, int argumentIndex) { + OptionArgumentDefinition argumentA = new OptionArgumentDefinition( + argument.type, argument.valueType, argument.key, + argument.min, argument.max); + argumentAs[argumentIndex] = argumentA; + } + } }