diff options
author | Cedric Beust <cedric@beust.com> | 2012-08-01 08:50:32 -0700 |
---|---|---|
committer | Cedric Beust <cedric@beust.com> | 2012-08-01 08:50:32 -0700 |
commit | 2c092c0c1966a21f1b585eac22b4e36045a43549 (patch) | |
tree | 4b7ce7d71fdfed50cc4ada18a1cb46777d57eb12 /src | |
parent | 14bcad3aea8700c3cd3fc9f5b380355b074c94c7 (diff) | |
download | platform_external_jcommander-2c092c0c1966a21f1b585eac22b4e36045a43549.tar.gz platform_external_jcommander-2c092c0c1966a21f1b585eac22b4e36045a43549.tar.bz2 platform_external_jcommander-2c092c0c1966a21f1b585eac22b4e36045a43549.zip |
Added: JCommander#allowAbbreviatedOptions (default: false)
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/beust/jcommander/JCommander.java | 43 | ||||
-rw-r--r-- | src/test/java/com/beust/jcommander/JCommanderTest.java | 58 |
2 files changed, 96 insertions, 5 deletions
diff --git a/src/main/java/com/beust/jcommander/JCommander.java b/src/main/java/com/beust/jcommander/JCommander.java index 69a4a3e..6060dfc 100644 --- a/src/main/java/com/beust/jcommander/JCommander.java +++ b/src/main/java/com/beust/jcommander/JCommander.java @@ -795,6 +795,7 @@ public class JCommander { private boolean m_caseSensitiveOptions = true; private boolean m_caseSensitiveCommands = true; + private boolean m_allowAbbreviatedOptions = false; /** * @return the number of options that were processed. @@ -1415,13 +1416,43 @@ public class JCommander { return m_objects; } + private <V> V findAbbreviatedOption(Map<String, V> map, String name, boolean caseSensitive) { + Map<String, V> results = Maps.newHashMap(); + for (String c : map.keySet()) { + boolean match = (caseSensitive && c.startsWith(name)) + || ((! caseSensitive) && c.toLowerCase().startsWith(name.toLowerCase())); + if (match) { + results.put(c, map.get(c)); + } + } + V result; + if (results.size() > 1) { + throw new ParameterException("Ambiguous option: " + name + + " matches " + results.keySet()); + } else if (results.size() == 1) { + result = results.values().iterator().next(); + } else { + result = null; + } + + return result; + } + private <V> V findCaseSensitiveMap(Map<String, V> map, String name) { if (m_caseSensitiveOptions) { - return map.get(name); + if (m_allowAbbreviatedOptions) { + return findAbbreviatedOption(map, name, m_caseSensitiveOptions); + } else { + return map.get(name); + } } else { - for (String c : map.keySet()) { - if (c.equalsIgnoreCase(name)) { - return map.get(c); + if (m_allowAbbreviatedOptions) { + return findAbbreviatedOption(map, name, m_caseSensitiveOptions); + } else { + for (String c : map.keySet()) { + if (c.equalsIgnoreCase(name)) { + return map.get(c); + } } } } @@ -1543,6 +1574,10 @@ public class JCommander { m_caseSensitiveOptions = b; } + public void setAllowAbbreviatedOptions(boolean b) { + m_allowAbbreviatedOptions = b; + } + // public void setCaseSensitiveCommands(boolean b) { // m_caseSensitiveCommands = b; // } diff --git a/src/test/java/com/beust/jcommander/JCommanderTest.java b/src/test/java/com/beust/jcommander/JCommanderTest.java index c380721..fa79d1f 100644 --- a/src/test/java/com/beust/jcommander/JCommanderTest.java +++ b/src/test/java/com/beust/jcommander/JCommanderTest.java @@ -884,9 +884,65 @@ public class JCommanderTest { Assert.assertEquals(command, "--configure"); } + public void abbreviatedOptions() { + class Arg { + @Parameter(names = { "-p", "--param" }) + private String param; + } + Arg a = new Arg(); + JCommander jc = new JCommander(a); + jc.setAllowAbbreviatedOptions(true); + jc.parse(new String[] { "--par", "foo" }); + Assert.assertEquals(a.param, "foo"); + } + + public void abbreviatedOptionsCaseInsensitive() { + class Arg { + @Parameter(names = { "-p", "--param" }) + private String param; + } + Arg a = new Arg(); + JCommander jc = new JCommander(a); + jc.setCaseSensitiveOptions(false); + jc.setAllowAbbreviatedOptions(true); + jc.parse(new String[] { "--PAR", "foo" }); + Assert.assertEquals(a.param, "foo"); + } + + @Test(expectedExceptions = ParameterException.class) + public void ambiguousAbbreviatedOptions() { + class Arg { + @Parameter(names = { "--param" }) + private String param; + @Parameter(names = { "--parb" }) + private String parb; + } + Arg a = new Arg(); + JCommander jc = new JCommander(a); + jc.setAllowAbbreviatedOptions(true); + jc.parse(new String[] { "--par", "foo" }); + Assert.assertEquals(a.param, "foo"); + } + + @Test(expectedExceptions = ParameterException.class) + public void ambiguousAbbreviatedOptionsCaseInsensitive() { + class Arg { + @Parameter(names = { "--param" }) + private String param; + @Parameter(names = { "--parb" }) + private String parb; + } + Arg a = new Arg(); + JCommander jc = new JCommander(a); + jc.setCaseSensitiveOptions(false); + jc.setAllowAbbreviatedOptions(true); + jc.parse(new String[] { "--PAR", "foo" }); + Assert.assertEquals(a.param, "foo"); + } + @Test(enabled = false) public static void main(String[] args) throws Exception { - new JCommanderTest().caseInsensitiveCommand(); + new JCommanderTest().ambiguousAbbreviatedOptionsCaseInsensitive(); // class A { // @Parameter(names = "-short", required = true) // List<String> parameters; |