Title: [waffle-scm] [793] trunk/waffle-core/src/test/java/org/codehaus/waffle/bind/converters: Made separators configurable in map converters.

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(&quot;c&quot;, 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:

http://xircles.codehaus.org/manage_email

Reply via email to