From efccdd821b68280ee3b73c8ef5cda121bc27f620 Mon Sep 17 00:00:00 2001 From: rfeng Date: Sat, 13 Nov 2010 17:42:16 +0000 Subject: 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 --- .../sca/databinding/jaxb/JAXBContextHelper.java | 30 ++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'sca-java-2.x/trunk/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding') 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; -- cgit v1.2.3