From f29a66c24801c7422a7bd8acf6770c74dbfb4188 Mon Sep 17 00:00:00 2001 From: antelder Date: Mon, 8 Dec 2008 10:23:04 +0000 Subject: TUSCANY-2681: Apply fix from Rodolfo Dias to fix When a Component class implements an interfaces that extends other interface and use generics occur the error git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@724302 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/impl/JavaInterfaceIntrospectorImpl.java | 14 ++++- .../interfacedef/java/impl/JavaInterfaceUtil.java | 64 ++++++++++++++++++++-- 2 files changed, 69 insertions(+), 9 deletions(-) (limited to 'branches') diff --git a/branches/sca-java-1.x/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java b/branches/sca-java-1.x/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java index b1198824fa..126b435989 100644 --- a/branches/sca-java-1.x/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java +++ b/branches/sca-java-1.x/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java @@ -142,15 +142,23 @@ public class JavaInterfaceIntrospectorImpl { return rawType; } + private void collectGenericInterfaces(Class clazz, Set genericInterfaces) { + for (Type t : clazz.getGenericInterfaces()) { + genericInterfaces.add(t); + } + Class[] interfaces = clazz.getInterfaces(); + for(Class c : interfaces){ + collectGenericInterfaces(c, genericInterfaces); + } + } + private List getOperations(Class clazz, boolean remotable, boolean conversational, String ns) throws InvalidInterfaceException { Set genericInterfaces = new HashSet(); - for (Type t : clazz.getGenericInterfaces()) { - genericInterfaces.add(t); - } + collectGenericInterfaces(clazz, genericInterfaces); Map typeBindings = new HashMap(); for (Type genericInterface : genericInterfaces) { if (genericInterface instanceof ParameterizedType) { diff --git a/branches/sca-java-1.x/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceUtil.java b/branches/sca-java-1.x/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceUtil.java index 2a9e3c5329..2782ffd8db 100644 --- a/branches/sca-java-1.x/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceUtil.java +++ b/branches/sca-java-1.x/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceUtil.java @@ -19,7 +19,9 @@ package org.apache.tuscany.sca.interfacedef.java.impl; import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -96,15 +98,65 @@ public final class JavaInterfaceUtil { List types = inputType.getLogical(); Class[] javaTypes = new Class[types.size()]; for (int i = 0; i < javaTypes.length; i++) { - Type physical = types.get(i).getPhysical(); - if (physical instanceof Class) { - javaTypes[i] = (Class)physical; - } else { - throw new UnsupportedOperationException(); - } + DataType type = types.get(i); + javaTypes[i] = getClassOfDataType(type); } return javaTypes; } + + /** + * Get the Java Type that represent the DataType informed + * When dataType.getGenericType() is GenericArrayType or WildcardType the Physical type is used, + * because the physical type have the correct information about this DataType. + * @param dataType DataType + * @return The Class that represent the DataType + */ + private static Class getClassOfDataType(DataType dataType){ + Type generic = dataType.getGenericType(); + boolean isGeneric = (generic != null + && generic != dataType.getPhysical() + && (generic instanceof TypeVariable + || generic instanceof ParameterizedType)); + Class javaType = null; + if (isGeneric) { + javaType = getClassOfSimpleGeneric(generic); + }else { + Type physical = dataType.getPhysical(); + javaType = getClassOfPhysical(physical); + } + if (javaType == null) { + throw new UnsupportedOperationException(); + } + return javaType; + } + + /** + * Return Class of Type Generic informed + * @param generic The Generic Type + * @return The Class that represent the Generic + */ + private static Class getClassOfSimpleGeneric(Type generic){ + Class javaType = null; + if (generic instanceof TypeVariable){ + javaType = (Class)Object.class; + } else if (generic instanceof ParameterizedType){ + javaType = (Class)((ParameterizedType)generic).getRawType(); + } + return javaType; + } + + /** + * Return Class of Type Physical informed + * @param physical The Physical + * @return The Class that represent the Physical + */ + private static Class getClassOfPhysical(Type physical){ + Class javaType = null; + if (physical instanceof Class) { + javaType = (Class)physical; + } + return javaType; + } /** * Searches a collection of operations for a match against the given method -- cgit v1.2.3