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")