Index: lutinutil/src/java/org/codelutin/option/OptionParser.java diff -u lutinutil/src/java/org/codelutin/option/OptionParser.java:1.2 lutinutil/src/java/org/codelutin/option/OptionParser.java:1.3 --- lutinutil/src/java/org/codelutin/option/OptionParser.java:1.2 Sun Dec 30 23:42:59 2007 +++ lutinutil/src/java/org/codelutin/option/OptionParser.java Mon Dec 31 05:29:01 2007 @@ -23,6 +23,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import static org.codelutin.i18n.I18n._; +import org.codelutin.option.OptionParserContexts.OptionContext; import org.codelutin.option.OptionParserContexts.ParserContext; import org.codelutin.option.def.OptionDefinition; import org.codelutin.option.def.OptionDefinitionBuilder; @@ -51,9 +52,16 @@ * Si on veut utiliser les actions des options (OptionAction), il faut avant * tout parsing, enregistrer les classes concretes d'implantation de ces actions. *

- * Cela se fait en utilisant la méthode {@link #registerActions(Class[])}, les + * Cela se fait en utilisant la méthode {@link #registerActions(Class)}, les * implantations doivent être présentes en tant qu'inner class d'une ou plusieurs * classes container. + *

+ * Le fonctionnement est identique pour les config (celles générées sont abstraites), + * on doit enregistre des implantation concretes par l'intermédiaire de la méthode + * {@link #registerConfigs(Class[])}. + *

+ * Attention, contrairement aux actions, ici les classes de Config ne sont + * pas des inner-classes. */ public abstract class OptionParser { @@ -62,7 +70,7 @@ protected final Log log = LogFactory.getLog(getClass()); /** - * Cette méthode encapsule l'appel à la méthode statique buildDefinition + * Cette méthode encapsule l'appel à la méthode statique buildDefinitions * générée dans le parseur de classe targetClass et retourne * les définitions d'options obtenues par le builder utilisé. * @@ -94,11 +102,6 @@ /** les clefs d'options connues par le parseur */ protected final List configKeys; - /** les options trouvées et valides, indexées par leur clef typée dans le dernier parsing */ - protected Map> options; - - protected Map configs; - /** les arguments non utilisés, indexés par leur position dans du dernier parsing */ protected Map unusedArguments; @@ -114,21 +117,6 @@ } /** - * Enregistre les implantations d'action à partir de plusieurs classes - * contenant des classes imbriquées d'implantation d'OptionAction. - *

- * Cette méthode doit être invoquée avant toute demande d'OptionAction - * après parsing. - * - * @param clazz la liste des classes contenant des implantations d'OptionAction - */ - public void registerActions(Class... clazz) { - for (Class aClass : clazz) { - registerActions(aClass); - } - } - - /** * Enregistre les implantations d'action à partir d'une classe contenant * des classes imbriquées d'implantation d'OptionAction. * @@ -145,35 +133,16 @@ } /** - * Enregistre les implantations d'action à partir de plusieurs classes - * contenant des classes imbriquées d'implantation d'OptionAction. - *

- * Cette méthode doit être invoquée avant toute demande d'OptionAction - * après parsing. + * Enregistre les implantations concretes des configs. * - * @param clazz la liste des classes contenant des implantations d'OptionAction + * @param clazz la liste des classes contenant des implantations de Config */ - public void registerConfigs(Class... clazz) { - for (Class aClass : clazz) { - registerConfigs(aClass); + public void registerConfigs(Class... clazz) { + for (Class aClass : clazz) { + registerConfig(aClass); } } - /** - * Enregistre les implantations de config à partir d'une classe contenant - * des classes imbriquées d'implantation Config. - * - * @param clazz la classe contenant des implantations de Config - */ - public void registerConfigs(Class clazz) { - // recherche des inner classes - Class[] classes = clazz.getClasses(); - for (Class aClass : classes) { - if (Config.class.isAssignableFrom(aClass)) { - registerConfig(aClass); - } - } - } public List getConfigKeys() { return configKeys; @@ -203,10 +172,12 @@ context.detectOptions(args); // instanciate real options from safe contexts - options = context.instanciate(); + for (OptionContext optionContext : context.getContexts()) { + optionContext.instanciate(); + } // transfert unused arguments - for (Integer unusedArgument : context.unusedArguments) { + for (Integer unusedArgument : context.getUnusedArguments()) { unusedArguments.put(unusedArgument, args[unusedArgument]); } @@ -223,17 +194,15 @@ * parsing correspondant à la clef donnée. */ public boolean isOptionEnabled(OptionKey key) { - List list = options.get(key); - return list != null && !list.isEmpty(); + List list = key.getOptions(); + return !list.isEmpty(); } /** @return le nombre d'options valides trouvées lors du dernier parsing */ public int getNbOptions() { int result = 0; - if (options != null) { - for (List

@@ -432,7 +419,7 @@ result = detectArgument(lastGroup, lastArgument, argument, pos); if (CardinalityHelper.isMandatory(lastArgument.getMin()) && result == null) { - addError(org.codelutin.i18n.I18n._("lutinutil.error.parser.unfound.mandatory.argument", lastArgument, lastGroup, argument)); + addError(_("lutinutil.error.parser.unfound.mandatory.argument", lastArgument, lastGroup, argument)); return null; } // the lastGroup is no more available @@ -448,7 +435,7 @@ // must match the argument in this group result = detectArgument(group, argument, pos); if (result == null) { - addError(org.codelutin.i18n.I18n._("lutinutil.error.parser.unfound.mandatory.group", group, argument)); + addError(_("lutinutil.error.parser.unfound.mandatory.group", group, argument)); } return result; } @@ -534,7 +521,7 @@ log.info(argument + " : " + result); if (result == null) { //fatal error : unknown namedAndValued argument - addError(org.codelutin.i18n.I18n._("lutinutil.error.parser.valued.argument.unfound", key, Arrays.asList(currentGroup))); + addError(_("lutinutil.error.parser.valued.argument.unfound", key, Arrays.asList(currentGroup))); return null; } return result;