summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/trunk/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java
diff options
context:
space:
mode:
authorrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2010-11-13 17:42:16 +0000
committerrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2010-11-13 17:42:16 +0000
commitefccdd821b68280ee3b73c8ef5cda121bc27f620 (patch)
treec43374b274b5bc3e943826af279ff23a526174b9 /sca-java-2.x/trunk/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java
parentd2413f4a139158cc70a996c92b0730e64a239c87 (diff)
Improve jaxb/json databindings and jsonrpc binding to better handle interfaces
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1034820 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
-rw-r--r--sca-java-2.x/trunk/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java30
1 files changed, 28 insertions, 2 deletions
diff --git a/sca-java-2.x/trunk/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java b/sca-java-2.x/trunk/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java
index 13eceb0d9a..9fa9038006 100644
--- a/sca-java-2.x/trunk/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java
+++ b/sca-java-2.x/trunk/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java
@@ -18,6 +18,7 @@
*/
package org.apache.tuscany.sca.databinding.jaxb;
+import java.lang.reflect.Array;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
@@ -363,6 +364,31 @@ public final class JAXBContextHelper {
return cls;
}
}
+
+ private static Class<?> erase(Type type) {
+ if (type instanceof Class) {
+ return (Class<?>)type;
+ }
+ if (type instanceof ParameterizedType) {
+ ParameterizedType pt = (ParameterizedType)type;
+ return (Class<?>)pt.getRawType();
+ }
+ if (type instanceof TypeVariable) {
+ TypeVariable tv = (TypeVariable)type;
+ Type[] bounds = tv.getBounds();
+ return (0 < bounds.length) ? erase(bounds[0]) : Object.class;
+ }
+ if (type instanceof WildcardType) {
+ WildcardType wt = (WildcardType)type;
+ Type[] bounds = wt.getUpperBounds();
+ return (0 < bounds.length) ? erase(bounds[0]) : Object.class;
+ }
+ if (type instanceof GenericArrayType) {
+ GenericArrayType gat = (GenericArrayType)type;
+ return Array.newInstance(erase(gat.getGenericComponentType()), 0).getClass();
+ }
+ throw new IllegalArgumentException("Unknown Type kind: " + type.getClass());
+ }
public static Class<?> getValueType(XmlJavaTypeAdapter adapter) {
if (adapter != null) {
@@ -371,9 +397,9 @@ public final class JAXBContextHelper {
Type superClass = adapterClass.getGenericSuperclass();
while (superClass instanceof ParameterizedType && XmlAdapter.class != ((ParameterizedType)superClass)
.getRawType()) {
- superClass = ((Class<?>)((ParameterizedType)superClass).getRawType()).getGenericSuperclass();
+ superClass = erase(superClass).getGenericSuperclass();
}
- return (Class<?>)((ParameterizedType)superClass).getActualTypeArguments()[0];
+ return erase(((ParameterizedType)superClass).getActualTypeArguments()[0]);
}
}
return null;