summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/trunk/modules/implementation-java
diff options
context:
space:
mode:
authorrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2010-06-26 00:02:46 +0000
committerrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2010-06-26 00:02:46 +0000
commit8c2da632e20cef7735985bd72c72f68419e788e4 (patch)
tree03d5d14d8cb5aaa89fa2c9b01eb2689c9e89dc6e /sca-java-2.x/trunk/modules/implementation-java
parent91e796407efd625e37853545415ddcd44acb0fdc (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')
-rw-r--r--sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF1
-rw-r--r--sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractPropertyProcessor.java46
-rw-r--r--sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessor.java51
-rw-r--r--sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessorTestCase.java4
4 files changed, 72 insertions, 30 deletions
diff --git a/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF b/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF
index 44f27a2c5f..7850a30f48 100644
--- a/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF
+++ b/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF
@@ -32,6 +32,7 @@ Import-Package: javax.jws,
org.apache.tuscany.sca.implementation.java;version="2.0.0",
org.apache.tuscany.sca.implementation.java.introspect;version="2.0.0",
org.apache.tuscany.sca.interfacedef;version="2.0.0",
+ org.apache.tuscany.sca.interfacedef.impl;version="2.0.0",
org.apache.tuscany.sca.interfacedef.java;version="2.0.0",
org.apache.tuscany.sca.interfacedef.java.impl;version="2.0.0";resolution:=optional,
org.apache.tuscany.sca.interfacedef.util;version="2.0.0",
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());
}
/**