Index: lutinutil/src/java/org/codelutin/util/OptionParserUtil.java diff -u lutinutil/src/java/org/codelutin/util/OptionParserUtil.java:1.4 lutinutil/src/java/org/codelutin/util/OptionParserUtil.java:1.5 --- lutinutil/src/java/org/codelutin/util/OptionParserUtil.java:1.4 Wed Dec 12 22:11:52 2007 +++ lutinutil/src/java/org/codelutin/util/OptionParserUtil.java Sun Dec 16 22:29:39 2007 @@ -8,7 +8,7 @@ import org.codelutin.util.OptionDefinitionParser.OptionGroupArgumentContext; import org.codelutin.util.OptionParserAnnotationHelper.ApplicationA; import org.codelutin.util.OptionParserAnnotationHelper.ArgumentA; -import org.codelutin.util.OptionParserAnnotationHelper.GroupArgumentA; +import org.codelutin.util.OptionParserAnnotationHelper.GroupA; import org.codelutin.util.OptionParserAnnotationHelper.OptionA; import java.util.ArrayList; @@ -28,7 +28,7 @@ builder.append(addTitle(headOptions, '-', false)).append("\n"); for (OptionA definition : anno.options()) { builder.append(prefix).append(OptionParserUtil.toString(definition)); - builder.append("\n ").append(definition.description()).append("\n\n"); + builder.append("\n ").append(definition.desc()).append("\n\n"); } return builder.toString(); } @@ -53,21 +53,22 @@ } } if (anno.groups().length > 0) { - for (GroupArgumentA group : anno.groups()) { + for (GroupA group : anno.groups()) { builder.append(' ').append(toString(group)); } } return builder.toString(); } - public static String toString(GroupArgumentA anno) { + public static String toString(GroupA anno) { StringBuilder builder = new StringBuilder(); StringBuffer s = new StringBuffer(); - for (ArgumentA argument : anno.arguments()) { + for (ArgumentA argument : anno.args()) { s.append('|').append(toString(argument)); } String s1 = s.toString(); - StringUtil.printCardinalite(builder, s1.length() > 0 ? s1.substring(1) : s1, anno.min(), anno.max(), anno.pos() != -1, "<", ">", "[", "]"); + boolean mandatory = anno.pos() > -1; + StringUtil.printCardinalite(builder, s1.length() > 0 ? s1.substring(1) : s1, mandatory ?1:0, 1, mandatory, "<", ">", "[", "]"); return builder.toString(); } @@ -121,6 +122,37 @@ return null; } + public static boolean isMandatory(OptionArgumentDefinition definition) { + return definition.getMin() > 0; + } + + public static boolean isRepeatable(OptionArgumentDefinition def) { + return isInifinite(def) || def.getMax() > 0; + } + + public static boolean isInifinite(OptionArgumentDefinition def) { + return def.getMax() == -1; + } + + public static List getOptionalGroups(List groups) { + List result =new ArrayList(); + for (OptionGroupDefinition group : groups) { + if (!group.isMandatory()) { + result.add(group); + } + } + return result; + } + + public static OptionGroupDefinition getNextMandatoryGroup(List groups) { + for (OptionGroupDefinition group : groups) { + if (group.isMandatory()) { + return group; + } + } + return null; + } + /** * Un contexte abstrait pour parseur (qui peut contenir un contexte parent * et des contextes enfants). @@ -172,8 +204,7 @@ protected void preAddSonHook(S context) { if (!hasChilds()) { - //TODO Should throw runtime exception, - return; + throw new RuntimeException("could not add a son to a leaf context"); } if (context == null || !context.valid) { unvalidate(); @@ -268,6 +299,8 @@ super(parent, withSons); } + protected abstract Object instanciate(); + protected OptionParserException newError(String content, Exception e) { OptionParserException e1; if (e == null) { @@ -343,7 +376,7 @@ ApplicationA parserA; OptionA[] optionAs; - GroupArgumentA[] groupArgumentAs; + GroupA[] groupAs; ArgumentA[] argumentAs; public ApplicationA run(OptionContext[] options) { @@ -355,7 +388,7 @@ @Override protected void enterOption(OptionContext option, int optionIndex) { - groupArgumentAs = new GroupArgumentA[option.contexts.size()]; + groupAs = new GroupA[option.contexts.size()]; } @Override @@ -372,16 +405,16 @@ protected void exitOption(OptionContext option, int optionIndex) { OptionA optionA = OptionParserAnnotationHelper.newOptionA(option.key, option.description, option.min, option.max, option.alias, - option.impl, groupArgumentAs); + option.impl, groupAs); optionAs[optionIndex] = optionA; } @Override protected void exitGroup(OptionGroupArgumentContext group, int groupIndex) { - GroupArgumentA groupArgumentA; - groupArgumentA = OptionParserAnnotationHelper.newGroupArgumentA(group.min, + OptionParserAnnotationHelper.GroupA groupA; + groupA = OptionParserAnnotationHelper.newGroupArgumentA(group.min, group.max, group.pos, argumentAs); - groupArgumentAs[groupIndex] = groupArgumentA; + groupAs[groupIndex] = groupA; } @Override @@ -407,7 +440,7 @@ ApplicationDefinition definition; OptionDefinition[] options; - OptionGroupArgumentDefinition[] groupArguments; + OptionGroupDefinition[] groups; OptionArgumentDefinition[] arguments; public ApplicationDefinition run(OptionContext[] options) { @@ -419,7 +452,7 @@ @Override protected void enterOption(OptionContext option, int optionIndex) { - groupArguments = new OptionGroupArgumentDefinition[option.contexts.size()]; + groups = new OptionGroupDefinition[option.contexts.size()]; } @Override @@ -431,16 +464,16 @@ protected void exitOption(OptionContext option, int optionIndex) { OptionDefinition optionA = new OptionDefinition(option.key, option.description, option.min, option.max, option.alias, - option.impl, groupArguments); + option.impl, groups); options[optionIndex] = optionA; } @Override protected void exitGroup(OptionGroupArgumentContext group, int groupIndex) { - OptionGroupArgumentDefinition groupArgumentA; - groupArgumentA = new OptionGroupArgumentDefinition(group.min, - group.max, group.pos, arguments); - groupArguments[groupIndex] = groupArgumentA; + OptionGroupDefinition groupA; + groupA = new OptionGroupDefinition( + group.pos, arguments); + groups[groupIndex] = groupA; } @Override