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/22 22:57:48 UTC

svn commit: r510671 - in /incubator/tuscany/branches/sca-java-integration/sca: extensions/axis2/databinding/src/main/java/org/apache/tuscany/databinding/axiom/ extensions/axis2/samples/helloworldwsclient/ kernel/api/src/main/java/org/apache/tuscany/api...

Author: rfeng
Date: Thu Feb 22 13:57:46 2007
New Revision: 510671

URL: http://svn.apache.org/viewvc?view=rev&rev=510671
Log:
[sca-integration-branch] Improvements over databindings, adding more heuristic introspections

Added:
    incubator/tuscany/branches/sca-java-integration/sca/kernel/api/src/main/java/org/apache/tuscany/api/annotation/WrapperStyle.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java   (with props)
Modified:
    incubator/tuscany/branches/sca-java-integration/sca/extensions/axis2/databinding/src/main/java/org/apache/tuscany/databinding/axiom/OMElementWrapperHandler.java
    incubator/tuscany/branches/sca-java-integration/sca/extensions/axis2/samples/helloworldwsclient/pom.xml
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingJavaInterfaceProcessor.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImpl.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Input2InputTransformer.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Output2OutputTransformer.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DOMWrapperHandler.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactoryImpl.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingJavaInterfaceProcessorTestCase.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImplTestCase.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/DataBinding.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/DataBindingRegistry.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/WrapperHandler.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/DataBindingExtension.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/DataBindingExtensionTestCase.java
    incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.java
    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/main/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandler.java
    incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java
    incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBDataBindingTestCase.java
    incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2String.java
    incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2XMLStreamReader.java
    incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataBinding.java
    incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataTypeHelper.java
    incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOWrapperHandler.java
    incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/test/java/org/apache/tuscany/databinding/sdo/SDODataBindingTestCase.java

Modified: incubator/tuscany/branches/sca-java-integration/sca/extensions/axis2/databinding/src/main/java/org/apache/tuscany/databinding/axiom/OMElementWrapperHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/extensions/axis2/databinding/src/main/java/org/apache/tuscany/databinding/axiom/OMElementWrapperHandler.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/extensions/axis2/databinding/src/main/java/org/apache/tuscany/databinding/axiom/OMElementWrapperHandler.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/extensions/axis2/databinding/src/main/java/org/apache/tuscany/databinding/axiom/OMElementWrapperHandler.java Thu Feb 22 13:57:46 2007
@@ -19,7 +19,10 @@
 
 package org.apache.tuscany.databinding.axiom;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 
 import org.apache.axiom.om.OMAbstractFactory;
 import org.apache.axiom.om.OMElement;
@@ -45,23 +48,16 @@
         return wrapper;
     }
 
-    public Object getChild(OMElement wrapper, int i, ElementInfo element) {
-        int index = 0;
-        for (Iterator e = wrapper.getChildElements(); e.hasNext();) {
-            OMElement child = (OMElement) e.next();
-            if (index != i) {
-                index++;
-                continue;
-            }
-            if (child.getQName().equals(element.getQName())) {
-                return child;
-            }
-        }
-        return null;
-    }
-
     public void setChild(OMElement wrapper, int i, ElementInfo childElement, Object value) {
         wrapper.addChild((OMElement) value);
+    }
+
+    public List getChildren(OMElement wrapper) {
+        List<Object> elements = new ArrayList<Object>();
+        for (Iterator i = wrapper.getChildElements(); i.hasNext();) {
+            elements.add(i.next());
+        }
+        return elements;
     }
 
 }

Modified: incubator/tuscany/branches/sca-java-integration/sca/extensions/axis2/samples/helloworldwsclient/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/extensions/axis2/samples/helloworldwsclient/pom.xml?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/extensions/axis2/samples/helloworldwsclient/pom.xml (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/extensions/axis2/samples/helloworldwsclient/pom.xml Thu Feb 22 13:57:46 2007
@@ -55,6 +55,20 @@
                     </archive>
                 </configuration>
             </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>2.2</version>
+                    <configuration>
+                        <includes>
+                            <include>**/*TestCase.java</include>
+                        </includes>
+                        <reportFormat>brief</reportFormat>
+                        <useFile>false</useFile>
+                        <forkMode>never</forkMode>
+                        <argLine>-ea</argLine>
+                    </configuration>
+                </plugin>
         </plugins>
     </build>
 

Added: incubator/tuscany/branches/sca-java-integration/sca/kernel/api/src/main/java/org/apache/tuscany/api/annotation/WrapperStyle.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/api/src/main/java/org/apache/tuscany/api/annotation/WrapperStyle.java?view=auto&rev=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/api/src/main/java/org/apache/tuscany/api/annotation/WrapperStyle.java (added)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/api/src/main/java/org/apache/tuscany/api/annotation/WrapperStyle.java Thu Feb 22 13:57:46 2007
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.api.annotation;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation that can be applied to interfaces or methods to indicate a wrapper
+ * style
+ * 
+ * @version $Rev$ $Date$
+ */
+@Target( {METHOD, TYPE})
+@Retention(RUNTIME)
+public @interface WrapperStyle {
+
+    /**
+     * The name of the databinding for the wrapper
+     */
+    String value();
+}

Propchange: incubator/tuscany/branches/sca-java-integration/sca/kernel/api/src/main/java/org/apache/tuscany/api/annotation/WrapperStyle.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/branches/sca-java-integration/sca/kernel/api/src/main/java/org/apache/tuscany/api/annotation/WrapperStyle.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingJavaInterfaceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingJavaInterfaceProcessor.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingJavaInterfaceProcessor.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingJavaInterfaceProcessor.java Thu Feb 22 13:57:46 2007
@@ -19,6 +19,7 @@
 
 package org.apache.tuscany.core.databinding.impl;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
 import java.math.BigDecimal;
@@ -30,35 +31,46 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+
 import javax.xml.datatype.Duration;
 import javax.xml.datatype.XMLGregorianCalendar;
 
+import org.apache.tuscany.api.annotation.DataContext;
+import org.apache.tuscany.api.annotation.DataType;
+import org.apache.tuscany.api.annotation.WrapperStyle;
+import org.apache.tuscany.spi.annotation.Autowire;
+import org.apache.tuscany.spi.databinding.DataBindingRegistry;
 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.Operation;
 
-import org.apache.tuscany.api.annotation.DataContext;
-import org.apache.tuscany.api.annotation.DataType;
-
 /**
  * The databinding annotation processor for java interfaces
- *
+ * 
  * @version $Rev$ $Date$
  */
 public class DataBindingJavaInterfaceProcessor extends JavaInterfaceProcessorExtension {
-
-    private static final String SIMPLE_JAVA_OBJECTS = "java.lang.Object";
-
     private static final Class[] SIMPLE_JAVA_TYPES =
         {Byte.class, Character.class, Short.class, Integer.class, Long.class, Float.class, Double.class, Date.class,
-        Calendar.class, GregorianCalendar.class, Duration.class, XMLGregorianCalendar.class, BigInteger.class,
-        BigDecimal.class};
+         Calendar.class, GregorianCalendar.class, Duration.class, XMLGregorianCalendar.class, BigInteger.class,
+         BigDecimal.class};
 
     private static final Set<Class> SIMPLE_TYPE_SET = new HashSet<Class>(Arrays.asList(SIMPLE_JAVA_TYPES));
 
+    private DataBindingRegistry dataBindingRegistry;
+
+    public DataBindingJavaInterfaceProcessor(@Autowire
+    DataBindingRegistry dataBindingRegistry) {
+        super();
+        this.dataBindingRegistry = dataBindingRegistry;
+    }
+
     public void visitInterface(Class<?> clazz, Class<?> callbackClass, JavaServiceContract contract)
         throws InvalidServiceContractException {
+        if (!contract.isRemotable()) {
+            return;
+        }
         Map<String, Operation<Type>> operations = contract.getOperations();
         processInterface(clazz, contract, operations);
         if (callbackClass != null) {
@@ -67,9 +79,9 @@
         }
     }
 
-    private void processInterface(Class<?> clazz,
-                                  JavaServiceContract contract,
+    private void processInterface(Class<?> clazz, JavaServiceContract contract, 
                                   Map<String, Operation<Type>> operations) {
+        WrapperStyle interfaceWrapperStyle = clazz.getAnnotation(WrapperStyle.class);
         DataType interfaceDataType = clazz.getAnnotation(DataType.class);
         if (interfaceDataType != null) {
             contract.setDataBinding(interfaceDataType.name());
@@ -81,6 +93,9 @@
         for (Method method : clazz.getMethods()) {
             Operation<?> operation = operations.get(method.getName());
             DataType operationDataType = method.getAnnotation(DataType.class);
+            if (operationDataType == null) {
+                operationDataType = interfaceDataType;
+            }
 
             if (operationDataType != null) {
                 operation.setDataBinding(operationDataType.name());
@@ -89,44 +104,31 @@
                     operation.setMetaData(c.key(), c.value());
                 }
             }
+            WrapperStyle operationWrapperStyle = clazz.getAnnotation(WrapperStyle.class);
+            if (operationWrapperStyle == null) {
+                operationWrapperStyle = interfaceWrapperStyle;
+            }
+            
+            if (operationWrapperStyle != null) {
+                operation.setDataBinding(operationWrapperStyle.value());
+                operation.setWrapperStyle(true);
+            }
+            // String dataBinding = operation.getDataBinding();
 
-            String dataBinding = operation.getDataBinding();
-
+            Annotation[] annotations = null;
+            if (operationDataType != null) {
+                annotations = new Annotation[] {operationDataType};
+            }
             // FIXME: We need a better way to identify simple java types
             for (org.apache.tuscany.spi.model.DataType<?> d : operation.getInputType().getLogical()) {
-                adjustSimpleType(d, dataBinding);
+                dataBindingRegistry.introspectType(d, annotations);
             }
             if (operation.getOutputType() != null) {
-                adjustSimpleType(operation.getOutputType(), dataBinding);
+                dataBindingRegistry.introspectType(operation.getOutputType(), annotations);
             }
             for (org.apache.tuscany.spi.model.DataType<?> d : operation.getFaultTypes()) {
-                adjustSimpleType(d, dataBinding);
+                dataBindingRegistry.introspectType(d, annotations);
             }
-        }
-    }
-
-    private void adjustSimpleType(org.apache.tuscany.spi.model.DataType<?> dataType, String dataBinding) {
-        Type type = dataType.getPhysical();
-        if (!(type instanceof Class)) {
-            return;
-        }
-        Class cls = (Class) dataType.getPhysical();
-        if (cls.isPrimitive() || SIMPLE_TYPE_SET.contains(cls)) {
-            dataType.setDataBinding(SIMPLE_JAVA_OBJECTS);
-        } 
-        /**
-         * [rfeng] The following code hits a bug in IBM JDK 5.0          
-         * if (cls == String.class && (dataBinding == null || !dataBinding.equals(String.class.getName()))) {
-         *      // Identify the String as a simple type
-         *      dataType.setDataBinding(SIMPLE_JAVA_OBJECTS);
-         * }     
-         */      
-        
-        boolean plainString =
-            cls == String.class && ((dataBinding == null) || !dataBinding.equals(String.class.getName()));
-        if (plainString) {
-            // Identify the String as a simple type
-            dataType.setDataBinding(SIMPLE_JAVA_OBJECTS);
         }
     }
 }

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImpl.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImpl.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImpl.java Thu Feb 22 13:57:46 2007
@@ -19,15 +19,17 @@
 
 package org.apache.tuscany.core.databinding.impl;
 
+import java.lang.annotation.Annotation;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
-
-import org.osoa.sca.annotations.EagerInit;
+import java.util.Set;
 
 import org.apache.tuscany.core.databinding.javabeans.JavaBeansDataBinding;
 import org.apache.tuscany.spi.databinding.DataBinding;
 import org.apache.tuscany.spi.databinding.DataBindingRegistry;
 import org.apache.tuscany.spi.model.DataType;
+import org.osoa.sca.annotations.EagerInit;
 
 /**
  * The default implementation of a data binding registry
@@ -47,34 +49,53 @@
 
     public void register(DataBinding dataBinding) {
         bindings.put(dataBinding.getName().toLowerCase(), dataBinding);
+        String[] aliases = dataBinding.getAliases();
+        if (aliases != null) {
+            for (String alias : aliases) {
+                bindings.put(alias.toLowerCase(), dataBinding);
+            }
+        }
     }
 
     public DataBinding unregister(String id) {
         if (id == null) {
             return null;
         }
-        return bindings.remove(id.toLowerCase());
+        DataBinding dataBinding = bindings.remove(id.toLowerCase());
+        if (dataBinding != null) {
+            String[] aliases = dataBinding.getAliases();
+            if (aliases != null) {
+                for (String alias : aliases) {
+                    bindings.remove(alias.toLowerCase());
+                }
+            }
+        }
+        return dataBinding;
+    }
+    
+    private Set<DataBinding> getDataBindings() {
+        return new HashSet<DataBinding>(bindings.values());
     }
 
-    public DataType introspectType(Class<?> javaType) {
-        DataType dataType = null;
-        for (DataBinding binding : bindings.values()) {
+    public boolean introspectType(DataType dataType, Annotation[] annotations) {
+        for (DataBinding binding : getDataBindings()) {
             //don't introspect for JavaBeansDatabinding as all javatypes will anyways match to its basetype 
             //which is java.lang.Object.  Default to this only if no databinding results
             if (!binding.getName().equals(JavaBeansDataBinding.NAME)) {
-                dataType = binding.introspect(javaType);
-            }
-            
-            if (dataType != null) {
-                return dataType;
+                if (binding.introspect(dataType, annotations)) {
+                    return true;
+                }
             }
         }
-        return new DataType<Class>(JavaBeansDataBinding.NAME, Object.class, javaType);
+        if (dataType.getDataBinding() == null) {
+            dataType.setDataBinding(JavaBeansDataBinding.NAME);
+        }
+        return false;
     }
 
     public DataType introspectType(Object value) {
         DataType dataType = null;
-        for (DataBinding binding : bindings.values()) {
+        for (DataBinding binding : getDataBindings()) {
             //don't introspect for JavaBeansDatabinding as all javatypes will anyways match to its basetype 
             //which is java.lang.Object.  Default to this only if no databinding results
             if (!binding.getName().equals(JavaBeansDataBinding.NAME)) {
@@ -84,7 +105,7 @@
                 return dataType;
             }
         }
-        return new DataType<Class>(JavaBeansDataBinding.NAME, Object.class, value.getClass());
+        return new DataType<Class>(JavaBeansDataBinding.NAME, value.getClass(), value.getClass());
     }
 
 }

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Input2InputTransformer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Input2InputTransformer.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Input2InputTransformer.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Input2InputTransformer.java Thu Feb 22 13:57:46 2007
@@ -144,8 +144,8 @@
         } else if (sourceWrapped && (!targetWrapped)) {
             // Wrapped to Unwrapped
             Object sourceWrapper = source[0];
-            List<ElementInfo> childElements = sourceOp.getWrapper().getInputChildElements();
-            Object[] target = new Object[childElements.size()];
+            // List<ElementInfo> childElements = sourceOp.getWrapper().getInputChildElements();
+            Object[] target = null;
 
             targetWrapperHandler = getWapperHandler(targetType.getOperation().getDataBinding(), false);
             if (targetWrapperHandler != null) {
@@ -160,18 +160,15 @@
                                      sourceType.getLogical().get(0),
                                      targetWrapperType,
                                      context.getMetadata());
-                for (int i = 0; i < childElements.size(); i++) {
-                    ElementInfo childElement = childElements.get(i);
-                    target[i] = targetWrapperHandler.getChild(targetWrapper, i, childElement);
-                }
+                target = targetWrapperHandler.getChildren(targetWrapper).toArray();
             } else {
-                for (int i = 0; i < childElements.size(); i++) {
-                    ElementInfo childElement = childElements.get(i);
-                    Object child = sourceWrapperHandler.getChild(sourceWrapper, i, childElement);
+                Object[] sourceChildren = sourceWrapperHandler.getChildren(sourceWrapper).toArray();
+                target = new Object[sourceChildren.length];
+                for (int i = 0; i < sourceChildren.length; i++) {
                     DataType<QName> childType =
                         sourceOp.getWrapper().getUnwrappedInputType().getLogical().get(i);
                     target[i] =
-                        mediator.mediate(child, childType, targetType.getLogical().get(i), context
+                        mediator.mediate(sourceChildren[i], childType, targetType.getLogical().get(i), context
                             .getMetadata());
                 }
             }

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Output2OutputTransformer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Output2OutputTransformer.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Output2OutputTransformer.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Output2OutputTransformer.java Thu Feb 22 13:57:46 2007
@@ -157,8 +157,6 @@
                     // The void output
                     return null;
                 }
-                ElementInfo childElement = childElements.get(0);
-
                 targetWrapperHandler = getWapperHandler(targetType.getLogical().getDataBinding());
                 if (targetWrapperHandler != null) {
                     ElementInfo wrapperElement = sourceOp.getWrapper().getInputWrapperElement();
@@ -170,9 +168,9 @@
                     Object targetWrapper =
                         mediator.mediate(sourceWrapper, sourceType.getLogical(), targetWrapperType, context
                             .getMetadata());
-                    return targetWrapperHandler.getChild(targetWrapper, 0, childElement);
+                    return targetWrapperHandler.getChildren(targetWrapper).get(0);
                 } else {
-                    Object child = sourceWrapperHandler.getChild(sourceWrapper, 0, childElement);
+                    Object child = sourceWrapperHandler.getChildren(sourceWrapper).get(0);
                     DataType<?> childType = sourceOp.getWrapper().getUnwrappedOutputType();
                     return mediator.mediate(child, childType, targetType.getLogical(), context.getMetadata());
                 }

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DOMWrapperHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DOMWrapperHandler.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DOMWrapperHandler.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DOMWrapperHandler.java Thu Feb 22 13:57:46 2007
@@ -19,6 +19,9 @@
 
 package org.apache.tuscany.core.databinding.xml;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.xml.namespace.QName;
 import javax.xml.parsers.ParserConfigurationException;
 
@@ -49,31 +52,27 @@
         return DOMHelper.createElement(document, name);
     }
 
-    public Object getChild(Node wrapper, int i, ElementInfo element) {
-        int index = 0;
-        NodeList nodes = wrapper.getChildNodes();
-        for (int j = 0; j < nodes.getLength(); j++) {
-            Node node = nodes.item(j);
-            if (node.getNodeType() != Node.ELEMENT_NODE) {
-                continue;
-            }
-            if (index != i) {
-                index++;
-            } else {
-                QName name = DOMHelper.getQName(node);
-                if (name.equals(element.getQName())) {
-                    return node;
-                }
-            }
-        }
-        return null;
-    }
-
     public void setChild(Node wrapper, int i, ElementInfo childElement, Object value) {
         Node node = (Node) value;
         if (node.getNodeType() == Node.DOCUMENT_NODE) {
             node = ((Document) node).getDocumentElement();
         }
         wrapper.appendChild(wrapper.getOwnerDocument().importNode(node, true));
+    }
+
+    public List getChildren(Node wrapper) {
+        assert wrapper != null;
+        if (wrapper.getNodeType() == Node.DOCUMENT_NODE) {
+            wrapper = ((Document) wrapper).getDocumentElement();
+        }
+        List<Node> elements = new ArrayList<Node>();
+        NodeList nodes = wrapper.getChildNodes();
+        for (int j = 0; j < nodes.getLength(); j++) {
+            Node node = nodes.item(j);
+            if (node.getNodeType() == Node.ELEMENT_NODE) {
+                elements.add(node);
+            }
+        }
+        return elements;
     }
 }

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactoryImpl.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactoryImpl.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactoryImpl.java Thu Feb 22 13:57:46 2007
@@ -91,10 +91,8 @@
             if (dataBinding != null) {
                 targetDataType = new DataType<Class>(dataBinding, javaType, javaType);
             } else {
-                targetDataType = registry.introspectType(javaType);
-                if (targetDataType == null) {
-                    targetDataType = new DataType<Class>("java.lang.Object", javaType, javaType);
-                }
+                targetDataType = new DataType<Class>(dataBinding, javaType, javaType);
+                registry.introspectType(targetDataType, null);
             }
         }
 

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingJavaInterfaceProcessorTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingJavaInterfaceProcessorTestCase.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingJavaInterfaceProcessorTestCase.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingJavaInterfaceProcessorTestCase.java Thu Feb 22 13:57:46 2007
@@ -30,6 +30,7 @@
 
 import org.apache.tuscany.api.annotation.DataContext;
 import org.apache.tuscany.api.annotation.DataType;
+import org.apache.tuscany.spi.databinding.DataBindingRegistry;
 import org.apache.tuscany.spi.idl.InvalidServiceContractException;
 import org.apache.tuscany.spi.idl.java.JavaServiceContract;
 import org.apache.tuscany.spi.model.Operation;
@@ -52,7 +53,8 @@
      * @throws InvalidServiceContractException
      */
     public final void testVisitInterface() throws InvalidServiceContractException {
-        DataBindingJavaInterfaceProcessor processor = new DataBindingJavaInterfaceProcessor();
+        DataBindingRegistry registry = new DataBindingRegistryImpl();
+        DataBindingJavaInterfaceProcessor processor = new DataBindingJavaInterfaceProcessor(registry);
         JavaServiceContract contract = new JavaServiceContract(MockInterface.class);
         Map<String, Operation<Type>> operations = new HashMap<String, Operation<Type>>();
         Operation<Type> operation = new Operation<Type>("call", null, null, null, false, null, NO_CONVERSATION);
@@ -60,6 +62,7 @@
         operations.put("call", operation);
         operations.put("call1", operation1);
         contract.setOperations(operations);
+        contract.setRemotable(true);
         processor.visitInterface(MockInterface.class, null, contract);
         Assert.assertEquals("org.w3c.dom.Node", contract.getDataBinding());
         Assert.assertEquals("element", (String)contract.getMetaData().get("nodeType"));

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImplTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImplTestCase.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImplTestCase.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/DataBindingRegistryImplTestCase.java Thu Feb 22 13:57:46 2007
@@ -22,6 +22,8 @@
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 
+import java.lang.annotation.Annotation;
+
 import javax.xml.stream.XMLStreamReader;
 
 import junit.framework.Assert;
@@ -49,19 +51,23 @@
 
     public void testRegistry() {
         DataBinding db1 = createMock(DataBinding.class);
+        expect(db1.getAliases()).andReturn(new String[] {"db1"}).anyTimes();
         expect(db1.getName()).andReturn(ContentHandler.class.getName()).anyTimes();
         DataType<Class> dataType1 = new DataType<Class>(ContentHandler.class, ContentHandler.class);
-        expect(db1.introspect(ContentHandler.class)).andReturn(dataType1);
-        expect(db1.introspect((Class)EasyMock.anyObject())).andReturn(null).anyTimes();
+        expect(db1.introspect(dataType1, null)).andReturn(true);
+        expect(db1.introspect(EasyMock.not(EasyMock.same(dataType1)), (Annotation[])EasyMock.isNull()))
+            .andReturn(false).anyTimes();
         replay(db1);
 
         registry.register(db1);
 
         DataBinding db2 = createMock(DataBinding.class);
+        expect(db2.getAliases()).andReturn(new String[] {"db2"}).anyTimes();
         expect(db2.getName()).andReturn(XMLStreamReader.class.getName()).anyTimes();
         DataType<Class> dataType2 = new DataType<Class>(XMLStreamReader.class, XMLStreamReader.class);
-        expect(db2.introspect(XMLStreamReader.class)).andReturn(dataType2);
-        expect(db2.introspect((Class)EasyMock.anyObject())).andReturn(null).anyTimes();
+        expect(db2.introspect(dataType2, null)).andReturn(true);
+        expect(db2.introspect(EasyMock.not(EasyMock.same(dataType2)), (Annotation[])EasyMock.isNull()))
+            .andReturn(false).anyTimes();
         replay(db2);
 
         registry.register(db2);
@@ -70,17 +76,17 @@
         DataBinding db3 = registry.getDataBinding(name);
         Assert.assertTrue(db1 == db3);
 
-        DataType<?> dt = registry.introspectType(ContentHandler.class);
-        Assert.assertEquals(dataType1, dt);
+        DataType dt = new DataType(ContentHandler.class, null);
+        registry.introspectType(dt, null);
+        Assert.assertEquals(dataType1.getLogical(), ContentHandler.class);
         Assert.assertTrue(dt.getDataBinding().equalsIgnoreCase(name));
 
         registry.unregister(name);
         DataBinding db4 = registry.getDataBinding(name);
         Assert.assertNull(db4);
-        
-       
-        dt = registry.introspectType(ContentHandler.class);
-        Assert.assertNotNull(dt);
+
+        dt = new DataType(null, String.class, null);
+        registry.introspectType(dt, null);
         Assert.assertEquals("java.lang.Object", dt.getDataBinding());
     }
 

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/DataBinding.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/DataBinding.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/DataBinding.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/DataBinding.java Thu Feb 22 13:57:46 2007
@@ -19,6 +19,8 @@
 
 package org.apache.tuscany.spi.databinding;
 
+import java.lang.annotation.Annotation;
+
 import org.apache.tuscany.spi.model.DataType;
 
 /**
@@ -43,14 +45,22 @@
      * @return The name of the databinding
      */
     String getName();
+    
+    /**
+     * Get the aliases for the databinding
+     * 
+     * @return An array of aliases
+     */
+    String[] getAliases();
 
     /**
-     * Introspect a java class or interface to create a DataType model
+     * Introspect and populate information to a DataType model
      * 
      * @param javaType The java class or interface to be introspected
-     * @return The DataType or null if the java type is not supported by this databinding
+     * @param annotations The java annotations
+     * @return true if the databinding has recognized the given data type
      */
-    DataType introspect(Class<?> javaType);
+    boolean introspect(DataType dataType, Annotation[] annotations);
 
     /**
      * Introspect the data to figure out the corresponding data type

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/DataBindingRegistry.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/DataBindingRegistry.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/DataBindingRegistry.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/DataBindingRegistry.java Thu Feb 22 13:57:46 2007
@@ -18,6 +18,8 @@
  */
 package org.apache.tuscany.spi.databinding;
 
+import java.lang.annotation.Annotation;
+
 import org.apache.tuscany.spi.model.DataType;
 
 /**
@@ -50,11 +52,12 @@
     /**
      * Introspect the java class to figure out what DataType supports it
      * 
-     * @param javaType The java class or interface
+     * @param DataType The initial data type
+     * @param annotations The java annotations
      * @return A DataType representing the java type or null if no databinding
      *         recognizes the java type
      */
-    DataType introspectType(Class<?> javaType);
+    boolean introspectType(DataType dataType, Annotation[] annotations);
 
     /**
      * Introspect the value to figure out the corresponding DataType

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/WrapperHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/WrapperHandler.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/WrapperHandler.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/WrapperHandler.java Thu Feb 22 13:57:46 2007
@@ -19,6 +19,8 @@
 
 package org.apache.tuscany.spi.databinding;
 
+import java.util.List;
+
 import org.apache.tuscany.spi.idl.ElementInfo;
 
 /**
@@ -45,12 +47,9 @@
     void setChild(T wrapper, int i, ElementInfo childElement, Object value);
 
     /**
-     * Get child element from the wrapper
-     * 
-     * @param wrapper The wrapper
-     * @param i The index
-     * @param element The XSD element
-     * @return The value of the child
+     * Get a list of child elements from the wrapper
+     * @param wrapper
+     * @return child elements under the wrapper
      */
-    Object getChild(T wrapper, int i, ElementInfo element);
+    List getChildren(T wrapper);
 }

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/DataBindingExtension.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/DataBindingExtension.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/DataBindingExtension.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/DataBindingExtension.java Thu Feb 22 13:57:46 2007
@@ -27,6 +27,7 @@
 import java.io.ObjectStreamClass;
 import java.io.OutputStream;
 import java.io.Serializable;
+import java.lang.annotation.Annotation;
 
 import org.osoa.sca.annotations.EagerInit;
 import org.osoa.sca.annotations.Init;
@@ -43,7 +44,7 @@
 
 /**
  * Base Implementation of DataBinding
- *
+ * 
  * @version $Rev$ $Date$
  */
 @Service(DataBinding.class)
@@ -58,9 +59,11 @@
     protected String name;
 
     /**
-     * Create a databinding with the base java type whose name will be used as the name of the databinding
-     *
-     * @param baseType The base java class or interface representing the databinding, for example, org.w3c.dom.Node
+     * Create a databinding with the base java type whose name will be used as
+     * the name of the databinding
+     * 
+     * @param baseType The base java class or interface representing the
+     *            databinding, for example, org.w3c.dom.Node
      */
     protected DataBindingExtension(Class<?> baseType) {
         this(baseType.getName(), baseType);
@@ -68,9 +71,10 @@
 
     /**
      * Create a databinding with the name and base java type
-     *
-     * @param name     The name of the databinding
-     * @param baseType The base java class or interface representing the databinding, for example, org.w3c.dom.Node
+     * 
+     * @param name The name of the databinding
+     * @param baseType The base java class or interface representing the
+     *            databinding, for example, org.w3c.dom.Node
      */
     protected DataBindingExtension(String name, Class<?> baseType) {
         this.name = name;
@@ -87,22 +91,30 @@
         registry.register(this);
     }
 
-    public DataType introspect(Class<?> javaType) {
-        if (baseType == null || javaType == null) {
-            return null;
-        }
-        if (baseType.isAssignableFrom(javaType)) {
-            return new DataType<Class>(name, javaType, baseType);
-        } else {
-            return null;
+    public boolean introspect(DataType type, Annotation[] annotations) {
+        assert type != null;
+        Object physical = type.getPhysical();
+        if (physical instanceof Class) {
+            Class cls = (Class)physical;
+            if (baseType != null && baseType.isAssignableFrom(cls)) {
+                type.setDataBinding(getName());
+                type.setLogical(baseType);
+                return true;
+            }
         }
+        return false;
     }
 
     public DataType introspect(Object value) {
         if (value == null) {
             return null;
         } else {
-            return introspect(value.getClass());
+            DataType<Class> dataType = new DataType<Class>(value.getClass(), value.getClass());
+            if (introspect(dataType, null)) {
+                return dataType;
+            } else {
+                return null;
+            }
         }
     }
 
@@ -116,7 +128,7 @@
     public WrapperHandler getWrapperHandler() {
         return null;
     }
-    
+
     public ExceptionHandler getExceptionHandler() {
         return null;
     }
@@ -126,8 +138,10 @@
             return null;
         }
         final Class clazz = arg.getClass();
-        if (String.class == clazz || clazz.isPrimitive() || Number.class.isAssignableFrom(clazz)
-            || Boolean.class.isAssignableFrom(clazz) || Character.class.isAssignableFrom(clazz)
+        if (String.class == clazz || clazz.isPrimitive()
+            || Number.class.isAssignableFrom(clazz)
+            || Boolean.class.isAssignableFrom(clazz)
+            || Character.class.isAssignableFrom(clazz)
             || Byte.class.isAssignableFrom(clazz)) {
             // Immutable classes
             return arg;
@@ -147,13 +161,11 @@
                 bis.close();
                 return objectCopy;
             } else {
-                //return arg;
-                throw new IllegalArgumentException(
-                    "Pass-by-value is not supported for the given object");
+                // return arg;
+                throw new IllegalArgumentException("Pass-by-value is not supported for the given object");
             }
         } catch (Exception e) {
-            throw new IllegalArgumentException(
-                "Pass-by-value is not supported for the given object", e);
+            throw new IllegalArgumentException("Pass-by-value is not supported for the given object", e);
         }
     }
 
@@ -161,8 +173,7 @@
         return new ObjectOutputStream(os);
     }
 
-    protected ObjectInputStream getObjectInputStream(InputStream is, final ClassLoader cl)
-        throws IOException {
+    protected ObjectInputStream getObjectInputStream(InputStream is, final ClassLoader cl) throws IOException {
         ObjectInputStream ois = new ObjectInputStream(is) {
             @Override
             protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
@@ -179,6 +190,10 @@
 
     public SimpleTypeMapper getSimpleTypeMapper() {
         return new SimpleTypeMapperExtension();
+    }
+
+    public String[] getAliases() {
+        return null;
     }
 
 }

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java Thu Feb 22 13:57:46 2007
@@ -39,7 +39,7 @@
 
     private final Type physical;
 
-    private final L logical;
+    private L logical;
 
     private Map<String, Object> metadata = new HashMap<String, Object>();
 
@@ -237,6 +237,13 @@
 
     public void setOperation(Operation operation) {
         this.operation = operation;
+    }
+
+    /**
+     * @param logical the logical to set
+     */
+    public void setLogical(L logical) {
+        this.logical = logical;
     }
 
 }

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/DataBindingExtensionTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/DataBindingExtensionTestCase.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/DataBindingExtensionTestCase.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/databinding/extension/DataBindingExtensionTestCase.java Thu Feb 22 13:57:46 2007
@@ -22,6 +22,7 @@
 import junit.framework.TestCase;
 
 import org.apache.tuscany.spi.databinding.DataBindingRegistry;
+import org.apache.tuscany.spi.model.DataType;
 import org.easymock.EasyMock;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -41,8 +42,10 @@
     public void testExtension() {
         DataBinding1 binding1 = new DataBinding1(Node.class);
         assertEquals(Node.class.getName(), binding1.getName());
-        assertNotNull(binding1.introspect(Element.class));
-        assertNull(binding1.introspect(String.class));
+        DataType dt1 = new DataType(Element.class, null);
+        assertTrue(binding1.introspect(dt1, null));
+        DataType dt2 = new DataType(String.class, null);
+        assertFalse(binding1.introspect(dt2, null));
         assertNull(binding1.getWrapperHandler());
         
         DataBindingRegistry registry = EasyMock.createMock(DataBindingRegistry.class);

Modified: incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.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/JAXBContextHelper.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.java Thu Feb 22 13:57:46 2007
@@ -29,6 +29,7 @@
 
 import org.apache.tuscany.spi.databinding.TransformationContext;
 import org.apache.tuscany.spi.databinding.TransformationException;
+import org.apache.tuscany.spi.idl.ElementInfo;
 import org.apache.tuscany.spi.model.DataType;
 import org.apache.tuscany.spi.model.Operation;
 
@@ -82,16 +83,19 @@
         if (value instanceof JAXBElement) {
             return (JAXBElement)value;
         } else {
-            Class type = (Class) dataType.getPhysical();
-            Object logical = dataType.getLogical();
-            if (!(logical instanceof QName)) {
-                logical = JAXBDataBinding.ROOT_ELEMENT;
+            Class type = (Class)dataType.getPhysical();
+            ElementInfo elementInfo = (ElementInfo)dataType.getMetadata(ElementInfo.class.getName());
+            QName elementName = JAXBDataBinding.ROOT_ELEMENT;
+            if (elementInfo != null) {
+                elementName = elementInfo.getQName();
+            } else {
                 /**
-                 * Set the declared type to Object.class so that xsi:type will be produced
+                 * Set the declared type to Object.class so that xsi:type will
+                 * be produced
                  */
                 type = Object.class;
             }
-            return new JAXBElement((QName)logical, type, value);
+            return new JAXBElement(elementName, type, value);
         }
     }
 

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=510671&r1=510670&r2=510671
==============================================================================
--- 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 Thu Feb 22 13:57:46 2007
@@ -20,6 +20,7 @@
 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;
 
@@ -47,7 +48,12 @@
     public static final String NAME = JAXBElement.class.getName();
 
     @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) {
@@ -56,16 +62,25 @@
                 if (rawType == JAXBElement.class) {
                     Type actualType = parameterizedType.getActualTypeArguments()[0];
                     if (actualType instanceof Class) {
-                        return introspect((Class<?>)actualType);
+                        QName xmlType = getXmlTypeName((Class)actualType);
+                        dataType.setLogical(xmlType);
+                        dataType.setDataBinding(getName());
+                        return true;
                     }
                 }
             }
-            return new DataType<QName>(getName(), javaType, null);
+            dataType.setLogical(null);
+            dataType.setDataBinding(getName());
+            return true;
         }
 
         QName xmlType = getXmlTypeName(javaType);
-        DataType<QName> dataType = new DataType<QName>(getName(), javaType, xmlType);
-        return dataType;
+        if (xmlType == null) {
+            return false;
+        }
+        dataType.setLogical(xmlType);
+        dataType.setDataBinding(getName());
+        return true;
     }
 
     public static QName getXmlTypeName(Class<?> javaType) {
@@ -74,7 +89,9 @@
         Package pkg = javaType.getPackage();
         if (pkg != null) {
             XmlSchema schema = pkg.getAnnotation(XmlSchema.class);
-            namespace = schema.namespace();
+            if (schema != null) {
+                namespace = schema.namespace();
+            }
         }
         XmlType type = javaType.getAnnotation(XmlType.class);
         if (type != null) {
@@ -107,7 +124,7 @@
                 name = Introspector.decapitalize(javaType.getSimpleName());
             }
         }
-        if (namespace == null && name == null) {
+        if (name == null) {
             return null;
         }
         QName xmlType = new QName(namespace, name);

Modified: 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/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandler.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandler.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBExceptionHandler.java Thu Feb 22 13:57:46 2007
@@ -26,6 +26,7 @@
 import javax.xml.ws.WebFault;
 
 import org.apache.tuscany.spi.databinding.ExceptionHandler;
+import org.apache.tuscany.spi.idl.ElementInfo;
 import org.apache.tuscany.spi.model.DataType;
 
 /**
@@ -97,6 +98,7 @@
             // only part in
             // the fault message references
             DataType<QName> faultType = new DataType<QName>(JAXBDataBinding.NAME, faultBeanClass, element);
+            faultType.setMetadata(ElementInfo.class.getName(), new ElementInfo(element, null));
             return faultType;
         }
     }

Modified: incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.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/JAXBWrapperHandler.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java Thu Feb 22 13:57:46 2007
@@ -19,13 +19,14 @@
 
 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;
@@ -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;
     }
 
 }

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=510671&r1=510670&r2=510671
==============================================================================
--- 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 Thu Feb 22 13:57:46 2007
@@ -19,6 +19,8 @@
 
 package org.apache.tuscany.databinding.jaxb;
 
+import java.lang.annotation.Annotation;
+
 import javax.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
 
@@ -48,22 +50,30 @@
 
     /**
      * Test method for
-     * {@link org.apache.tuscany.databinding.jaxb.JAXBDataBinding#introspect(java.lang.Class)}.
+     * {@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() == null);
+        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"), dataType.getLogical());
+        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"), dataType.getLogical());
+        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"), dataType.getLogical());
 
     }
 

Added: 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/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java?view=auto&rev=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java (added)
+++ incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java Thu Feb 22 13:57:46 2007
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.databinding.jaxb;
+
+import java.util.List;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.spi.idl.ElementInfo;
+
+import com.example.ipo.jaxb.ObjectFactory;
+import com.example.ipo.jaxb.PurchaseOrderType;
+
+/**
+ * Test case for JAXBExceptionHandler
+ */
+public class JAXBWrapperHandlerTestCase extends TestCase {
+    private static final QName ELEMENT = new QName("http://www.example.com/IPO", "purchaseOrder");
+    private JAXBWrapperHandler handler;
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+        this.handler = new JAXBWrapperHandler();
+    }
+
+    public void testCreate() {
+        // ElementInfo element = new ElementInfo(ELEMENT, null);
+        // JAXBElement<?> jaxbElement = handler.create(element, null);
+    }
+
+    public void testSetChild() {
+        ObjectFactory factory = new ObjectFactory();
+        PurchaseOrderType po = factory.createPurchaseOrderType();
+        JAXBElement<PurchaseOrderType> wrapper = factory.createPurchaseOrder(po);
+        handler.setChild(wrapper, 2, null, "Comment");
+    }
+
+    public void testGetChildren() {
+        ObjectFactory factory = new ObjectFactory();
+        PurchaseOrderType po = factory.createPurchaseOrderType();
+        po.setComment("Comment");
+        JAXBElement<PurchaseOrderType> wrapper = factory.createPurchaseOrder(po);
+        List children = handler.getChildren(wrapper);
+        assertNotNull(children);
+        assertEquals(4, children.size());
+        assertEquals("Comment", children.get(2));
+        assertNull(children.get(0));
+    }
+}

Propchange: incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2String.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2String.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2String.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2String.java Thu Feb 22 13:57:46 2007
@@ -18,8 +18,6 @@
  */
 package org.apache.tuscany.databinding.sdo;
 
-import static org.apache.tuscany.databinding.sdo.SDODataBinding.ROOT_ELEMENT;
-
 import javax.xml.namespace.QName;
 
 import org.apache.tuscany.spi.databinding.PullTransformer;
@@ -41,13 +39,8 @@
         try {
             HelperContext helperContext = SDODataTypeHelper.getHelperContext(context);
             XMLHelper xmlHelper = helperContext.getXMLHelper();
-            Object logicalType = context.getSourceDataType().getLogical();
-            if (logicalType instanceof QName) {
-                QName elementName = (QName)logicalType;
-                return xmlHelper.save(source, elementName.getNamespaceURI(), elementName.getLocalPart());
-            } else {
-                return xmlHelper.save(source, ROOT_ELEMENT.getNamespaceURI(), ROOT_ELEMENT.getLocalPart());
-            }
+            QName elementName = SDODataTypeHelper.getElement(context.getSourceDataType());
+            return xmlHelper.save(source, elementName.getNamespaceURI(), elementName.getLocalPart());
         } catch (Exception e) {
             throw new TransformationException(e);
         }

Modified: incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2XMLStreamReader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2XMLStreamReader.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2XMLStreamReader.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2XMLStreamReader.java Thu Feb 22 13:57:46 2007
@@ -44,9 +44,7 @@
         try {
             HelperContext helperContext = SDODataTypeHelper.getHelperContext(context);
             XMLStreamHelper streamHelper = SDOUtil.createXMLStreamHelper(helperContext.getTypeHelper());
-            Object logicalType = context.getSourceDataType().getLogical();
-            QName elementName =
-                    (logicalType instanceof QName) ? (QName) logicalType : SDODataBinding.ROOT_ELEMENT;
+            QName elementName = SDODataTypeHelper.getElement(context.getSourceDataType());
             XMLHelper xmlHelper = helperContext.getXMLHelper();
             XMLDocument document =
                     xmlHelper.createDocument(source, elementName.getNamespaceURI(), elementName.getLocalPart());

Modified: incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataBinding.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataBinding.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataBinding.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataBinding.java Thu Feb 22 13:57:46 2007
@@ -19,6 +19,8 @@
 
 package org.apache.tuscany.databinding.sdo;
 
+import java.lang.annotation.Annotation;
+
 import javax.xml.namespace.QName;
 
 import org.apache.tuscany.spi.databinding.ExceptionHandler;
@@ -52,30 +54,33 @@
     }
 
     @Override
-    public DataType introspect(Class<?> javaType) {
-        if (javaType == null) {
-            return null;
+    public boolean introspect(DataType dataType, Annotation[] annotations) {
+        Object physical = dataType.getPhysical();
+        if (!(physical instanceof Class)) {
+            return false;
         }
+        Class javaType = (Class)physical;
         HelperContext context = HelperProvider.getDefaultContext();
         // FIXME: Need a better to test dynamic SDO
         if (DataObject.class.isAssignableFrom(javaType)) {
             // Dynamic SDO
-            return new DataType<QName>(getName(), javaType, null);
+            dataType.setLogical(DataObject.class);
+            return true;
         }
         // FIXME: We need to access HelperContext
         Type type = context.getTypeHelper().getType(javaType);
         if (type == null) {
-            return null;
+            return false;
         }
         if (type.isDataType()) {
             // FIXME: Ignore simple types?
-            return null;
+            return false;
         }
         String namespace = type.getURI();
         String name = context.getXSDHelper().getLocalName(type);
         QName xmlType = new QName(namespace, name);
-        DataType<QName> dataType = new DataType<QName>(getName(), javaType, xmlType);
-        return dataType;
+        dataType.setLogical(xmlType);
+        return true;
     }
 
     @Override

Modified: incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataTypeHelper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataTypeHelper.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataTypeHelper.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataTypeHelper.java Thu Feb 22 13:57:46 2007
@@ -19,11 +19,15 @@
 
 package org.apache.tuscany.databinding.sdo;
 
+import javax.xml.namespace.QName;
+
 import org.apache.tuscany.databinding.sdo.ImportSDOLoader.SDOType;
 import org.apache.tuscany.sdo.util.SDOUtil;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.databinding.TransformationContext;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.idl.ElementInfo;
+import org.apache.tuscany.spi.model.DataType;
 
 import commonj.sdo.helper.HelperContext;
 import commonj.sdo.impl.HelperProvider;
@@ -53,11 +57,12 @@
             return helperContext;
         }
     }
-    
+
     public static HelperContext getHelperContext(DeploymentContext deploymentContext) {
         HelperContext helperContext = null;
         if (deploymentContext != null && deploymentContext.getParent() != null) {
-            // HACK: Retrieve the SDO HelperContext from the CompositeComponent extensions
+            // HACK: Retrieve the SDO HelperContext from the CompositeComponent
+            // extensions
             helperContext = (HelperContext)deploymentContext.getParent().getExtension(HelperContext.class.getName());
             if (helperContext == null) {
                 helperContext = SDOUtil.createHelperContext();
@@ -68,12 +73,21 @@
         if (helperContext == null) {
             helperContext = getDefaultHelperContext();
         }
-        
+
         return helperContext;
     }
-    
+
     protected static HelperContext getDefaultHelperContext() {
         // SDOUtil.createHelperContext();
         return HelperProvider.getDefaultContext();
+    }
+
+    public static QName getElement(DataType<?> dataType) {
+        ElementInfo info = (ElementInfo)dataType.getMetadata().get(ElementInfo.class.getName());
+        if (info == null) {
+            return SDODataBinding.ROOT_ELEMENT;
+        } else {
+            return info.getQName();
+        }
     }
 }

Modified: incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOWrapperHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOWrapperHandler.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOWrapperHandler.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOWrapperHandler.java Thu Feb 22 13:57:46 2007
@@ -19,6 +19,9 @@
 
 package org.apache.tuscany.databinding.sdo;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.xml.namespace.QName;
 
 import org.apache.tuscany.spi.databinding.TransformationContext;
@@ -50,16 +53,6 @@
     }
 
     /**
-     * @see org.apache.tuscany.spi.databinding.WrapperHandler#getChild(java.lang.Object,
-     *      int, ElementInfo)
-     */
-    public Object getChild(Object wrapper, int i, ElementInfo element) {
-        DataObject wrapperDO =
-            (wrapper instanceof XMLDocument) ? ((XMLDocument)wrapper).getRootObject() : (DataObject)wrapper;
-        return wrapperDO.get(element.getQName().getLocalPart());
-    }
-
-    /**
      * @see org.apache.tuscany.spi.databinding.WrapperHandler#setChild(java.lang.Object,
      *      int, ElementInfo, java.lang.Object)
      */
@@ -67,6 +60,17 @@
         DataObject wrapperDO =
             (wrapper instanceof XMLDocument) ? ((XMLDocument)wrapper).getRootObject() : (DataObject)wrapper;
         wrapperDO.set(childElement.getQName().getLocalPart(), value);
+    }
+
+    public List getChildren(Object wrapper) {
+        DataObject wrapperDO =
+            (wrapper instanceof XMLDocument) ? ((XMLDocument)wrapper).getRootObject() : (DataObject)wrapper;
+        List properties = wrapperDO.getInstanceProperties();
+        List<Object> elements = new ArrayList<Object>();
+        for (int i = 0; i < properties.size(); i++) {
+            elements.add(wrapperDO.get(i));
+        }
+        return elements;
     }
 
 }

Modified: incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/test/java/org/apache/tuscany/databinding/sdo/SDODataBindingTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/test/java/org/apache/tuscany/databinding/sdo/SDODataBindingTestCase.java?view=diff&rev=510671&r1=510670&r2=510671
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/test/java/org/apache/tuscany/databinding/sdo/SDODataBindingTestCase.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/services/databinding/databinding-sdo/src/test/java/org/apache/tuscany/databinding/sdo/SDODataBindingTestCase.java Thu Feb 22 13:57:46 2007
@@ -53,15 +53,21 @@
     }
 
     public final void testIntrospect() {
-        DataType<?> dataType = binding.introspect(DataObject.class);
-        Assert.assertTrue(dataType.getDataBinding().equals(binding.getName()));
-        Assert.assertTrue(dataType.getPhysical() == DataObject.class && dataType.getLogical() == null);
-        dataType = binding.introspect(PurchaseOrderType.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 dataType = new DataType(DataObject.class, null);
+        boolean yes = binding.introspect(dataType, null);
+        assertTrue(yes);
+        assertTrue(dataType.getDataBinding().equals(binding.getName()));
+        assertTrue(dataType.getPhysical() == DataObject.class && dataType.getLogical() == DataObject.class);
+        dataType = new DataType(PurchaseOrderType.class, null);
+        yes = binding.introspect(dataType, null);
+        assertTrue(yes);
+        assertEquals(PurchaseOrderType.class, dataType.getPhysical());
+        assertEquals(new QName("http://www.example.com/IPO", "PurchaseOrderType"), dataType.getLogical());
+        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"), dataType.getLogical());
     }
 
     public final void testCopyRoot() {



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