Index: lutinutil/src/java/org/codelutin/util/OptionDefinitionParser.java diff -u lutinutil/src/java/org/codelutin/util/OptionDefinitionParser.java:1.5 lutinutil/src/java/org/codelutin/util/OptionDefinitionParser.java:1.6 --- lutinutil/src/java/org/codelutin/util/OptionDefinitionParser.java:1.5 Wed Nov 28 20:02:12 2007 +++ lutinutil/src/java/org/codelutin/util/OptionDefinitionParser.java Thu Nov 29 23:39:31 2007 @@ -24,9 +24,9 @@ * Created: 22 août 2003 * * @author Benjamin Poussin -* @version $Revision: 1.5 $ +* @version $Revision: 1.6 $ * -* Mise a jour: $Date: 2007-11-28 20:02:12 $ +* Mise a jour: $Date: 2007-11-29 23:39:31 $ * par : $Author: tchemit $ */ @@ -36,8 +36,20 @@ import static org.codelutin.util.OptionArgumentValueType._newfile; import static org.codelutin.util.OptionArgumentValueType._string; -import java.io.*; -import java.util.*; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; /** * Parser de définition d'options de la ligne de commande. @@ -118,6 +130,8 @@ /** collection of definition names found in properties file */ protected List definitionNames; + protected List argumentKeyUsed; + public OptionDefinition[] getDefinitions() { return definitions.toArray(new OptionDefinition[definitions.size()]); } @@ -183,6 +197,7 @@ this.errors = new ArrayList(); this.definitions = new ArrayList(); this.unvalidDefinitions = new ArrayList(); + this.argumentKeyUsed = new ArrayList(); Map result = new TreeMap(); this.definitionNames = new ArrayList(); @@ -238,6 +253,8 @@ protected OptionDefinition parseDefinition(String definitionName, String description, String definition) { + argumentKeyUsed.clear(); + // assume when arrives here, that the gloabl option definition is fine : // says : definition is not empty nor null // says : definition has a first valid alias @@ -316,8 +333,8 @@ // construction de la définition complête de l'option return safe ? new OptionDefinition( - definitionName,description,definition, - min,max,alias, + definitionName, description, definition, + min, max, alias, argumentDefinitions.toArray(new OptionArgumentDefinition[argumentDefinitions.size()]) ) : new SyntaxUnvalidOptionDefinition(description, definition); } @@ -434,6 +451,7 @@ result = false; continue; } + if (type == OptionArgumentType.valued) { // on sauvegarde le type (pour les conflits possibles) valueTypesFound.add(valueType); @@ -448,6 +466,9 @@ (Integer) typeAndMinAndMax[2], position ); + // keep the key used + argumentKeyUsed.add(definition.getKey()); + // register the new argument definition definitionsFound.add(definition); } @@ -664,7 +685,11 @@ if (!checkCardinalite(min, max, definition, groupementDefinition)) { return false; } - + if (argumentKeyUsed.contains(key)) { + addError(_("lutinutil.parserdef.duplicated.argument.key", + key, definition, groupementDefinition)); + return false; + } // un argument de type constant ne peut pas avoir de cardinalite autre que {1,1} if (type == OptionArgumentType.constant) { if (mandatory && !(min == 1 && max == 1)) { @@ -690,13 +715,13 @@ } } // on verifie que la clef n'est pas déjà enregistrée - for (OptionArgumentDefinition optionArgumentDefinition : argumentsFound) { + /*for (OptionArgumentDefinition optionArgumentDefinition : argumentsFound) { if (optionArgumentDefinition.getKey().equals(key)) { addError(_("lutinutil.parserdef.duplicated.argument.key", key, definition, groupementDefinition)); return false; } - } + }*/ if (type == OptionArgumentType.valued) { if (((valueType == _newfile) && valueTypesUsed.contains(_string)) ||