Index: lutinutil/src/java/org/codelutin/util/OptionParser.java diff -u lutinutil/src/java/org/codelutin/util/OptionParser.java:1.2 lutinutil/src/java/org/codelutin/util/OptionParser.java:1.3 --- lutinutil/src/java/org/codelutin/util/OptionParser.java:1.2 Wed Nov 28 01:30:34 2007 +++ lutinutil/src/java/org/codelutin/util/OptionParser.java Wed Nov 28 17:21:09 2007 @@ -24,13 +24,17 @@ import org.apache.commons.logging.LogFactory; import static org.codelutin.i18n.I18n._; import static org.codelutin.util.OptionDefinitionParser.LUTINUTIL_PARSERDEF_PRINT_DETAIL_OPTION_HEAD; +import org.codelutin.util.OptionParserAnnotationHelper.OptionDefinitionA; +import org.codelutin.util.OptionParserAnnotationHelper.OptionParserA; import java.io.IOException; import java.io.Writer; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -39,10 +43,8 @@ * Parser abstrait d'options de la ligne de commande. *

* Pour implanter le parseur il suffit de surcharger cette classe et d'y ajouter - * l'annotation {@link OptionParserAnnotation} au niveau de la classe, en y - * indiquant la définition du parser (pour le moment uniquement le nom - * complet de l'usine de définitions d'options - * {@link OptionParserAnnotation#factoryName()}). + * l'annotation {@link OptionParserAnnotationHelper.OptionParserA} au niveau de la classe, en y + * indiquant la définition du parser. *

* Ensuite on utilise la méthode publique statique {@link #newParser(String, ClassLoader)} * pour obtenir une nouvelle instance de parser à partir du nom de sa classe et @@ -52,30 +54,11 @@ * pour effectuer le parsing des arguments passés. * * @author chemit - * @see OptionParserAnnotation + * @see OptionParserAnnotationHelper.OptionParserA */ public abstract class OptionParser { - /** - * Annotation pour définir le paramètrage d'un parseur d'option - * - * @author chemit - */ - @java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) - - @java.lang.annotation.Target(value = java.lang.annotation.ElementType.TYPE) - - public static @interface OptionParserAnnotation { - - /** @return le nom de l'usine de définitions d'options utilisée */ - public String factoryName(); - - /** @return la liste des clef d'options disponibles */ - public String[] keys(); - - } - public static OptionParser newParser(String className, ClassLoader loader) { Class parserClass; @@ -95,7 +78,14 @@ } } - static org.apache.commons.logging.Log log = LogFactory.getLog(OptionParser.class); + public static OptionKeyFactory getKeyFactory() { + if (keyFactory == null) { + keyFactory = new OptionKeyFactory(); + } + return keyFactory; + } + + final org.apache.commons.logging.Log log; /** * le context du parseur : contient tous les index nécessaires pendant le @@ -103,28 +93,50 @@ */ protected final ParserContext context; + protected final InitialContext initialContext; + + protected static OptionKeyFactory keyFactory; + public OptionParser() { - // find the fullyQualifiedFactoryName via OptionParserAnnotation - // annotation - OptionParserAnnotation def = getClass().getAnnotation(OptionParserAnnotation.class); + // find the fullyQualifiedFactoryName via OptionParserA annotation + OptionParserA def = getClass().getAnnotation(OptionParserA.class); if (def == null) { //TODO - throw new IllegalArgumentException("could not found annotation " + OptionParserAnnotation.class + " in Parser " + this); + throw new IllegalArgumentException("could not found annotation " + OptionParserA.class + " in Parser " + this); } + log = LogFactory.getLog(getClass()); - String fullyQualifiedFactoryName = def.factoryName(); + getKeyFactory(); - String[] keys = def.keys(); + try { + Map map; + OptionDefinitionA defA; + OptionDefinition definition; + + map = new HashMap(); + + for (String key : def.keys()) { + String fieldName = StringUtil.convertToConstantName(key); + Field field = getClass().getField(fieldName); + OptionKeyFactory.OptionKey optionKey = (OptionKeyFactory.OptionKey) field.get(this); + + defA = field.getAnnotation(OptionDefinitionA.class); + definition = new OptionDefinition(defA); + map.put(optionKey, definition); + } + + initialContext = new InitialContext(map); + + // create parser context + context = new ParserContext(); + + } catch (NoSuchFieldException e) { + throw new IllegalArgumentException(e); + } catch (IllegalAccessException e) { + throw new IllegalArgumentException(e); + } - // obtain instance of factory - OptionDefinitionFactory definitionFactory = - OptionDefinitionFactory.newFactory( - fullyQualifiedFactoryName, - getClass().getClassLoader() - ); - // create parser context - context = new ParserContext(keys, definitionFactory.getDefinitions()); } public OptionParser doParse(String... args) throws OptionParserException { @@ -142,7 +154,7 @@ instanciateOption(optionContext); } } - //TODO Report errors from context before suppress context + //TODO Report errors from context before clear context context.clear(); @@ -150,40 +162,30 @@ return this; } - public OptionKeyFactory.OptionKey[] getKeys() { - return context.keys; - } - - public OptionKeyFactory.OptionKey getKey(String key) { - for (OptionKeyFactory.OptionKey optionKey : context.keys) { - if (optionKey.name().equals(key)) { - return optionKey; - } - } - return null; + public boolean isEnabled(OptionKeyFactory.OptionKey key) { + List