diff --git a/src/ArgsParser/ArgsParser.java b/src/ArgsParser/ArgsParser.java index cdec669..2919fc9 100644 --- a/src/ArgsParser/ArgsParser.java +++ b/src/ArgsParser/ArgsParser.java @@ -60,6 +60,8 @@ public class ArgsParser { private final String[] args; private final Map> parameterMap = new HashMap<>(); private final Set> mandatoryParameters = new HashSet<>(); + private final Set fullFlags = new HashSet<>(); + private final Set shortFlags = new HashSet<>(); protected boolean parseArgsWasCalled = false; private int longestFlagSize = 0; private int longestShortFlag = 0; @@ -92,6 +94,11 @@ private Parameter createParameter(String fullFlag, boolean isMandatory, T defaultValue) { + // check if the flag names are already used + if (fullFlags.contains(fullFlag)) throw new IllegalArgumentException("Flag already exists: " + fullFlag); + if (shortFlags.contains(shortFlag)) throw new IllegalArgumentException("Flag already exists: " + shortFlag); + + // create new parameter instance Parameter parameter = new Parameter(makeFlag(fullFlag, false), makeFlag(shortFlag, true), description, type, isMandatory, this); @@ -100,17 +107,22 @@ private Parameter createParameter(String fullFlag, parameter.setDefault(defaultValue); } + // add parameter to the map parameterMap.put(parameter.getFullFlag(), parameter); if (parameter.getShortFlag() != null) parameterMap.put(parameter.getShortFlag(), parameter); + // check for the lengths of the name int nameSize = parameter.getFullFlag().length(); if (longestFlagSize < nameSize) longestFlagSize = nameSize; - if (parameter.getShortFlag() != null) { - int shortSize = parameter.getShortFlag().length(); - if (longestShortFlag < shortSize) longestShortFlag = shortSize; - } + int shortSize = parameter.getShortFlag().length(); + if (longestShortFlag < shortSize) longestShortFlag = shortSize; + + // add names to the name sets + fullFlags.add(fullFlag); + shortFlags.add(shortFlag); + // add to mandatory parameters if parameter is mandatory if (parameter.isMandatory()) mandatoryParameters.add(parameter); return parameter; diff --git a/src/test/TestArgsParser.java b/src/test/TestArgsParser.java index 730420f..ff9d04b 100644 --- a/src/test/TestArgsParser.java +++ b/src/test/TestArgsParser.java @@ -521,4 +521,16 @@ public void testBool2() { Boolean result = bool.getArgument(); assertFalse(result); } + + @Test + public void testSameFlagNameException() { + ArgsParser parser = new ArgsParser(new String[] {"--file", "file.txt", "--file", "file2.txt"}); + Parameter file = parser.addStringParameter("file", "f", "descr", true); + try { + Parameter file2 = parser.addStringParameter("file", "f2", "descr", true); + parser.parseArgs(); + } catch (Exception e) { + assertEquals("Flag already exists: file", e.getMessage()); + } + } }