- Revision
- 793
- Author
- mauro
- Date
- 2008-08-28 06:12:33 -0500 (Thu, 28 Aug 2008)
Log Message
Made separators configurable in map converters.
Modified Paths
- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/StringListMapValueConverter.java
- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/StringNumberListMapValueConverter.java
- trunk/waffle-core/src/test/java/org/codehaus/waffle/bind/converters/StringListMapValueConverterTest.java
- trunk/waffle-core/src/test/java/org/codehaus/waffle/bind/converters/StringNumberListMapValueConverterTest.java
Diff
Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/StringListMapValueConverter.java (792 => 793)
--- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/StringListMapValueConverter.java 2008-08-28 10:36:59 UTC (rev 792) +++ trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/StringListMapValueConverter.java 2008-08-28 11:12:33 UTC (rev 793) @@ -33,6 +33,21 @@ * map.put("c", asList("x", "y", "z")); * </pre> * + * A <code>null</code> or empty value (once trimmed) will be returned as an empty <code>HashMap</code> (behaviour which + * can be overridden via the [EMAIL PROTECTED] #convertMissingValue} method), while an invalid value will cause a BindException to + * be thrown. The message keys and default values used are: + * <ul> + * <li>"bind.error.map" ([EMAIL PROTECTED] #BIND_ERROR_MAP_KEY}): bind error in map parsing (message defaults to + * [EMAIL PROTECTED] #DEFAULT_MAP_MESSAGE})</li> + * <li>"map.newline.separator" ([EMAIL PROTECTED] #NEWLINE_SEPARATOR_KEY}): newline separator used in parsing (defaults to + * [EMAIL PROTECTED] #DEFAULT_NEWLINE_SEPARATOR})</li> + * <li>"map.key.separator" ([EMAIL PROTECTED] #KEY_SEPARATOR_KEY}): key separator used in parsing (defaults to + * [EMAIL PROTECTED] #DEFAULT_KEY_SEPARATOR})</li> + * <li>"map.list.separator" ([EMAIL PROTECTED] #LIST_SEPARATOR_KEY}): list separator used in parsing (defaults to + * [EMAIL PROTECTED] #DEFAULT_LIST_SEPARATOR})</li> + * </ul> + * The separators are also optionally injectable via <code>Properties</code> in the constructor and take precedence over + * the ones configured in the messages resources. * </p> * * @author Mauro Talevi @@ -41,9 +56,12 @@ public static final String BIND_ERROR_MAP_KEY = "bind.error.map"; public static final String DEFAULT_MAP_MESSAGE = "Invalid map value for field {0}"; - protected static final String NL = "\n"; - protected static final String EQUAL = "="; - protected static final String COMMA = ","; + public static final String NEWLINE_SEPARATOR_KEY = "map.newline.separator"; + public static final String KEY_SEPARATOR_KEY = "map.key.separator"; + public static final String LIST_SEPARATOR_KEY = "map.list.separator"; + public static final String DEFAULT_NEWLINE_SEPARATOR = "\n"; + public static final String DEFAULT_KEY_SEPARATOR = "="; + public static final String DEFAULT_LIST_SEPARATOR = ","; public StringListMapValueConverter(MessageResources messageResources) { this(messageResources, new Properties()); @@ -67,13 +85,16 @@ return convertMissingValue(BIND_ERROR_MAP_KEY, DEFAULT_MAP_MESSAGE, fieldName); } - List<String> lines = split(value, NL); + String newlineSeparator = patternFor(NEWLINE_SEPARATOR_KEY, DEFAULT_NEWLINE_SEPARATOR); + String keySeparator = patternFor(KEY_SEPARATOR_KEY, DEFAULT_KEY_SEPARATOR); + String listSeparator = patternFor(LIST_SEPARATOR_KEY, DEFAULT_LIST_SEPARATOR); + List<String> lines = split(value, newlineSeparator); Map<String, List<String>> map = new HashMap<String, List<String>>(); for (String line : lines) { - List<String> parts = split(line, EQUAL); + List<String> parts = split(line, keySeparator); if (parts.size() > 1) { String csv = parts.get(1); - map.put(parts.get(0), split(csv, COMMA)); + map.put(parts.get(0), split(csv, listSeparator)); } } return map;
Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/StringNumberListMapValueConverter.java (792 => 793)
--- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/StringNumberListMapValueConverter.java 2008-08-28 10:36:59 UTC (rev 792) +++ trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/StringNumberListMapValueConverter.java 2008-08-28 11:12:33 UTC (rev 793) @@ -16,9 +16,10 @@ /** * <p> - * <code>ValueConverter</code> that converts a text value to a Map of Number Lists indexed by Strings. It provides - * number parsing of the string values using the <code>NumberFormat</code> instance provided (which defaults to - * <code>NumberFormat.getInstance()</code>) and if not successful returns the string values themselves. + * <code>ValueConverter</code> that converts a text value to a Map of Number Lists indexed by Strings. It extends + * [EMAIL PROTECTED] StringListMapValueConverter} providing number parsing of the string values using the <code>NumberFormat</code> + * instance provided (which defaults to <code>NumberFormat.getInstance()</code>) and if not successful returns the + * string values themselves. * </p> * <p> * A value of the form @@ -38,7 +39,10 @@ * map.put("c", asList(1, 2, 3)); * </pre> * + * As for [EMAIL PROTECTED] StringListMapValueConverter}, the separators are also optionally injectable via <code>Properties</code> in the constructor and take precedence over + * the ones configured in the messages resources. * </p> + * </p> * * @author Mauro Talevi */ @@ -50,6 +54,10 @@ this(messageResources, new Properties(), NumberFormat.getInstance()); } + public StringNumberListMapValueConverter(MessageResources messageResources, Properties patterns) { + this(messageResources, patterns, NumberFormat.getInstance()); + } + public StringNumberListMapValueConverter(MessageResources messageResources, Properties patterns, NumberFormat numberFormat) { super(messageResources, patterns); @@ -70,14 +78,17 @@ return convertMissingValue(BIND_ERROR_MAP_KEY, DEFAULT_MAP_MESSAGE, fieldName); } - List<String> lines = split(value, NL); + String newlineSeparator = patternFor(NEWLINE_SEPARATOR_KEY, DEFAULT_NEWLINE_SEPARATOR); + String keySeparator = patternFor(KEY_SEPARATOR_KEY, DEFAULT_KEY_SEPARATOR); + String listSeparator = patternFor(LIST_SEPARATOR_KEY, DEFAULT_LIST_SEPARATOR); + List<String> lines = split(value, newlineSeparator); Map<String, List<Number>> map = new HashMap<String, List<Number>>(); for (String line : lines) { - List<String> parts = split(line, EQUAL); + List<String> parts = split(line, keySeparator); if (parts.size() > 1) { try { String csv = parts.get(1); - List<String> values = split(csv, COMMA); + List<String> values = split(csv, listSeparator); List<Number> numbers = new ArrayList<Number>(); for (String numberValue : values) { numbers.add(numberFormat.parse(numberValue));
Modified: trunk/waffle-core/src/test/java/org/codehaus/waffle/bind/converters/StringListMapValueConverterTest.java (792 => 793)
--- trunk/waffle-core/src/test/java/org/codehaus/waffle/bind/converters/StringListMapValueConverterTest.java 2008-08-28 10:36:59 UTC (rev 792) +++ trunk/waffle-core/src/test/java/org/codehaus/waffle/bind/converters/StringListMapValueConverterTest.java 2008-08-28 11:12:33 UTC (rev 793) @@ -2,6 +2,9 @@ import static java.text.MessageFormat.format; import static java.util.Arrays.asList; +import static org.codehaus.waffle.bind.converters.StringListMapValueConverter.KEY_SEPARATOR_KEY; +import static org.codehaus.waffle.bind.converters.StringListMapValueConverter.LIST_SEPARATOR_KEY; +import static org.codehaus.waffle.bind.converters.StringListMapValueConverter.NEWLINE_SEPARATOR_KEY; import static org.codehaus.waffle.testmodel.FakeControllerWithListMethods.methodParameterType; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -12,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; import ognl.OgnlException; @@ -36,7 +40,7 @@ } @Test - public void canConvertMapsOfStringNumberLists() throws OgnlException { + public void canConvertMapsOfStringLists() throws OgnlException { StringListMapValueConverter converter = new StringListMapValueConverter(new DefaultMessageResources()); Map<String, List<String>> map = new HashMap<String, List<String>>(); map.put("a", asList("x")); @@ -53,6 +57,27 @@ assertCanConvertValueToMap(converter, map, "a=x\n b=x,y\n c=x,y,z"); } + @Test + public void canConvertMapsOfStringListsWithCustomSeparators() throws OgnlException { + Properties patterns = new Properties(); + patterns.setProperty(NEWLINE_SEPARATOR_KEY, ";"); + patterns.setProperty(KEY_SEPARATOR_KEY, ":"); + patterns.setProperty(LIST_SEPARATOR_KEY, "-"); + StringListMapValueConverter converter = new StringListMapValueConverter(new DefaultMessageResources(), patterns); + Map<String, List<String>> map = new HashMap<String, List<String>>(); + map.put("a", asList("x")); + assertCanConvertValueToMap(converter, map, "a:x"); + map.clear(); + map.put("a", asList("x")); + map.put("b", asList("y")); + assertCanConvertValueToMap(converter, map, "a:x; b:y"); + map.clear(); + map.put("a", asList("x")); + map.put("b", asList("x", "y")); + map.put("c", asList("x", "y", "z")); + assertCanConvertValueToMap(converter, map, "a:x;b:x-y;c:x-y-z"); + } + @SuppressWarnings("unchecked") private void assertCanConvertValueToMap(StringListMapValueConverter converter, Map<String, List<String>> expected, String value) {
Modified: trunk/waffle-core/src/test/java/org/codehaus/waffle/bind/converters/StringNumberListMapValueConverterTest.java (792 => 793)
--- trunk/waffle-core/src/test/java/org/codehaus/waffle/bind/converters/StringNumberListMapValueConverterTest.java 2008-08-28 10:36:59 UTC (rev 792) +++ trunk/waffle-core/src/test/java/org/codehaus/waffle/bind/converters/StringNumberListMapValueConverterTest.java 2008-08-28 11:12:33 UTC (rev 793) @@ -2,6 +2,9 @@ import static java.text.MessageFormat.format; import static java.util.Arrays.asList; +import static org.codehaus.waffle.bind.converters.StringListMapValueConverter.KEY_SEPARATOR_KEY; +import static org.codehaus.waffle.bind.converters.StringListMapValueConverter.LIST_SEPARATOR_KEY; +import static org.codehaus.waffle.bind.converters.StringListMapValueConverter.NEWLINE_SEPARATOR_KEY; import static org.codehaus.waffle.testmodel.FakeControllerWithListMethods.methodParameterType; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -12,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; import ognl.OgnlException; @@ -57,6 +61,27 @@ } + @Test + public void canConvertMapsOfStringNumberListsWithCustomSeparators() throws OgnlException { + Properties patterns = new Properties(); + patterns.setProperty(NEWLINE_SEPARATOR_KEY, ";"); + patterns.setProperty(KEY_SEPARATOR_KEY, ":"); + patterns.setProperty(LIST_SEPARATOR_KEY, "-"); + StringNumberListMapValueConverter converter = new StringNumberListMapValueConverter(new DefaultMessageResources(), patterns); + Map<String, List<? extends Number>> map = new HashMap<String, List<? extends Number>>(); + map.put("a", asList(1)); + assertCanConvertValueToMap(converter, map, "a:1"); + map.clear(); + map.put("a", asList(1)); + map.put("b", asList(2)); + assertCanConvertValueToMap(converter, map, "a:1; b:2"); + map.clear(); + map.put("a", asList(1)); + map.put("b", asList(1, 2)); + map.put("c", asList(1, 2, 3)); + assertCanConvertValueToMap(converter, map, "a:1;b:1-2;c:1-2-3"); + } + @SuppressWarnings("unchecked") private void assertCanConvertValueToMap(StringNumberListMapValueConverter converter, Map<String, List<? extends Number>> expected, String value) {
To unsubscribe from this list please visit:
