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