diff options
author | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2010-06-26 00:02:46 +0000 |
---|---|---|
committer | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2010-06-26 00:02:46 +0000 |
commit | 8c2da632e20cef7735985bd72c72f68419e788e4 (patch) | |
tree | 03d5d14d8cb5aaa89fa2c9b01eb2689c9e89dc6e /sca-java-2.x/trunk/modules/implementation-java/src | |
parent | 91e796407efd625e37853545415ddcd44acb0fdc (diff) |
Improve property type introspections
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@958152 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x/trunk/modules/implementation-java/src')
3 files changed, 71 insertions, 30 deletions
diff --git a/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractPropertyProcessor.java b/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractPropertyProcessor.java index 180ea3e64d..ff70fb89eb 100644 --- a/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractPropertyProcessor.java +++ b/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractPropertyProcessor.java @@ -21,6 +21,7 @@ package org.apache.tuscany.sca.implementation.java.introspect.impl; import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; import java.lang.reflect.Field; +import java.lang.reflect.GenericArrayType; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; @@ -29,6 +30,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import org.apache.tuscany.sca.assembly.AssemblyFactory; import org.apache.tuscany.sca.assembly.Property; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.implementation.java.IntrospectionException; @@ -37,7 +39,9 @@ import org.apache.tuscany.sca.implementation.java.JavaImplementation; import org.apache.tuscany.sca.implementation.java.JavaParameterImpl; import org.apache.tuscany.sca.implementation.java.introspect.BaseJavaClassVisitor; import org.apache.tuscany.sca.implementation.java.introspect.JavaIntrospectionHelper; -import org.apache.tuscany.sca.interfacedef.util.JavaXMLMapper; +import org.apache.tuscany.sca.interfacedef.DataType; +import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl; +import org.apache.tuscany.sca.interfacedef.util.XMLType; /** * Base class for ImplementationProcessors that handle annotations that add @@ -203,21 +207,45 @@ public abstract class AbstractPropertyProcessor<A extends Annotation> extends Ba protected Property createProperty(String name, JavaElementImpl element) throws IntrospectionException { + Type type = element.getGenericType(); + Class<?> javaType = element.getType(); + + return createProperty(assemblyFactory, name, javaType, type); + + } + + public static Property createProperty(AssemblyFactory assemblyFactory, String name, Class<?> javaClass, Type genericType) { Property property = assemblyFactory.createProperty(); property.setName(name); - - Class<?> javaType = element.getType(); - if (javaType.isArray() || Collection.class.isAssignableFrom(javaType)) { + + if (javaClass.isArray() || Collection.class.isAssignableFrom(javaClass)) { property.setMany(true); - Type type = element.getGenericType(); - if (type instanceof ParameterizedType){ - property.setXSDType(JavaXMLMapper.getXMLType((Class)((ParameterizedType)type).getActualTypeArguments()[0])); + if (javaClass.isArray()) { + Class<?> propType = javaClass.getComponentType(); + Type genericPropType = propType; + if (genericType instanceof GenericArrayType) { + genericPropType = ((GenericArrayType)genericType).getGenericComponentType(); + } + DataType dt = new DataTypeImpl(null, propType, genericPropType, XMLType.UNKNOWN); + property.setDataType(dt); + } else { + if (genericType instanceof ParameterizedType) { + // Collection<BaseType> property; + Type genericPropType = ((ParameterizedType)genericType).getActualTypeArguments()[0]; + Class<?> propType = JavaIntrospectionHelper.getErasure(genericPropType); + DataType dt = new DataTypeImpl(null, propType, genericPropType, XMLType.UNKNOWN); + property.setDataType(dt); + } else { + // Collection property; + DataType dt = new DataTypeImpl(null, Object.class, Object.class, XMLType.UNKNOWN); + property.setDataType(dt); + } } } else { - property.setXSDType(JavaXMLMapper.getXMLType(javaType)); + DataType dt = new DataTypeImpl(null, javaClass, genericType, XMLType.UNKNOWN); + property.setDataType(dt); } return property; - } protected abstract String getName(A annotation); diff --git a/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessor.java b/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessor.java index 4bb775d17b..f5148fd38f 100644 --- a/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessor.java +++ b/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessor.java @@ -24,6 +24,7 @@ import static org.apache.tuscany.sca.implementation.java.introspect.JavaIntrospe import static org.apache.tuscany.sca.implementation.java.introspect.JavaIntrospectionHelper.toPropertyName; import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Member; @@ -55,8 +56,8 @@ import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; import org.apache.tuscany.sca.interfacedef.java.JavaInterface; import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract; import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; -import org.apache.tuscany.sca.interfacedef.util.JavaXMLMapper; import org.oasisopen.sca.annotation.Callback; +import org.oasisopen.sca.annotation.ComponentName; import org.oasisopen.sca.annotation.Context; import org.oasisopen.sca.annotation.Property; import org.oasisopen.sca.annotation.Reference; @@ -138,7 +139,19 @@ public class HeuristicPojoProcessor extends BaseJavaClassVisitor { throw new IntrospectionException(e); } } + + private static boolean isAnnotatedWithSCA(AnnotatedElement element) { + for (Annotation a : element.getAnnotations()) { + if (isSCAAnnotation(a)) { + return true; + } + } + return false; + } + private static boolean isSCAAnnotation(Annotation a) { + return a.annotationType().getName().startsWith("org.oasisopen.sca.annotation."); + } private <T> void calcPropRefs(Set<Method> methods, List<org.apache.tuscany.sca.assembly.Service> services, @@ -152,7 +165,7 @@ public class HeuristicPojoProcessor extends BaseJavaClassVisitor { if (!isPublicSetter(method)) { continue; } - if (method.isAnnotationPresent(Callback.class) || method.isAnnotationPresent(Context.class)) { + if (isAnnotatedWithSCA(method)) { // Add the property name as others others.add(toPropertyName(method.getName())); continue; @@ -169,7 +182,7 @@ public class HeuristicPojoProcessor extends BaseJavaClassVisitor { type.getReferences().add(createReference(name, param)); type.getReferenceMembers().put(name, new JavaElementImpl(method, 0)); } else { - type.getProperties().add(createProperty(name, param)); + type.getProperties().add(createProperty(name, param, genericType)); type.getPropertyMembers().put(name, new JavaElementImpl(method, 0)); } } @@ -180,12 +193,14 @@ public class HeuristicPojoProcessor extends BaseJavaClassVisitor { if (!isProtectedSetter(method)) { continue; } - if (method.isAnnotationPresent(Callback.class) || method.isAnnotationPresent(Context.class)) { + if (isAnnotatedWithSCA(method)) { // Add the property name as others others.add(toPropertyName(method.getName())); continue; } Class<?> param = method.getParameterTypes()[0]; + Type paramType = method.getGenericParameterTypes()[0]; + String name = toPropertyName(method.getName()); setters.add(name); // avoid duplicate property or ref names @@ -196,7 +211,7 @@ public class HeuristicPojoProcessor extends BaseJavaClassVisitor { } } else { if (!type.getPropertyMembers().containsKey(name)) { - type.getProperties().add(createProperty(name, param)); + type.getProperties().add(createProperty(name, param, paramType)); type.getPropertyMembers().put(name, new JavaElementImpl(method, 0)); } } @@ -207,7 +222,7 @@ public class HeuristicPojoProcessor extends BaseJavaClassVisitor { // for the same name Set<Field> fields = getAllPublicAndProtectedFields(clazz, false); for (Field field : fields) { - if (field.isAnnotationPresent(Callback.class) || field.isAnnotationPresent(Context.class)) { + if (isAnnotatedWithSCA(field)) { continue; } if (setters.contains(field.getName()) || others.contains(field.getName())) { @@ -215,6 +230,7 @@ public class HeuristicPojoProcessor extends BaseJavaClassVisitor { } String name = field.getName(); Class<?> paramType = field.getType(); + Type genericType = field.getGenericType(); if (isReferenceType(paramType, field.getGenericType())) { if (!type.getReferenceMembers().containsKey(name)) { type.getReferences().add(createReference(name, paramType)); @@ -222,7 +238,7 @@ public class HeuristicPojoProcessor extends BaseJavaClassVisitor { } } else { if (!type.getPropertyMembers().containsKey(name)) { - type.getProperties().add(createProperty(name, paramType)); + type.getProperties().add(createProperty(name, paramType, genericType)); type.getPropertyMembers().put(name, new JavaElementImpl(field)); } } @@ -362,7 +378,7 @@ public class HeuristicPojoProcessor extends BaseJavaClassVisitor { p.setClassifer(Reference.class); type.getReferenceMembers().put(name, p); } else { - type.getProperties().add(createProperty(name, p.getType())); + type.getProperties().add(createProperty(name, p.getType(), p.getGenericType())); p.setClassifer(Property.class); type.getPropertyMembers().put(name, p); } @@ -452,11 +468,8 @@ public class HeuristicPojoProcessor extends BaseJavaClassVisitor { * @param name the property name * @param paramType the property type */ - private org.apache.tuscany.sca.assembly.Property createProperty(String name, Class<?> paramType) { - org.apache.tuscany.sca.assembly.Property property = assemblyFactory.createProperty(); - property.setName(name); - property.setXSDType(JavaXMLMapper.getXMLType(paramType)); - return property; + private org.apache.tuscany.sca.assembly.Property createProperty(String name, Class<?> javaClass, Type genericType) { + return AbstractPropertyProcessor.createProperty(assemblyFactory, name, javaClass, genericType); } private org.apache.tuscany.sca.assembly.Reference createReference(String name, Class<?> paramType) @@ -582,6 +595,7 @@ public class HeuristicPojoProcessor extends BaseJavaClassVisitor { * The name of the reference or of the property is derived from the * name found on the setter method or on the field. */ + // FIXME: [rfeng] What if it's a collection of references? private static boolean isReferenceType(Class<?> cls, Type genericType) { Class<?> baseType = JavaIntrospectionHelper.getBaseType(cls, genericType); return baseType.isInterface() && baseType.isAnnotationPresent(Remotable.class); @@ -635,9 +649,7 @@ public class HeuristicPojoProcessor extends BaseJavaClassVisitor { */ private static boolean isAnnotated(JavaParameterImpl parameter) { for (Annotation annotation : parameter.getAnnotations()) { - Class<? extends Annotation> annotType = annotation.annotationType(); - if (annotType.equals(Property.class) || annotType.equals(Reference.class) - || annotType.equals(Resource.class)) { + if (isSCAAnnotation(annotation)) { return true; } } @@ -668,8 +680,11 @@ public class HeuristicPojoProcessor extends BaseJavaClassVisitor { for (Annotation[] annotations : annots) { for (Annotation annotation : annotations) { Class<? extends Annotation> annotType = annotation.annotationType(); - if (annotType.equals(Property.class) || annotType.equals(Reference.class) - || annotType.equals(Resource.class)) { + if (annotType == Property.class || annotType == Reference.class + || annotType == Resource.class + || annotType == ComponentName.class + || annotType == Context.class + || annotType == Callback.class) { return true; } } diff --git a/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessorTestCase.java b/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessorTestCase.java index ede71a90dd..a850f86995 100644 --- a/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessorTestCase.java +++ b/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessorTestCase.java @@ -27,7 +27,6 @@ import java.util.Collection; import java.util.List; import javax.jws.WebService; -import javax.xml.namespace.QName; import org.apache.tuscany.sca.assembly.DefaultAssemblyFactory; import org.apache.tuscany.sca.core.DefaultExtensionPointRegistry; @@ -39,7 +38,6 @@ import org.apache.tuscany.sca.implementation.java.JavaElementImpl; import org.apache.tuscany.sca.implementation.java.JavaImplementation; import org.apache.tuscany.sca.implementation.java.JavaImplementationFactory; import org.apache.tuscany.sca.interfacedef.java.DefaultJavaInterfaceFactory; -import org.apache.tuscany.sca.interfacedef.util.JavaXMLMapper; import org.junit.Test; import org.oasisopen.sca.annotation.Property; import org.oasisopen.sca.annotation.Reference; @@ -239,7 +237,7 @@ public class HeuristicPojoProcessorTestCase extends AbstractProcessorTest { processor.visitEnd(PropertyIntTypeOnConstructor.class, type); org.apache.tuscany.sca.assembly.Property foo = ModelHelper.getProperty(type, "foo"); assertEquals(int.class, type.getPropertyMembers().get("foo").getType()); - assertEquals(new QName(JavaXMLMapper.URI_2001_SCHEMA_XSD, "int"), foo.getXSDType()); + // assertEquals(new QName(JavaXMLMapper.URI_2001_SCHEMA_XSD, "int"), foo.getXSDType()); } /** |