1 package com.beust.jcommander; 2 3 import com.beust.jcommander.internal.Maps; 4 5 import java.util.Map; 6 7 /** 8 * Helper class to perform fuzzy key look ups: looking up case insensitive or 9 * abbreviated keys. 10 */ 11 public class FuzzyMap { 12 interface IKey { getName()13 String getName(); 14 } 15 findInMap(Map<? extends IKey, V> map, IKey name, boolean caseSensitive, boolean allowAbbreviations)16 public static <V> V findInMap(Map<? extends IKey, V> map, IKey name, 17 boolean caseSensitive, boolean allowAbbreviations) { 18 if (allowAbbreviations) { 19 return findAbbreviatedValue(map, name, caseSensitive); 20 } else { 21 if (caseSensitive) { 22 return map.get(name); 23 } else { 24 for (IKey c : map.keySet()) { 25 if (c.getName().equalsIgnoreCase(name.getName())) { 26 return map.get(c); 27 } 28 } 29 } 30 } 31 return null; 32 } 33 findAbbreviatedValue(Map<? extends IKey, V> map, IKey name, boolean caseSensitive)34 private static <V> V findAbbreviatedValue(Map<? extends IKey, V> map, IKey name, 35 boolean caseSensitive) { 36 String string = name.getName(); 37 Map<String, V> results = Maps.newHashMap(); 38 for (IKey c : map.keySet()) { 39 String n = c.getName(); 40 boolean match = (caseSensitive && n.startsWith(string)) 41 || ((! caseSensitive) && n.toLowerCase().startsWith(string.toLowerCase())); 42 if (match) { 43 results.put(n, map.get(c)); 44 } 45 } 46 47 V result; 48 if (results.size() > 1) { 49 throw new ParameterException("Ambiguous option: " + name 50 + " matches " + results.keySet()); 51 } else if (results.size() == 1) { 52 result = results.values().iterator().next(); 53 } else { 54 result = null; 55 } 56 57 return result; 58 } 59 60 61 } 62