Author: cziegeler
Date: Fri Jan 16 10:43:54 2009
New Revision: 735083

URL: http://svn.apache.org/viewvc?rev=735083&view=rev
Log:
SLING-832 : Apply patch from Tobias Bocanegra to support arrays in type 
conversion.

Modified:
    
incubator/sling/trunk/api/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java

Modified: 
incubator/sling/trunk/api/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/api/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java?rev=735083&r1=735082&r2=735083&view=diff
==============================================================================
--- 
incubator/sling/trunk/api/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java
 (original)
+++ 
incubator/sling/trunk/api/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java
 Fri Jan 16 10:43:54 2009
@@ -18,7 +18,10 @@
  */
 package org.apache.sling.api.wrappers;
 
+import java.lang.reflect.Array;
 import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -47,15 +50,26 @@
     /**
      * {...@inheritdoc}
      */
-    @SuppressWarnings("unchecked")
     public <T> T get(String name, Class<T> type) {
+        return convert(get(name), type);
+    }
+
+    /**
+     * Converts the object to the given type.
+     * @param obj object
+     * @param type type
+     * @return the converted object
+     */
+    @SuppressWarnings("unchecked")
+    private <T> T convert(Object obj, Class<T> type) {
+        // todo: do smarter checks
         try {
-            // todo: do smarter checks
-            Object obj = get(name);
             if (obj == null) {
                 return null;
             } else if (type.isAssignableFrom(obj.getClass())) {
                 return (T) obj;
+            } else if (type.isArray()) {
+                return (T) convertToArray(obj, type.getComponentType());
             } else if (type == String.class) {
                 return (T) String.valueOf(obj);
             } else if (type == Integer.class) {
@@ -75,6 +89,26 @@
     }
 
     /**
+     * Converts the object to an array of the given type
+     * @param obj tje object or object array
+     * @param type the component type of the array
+     * @return and array of type T
+     */
+    private <T> T[] convertToArray(Object obj, Class<T> type) {
+        List<T> values = new LinkedList<T>();
+        if (obj.getClass().isArray()) {
+            for (Object o: (Object[]) obj) {
+                values.add(convert(o, type));
+            }
+        } else {
+            values.add(convert(obj, type));
+        }
+        @SuppressWarnings("unchecked")
+        T[] result = (T[]) Array.newInstance(type, values.size());
+        return values.toArray(result);
+    }
+
+    /**
      * {...@inheritdoc}
      */
     @SuppressWarnings("unchecked")


Reply via email to