Index: lutinutil/src/java/org/codelutin/util/OptionDefinitionFactory.java diff -u /dev/null lutinutil/src/java/org/codelutin/util/OptionDefinitionFactory.java:1.1 --- /dev/null Mon Nov 19 19:53:35 2007 +++ lutinutil/src/java/org/codelutin/util/OptionDefinitionFactory.java Mon Nov 19 19:53:30 2007 @@ -0,0 +1,180 @@ +package org.codelutin.util; + +import org.apache.commons.collections.map.ReferenceMap; +import static org.codelutin.i18n.I18n._; +import static org.codelutin.util.OptionDefinitionParser.LUTINUTIL_PARSERDEF_PRINT_DETAIL_OPTION_HEAD; + +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * Factory de définitions d'options. + *

+ * Cette classe servira de super classe à la Factory generee par le parseur + * de définition, la genetation consiste a implanter la methode init pour + * initialiser la map d'option. + *

+ * Elle contient une méthode pour récupérer une factory initialisée à partir + * de sa classe {@link #newFactory(Class)}. + * + * @author chemit + */ + +public abstract class OptionDefinitionFactory { + + /** + * @param clazz class of the factory to get + * @return an instance of the required factory, initialize. + * @throws InstantiationException if error while instanciate factory + * @throws IllegalAccessException if can not access class + */ + public static OptionDefinitionFactory newFactory( + Class clazz) + throws InstantiationException, IllegalAccessException { + + // instanciate the factory + OptionDefinitionFactory factor = clazz.newInstance(); + + // init factory (this is the generated method) + factor.init(); + + return factor; + } + + /** + * La methode a implanter pour initialiser la factory. + *

+ * Il s'agit de remplir {@link #options} avec des {@link OptionDefinition} + */ + public abstract void init(); + + /** les options enregistrees dans la factory indexees par leur nom unique */ + protected final Map options; + + /** les clefs des options connues par la factory (Instanciation paresseuse). */ + protected List keys; + + @SuppressWarnings("unchecked") + public OptionDefinitionFactory() { + options = (Map) new ReferenceMap(); + } + + public OptionDefinition get(String key) { + return options.get(key); + } + + public List getKeys() { + if (keys == null) { + ArrayList list = new ArrayList(options.keySet()); + Collections.sort(list); + keys = Collections.unmodifiableList(list); + } + return keys; + } + + public OptionDefinition[] getOptions() { + return options.values().toArray(new OptionDefinition[options.size()]); + } + + public void printUsage(Writer writer, String name) throws IOException { + writer.append(_("lutinutil.parserdef.printUsage.factory.head",name)); + if (!getKeys().isEmpty()) { + for (String key : keys) { + get(key).printUsage(writer); + } + } + } + + public void printDetails(Writer writer) throws IOException { + int size = getKeys().size(); + writer.append(_("lutinutil.parserdef.printDetail.factory.head", + this, size)); + for (int i = 0; i < size; i++) { + OptionDefinition definition = options.get(getKeys().get(i)); + writer.append(_(LUTINUTIL_PARSERDEF_PRINT_DETAIL_OPTION_HEAD, + i + 1, size, definition)); + definition.printDetail(writer); + } + } + + protected OptionDefinition addOptionDefinition(String name, + String definition, + String description, + int min, int max, + int nbArguments, + String alias) { + return addOptionDefinition0(name, description, definition, min, max, + nbArguments, alias); + } + + protected OptionDefinition addOptionDefinition(String name, + String definition, + String description, + int min, int max, + int nbArguments, + String alias, String alias2) { + return addOptionDefinition0(name, description, definition, min, max, + nbArguments, alias, alias2); + } + + protected OptionDefinition addOptionDefinition(String name, + String definition, + String description, + int min, int max, + int nbArguments, + String alias, String alias2, + String alias3) { + return addOptionDefinition0(name, description, definition, min, max, + nbArguments, alias, alias2, alias3); + } + + protected OptionDefinition addOptionDefinition(String name, + String definition, + String description, + int min, int max, + int nbArguments, + String alias, String alias2, + String alias3, String alias4) { + return addOptionDefinition0(name, description, definition, min, max, + nbArguments, alias, alias2, alias3, alias4); + } + + protected OptionDefinition addOptionDefinition0(String name, + String definition, + String description, + int min, int max, + int nbArguments, + String... alias) { + OptionDefinition result; + result = new OptionDefinition(name, description, definition, min, max, + nbArguments, alias); + options.put(name, result); + return result; + } + + protected OptionArgumentDefinition addArgumentDefinition( + OptionDefinition definition, int index, String key, + OptionArgumentType type, + OptionArgumentValueType valueType, + int min, int max, int position) { + try { + OptionArgumentDefinition result; + result = new OptionArgumentDefinition(type, valueType, key, min, + max, position); + definition.arguments[index] = result; + return result; + } catch (IllegalArgumentException e) { + throw new RuntimeException(e); + } + } + + @Override + protected void finalize() throws Throwable { + super.finalize(); + options.clear(); + } +}