You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by zh...@apache.org on 2010/09/18 02:46:22 UTC
svn commit: r998378 - in /shindig/trunk/java/common/src:
main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java
test/java/org/apache/shindig/protocol/conversion/BeanDelegatorTest.java
Author: zhoresh
Date: Sat Sep 18 00:46:22 2010
New Revision: 998378
URL: http://svn.apache.org/viewvc?rev=998378&view=rev
Log:
Ref: http://codereview.appspot.com/2242041/
Improve BeanDelegator for easy overwrite
Modified:
shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java
shindig/trunk/java/common/src/test/java/org/apache/shindig/protocol/conversion/BeanDelegatorTest.java
Modified: shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java?rev=998378&r1=998377&r2=998378&view=diff
==============================================================================
--- shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java (original)
+++ shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java Sat Sep 18 00:46:22 2010
@@ -87,12 +87,37 @@ public class BeanDelegator {
*/
public Object createDelegator(Object source) {
if (source == null || delegatedClasses == null) {
+ return source;
+ }
+
+ if (delegatedClasses.containsKey(source.getClass())) {
+ Class<?> apiInterface = delegatedClasses.get(source.getClass());
+
+ return createDelegator(source, apiInterface);
+ }
+ return source;
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> T createDelegator(Object source, Class<T> apiInterface) {
+ return createDelegator(source, apiInterface, EMPTY_FIELDS);
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> T createDelegator(Object source, Class<T> apiInterface,
+ Map<String, Object> extraFields) {
+
+ if (source == null) {
return null;
}
+ if (apiInterface.isPrimitive() || apiInterface.isAssignableFrom(source.getClass())) {
+ return (T) source;
+ }
+
// For enum, return the converted enum
if (source instanceof Enum<?> && delegatedClasses.containsKey(source.getClass())) {
- return convertEnum((Enum<?>) source);
+ return (T) convertEnum((Enum<?>) source);
}
// Proxy each item in a map (map key is not proxied)
@@ -103,11 +128,11 @@ public class BeanDelegator {
// Convert Map:
ImmutableMap.Builder<Object, Object> mapBuilder = ImmutableMap.builder();
for (Map.Entry<?, ?> entry : mapSource.entrySet()) {
- mapBuilder.put(entry.getKey(), createDelegator(entry.getValue()));
+ mapBuilder.put(entry.getKey(), createDelegator(entry.getValue(), apiInterface));
}
- return mapBuilder.build();
+ return (T) mapBuilder.build();
} else {
- return source;
+ return (T) source;
}
}
@@ -119,30 +144,13 @@ public class BeanDelegator {
// Convert Map:
ImmutableList.Builder<Object> listBuilder = ImmutableList.builder();
for (Object entry : listSource) {
- listBuilder.add(createDelegator(entry));
+ listBuilder.add(createDelegator(entry, apiInterface));
}
- return listBuilder.build();
+ return (T) listBuilder.build();
} else {
- return source;
+ return (T) source;
}
}
-
- if (delegatedClasses.containsKey(source.getClass())) {
- Class<?> apiInterface = delegatedClasses.get(source.getClass());
-
- return createDelegator(source, apiInterface);
- }
- return source;
- }
-
- @SuppressWarnings("unchecked")
- public <T> T createDelegator(Object source, Class<T> apiInterface) {
- return createDelegator(source, apiInterface, EMPTY_FIELDS);
- }
-
- @SuppressWarnings("unchecked")
- public <T> T createDelegator(Object source, Class<T> apiInterface,
- Map<String, Object> extraFields) {
return (T) Proxy.newProxyInstance( apiInterface.getClassLoader(),
new Class[] { apiInterface }, new DelegateInvocationHandler(source, extraFields));
}
@@ -189,7 +197,7 @@ public class BeanDelegator {
Method sourceMethod = sourceClass.getMethod(
method.getName(), method.getParameterTypes());
Object result = sourceMethod.invoke(source, args);
- return createDelegator(result);
+ return createDelegator(result, getParameterizedReturnType(method));
} catch (NoSuchMethodException e) {
// Will throw unsupported method below
} catch (IllegalArgumentException e) {
@@ -203,6 +211,21 @@ public class BeanDelegator {
}
}
+ private Class<?> getParameterizedReturnType(Method method) {
+ Type type = method.getGenericReturnType();
+ if (type instanceof ParameterizedType) {
+ ParameterizedType paramType = (ParameterizedType) type;
+
+ if (List.class.isAssignableFrom((Class<?>) paramType.getRawType())) {
+ type = paramType.getActualTypeArguments()[0];
+ } else if (Map.class.isAssignableFrom((Class<?>) paramType.getRawType())) {
+ type = paramType.getActualTypeArguments()[1];
+ }
+ }
+ return (Class<?>) type;
+ }
+
+
/**
* Validate all proxied classes to see that all required functions are implemented.
* Throws exception if failed validation.
Modified: shindig/trunk/java/common/src/test/java/org/apache/shindig/protocol/conversion/BeanDelegatorTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/test/java/org/apache/shindig/protocol/conversion/BeanDelegatorTest.java?rev=998378&r1=998377&r2=998378&view=diff
==============================================================================
--- shindig/trunk/java/common/src/test/java/org/apache/shindig/protocol/conversion/BeanDelegatorTest.java (original)
+++ shindig/trunk/java/common/src/test/java/org/apache/shindig/protocol/conversion/BeanDelegatorTest.java Sat Sep 18 00:46:22 2010
@@ -27,7 +27,6 @@ import org.apache.shindig.protocol.conve
import org.junit.Before;
import org.junit.Test;
-import java.beans.BeanInfo;
import java.util.List;
import java.util.Map;