You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2007/03/18 01:47:48 UTC
svn commit: r519491 - in
/incubator/tuscany/java/sca/services/databinding/databinding-jaxb: ./
src/main/java/org/apache/tuscany/databinding/jaxb/
src/main/resources/META-INF/sca/
src/test/java/org/apache/tuscany/databinding/jaxb/ src/test/java/org/apac...
Author: rfeng
Date: Sat Mar 17 17:47:47 2007
New Revision: 519491
URL: http://svn.apache.org/viewvc?view=rev&rev=519491
Log:
Merge databinding-jaxb from sca-java-integration branch
Added:
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandler.java
- copied, changed from r518390, incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandler.java
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXWSJavaInterfaceProcessor.java
- copied, changed from r518390, incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXWSJavaInterfaceProcessor.java
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/resources/META-INF/sca/extension.composite
- copied unchanged from r518390, incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/resources/META-INF/sca/extension.composite
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandlerTestCase.java
- copied, changed from r518390, incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandlerTestCase.java
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java
- copied, changed from r518390, incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/fault/
- copied from r518390, incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/fault/
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/fault/InvalidSymbolFault.java
- copied unchanged from r518390, incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/fault/InvalidSymbolFault.java
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/fault/InvalidSymbolFault_Exception.java
- copied unchanged from r518390, incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/fault/InvalidSymbolFault_Exception.java
Modified:
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/pom.xml
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXB2Node.java
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.java
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBDataBinding.java
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBDataBindingTestCase.java
Modified: incubator/tuscany/java/sca/services/databinding/databinding-jaxb/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-jaxb/pom.xml?view=diff&rev=519491&r1=519490&r2=519491
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-jaxb/pom.xml (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-jaxb/pom.xml Sat Mar 17 17:47:47 2007
@@ -21,7 +21,7 @@
<parent>
<groupId>org.apache.tuscany.sca.services.databinding</groupId>
<artifactId>parent</artifactId>
- <version>1.0-incubator-SNAPSHOT</version>
+ <version>2.0-alpha2-incubating-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>databinding-jaxb</artifactId>
@@ -54,8 +54,8 @@
<dependencies>
<dependency>
<groupId>org.apache.tuscany.sca.kernel</groupId>
- <artifactId>tuscany-spi</artifactId>
- <version>1.0-incubator-SNAPSHOT</version>
+ <artifactId>tuscany-databinding</artifactId>
+ <version>2.0-alpha2-incubating-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
@@ -65,6 +65,13 @@
<scope>compile</scope>
</dependency>
<dependency>
+ <groupId>javax.xml.ws</groupId>
+ <artifactId>jaxws-api</artifactId>
+ <!-- Set to 2.1 to make jaxws-maven-plugin happy -->
+ <version>2.1</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.0.5</version>
@@ -81,6 +88,7 @@
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
+ <version>4.2</version>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
Modified: incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXB2Node.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXB2Node.java?view=diff&rev=519491&r1=519490&r2=519491
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXB2Node.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXB2Node.java Sat Mar 17 17:47:47 2007
@@ -19,6 +19,7 @@
package org.apache.tuscany.databinding.jaxb;
import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import org.apache.tuscany.spi.databinding.PullTransformer;
@@ -44,8 +45,8 @@
// FIXME: The default Marshaller doesn't support
// marshaller.getNode()
Document document = DOMHelper.newDocument();
- marshaller.marshal(JAXBContextHelper.createJAXBElement(tContext.getSourceDataType(), source),
- document);
+ JAXBElement<?> jaxbElement = JAXBContextHelper.createJAXBElement(tContext.getSourceDataType(), source);
+ marshaller.marshal(jaxbElement, document);
return document;
} catch (Exception e) {
throw new TransformationException(e);
Modified: incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.java?view=diff&rev=519491&r1=519490&r2=519491
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.java Sat Mar 17 17:47:47 2007
@@ -18,21 +18,26 @@
*/
package org.apache.tuscany.databinding.jaxb;
+import java.beans.Introspector;
+import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
+import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSchema;
+import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.apache.tuscany.spi.databinding.TransformationContext;
import org.apache.tuscany.spi.databinding.TransformationException;
import org.apache.tuscany.spi.model.DataType;
import org.apache.tuscany.spi.model.Operation;
+import org.apache.tuscany.spi.model.XMLType;
public class JAXBContextHelper {
- private static final QName JAXB_ELEMENT = new QName("http://jaxb", "element");
// TODO: Do we need to set them for source and target?
public static final String JAXB_CLASSES = "jaxb.classes";
@@ -41,8 +46,7 @@
private JAXBContextHelper() {
}
- public static JAXBContext createJAXBContext(TransformationContext tContext, boolean source)
- throws JAXBException {
+ public static JAXBContext createJAXBContext(TransformationContext tContext, boolean source) throws JAXBException {
if (tContext == null)
throw new TransformationException("JAXB context is not set for the transformation.");
@@ -83,28 +87,106 @@
if (value instanceof JAXBElement) {
return (JAXBElement)value;
} else {
+ Class type = (Class)dataType.getPhysical();
Object logical = dataType.getLogical();
- if (!(logical instanceof QName)) {
- logical = JAXB_ELEMENT;
+ QName elementName = JAXBDataBinding.ROOT_ELEMENT;
+ if (logical instanceof XMLType) {
+ XMLType xmlType = (XMLType)logical;
+ QName element = xmlType.getElementName();
+ if (element != null) {
+ elementName = element;
+ } else {
+ /**
+ * Set the declared type to Object.class so that xsi:type
+ * will be produced
+ */
+ type = Object.class;
+ }
+ } else {
+ type = Object.class;
}
- return new JAXBElement((QName)logical, (Class)dataType.getPhysical(), value);
+ return new JAXBElement(elementName, type, value);
}
}
@SuppressWarnings("unchecked")
public static Object createReturnValue(DataType dataType, Object value) {
- Class<?> cls = (Class)dataType.getPhysical();
- XmlRootElement element = cls.getAnnotation(XmlRootElement.class);
- if (element == null) {
+ Class<?> cls = getJavaType(dataType);
+ if (cls == JAXBElement.class) {
+ return createJAXBElement(dataType, value);
+ } else {
if (value instanceof JAXBElement) {
return ((JAXBElement)value).getValue();
} else {
return value;
}
+ }
+ }
+
+ public static Class<?> getJavaType(DataType<?> dataType) {
+ if (dataType == null) {
+ return null;
+ }
+ Type type = dataType.getPhysical();
+ if (type instanceof Class) {
+ Class cls = (Class)type;
+ if (JAXBElement.class.isAssignableFrom(cls)) {
+ return null;
+ } else {
+ return cls;
+ }
+ } else if (type instanceof ParameterizedType) {
+ ParameterizedType pType = (ParameterizedType)type;
+ return (Class)pType.getRawType();
+ }
+ return null;
+ }
+
+ public static XMLType getXmlTypeName(Class<?> javaType) {
+ String namespace = null;
+ String name = null;
+ Package pkg = javaType.getPackage();
+ if (pkg != null) {
+ XmlSchema schema = pkg.getAnnotation(XmlSchema.class);
+ if (schema != null) {
+ namespace = schema.namespace();
+ }
+ }
+ XmlType type = javaType.getAnnotation(XmlType.class);
+ if (type != null) {
+ String typeNamespace = type.namespace();
+ String typeName = type.name();
+
+ if (typeNamespace.equals("##default") && typeName.equals("")) {
+ XmlRootElement rootElement = javaType.getAnnotation(XmlRootElement.class);
+ if (rootElement != null) {
+ namespace = rootElement.namespace();
+ } else {
+ // FIXME: The namespace should be from the referencing
+ // property
+ namespace = null;
+ }
+ } else if (typeNamespace.equals("##default")) {
+ // namespace is from the package
+ } else {
+ namespace = typeNamespace;
+ }
+
+ if (typeName.equals("##default")) {
+ name = Introspector.decapitalize(javaType.getSimpleName());
+ } else {
+ name = typeName;
+ }
} else {
- QName root = new QName(element.namespace(), element.name());
- return new JAXBElement(root, (Class)dataType.getPhysical(), value);
+ XmlEnum xmlEnum = javaType.getAnnotation(XmlEnum.class);
+ if (xmlEnum != null) {
+ name = Introspector.decapitalize(javaType.getSimpleName());
+ }
+ }
+ if (name == null) {
+ return null;
}
+ return new XMLType(null, new QName(namespace, name));
}
}
Modified: incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBDataBinding.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBDataBinding.java?view=diff&rev=519491&r1=519490&r2=519491
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBDataBinding.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBDataBinding.java Sat Mar 17 17:47:47 2007
@@ -19,91 +19,96 @@
package org.apache.tuscany.databinding.jaxb;
-import java.beans.Introspector;
+import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
+import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
+import org.apache.tuscany.spi.databinding.ExceptionHandler;
+import org.apache.tuscany.spi.databinding.extension.DOMHelper;
import org.apache.tuscany.spi.databinding.extension.DataBindingExtension;
import org.apache.tuscany.spi.model.DataType;
+import org.apache.tuscany.spi.model.XMLType;
+import org.w3c.dom.Document;
/**
* JAXB DataBinding
*/
public class JAXBDataBinding extends DataBindingExtension {
-
public static final String NAME = JAXBElement.class.getName();
+ public static final String[] ALIASES = new String[] {"jaxb"};
+
+ public static final String ROOT_NAMESPACE = "http://tuscany.apache.org/xmlns/sca/databinding/jaxb/1.0";
+ public static final QName ROOT_ELEMENT = new QName(ROOT_NAMESPACE, "root");
+
+ public JAXBDataBinding() {
+ super(NAME, ALIASES, JAXBElement.class);
+ }
@Override
- public DataType introspect(Class<?> javaType) {
+ public boolean introspect(DataType dataType, Annotation[] annotations) {
+ Object physical = dataType.getPhysical();
+ if (!(physical instanceof Class)) {
+ return false;
+ }
+ Class javaType = (Class)physical;
if (JAXBElement.class.isAssignableFrom(javaType)) {
Type type = javaType.getGenericSuperclass();
if (type instanceof ParameterizedType) {
- ParameterizedType parameterizedType = ((ParameterizedType) type);
+ ParameterizedType parameterizedType = ((ParameterizedType)type);
Type rawType = parameterizedType.getRawType();
if (rawType == JAXBElement.class) {
Type actualType = parameterizedType.getActualTypeArguments()[0];
if (actualType instanceof Class) {
- return introspect((Class<?>) actualType);
+ XMLType xmlType = JAXBContextHelper.getXmlTypeName((Class)actualType);
+ dataType.setLogical(xmlType);
+ dataType.setDataBinding(getName());
+ return true;
}
}
}
- return new DataType<QName>(getName(), javaType, null);
+ dataType.setLogical(XMLType.UNKNOWN);
+ dataType.setDataBinding(getName());
+ return true;
}
- String namespace = null;
- String name = null;
- Package pkg = javaType.getPackage();
- if (pkg != null) {
- XmlSchema schema = pkg.getAnnotation(XmlSchema.class);
- namespace = schema.namespace();
+ XMLType xmlType = JAXBContextHelper.getXmlTypeName(javaType);
+ if (xmlType == null) {
+ return false;
}
- XmlType type = javaType.getAnnotation(XmlType.class);
- if (type != null) {
- String typeNamespace = type.namespace();
- String typeName = type.name();
-
- if (typeNamespace.equals("##default") && typeName.equals("")) {
- XmlRootElement rootElement = javaType.getAnnotation(XmlRootElement.class);
- if (rootElement != null) {
- namespace = rootElement.namespace();
- } else {
- // FIXME: The namespace should be from the referencing property
- namespace = null;
- }
- } else if (typeNamespace.equals("##default")) {
- // namespace is from the package
- } else {
- namespace = typeNamespace;
- }
+ dataType.setLogical(xmlType);
+ dataType.setDataBinding(getName());
+ return true;
+ }
- if (typeName.equals("##default")) {
- name = Introspector.decapitalize(javaType.getSimpleName());
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object copy(Object arg) {
+ try {
+ boolean isElement = false;
+ Class cls = arg.getClass();
+ if (arg instanceof JAXBElement) {
+ isElement = true;
+ cls = ((JAXBElement)arg).getDeclaredType();
} else {
- name = typeName;
- }
- } else {
- XmlEnum xmlEnum = javaType.getAnnotation(XmlEnum.class);
- if (xmlEnum != null) {
- name = Introspector.decapitalize(javaType.getSimpleName());
+ arg = new JAXBElement(ROOT_ELEMENT, Object.class, arg);
}
+ JAXBContext context = JAXBContext.newInstance(cls);
+ Document doc = DOMHelper.newDocument();
+ context.createMarshaller().marshal(arg, doc);
+ JAXBElement<?> element = context.createUnmarshaller().unmarshal(doc, cls);
+ return isElement ? element : element.getValue();
+ } catch (Exception e) {
+ throw new IllegalArgumentException(e);
}
- if (namespace == null && name == null) {
- return null;
- }
- QName xmlType = new QName(namespace, name);
- DataType<QName> dataType = new DataType<QName>(getName(), javaType, xmlType);
- return dataType;
}
- public JAXBDataBinding() {
- super(NAME, JAXBElement.class);
+ @Override
+ public ExceptionHandler getExceptionHandler() {
+ return new JAXBExceptionHandler();
}
}
Copied: incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandler.java (from r518390, incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandler.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandler.java?view=diff&rev=519491&p1=incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandler.java&r1=518390&p2=incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandler.java&r2=519491
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandler.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandler.java Sat Mar 17 17:47:47 2007
@@ -26,8 +26,8 @@
import javax.xml.ws.WebFault;
import org.apache.tuscany.spi.databinding.ExceptionHandler;
-import org.apache.tuscany.spi.idl.XMLType;
import org.apache.tuscany.spi.model.DataType;
+import org.apache.tuscany.spi.model.XMLType;
/**
* JAXB implementation of ExceptionHandler
Modified: incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java?view=diff&rev=519491&r1=519490&r2=519491
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java Sat Mar 17 17:47:47 2007
@@ -19,19 +19,20 @@
package org.apache.tuscany.databinding.jaxb;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.apache.tuscany.spi.databinding.TransformationContext;
import org.apache.tuscany.spi.databinding.TransformationException;
import org.apache.tuscany.spi.databinding.WrapperHandler;
-import org.apache.tuscany.spi.idl.ElementInfo;
+import org.apache.tuscany.spi.model.ElementInfo;
/**
* JAXB WrapperHandler implementation
@@ -40,9 +41,14 @@
public JAXBElement<?> create(ElementInfo element, TransformationContext context) {
try {
+ // FIXME: How do we map the global element to a factory?
String packageName = null;
String factoryClassName = packageName + ".ObjectFactory";
- Class<?> factoryClass = Class.forName(factoryClassName, true, context.getClassLoader());
+ ClassLoader classLoader = context != null ? context.getClassLoader() : null;
+ if (classLoader == null) {
+ classLoader = Thread.currentThread().getContextClassLoader();
+ }
+ Class<?> factoryClass = Class.forName(factoryClassName, true, classLoader);
assert factoryClass.isAnnotationPresent(XmlRegistry.class);
Object factory = factoryClass.newInstance();
QName elementName = element.getQName();
@@ -58,7 +64,7 @@
if (method != null) {
Class typeClass = method.getParameterTypes()[0];
Object value = typeClass.newInstance();
- return (JAXBElement<?>) method.invoke(factory, new Object[] { value });
+ return (JAXBElement<?>)method.invoke(factory, new Object[] {value});
} else {
throw new TransformationException("ObjectFactory cannot be resolved.");
}
@@ -67,36 +73,51 @@
}
}
- public Object getChild(JAXBElement<?> wrapper, int i, ElementInfo element) {
+ public void setChild(JAXBElement<?> wrapper, int i, ElementInfo childElement, Object value) {
+ Object wrapperValue = wrapper.getValue();
+ Class<?> wrapperClass = wrapperValue.getClass();
+
+ XmlType xmlType = wrapperClass.getAnnotation(XmlType.class);
+ String[] properties = xmlType.propOrder();
+ String property = properties[i];
+
try {
- Object value = wrapper.getValue();
- PropertyDescriptor descriptors[] =
- Introspector.getBeanInfo(wrapper.getDeclaredType()).getPropertyDescriptors();
- for (PropertyDescriptor d : descriptors) {
- if (d.getName().equals(element.getQName().getLocalPart())) {
- return d.getReadMethod().invoke(value, new Object[] {});
+ for (Method m : wrapperClass.getMethods()) {
+ if (m.getName().equals("set" + capitalize(property))) {
+ m.invoke(wrapperValue, new Object[] {value});
+ return;
}
}
- return null;
- } catch (Exception e) {
+ } catch (Throwable e) {
throw new TransformationException(e);
}
}
- public void setChild(JAXBElement<?> wrapper, int i, ElementInfo childElement, Object value) {
- try {
- Object wrapperValue = wrapper.getValue();
- PropertyDescriptor descriptors[] =
- Introspector.getBeanInfo(wrapper.getDeclaredType()).getPropertyDescriptors();
- for (PropertyDescriptor d : descriptors) {
- if (d.getName().equals(childElement.getQName().getLocalPart())) {
- d.getWriteMethod().invoke(wrapperValue, new Object[] { value });
- break;
- }
+ private static String capitalize(String name) {
+ char first = Character.toUpperCase(name.charAt(0));
+ return first + name.substring(1);
+ }
+
+ /**
+ * @see org.apache.tuscany.spi.databinding.WrapperHandler#getChildren(java.lang.Object)
+ */
+ public List getChildren(JAXBElement<?> wrapper) {
+ Object wrapperValue = wrapper.getValue();
+ Class<?> wrapperClass = wrapperValue.getClass();
+
+ XmlType xmlType = wrapperClass.getAnnotation(XmlType.class);
+ String[] properties = xmlType.propOrder();
+ List<Object> elements = new ArrayList<Object>();
+ for (String p : properties) {
+ try {
+ Method method = wrapperClass.getMethod("get" + capitalize(p), (Class[])null);
+ Object value = method.invoke(wrapperValue, (Object[])null);
+ elements.add(value);
+ } catch (Throwable e) {
+ throw new TransformationException(e);
}
- } catch (Exception e) {
- throw new TransformationException(e);
}
+ return elements;
}
}
Copied: incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXWSJavaInterfaceProcessor.java (from r518390, incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXWSJavaInterfaceProcessor.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXWSJavaInterfaceProcessor.java?view=diff&rev=519491&p1=incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXWSJavaInterfaceProcessor.java&r1=518390&p2=incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXWSJavaInterfaceProcessor.java&r2=519491
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXWSJavaInterfaceProcessor.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXWSJavaInterfaceProcessor.java Sat Mar 17 17:47:47 2007
@@ -29,10 +29,10 @@
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
-import org.apache.tuscany.spi.idl.ElementInfo;
import org.apache.tuscany.spi.idl.InvalidServiceContractException;
import org.apache.tuscany.spi.idl.java.JavaInterfaceProcessorExtension;
import org.apache.tuscany.spi.idl.java.JavaServiceContract;
+import org.apache.tuscany.spi.model.ElementInfo;
import org.apache.tuscany.spi.model.Operation;
import org.apache.tuscany.spi.model.WrapperInfo;
Modified: incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBDataBindingTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBDataBindingTestCase.java?view=diff&rev=519491&r1=519490&r2=519491
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBDataBindingTestCase.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBDataBindingTestCase.java Sat Mar 17 17:47:47 2007
@@ -19,14 +19,17 @@
package org.apache.tuscany.databinding.jaxb;
+import java.lang.annotation.Annotation;
+
import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;
-import junit.framework.Assert;
import junit.framework.TestCase;
import org.apache.tuscany.spi.model.DataType;
+import org.apache.tuscany.spi.model.XMLType;
+import com.example.ipo.jaxb.ObjectFactory;
import com.example.ipo.jaxb.PurchaseOrderType;
import com.example.ipo.jaxb.USAddress;
import com.example.ipo.jaxb.USState;
@@ -46,22 +49,33 @@
}
/**
- * Test method for {@link org.apache.tuscany.databinding.jaxb.JAXBDataBinding#introspect(java.lang.Class)}.
+ * Test method for
+ * {@link org.apache.tuscany.databinding.jaxb.JAXBDataBinding#introspect(java.lang.Class, Annotation)}.
*/
public final void testIntrospect() {
- DataType<?> dataType = binding.introspect(JAXBElement.class);
- Assert.assertTrue(dataType.getDataBinding().equals(binding.getName()));
- Assert.assertTrue(dataType.getPhysical() == JAXBElement.class && dataType.getLogical() == null);
- dataType = binding.introspect(MockJAXBElement.class);
- Assert.assertEquals(PurchaseOrderType.class, dataType.getPhysical());
- Assert.assertEquals(new QName("http://www.example.com/IPO", "PurchaseOrderType"), dataType.getLogical());
- dataType = binding.introspect(USAddress.class);
- Assert.assertEquals(USAddress.class, dataType.getPhysical());
- Assert.assertEquals(new QName("http://www.example.com/IPO", "USAddress"), dataType.getLogical());
- dataType = binding.introspect(USState.class);
- Assert.assertTrue(dataType.getDataBinding().equals(binding.getName()));
- Assert.assertEquals(USState.class, dataType.getPhysical());
- Assert.assertEquals(new QName("http://www.example.com/IPO", "USState"), dataType.getLogical());
+ DataType dataType = new DataType(JAXBElement.class, null);
+ boolean yes = binding.introspect(dataType, null);
+ assertTrue(yes);
+ assertTrue(dataType.getDataBinding().equals(binding.getName()));
+ assertTrue(dataType.getPhysical() == JAXBElement.class && dataType.getLogical() == XMLType.UNKNOWN);
+ dataType = new DataType(MockJAXBElement.class, null);
+ yes = binding.introspect(dataType, null);
+ assertTrue(yes);
+ assertEquals(MockJAXBElement.class, dataType.getPhysical());
+ assertEquals(new QName("http://www.example.com/IPO", "PurchaseOrderType"), ((XMLType)dataType.getLogical())
+ .getTypeName());
+ dataType = new DataType(USAddress.class, null);
+ yes = binding.introspect(dataType, null);
+ assertTrue(yes);
+ assertEquals(USAddress.class, dataType.getPhysical());
+ assertEquals(new QName("http://www.example.com/IPO", "USAddress"), ((XMLType)dataType.getLogical())
+ .getTypeName());
+ dataType = new DataType(USState.class, null);
+ yes = binding.introspect(dataType, null);
+ assertTrue(yes);
+ assertTrue(dataType.getDataBinding().equals(binding.getName()));
+ assertEquals(USState.class, dataType.getPhysical());
+ assertEquals(new QName("http://www.example.com/IPO", "USState"), ((XMLType)dataType.getLogical()).getTypeName());
}
@@ -80,4 +94,33 @@
}
+ @SuppressWarnings("unchecked")
+ public void testCopy() {
+ ObjectFactory factory = new ObjectFactory();
+ PurchaseOrderType poType = factory.createPurchaseOrderType();
+ JAXBElement<PurchaseOrderType> po = factory.createPurchaseOrder(poType);
+ JAXBElement<PurchaseOrderType> copy = (JAXBElement<PurchaseOrderType>)binding.copy(po);
+ assertEquals(new QName("http://www.example.com/IPO", "purchaseOrder"), copy.getName());
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testCopyNonElement() {
+ ObjectFactory factory = new ObjectFactory();
+ PurchaseOrderType poType = factory.createPurchaseOrderType();
+ poType.setComment("Comment");
+ PurchaseOrderType copy = (PurchaseOrderType)binding.copy(poType);
+ assertTrue(copy instanceof PurchaseOrderType);
+ assertEquals("Comment", ((PurchaseOrderType)copy).getComment());
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testCopyNonRoot() {
+ ObjectFactory factory = new ObjectFactory();
+ USAddress address = factory.createUSAddress();
+ address.setCity("San Jose");
+ USAddress copy = (USAddress)binding.copy(address);
+ assertTrue(copy instanceof USAddress);
+ assertEquals("San Jose", ((USAddress)copy).getCity());
+
+ }
}
Copied: incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandlerTestCase.java (from r518390, incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandlerTestCase.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandlerTestCase.java?view=diff&rev=519491&p1=incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandlerTestCase.java&r1=518390&p2=incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandlerTestCase.java&r2=519491
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandlerTestCase.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandlerTestCase.java Sat Mar 17 17:47:47 2007
@@ -21,12 +21,12 @@
import javax.xml.namespace.QName;
+import junit.framework.TestCase;
+
import org.apache.tuscany.databinding.jaxb.fault.InvalidSymbolFault;
import org.apache.tuscany.databinding.jaxb.fault.InvalidSymbolFault_Exception;
-import org.apache.tuscany.spi.idl.XMLType;
import org.apache.tuscany.spi.model.DataType;
-
-import junit.framework.TestCase;
+import org.apache.tuscany.spi.model.XMLType;
/**
* Test case for JAXBExceptionHandler
Copied: incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java (from r518390, incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java?view=diff&rev=519491&p1=incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java&r1=518390&p2=incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java&r2=519491
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java Sat Mar 17 17:47:47 2007
@@ -26,8 +26,6 @@
import junit.framework.TestCase;
-import org.apache.tuscany.spi.idl.ElementInfo;
-
import com.example.ipo.jaxb.ObjectFactory;
import com.example.ipo.jaxb.PurchaseOrderType;
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org