Author: hlship
Date: Tue Mar  6 16:23:00 2007
New Revision: 515392

URL: http://svn.apache.org/viewvc?view=rev&rev=515392
Log:
TAPESTRY-1292: Allow lists to be used as select models

Modified:
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryInternalUtils.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryInternalUtilsTest.java

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryInternalUtils.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryInternalUtils.java?view=diff&rev=515392&r1=515391&r2=515392
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryInternalUtils.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/TapestryInternalUtils.java
 Tue Mar  6 16:23:00 2007
@@ -240,6 +240,53 @@
     }
 
     /**
+     * Converts an object to an [EMAIL PROTECTED] OptionModel}.
+     * 
+     * @param input
+     * @return
+     */
+    public static OptionModel toOptionModel(Object input)
+    {
+        String value = (input != null ? String.valueOf(input) : "");
+
+        return new OptionModelImpl(value, false, value);
+    }
+
+    /**
+     * Processes a list input into a series of objects compatible with
+     * [EMAIL PROTECTED] #toOptionModel(Object)}.
+     * 
+     * @param input
+     *            list of elements
+     * @return list of option models
+     */
+    public static <E> List<OptionModel> toOptionModels(List<E> input)
+    {
+        Defense.notNull(input, "input");
+
+        List<OptionModel> result = newList();
+
+        for (E element : input)
+            result.add(toOptionModel(element));
+
+        return result;
+    }
+
+    /**
+     * Wraps the result of [EMAIL PROTECTED] #toOptionModels(List)} as a 
[EMAIL PROTECTED] SelectModel} (with no option
+     * groups).
+     * 
+     * @param input
+     * @return
+     */
+    public static <E> SelectModel toSelectModel(List<E> input)
+    {
+        List<OptionModel> options = toOptionModels(input);
+
+        return new SelectModelImpl(null, options);
+    }
+
+    /**
      * Parses a key/value pair where the key and the value are seperated by an 
equals sign. The key
      * and value are trimmed of leading and trailing whitespace, and returned 
as a [EMAIL PROTECTED] KeyValue}.
      * 

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java?view=diff&rev=515392&r1=515391&r2=515392
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
 Tue Mar  6 16:23:00 2007
@@ -1252,6 +1252,7 @@
      * <li>List to [EMAIL PROTECTED] GridDataSource}
      * <li>null to [EMAIL PROTECTED] GridDataSource}
      * <li>String to [EMAIL PROTECTED] GridPagerPosition}
+     * <li>List to [EMAIL PROTECTED] SelectModel}
      * </ul>
      */
     @Contribute("tapestry.ioc.TypeCoercer")
@@ -1296,6 +1297,15 @@
                 String.class,
                 GridPagerPosition.class,
                 new 
StringToEnumCoercion<GridPagerPosition>(GridPagerPosition.class));
+
+        add(configuration, List.class, SelectModel.class, new Coercion<List, 
SelectModel>()
+        {
+            @SuppressWarnings("unchecked")
+            public SelectModel coerce(List input)
+            {
+                return TapestryInternalUtils.toSelectModel(input);
+            }
+        });
     }
 
     private static <S, T> void add(Configuration<CoercionTuple> configuration, 
Class<S> sourceType,

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryInternalUtilsTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryInternalUtilsTest.java?view=diff&rev=515392&r1=515391&r2=515392
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryInternalUtilsTest.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/TapestryInternalUtilsTest.java
 Tue Mar  6 16:23:00 2007
@@ -16,6 +16,7 @@
 
 import java.io.Closeable;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -207,6 +208,38 @@
 
         assertEquals(options.get(2).getLabel(), "C");
         assertEquals(options.get(2).getValue(), "3");
+    }
+
+    @Test
+    public void object_to_option_model()
+    {
+        Object object = new Integer(27);
+        OptionModel model = TapestryInternalUtils.toOptionModel(object);
+
+        assertEquals(model.getLabel(), "27");
+        assertEquals(model.getValue(), "27");
+    }
+
+    @Test
+    public void list_to_option_models()
+    {
+        List<String> list = new ArrayList<String>();
+        list.add("A");
+        list.add(null);
+        list.add("C");
+
+        List<OptionModel> options = TapestryInternalUtils.toOptionModels(list);
+
+        assertEquals(options.size(), 3);
+
+        assertEquals(options.get(0).getLabel(), "A");
+        assertEquals(options.get(0).getValue(), "A");
+
+        assertEquals(options.get(1).getLabel(), "");
+        assertEquals(options.get(1).getValue(), "");
+
+        assertEquals(options.get(2).getLabel(), "C");
+        assertEquals(options.get(2).getValue(), "C");
     }
 
     @Test


Reply via email to