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