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/02/15 01:18:45 UTC

svn commit: r507750 - in /incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src: main/java/org/apache/tuscany/databinding/jaxb/ test/java/org/apache/tuscany/databinding/jaxb/

Author: rfeng
Date: Wed Feb 14 16:18:45 2007
New Revision: 507750

URL: http://svn.apache.org/viewvc?view=rev&rev=507750
Log:
[sca-integration-branch] Add copy() support for JAXB

Modified:
    incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBDataBinding.java
    incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBDataBindingTestCase.java

Modified: incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBDataBinding.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBDataBinding.java?view=diff&rev=507750&r1=507749&r2=507750
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBDataBinding.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBDataBinding.java Wed Feb 14 16:18:45 2007
@@ -23,6 +23,7 @@
 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;
@@ -30,14 +31,18 @@
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.namespace.QName;
 
+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.w3c.dom.Document;
 
 /**
  * JAXB DataBinding
  */
 public class JAXBDataBinding extends DataBindingExtension {
-    
+    private static final String NAMESPACE = "http://tuscany.apache.org/xmlns/sca/databinding/jaxb/1.0";
+    private static final QName ROOT_ELEMENT = new QName(NAMESPACE, "root");
+
     public static final String NAME = JAXBElement.class.getName();
 
     @Override
@@ -45,12 +50,12 @@
         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);
+                        return introspect((Class<?>)actualType);
                     }
                 }
             }
@@ -74,7 +79,8 @@
                 if (rootElement != null) {
                     namespace = rootElement.namespace();
                 } else {
-                    // FIXME: The namespace should be from the referencing property
+                    // FIXME: The namespace should be from the referencing
+                    // property
                     namespace = null;
                 }
             } else if (typeNamespace.equals("##default")) {
@@ -104,6 +110,28 @@
 
     public JAXBDataBinding() {
         super(NAME, JAXBElement.class);
+    }
+
+    @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 {
+                arg = new JAXBElement(ROOT_ELEMENT, cls, 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);
+        }
     }
 
 }

Modified: incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBDataBindingTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBDataBindingTestCase.java?view=diff&rev=507750&r1=507749&r2=507750
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBDataBindingTestCase.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBDataBindingTestCase.java Wed Feb 14 16:18:45 2007
@@ -27,6 +27,7 @@
 
 import org.apache.tuscany.spi.model.DataType;
 
+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,7 +47,8 @@
     }
 
     /**
-     * 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)}.
      */
     public final void testIntrospect() {
         DataType<?> dataType = binding.introspect(JAXBElement.class);
@@ -80,4 +82,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());
+
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org