Author: rfeng
Date: Sat Jun 26 00:02:46 2010
New Revision: 958152
URL: http://svn.apache.org/viewvc?rev=958152&view=rev
Log:
Improve property type introspections
Modified:
tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeProcessor.java
tuscany/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/databinding/PropertyDataTypeProcessor.java
tuscany/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF
tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractPropertyProcessor.java
tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessor.java
tuscany/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessorTestCase.java
Modified:
tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeProcessor.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeProcessor.java?rev=958152&r1=958151&r2=958152&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeProcessor.java
(original)
+++
tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeProcessor.java
Sat Jun 26 00:02:46 2010
@@ -29,6 +29,7 @@ import static org.apache.tuscany.sca.ass
import static org.apache.tuscany.sca.assembly.xml.Constants.COMPOSITE;
import static org.apache.tuscany.sca.assembly.xml.Constants.COMPOSITE_QNAME;
import static org.apache.tuscany.sca.assembly.xml.Constants.ELEMENT;
+import static org.apache.tuscany.sca.assembly.xml.Constants.EXTENSION_QNAME;
import static org.apache.tuscany.sca.assembly.xml.Constants.FILE;
import static
org.apache.tuscany.sca.assembly.xml.Constants.IMPLEMENTATION_COMPOSITE;
import static
org.apache.tuscany.sca.assembly.xml.Constants.IMPLEMENTATION_COMPOSITE_QNAME;
@@ -59,7 +60,6 @@ import static org.apache.tuscany.sca.ass
import static org.apache.tuscany.sca.assembly.xml.Constants.WIRE;
import static org.apache.tuscany.sca.assembly.xml.Constants.WIRED_BY_IMPL;
import static org.apache.tuscany.sca.assembly.xml.Constants.WIRE_QNAME;
-import static org.apache.tuscany.sca.assembly.xml.Constants.EXTENSION_QNAME;
import java.util.ArrayList;
import java.util.List;
@@ -1121,7 +1121,8 @@ public class CompositeProcessor extends
XSDefinition resolved =
contribution.getModelResolver().resolveModel(XSDefinition.class, xsdDefinition,
context);
if (resolved == null || resolved.isUnresolved()){
// raise an error
- error(context.getMonitor(), "PropertyTypeNotFound",
property, property.getXSDType().toString(), property.getName(), parentName);
+ // [rfeng] The XSD might be not available if we use JAXB
annotated classes, report it as a warning for now
+ warning(context.getMonitor(), "PropertyTypeNotFound",
property, property.getXSDType().toString(), property.getName(), parentName);
} else {
// store the schema in the property
property.setXSDDefinition(resolved);
Modified:
tuscany/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/databinding/PropertyDataTypeProcessor.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/databinding/PropertyDataTypeProcessor.java?rev=958152&r1=958151&r2=958152&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/databinding/PropertyDataTypeProcessor.java
(original)
+++
tuscany/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/databinding/PropertyDataTypeProcessor.java
Sat Jun 26 00:02:46 2010
@@ -29,7 +29,6 @@ import org.apache.tuscany.sca.implementa
import
org.apache.tuscany.sca.implementation.java.introspect.BaseJavaClassVisitor;
import
org.apache.tuscany.sca.implementation.java.introspect.JavaIntrospectionHelper;
import org.apache.tuscany.sca.interfacedef.DataType;
-import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
import org.apache.tuscany.sca.interfacedef.util.JavaXMLMapper;
import org.apache.tuscany.sca.interfacedef.util.XMLType;
@@ -53,12 +52,10 @@ public class PropertyDataTypeProcessor e
* @param javaElement
* @return
*/
- private DataType<?> introspect(Property property, JavaElementImpl
javaElement) {
- XMLType xmlType = new XMLType(property.getXSDElement(),
property.getXSDType());
- DataType<XMLType> dt =
- new DataTypeImpl<XMLType>(null, javaElement.getType(),
javaElement.getGenericType(), xmlType);
- mediator.getDataBindings().introspectType(dt, null);
- return dt;
+ private void introspect(Property property, JavaElementImpl javaElement) {
+ // XMLType xmlType = new XMLType(property.getXSDElement(),
property.getXSDType());
+ // property.getDataType().setLogical(xmlType);
+ mediator.getDataBindings().introspectType(property.getDataType(),
null);
}
@Override
@@ -66,8 +63,8 @@ public class PropertyDataTypeProcessor e
for (Property property : type.getProperties()) {
String name = property.getName();
JavaElementImpl element = type.getPropertyMembers().get(name);
- DataType dt = introspect(property, element);
- property.setDataType(dt);
+ introspect(property, element);
+ DataType dt = property.getDataType();
if (dt.getLogical() instanceof XMLType) {
XMLType xmlType = (XMLType)dt.getLogical();
property.setXSDType(xmlType.getTypeName());
Modified:
tuscany/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF?rev=958152&r1=958151&r2=958152&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF
(original)
+++ tuscany/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF
Sat Jun 26 00:02:46 2010
@@ -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",
Modified:
tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractPropertyProcessor.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractPropertyProcessor.java?rev=958152&r1=958151&r2=958152&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractPropertyProcessor.java
(original)
+++
tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/AbstractPropertyProcessor.java
Sat Jun 26 00:02:46 2010
@@ -21,6 +21,7 @@ package org.apache.tuscany.sca.implement
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.implementa
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 AbstractPropertyPr
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);
Modified:
tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessor.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessor.java?rev=958152&r1=958151&r2=958152&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessor.java
(original)
+++
tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessor.java
Sat Jun 26 00:02:46 2010
@@ -24,6 +24,7 @@ import static org.apache.tuscany.sca.imp
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.interfaced
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 exte
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 exte
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 exte
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 exte
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 exte
}
} 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 exte
// 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 exte
}
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 exte
}
} 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 exte
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 exte
* @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 exte
* 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 exte
*/
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 exte
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;
}
}
Modified:
tuscany/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessorTestCase.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessorTestCase.java?rev=958152&r1=958151&r2=958152&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessorTestCase.java
(original)
+++
tuscany/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/HeuristicPojoProcessorTestCase.java
Sat Jun 26 00:02:46 2010
@@ -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.implementa
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 HeuristicPojoProcessorTestC
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());
}
/**