summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG1
-rw-r--r--src/main/java/com/beust/jcommander/JCommander.java43
-rw-r--r--src/test/java/com/beust/jcommander/JCommanderTest.java58
3 files changed, 97 insertions, 5 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 1482f1a..fdc3a1c 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
Current
+Added: JCommander#allowAbbreviatedOptions (default: false)
Added: JCommander#setCaseSensitiveOptions (default: true)
Fixed: The description of commands is now displayed on the next line and indented.
Fixed: Empty string defaults now displayed as "<empty string>" in the usage
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;