Title: [waffle-scm] [616] trunk/waffle-resources/src/main/resources/ftl/waffle: Enhanced ListValueConverter to return a List of different objects (Integer, Double, String) as appropriate.

Diff

Modified: trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/model/Person.java (615 => 616)

--- trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/model/Person.java	2008-04-14 19:11:32 UTC (rev 615)
+++ trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/model/Person.java	2008-04-14 22:55:39 UTC (rev 616)
@@ -17,4 +17,8 @@
 
     public List<String> getSkills();
     
+    public List<Integer> getLevels();
+    
+    public List<Double> getGrades();
+    
 }

Modified: trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/persister/PersistablePerson.java (615 => 616)

--- trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/persister/PersistablePerson.java	2008-04-14 19:11:32 UTC (rev 615)
+++ trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/persister/PersistablePerson.java	2008-04-14 22:55:39 UTC (rev 616)
@@ -14,6 +14,8 @@
     private String email;
     private Date dateOfBirth;
     private List<String> skills;
+    private List<Integer> levels;
+    private List<Double> grades;
 
     public PersistablePerson() {
         id = new Long(0);
@@ -22,6 +24,8 @@
         email = "";
         dateOfBirth = new Date();
         skills = new ArrayList<String>();
+        levels = new ArrayList<Integer>();
+        grades = new ArrayList<Double>();
     }
 
     public PersistablePerson(Person person) {
@@ -31,6 +35,8 @@
         this.email = person.getEmail();
         this.dateOfBirth = person.getDateOfBirth();
         this.skills = person.getSkills();
+        this.levels = person.getLevels();
+        this.grades = person.getGrades();
     }
 
     public Long getId() {
@@ -81,9 +87,22 @@
         this.skills = skills;
     }
     
-    @Override
-    public String toString() {
-        return "Person "+firstName+" has skills "+skills;
+    public List<Integer> getLevels() {
+        System.out.println("Levels ... "+levels);
+        return levels;
     }
+
+    public void setLevels(List<Integer> levels) {
+        this.levels = levels;
+    }
+
+    public List<Double> getGrades() {
+        System.out.println("Grades ... "+grades);
+        return grades;
+    }
     
+    public void setGrades(List<Double> grades) {
+        this.grades = grades;
+    }
+
 }

Modified: trunk/examples/freemarker-example/src/main/webapp/people/editperson.htm (615 => 616)

--- trunk/examples/freemarker-example/src/main/webapp/people/editperson.htm	2008-04-14 19:11:32 UTC (rev 615)
+++ trunk/examples/freemarker-example/src/main/webapp/people/editperson.htm	2008-04-14 22:55:39 UTC (rev 616)
@@ -27,15 +27,25 @@
         <br style="clear:both"/>
     </div>
     <div class="fieldRow">
+        <label for="" Of Birth:</label>
+        <@w.text "person.dateOfBirth" "${person.dateOfBirth?string('dd/MM/yyyy')}"/> 
+        <br style="clear:both"/>
+    </div>
+    <div class="fieldRow">
         <label for=""
         <@w.selectMultiple "person.skills" controller.getSkills() person.getSkills() "size='5'"/>
         <br style="clear:both"/>
     </div>
     <div class="fieldRow">
-        <label for="" Of Birth:</label>
-        <@w.text "person.dateOfBirth" "${person.dateOfBirth?string('dd/MM/yyyy')}"/> 
+        <label for=""
+        <@w.textAsCSV "person.levels" person.getLevels() /> 
         <br style="clear:both"/>
     </div>
+    <div class="fieldRow">
+        <label for=""
+        <@w.textAsCSV "person.grades" person.getGrades() /> 
+        <br style="clear:both"/>
+    </div>
 
     <br/>
     <a href="" |

Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/DateValueConverter.java (615 => 616)

--- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/DateValueConverter.java	2008-04-14 19:11:32 UTC (rev 615)
+++ trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/DateValueConverter.java	2008-04-14 22:55:39 UTC (rev 616)
@@ -40,16 +40,16 @@
     public <T> T convertValue(String propertyName, String value, Class<T> toType) {
         String fieldName = messageResources.getMessageWithDefault(propertyName, propertyName);
         if (value == null || value.equals("")) {
-            String message = messageResources.getMessageWithDefault("bind.error.date.missing", "Missing date value for field ", fieldName);
+            String message = messageResources.getMessageWithDefault("bind.error.date.missing", "Missing date value for field {0}", fieldName);
             throw new BindException(message);
         }
 
-        String datePattern = messageResources.getMessageWithDefault("date.format", "dd/MM/yyyy");
+        String dateFormat = messageResources.getMessageWithDefault("date.format", "dd/MM/yyyy");
 
         try {
-            return (T) new SimpleDateFormat(datePattern).parse(value);
+            return (T) new SimpleDateFormat(dateFormat).parse(value);
         } catch (ParseException e) {
-            String message = messageResources.getMessageWithDefault("bind.error.date.invalid", "Date {1} invalid for field {0} with pattern {2}", fieldName, value, datePattern);
+            String message = messageResources.getMessageWithDefault("bind.error.date.invalid", "Invalid date {1} (using format {2}) for field {0}", fieldName, value, dateFormat);
             throw new BindException(message);
         }
     }

Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/ListValueConverter.java (615 => 616)

--- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/ListValueConverter.java	2008-04-14 19:11:32 UTC (rev 615)
+++ trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/ListValueConverter.java	2008-04-14 22:55:39 UTC (rev 616)
@@ -10,8 +10,11 @@
  *****************************************************************************/
 package org.codehaus.waffle.bind.converters;
 
+import static java.lang.Double.parseDouble;
+import static java.lang.Integer.parseInt;
 import static java.util.Arrays.asList;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.codehaus.waffle.bind.BindException;
@@ -19,8 +22,9 @@
 import org.codehaus.waffle.i18n.MessageResources;
 
 /**
- * <code>ValueConverter</code> that converts a CSV value to a List of Strings. 
- * A <code>null</code> value will cause a BindException to thrown.
+ * <code>ValueConverter</code> that converts a CSV value to a List. A <code>null</code> value will cause a
+ * BindException to thrown. The converter also looks to see if the values in the list are integers or doubles and if so
+ * parses them.
  * 
  * @author Mauro Talevi
  */
@@ -41,10 +45,52 @@
         if (value == null) {
             String fieldName = messageResources.getMessageWithDefault(propertyName, propertyName);
             String message = messageResources.getMessageWithDefault("bind.error.list.missing",
-                    "Missing list value for field {0} for list {1}", fieldName);
+                    "Missing list value for field {0}", fieldName);
             throw new BindException(message);
         }
-        return (T) asList(value.split(","));
+        List<String> values = asList(value.split(","));        
+        if ( values.size() == 0 ){
+            return (T) values;
+        }
+        if ( areIntegers(values) ){
+            return (T) toIntegers(values);
+        } else if ( areDoubles(values)) {
+            return (T) toDoubles(values);
+        }
+        return (T) values;
     }
 
+    private boolean areIntegers(List<String> values) {
+        try {
+            parseInt(values.get(0));
+            return true;
+        } catch ( NumberFormatException e) {
+            return false;
+        }
+    }
+
+    private List<Integer> toIntegers(List<String> values) {
+        List<Integer> list = new ArrayList<Integer>();
+        for ( String value : values ){
+            list.add(parseInt(value));
+        }
+        return list;
+    }
+    
+    private boolean areDoubles(List<String> values) {
+        try {
+            parseDouble(values.get(0));
+            return true;
+        } catch ( NumberFormatException e) {
+            return false;
+        }
+    }
+
+    private List<Double> toDoubles(List<String> values) {
+        List<Double> list = new ArrayList<Double>();
+        for ( String value : values ){
+            list.add(parseDouble(value));
+        }
+        return list;
+    }
 }

Modified: trunk/waffle-resources/src/main/resources/ftl/waffle/form.ftl (615 => 616)

--- trunk/waffle-resources/src/main/resources/ftl/waffle/form.ftl	2008-04-14 19:11:32 UTC (rev 615)
+++ trunk/waffle-resources/src/main/resources/ftl/waffle/form.ftl	2008-04-14 22:55:39 UTC (rev 616)
@@ -20,6 +20,18 @@
 </#function>
 
 <#--
+ * Joins list values 
+ *
+ * @param values the values to join
+ * @param separator the separator to join list with
+ -->
+<#function join values separator>
+    <#assign result = ''>
+    <#list values as value>><#assign result=result+value><#if value_has_next><#assign result=result+separator></#if></#list>
+    <#return result>
+</#function>
+
+<#--
  * Shows values as CSV
  *
  * @param values the sequence of values
@@ -62,6 +74,18 @@
 </#macro>
 
 <#--
+ * Show a text input element with a given values as CSV
+ *
+ * @param field the name of the field to bind the element to 
+ * @param values the values
+ * @param attributes any additional attributes for the element (defaults to "")
+-->
+<#macro textAsCSV field values attributes="">
+    <#assign csv=join(values,",")>
+    <input type="text" id="${field}" name="${field}" value="${csv}" ${attributes}/>
+</#macro>
+
+<#--
  * Show a select input element allowing a value to be chosen from a list of options.
  *
  * @param field the name of the field to bind the element to 


To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email

Reply via email to