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 2006/09/18 07:33:14 UTC

svn commit: r447254 [2/3] - in /incubator/tuscany/java: samples/sca/echo.databinding/src/main/java/echo/ samples/sca/helloworldws/ samples/sca/helloworldws/src/main/java/helloworld/ samples/sca/helloworldws/src/main/resources/wsdl/ samples/sca/hellowor...

Modified: incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/Axis2TargetInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/Axis2TargetInvoker.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/Axis2TargetInvoker.java (original)
+++ incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/Axis2TargetInvoker.java Sun Sep 17 22:33:12 2006
@@ -32,7 +32,6 @@
 import org.apache.axis2.client.ServiceClient;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.wsdl.WSDLConstants;
-import org.apache.tuscany.binding.axis2.util.SDODataBinding;
 import org.apache.tuscany.spi.wire.InvocationRuntimeException;
 import org.apache.tuscany.spi.wire.Message;
 import org.apache.tuscany.spi.wire.TargetInvoker;
@@ -43,18 +42,17 @@
 public class Axis2TargetInvoker implements TargetInvoker {
 
     private QName wsdlOperationName;
-    private Options options;
 
-    private SDODataBinding dataBinding;
+    private Options options;
 
     private SOAPFactory soapFactory;
 
     private ServiceClient serviceClient;
-    
-    public Axis2TargetInvoker(ServiceClient serviceClient, QName wsdlOperationName, Options options, SDODataBinding dataBinding, SOAPFactory soapFactory) {
+
+    public Axis2TargetInvoker(ServiceClient serviceClient, QName wsdlOperationName, Options options,
+            SOAPFactory soapFactory) {
         this.wsdlOperationName = wsdlOperationName;
         this.options = options;
-        this.dataBinding = dataBinding;
         this.soapFactory = soapFactory;
         this.serviceClient = serviceClient;
     }
@@ -69,23 +67,12 @@
     public Object invokeTarget(final Object payload) throws InvocationTargetException {
         try {
             Object[] args = (Object[]) payload;
-            boolean pureOMelement = (args != null && args.length > 0 && (args[0] instanceof OMElement));
             OperationClient operationClient = createOperationClient(args);
 
             operationClient.execute(true);
 
             MessageContext responseMC = operationClient.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
-            OMElement responseOM = responseMC.getEnvelope().getBody().getFirstElement();
-
-            if (pureOMelement) {
-                return responseOM;
-            } else {
-                Object[] os = null;
-                if (responseOM != null) {
-                    os = dataBinding.fromOMElement(responseOM);
-                }
-                return (os!=null && os.length>=1)? os[0]: null;
-            }
+            return responseMC.getEnvelope().getBody().getFirstElement();
 
         } catch (AxisFault e) {
             throw new InvocationTargetException(e);
@@ -96,20 +83,14 @@
     protected OperationClient createOperationClient(Object[] args) throws AxisFault {
         SOAPEnvelope env = soapFactory.getDefaultEnvelope();
         if (args != null && args.length > 0) {
-            // TODO HACK
-            if (args[0] instanceof OMElement) {
-                SOAPBody body = env.getBody();
-                for (Object bc : args) {
-                    if (bc instanceof OMElement) {
-                        body.addChild((OMElement) bc);
-                    } else {
-                        throw new IllegalArgumentException(
-                                "Can't handle mixed payloads betweem OMElements and other types.");
-                    }
+            SOAPBody body = env.getBody();
+            for (Object bc : args) {
+                if (bc instanceof OMElement) {
+                    body.addChild((OMElement) bc);
+                } else {
+                    throw new IllegalArgumentException(
+                            "Can't handle mixed payloads betweem OMElements and other types.");
                 }
-            } else {
-                OMElement requestOM = dataBinding.toOMElement(args);
-                env.getBody().addChild(requestOM);
             }
         }
         MessageContext requestMC = new MessageContext();
@@ -151,8 +132,5 @@
     public boolean isOptimizable() {
         return false;
     }
-    
-    protected SDODataBinding getDataBinding() {
-        return dataBinding;
-    }
+
 }

Modified: incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/WebServiceBinding.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/WebServiceBinding.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/WebServiceBinding.java (original)
+++ incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/WebServiceBinding.java Sun Sep 17 22:33:12 2006
@@ -36,8 +36,6 @@
     private Service service;
     //private String portURI;
     private String uri;
-    private String webAppName;
-
     public WebServiceBinding(Definition definition, Port port, String uri, String portURI, Service service) {
         this.definition = definition;
         this.port = port;
@@ -76,13 +74,5 @@
 
     public void setURI(String theUri) {
         this.uri = theUri;
-    }
-
-    public void setWebAppName(String webAppName) {
-        this.webAppName = webAppName;
-    }
-
-    public String getWebAppName() {
-        return webAppName;
     }
 }

Modified: incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/WebServiceBindingLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/WebServiceBindingLoader.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/WebServiceBindingLoader.java (original)
+++ incubator/tuscany/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/WebServiceBindingLoader.java Sun Sep 17 22:33:12 2006
@@ -21,21 +21,17 @@
 import static org.osoa.sca.Version.XML_NAMESPACE_1_0;
 
 import java.io.IOException;
-import java.net.URL;
 import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
 
 import javax.wsdl.Definition;
 import javax.wsdl.Port;
 import javax.wsdl.Service;
 import javax.wsdl.WSDLException;
-import javax.wsdl.factory.WSDLFactory;
-import javax.wsdl.xml.WSDLReader;
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.tuscany.idl.wsdl.WSDLDefinitionRegistry;
 import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
@@ -43,8 +39,8 @@
 import org.apache.tuscany.spi.loader.LoaderException;
 import org.apache.tuscany.spi.loader.LoaderRegistry;
 import org.apache.tuscany.spi.loader.LoaderUtil;
+import org.osoa.sca.annotations.Constructor;
 import org.osoa.sca.annotations.Scope;
-import org.xml.sax.InputSource;
 
 /**
  * Parses a <code>WebServiceBinding</code> entry in an assembly XML file
@@ -52,52 +48,48 @@
  * @version $Rev$ $Date$
  */
 @Scope("MODULE")
+@SuppressWarnings("deprecation")
 public class WebServiceBindingLoader extends LoaderExtension<WebServiceBinding> {
     public static final QName BINDING_WS = new QName(XML_NAMESPACE_1_0, "binding.ws");
 
-    private String wsdlLocation;
+    private WSDLDefinitionRegistry wsdlDefinitionRegistry;
 
-    private String endpointAttribute;
-
- 
-    public WebServiceBindingLoader(@Autowire
-    LoaderRegistry registry) {
-        super(registry);
+    @Constructor( { "loaderRegistry", "wsdlDefinitionRegistry" })
+    public WebServiceBindingLoader(@Autowire LoaderRegistry loaderRegistry, 
+            @Autowire WSDLDefinitionRegistry wsdlDefinitionRegistry) {
+        super(loaderRegistry);
+        this.wsdlDefinitionRegistry = wsdlDefinitionRegistry;
     }
 
     public QName getXMLType() {
         return BINDING_WS;
     }
 
-    public WebServiceBinding load(CompositeComponent parent, XMLStreamReader reader,
-            DeploymentContext deploymentContext) throws XMLStreamException,
-            LoaderException {
+    public WebServiceBinding load(CompositeComponent parent, XMLStreamReader reader, DeploymentContext deploymentContext)
+        throws XMLStreamException, LoaderException {
         // not sure what uri was here ? String uri = reader.getAttributeValue(null, "uri");
         String uri = null;
-        endpointAttribute = reader.getAttributeValue(null, "endpoint");
-        wsdlLocation = reader.getAttributeValue(null, "location");
+        String endpoint = reader.getAttributeValue(null, "endpoint");
+        String wsdlLocation = reader.getAttributeValue(null, "location");
         LoaderUtil.skipToEndElement(reader);
         try {
-            return createBinding(uri, endpointAttribute, deploymentContext);
+            return createBinding(uri, endpoint, wsdlLocation, deploymentContext);
         } catch (Exception e) {
-
             throw new LoaderException(e);
         }
-        
+
     }
 
     @SuppressWarnings("unchecked")
-    private WebServiceBinding createBinding(String port, String portURI, DeploymentContext deploymentContext) throws WSDLException, IOException {
-        List<Definition> definitions = null;
-        // FIXME wsdlRegistry.getDefinitionsForNamespace(portNamespace,
-        // resourceLoader);
+    private WebServiceBinding createBinding(String port, String portURI, String wsdlLocation, DeploymentContext deploymentContext)
+        throws WSDLException, IOException {
         // Get the WSDL port namespace and name
         if (port == null && portURI != null) {
             int h = portURI.indexOf('#');
- //           String portNamespace = portURI.substring(0, h);
             String serviceName;
             String portName;
 
+            String namespace = portURI.substring(0, h);
             String fragment = portURI.substring(h + 1);
             if (fragment.startsWith("wsdl.endpoint(") && fragment.endsWith(")")) {
                 fragment = fragment.substring(14, fragment.length() - 1);
@@ -114,42 +106,27 @@
                 portName = fragment;
             }
             // FIXME need to find out how to get wsdl and what context to use --- terrible hack attack!
-            // URL wsdlurl = Thread.currentThread().getContextClassLoader().getResource(wsdlLocation);
-            if(null == wsdlLocation) throw new RuntimeException("Failed to determin wsdl location on binding. Try specifying 'location' attribute on  binding.");
-            URL wsdlurl = deploymentContext.getClassLoader().getResource(wsdlLocation);
-            if(wsdlurl == null){
-                Axis2BindingBuilderRuntimeException   axis2BindingLoaderException = new Axis2BindingBuilderRuntimeException("Failed to load wsdl");
-                axis2BindingLoaderException.setResourceURI(wsdlLocation); 
-                throw axis2BindingLoaderException;
-            }
-            WSDLFactory factory = WSDLFactory.newInstance();
-            WSDLReader reader = factory.newWSDLReader();
-            reader.setFeature("javax.wsdl.verbose", false);
-            InputSource input = new InputSource(wsdlurl.openStream());
-            Definition wsdlDef = reader.readWSDL(wsdlurl.toString(), input);
-            definitions = new LinkedList<Definition>();
-            definitions.add(wsdlDef);
-            // FIXME all the above needs to better addressed.
+            if (null == wsdlLocation) {
+                throw new Axis2BindingRunTimeException(
+                        "Failed to determin wsdl location on binding. Try specifying 'location' attribute on  binding.");
+            }    
+            Definition definition =
+                    wsdlDefinitionRegistry.loadDefinition(namespace+" "+wsdlLocation, deploymentContext.getClassLoader());
 
-            Definition definition = null;
             Port thePort = null;
             Service service = null;
-            for (Definition def : definitions) {
+            // Find the port with the given name
+            for (Service serv : (Collection<Service>) definition.getServices().values()) {
+                QName sqn = serv.getQName();
+                if (serviceName != null && !serviceName.equals(sqn.getLocalPart())) {
+                    continue;
+                }
 
-                // Find the port with the given name
-                for (Service serv : (Collection<Service>) def.getServices().values()) {
-                    QName sqn = serv.getQName();
-                    if (serviceName != null && !serviceName.equals(sqn.getLocalPart())) {
-                        continue;
-                    }
-
-                    Port p = serv.getPort(portName);
-                    if (p != null) {
-                        service = serv;
-                        definition = def;
-                        thePort = p;
-                        break;
-                    }
+                Port p = serv.getPort(portName);
+                if (p != null) {
+                    service = serv;
+                    thePort = p;
+                    break;
                 }
             }
             if (thePort == null) {
@@ -158,7 +135,7 @@
             }
             return new WebServiceBinding(definition, thePort, port, portURI, service);
         }
-        // FIXME
+        // FIXME: Find the first port?
         return null;
 
     }

Modified: incubator/tuscany/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/Axis2ReferenceTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/Axis2ReferenceTestCase.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/Axis2ReferenceTestCase.java (original)
+++ incubator/tuscany/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/Axis2ReferenceTestCase.java Sun Sep 17 22:33:12 2006
@@ -20,6 +20,7 @@
 
 import java.lang.reflect.Type;
 import java.net.URL;
+
 import javax.wsdl.Definition;
 import javax.wsdl.Port;
 import javax.wsdl.Service;
@@ -27,8 +28,9 @@
 import javax.wsdl.xml.WSDLReader;
 import javax.xml.namespace.QName;
 
-import org.xml.sax.InputSource;
+import junit.framework.TestCase;
 
+import org.apache.tuscany.idl.wsdl.WSDLServiceContract;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.component.WorkContext;
 import org.apache.tuscany.spi.idl.java.JavaServiceContract;
@@ -37,12 +39,8 @@
 import org.apache.tuscany.spi.wire.InboundWire;
 import org.apache.tuscany.spi.wire.TargetInvoker;
 import org.apache.tuscany.spi.wire.WireService;
-
-import commonj.sdo.helper.TypeHelper;
-import junit.framework.TestCase;
-
-import org.apache.tuscany.idl.wsdl.WSDLServiceContract;
-import org.easymock.classextension.EasyMock;
+import org.easymock.EasyMock;
+import org.xml.sax.InputSource;
 
 public class Axis2ReferenceTestCase extends TestCase {
 
@@ -83,13 +81,12 @@
             "SOAPService"));
         Port port = wsdlService.getPort("SoapPort");
         WebServiceBinding wsBinding = new WebServiceBinding(wsdlDef, port, "uri", "portURI", wsdlService);
-        wsBinding.setWebAppName(webAppName);
         //Create a mocked WireService, make the call of ServiceExtension.getServiceInstance() returns a proxy instance.
         WireService wireService = EasyMock.createNiceMock(WireService.class);
         EasyMock.replay(wireService);
         CompositeComponent parent = EasyMock.createNiceMock(CompositeComponent.class);
         // TODO figure out what to do with the service contract
-        ServiceContract contract = new WSDLServiceContract();
+        ServiceContract<?> contract = new WSDLServiceContract();
         contract.setInterfaceClass(Greeter.class);
         WorkContext workContext = EasyMock.createNiceMock(WorkContext.class);
         EasyMock.replay(workContext);
@@ -98,7 +95,6 @@
                 wireService,
                 wsBinding,
                 contract,
-                TypeHelper.INSTANCE,
                 workContext);
     }
 }

Modified: incubator/tuscany/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/Axis2ServiceTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/Axis2ServiceTestCase.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/Axis2ServiceTestCase.java (original)
+++ incubator/tuscany/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/Axis2ServiceTestCase.java Sun Sep 17 22:33:12 2006
@@ -18,6 +18,8 @@
  */
 package org.apache.tuscany.binding.axis2;
 
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
 import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
@@ -36,18 +38,20 @@
 import org.apache.tuscany.spi.component.WorkContext;
 import org.apache.tuscany.spi.host.ServletHost;
 import org.apache.tuscany.spi.idl.java.JavaServiceContract;
+import org.apache.tuscany.spi.model.Operation;
 import org.apache.tuscany.spi.wire.InboundWire;
+import org.apache.tuscany.spi.wire.OutboundInvocationChain;
+import org.apache.tuscany.spi.wire.OutboundWire;
 import org.apache.tuscany.spi.wire.WireService;
 
-import commonj.sdo.helper.TypeHelper;
 import junit.framework.TestCase;
-import org.easymock.classextension.EasyMock;
+import org.easymock.EasyMock;
 
 public class Axis2ServiceTestCase extends TestCase {
 
     public void testInvokeService() throws Exception {
         TestServletHost tomcatHost = new TestServletHost();
-        Axis2Service axis2Service = createAxis2Service("testWebAppName", "testServiceName", tomcatHost, false);
+        Axis2Service axis2Service = createAxis2Service("testServiceName", tomcatHost, false);
         axis2Service.start();
 
         if (true) return;
@@ -62,11 +66,11 @@
     public void testAsyncMessageReceiver() throws Exception {
 
         TestServletHost tomcatHost = new TestServletHost();
-        Axis2Service axis2Service = createAxis2Service("testWebAppName", "testServiceName", tomcatHost, true);
+        Axis2Service axis2Service = createAxis2Service("testServiceName", tomcatHost, true);
         axis2Service.start();
     }
 
-    private Axis2Service createAxis2Service(String webAppName, String serviceName, ServletHost tomcatHost, boolean callback)
+    private Axis2Service createAxis2Service(String serviceName, ServletHost tomcatHost, boolean callback)
         throws Exception {
         //Create WebServiceBinding
         String wsdlLocation = "/wsdl/hello_world_doc_lit.wsdl";
@@ -82,7 +86,6 @@
             "SOAPService"));
         Port port = wsdlService.getPort("SoapPort");
         WebServiceBinding wsBinding = new WebServiceBinding(wsdlDef, port, "uri", "portURI", wsdlService);
-        wsBinding.setWebAppName(webAppName);
 
         //Create a mocked WireService, make the call of ServiceExtension.getServiceInstance() returns a proxy instance.
         WireService wireService = EasyMock.createNiceMock(WireService.class);
@@ -93,27 +96,37 @@
         //Create a mocked InboundWire, make the call of ServiceExtension.getInterface() returns a Class
         InboundWire inboundWire = EasyMock.createNiceMock(InboundWire.class);
         JavaServiceContract contract = new JavaServiceContract(Greeter.class);
+        Map<String, Operation<Type>> opMap = new HashMap<String, Operation<Type>>();
+        for(Method m: Greeter.class.getMethods()) {
+            opMap.put(m.getName(), new Operation<Type>(m.getName(), null, null, null));
+        }
+        contract.setOperations(opMap);
         EasyMock.expect(inboundWire.getServiceContract()).andReturn(contract).anyTimes();
         if (callback) {
             EasyMock.expect(inboundWire.getCallbackReferenceName()).andReturn("").anyTimes();
         }
         EasyMock.replay(inboundWire);
 
+        OutboundWire outboundWire = EasyMock.createNiceMock(OutboundWire.class);
+        Map<Operation<?>, OutboundInvocationChain> map = new HashMap<Operation<?>, OutboundInvocationChain>();
+        EasyMock.expect(outboundWire.getInvocationChains()).andReturn(map).once();
+        EasyMock.replay(outboundWire);
+
         TuscanyAxisConfigurator tuscanyAxisConfigurator = new TuscanyAxisConfigurator();
         ConfigurationContext configurationContext = tuscanyAxisConfigurator.getConfigurationContext();
         WorkContext workContext = EasyMock.createNiceMock(WorkContext.class);
         EasyMock.replay(workContext);
         Axis2Service axis2Service =
             new Axis2Service(serviceName,
-                Greeter.class,
+                contract,
                 null,
                 wireService,
                 wsBinding,
                 tomcatHost,
                 configurationContext,
-                TypeHelper.INSTANCE,
                 workContext);
         axis2Service.setInboundWire(inboundWire);
+        axis2Service.setOutboundWire(outboundWire);
 
         return axis2Service;
     }

Modified: incubator/tuscany/java/sca/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/AxiomDataBinding.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/AxiomDataBinding.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/AxiomDataBinding.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/AxiomDataBinding.java Sun Sep 17 22:33:12 2006
@@ -30,6 +30,8 @@
  */
 @Service(DataBinding.class)
 public class AxiomDataBinding extends DataBindingExtension {
+    
+    public static final String NAME = OMElement.class.getName();
 
     public AxiomDataBinding() {
         super(OMElement.class);

Modified: incubator/tuscany/java/sca/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/String2OMElement.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/String2OMElement.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/String2OMElement.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/String2OMElement.java Sun Sep 17 22:33:12 2006
@@ -44,21 +44,29 @@
         try {
             StAXOMBuilder builder = new StAXOMBuilder(new ByteArrayInputStream(source.getBytes()));
             OMElement element = builder.getDocumentElement();
-            if (context != null) {
-                DataType<QName> dataType = context.getTargetDataType();
-                QName targetQName = dataType == null ? null : dataType.getLogical();
-                if (targetQName != null && !element.getQName().equals(targetQName)) {
-                    // TODO: Throw expection or switch to the new Element
-                    OMFactory factory = OMAbstractFactory.getOMFactory();
-                    OMNamespace namespace =
-                            factory.createOMNamespace(targetQName.getNamespaceURI(), targetQName.getPrefix());
-                    element.setNamespace(namespace);
-                    element.setLocalName(targetQName.getLocalPart());
-                }
-            }
+            adjustElementName(context, element);
             return element;
         } catch (Exception e) {
             throw new TransformationException(e);
+        }
+    }
+
+    /**
+     * @param context
+     * @param element
+     */
+    private void adjustElementName(TransformationContext context, OMElement element) {
+        if (context != null) {
+            DataType<QName> dataType = context.getTargetDataType();
+            QName targetQName = dataType == null ? null : dataType.getLogical();
+            if (targetQName != null && !element.getQName().equals(targetQName)) {
+                // TODO: Throw expection or switch to the new Element
+                OMFactory factory = OMAbstractFactory.getOMFactory();
+                OMNamespace namespace =
+                        factory.createOMNamespace(targetQName.getNamespaceURI(), targetQName.getPrefix());
+                element.setNamespace(namespace);
+                element.setLocalName(targetQName.getLocalPart());
+            }
         }
     }
 

Modified: incubator/tuscany/java/sca/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/XMLStreamReader2OMElement.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/XMLStreamReader2OMElement.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/XMLStreamReader2OMElement.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/XMLStreamReader2OMElement.java Sun Sep 17 22:33:12 2006
@@ -18,15 +18,20 @@
  */
 package org.apache.tuscany.databinding.axiom;
 
+import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.axiom.om.OMAbstractFactory;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.impl.builder.StAXOMBuilder;
 import org.apache.tuscany.databinding.TransformationContext;
 import org.apache.tuscany.databinding.TransformationException;
 import org.apache.tuscany.databinding.PullTransformer;
 import org.apache.tuscany.databinding.Transformer;
 import org.apache.tuscany.databinding.extension.TransformerExtension;
+import org.apache.tuscany.spi.model.DataType;
 import org.osoa.sca.annotations.Service;
 
 @Service(Transformer.class)
@@ -39,11 +44,36 @@
     public OMElement transform(XMLStreamReader source, TransformationContext context) {
         try {
             StAXOMBuilder builder = new StAXOMBuilder(source);
-            return builder.getDocumentElement();
+            OMElement element = builder.getDocumentElement();
+            adjustElementName(context, element);
+            return element;
         } catch (Exception e) {
             throw new TransformationException(e);
         }
     }
+    
+    /**
+     * For data trasnformation purpose, we may only care about the content of the OMElement.
+     * If the incoming OMElement is under a different name, then we try to adjust it based on the target
+     * data type
+     * @param context
+     * @param element
+     */
+    private void adjustElementName(TransformationContext context, OMElement element) {
+        if (context != null) {
+            DataType<QName> dataType = context.getTargetDataType();
+            QName targetQName = dataType == null ? null : dataType.getLogical();
+            if (targetQName != null && !element.getQName().equals(targetQName)) {
+                // TODO: Throw expection or switch to the new Element
+                OMFactory factory = OMAbstractFactory.getOMFactory();
+                OMNamespace namespace =
+                        factory.createOMNamespace(targetQName.getNamespaceURI(), targetQName.getPrefix());
+                element.setNamespace(namespace);
+                element.setLocalName(targetQName.getLocalPart());
+            }
+        }
+    }
+    
 
     public Class getTargetType() {
         return OMElement.class;

Modified: incubator/tuscany/java/sca/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementWrapperTransformerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementWrapperTransformerTestCase.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementWrapperTransformerTestCase.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementWrapperTransformerTestCase.java Sun Sep 17 22:33:12 2006
@@ -79,7 +79,7 @@
         Definition definition = registry.loadDefinition(null, url);
         PortType portType = definition.getPortType(PORTTYPE_NAME);
         Operation operation = portType.getOperation("checkOrderStatus", null, null);
-        WSDLOperation op = new WSDLOperation(operation, OMElement.class.getName(), registry.getSchemaRegistry());
+        WSDLOperation op = new WSDLOperation(operation, AxiomDataBinding.NAME, registry.getSchemaRegistry());
         Assert.assertTrue(op.isWrapperStyle());
 
         MediatorImpl m = new MediatorImpl();
@@ -90,7 +90,7 @@
         DataBindingRegistry dataBindingRegistry = new DataBindingRegistryImpl();
         dataBindingRegistry.register(new AxiomDataBinding());
         m.setDataBindingRegistry(dataBindingRegistry);
-        
+
         Object[] source = new Object[] { "cust001", IPO_XML, Integer.valueOf(1) };
         Input2InputTransformer t = new Input2InputTransformer();
         t.setDataBindingRegistry(dataBindingRegistry);
@@ -112,14 +112,23 @@
         Assert.assertEquals(new QName("http://example.com/order.xsd", "checkOrderStatus"), element.getQName());
 
         TransformationContext context1 = new TransformationContextImpl();
-        context1.setSourceDataType(op.getOutputType());
-        context1.setTargetDataType(new DataType<Class>("java.lang.String", String.class, String.class));
+        DataType<DataType> sourceType = new DataType<DataType>("idl:output", Object.class, op.getOutputType());
+        sourceType.setMetadata(WSDLOperation.class.getName(), op.getOutputType().getMetadata(
+                WSDLOperation.class.getName()));
+        
+        context1.setSourceDataType(sourceType);
+        DataType<DataType> targetType =
+                new DataType<DataType>("idl:output", Object.class, new DataType<Class>("java.lang.String",
+                        String.class, String.class));
+        context1.setTargetDataType(targetType);
+
         OMFactory factory = OMAbstractFactory.getOMFactory();
         OMElement responseElement =
                 factory.createOMElement(new QName("http://example.com/order.wsdl", "checkOrderStatusResponse"), null);
         OMElement status = factory.createOMElement(new QName(null, "status"), responseElement);
         factory.createOMText(status, "shipped");
         Output2OutputTransformer t2 = new Output2OutputTransformer();
+        t2.setMediator(m);
         t2.setDataBindingRegistry(dataBindingRegistry);
         Object st = t2.transform(responseElement, context1);
         Assert.assertEquals("shipped", st);

Modified: incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/Mediator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/Mediator.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/Mediator.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/Mediator.java Sun Sep 17 22:33:12 2006
@@ -18,6 +18,8 @@
  */
 package org.apache.tuscany.databinding;
 
+import java.util.Map;
+
 import org.apache.tuscany.spi.model.DataType;
 
 /**
@@ -33,9 +35,10 @@
      * @param source The data to be mediated
      * @param sourceDataType Data type for the source data
      * @param targetDataType Data type for the target data
+     * @param context 
      * @return
      */
-    public Object mediate(Object source, DataType sourceDataType, DataType targetDataType);
+    Object mediate(Object source, DataType sourceDataType, DataType targetDataType, Map<Class<?>, Object> context);
     /**
      * Mediate the source data into the target which is a sink to receive the data
      * @param source The data to be mediated
@@ -43,6 +46,6 @@
      * @param sourceDataType Data type for the source data
      * @param targetDataType Data type for the target data
      */
-    public void mediate(Object source, Object target, DataType sourceDataType, DataType targetDataType);
+    void mediate(Object source, Object target, DataType sourceDataType, DataType targetDataType, Map<Class<?>, Object> context);
     
 }

Modified: incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/TransformationContext.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/TransformationContext.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/TransformationContext.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/TransformationContext.java Sun Sep 17 22:33:12 2006
@@ -18,6 +18,8 @@
  */
 package org.apache.tuscany.databinding;
 
+import java.util.Map;
+
 import org.apache.tuscany.spi.model.DataType;
 
 /**
@@ -49,5 +51,7 @@
      * @return
      */
     public ClassLoader getClassLoader();
+    
+    public Map<Class<?>, Object> getMetadata();
 
 }

Modified: incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Input2InputTransformer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Input2InputTransformer.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Input2InputTransformer.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Input2InputTransformer.java Sun Sep 17 22:33:12 2006
@@ -33,7 +33,6 @@
 import org.apache.tuscany.databinding.extension.TransformerExtension;
 import org.apache.tuscany.idl.wsdl.WSDLOperation;
 import org.apache.tuscany.spi.annotation.Autowire;
-import org.apache.tuscany.spi.idl.InvalidServiceContractException;
 import org.apache.tuscany.spi.model.DataType;
 import org.apache.ws.commons.schema.XmlSchemaElement;
 import org.apache.ws.commons.schema.XmlSchemaSimpleType;
@@ -48,7 +47,9 @@
         PullTransformer<Object[], Object[]> {
 
     private static final String IDL_INPUT = "idl:input";
-    protected DataBindingRegistry dataBindingRegistry;         
+
+    protected DataBindingRegistry dataBindingRegistry;
+
     protected Mediator mediator;
 
     public Input2InputTransformer() {
@@ -64,7 +65,7 @@
     public String getTargetBinding() {
         return IDL_INPUT;
     }
-    
+
     /**
      * @param mediator the mediator to set
      */
@@ -81,7 +82,6 @@
         this.dataBindingRegistry = dataBindingRegistry;
     }
 
-
     /**
      * @see org.apache.tuscany.databinding.extension.TransformerExtension#getSourceType()
      */
@@ -102,7 +102,7 @@
      * @see org.apache.tuscany.databinding.Transformer#getWeight()
      */
     public int getWeight() {
-        return 10;
+        return 100;
     }
 
     @SuppressWarnings("unchecked")
@@ -110,24 +110,34 @@
         DataType<List<DataType<?>>> sourceType = context.getSourceDataType();
         WSDLOperation sourceOp = (WSDLOperation) sourceType.getMetadata(WSDLOperation.class.getName());
         boolean sourceWrapped = (sourceOp != null && sourceOp.isWrapperStyle());
-        
+
         WrapperHandler sourceWrapperHandler = null;
-        if(sourceWrapped) {
-            sourceWrapperHandler = getWapperHandler(sourceOp);
+        if (sourceWrapped) {
+            sourceWrapperHandler = getWapperHandler(sourceType.getLogical().get(0).getDataBinding(), true);
         }
 
         DataType<List<DataType<QName>>> targetType = context.getTargetDataType();
         WSDLOperation targetOp = (WSDLOperation) targetType.getMetadata(WSDLOperation.class.getName());
         boolean targetWrapped = (targetOp != null && targetOp.isWrapperStyle());
         WrapperHandler targetWrapperHandler = null;
-        if(targetWrapped) {
-            targetWrapperHandler = getWapperHandler(targetOp);
+        if (targetWrapped) {
+            targetWrapperHandler = getWapperHandler(targetType.getLogical().get(0).getDataBinding(), true);
         }
 
         if ((!sourceWrapped) && targetWrapped) {
             // Unwrapped --> Wrapped
             WSDLOperation.Wrapper wrapper = targetOp.getWrapper();
-            Object targetWrapper = targetWrapperHandler.create(wrapper.getInputWrapperElement(), context);
+            XmlSchemaElement wrapperElement = wrapper.getInputWrapperElement();
+
+            // If the source can be wrapped, wrapped it first
+            if (sourceWrapperHandler != null) {
+                Object sourceWrapper = sourceWrapperHandler.create(wrapperElement, context);
+                for (int i = 0; i < source.length; i++) {
+                    XmlSchemaElement argElement = wrapper.getInputChildElements().get(i);
+                    sourceWrapperHandler.setChild(sourceWrapper, i, argElement, source[0]);
+                }
+            }
+            Object targetWrapper = targetWrapperHandler.create(wrapperElement, context);
             if (source == null) {
                 return new Object[] { targetWrapper };
             }
@@ -140,7 +150,7 @@
                 boolean isSimpleType = (argXSDType instanceof XmlSchemaSimpleType);
                 Object child = source[i];
                 if (!isSimpleType) {
-                    child = mediator.mediate(source[i], sourceType.getLogical().get(i), argType);
+                    child = mediator.mediate(source[i], sourceType.getLogical().get(i), argType, context.getMetadata());
                     targetWrapperHandler.setChild(targetWrapper, i, argElement, child);
                 } else {
                     targetWrapperHandler.setChild(targetWrapper, i, argElement, child);
@@ -151,41 +161,54 @@
             // Wrapped to Unwrapped
             Object sourceWrapper = source[0];
             List<XmlSchemaElement> childElements = sourceOp.getWrapper().getInputChildElements();
-            Object[] newArgs = new Object[childElements.size()];
-            for (int i = 0; i < childElements.size(); i++) {
-                XmlSchemaElement childElement = childElements.get(i);
-                if (childElement.getSchemaType() instanceof XmlSchemaSimpleType) {
-                    newArgs[i] = sourceWrapperHandler.getChild(sourceWrapper, i, childElement);
-                } else {
-                    Object child = sourceWrapperHandler.getChild(sourceWrapper, i, childElement);
-                    DataType<QName> childType = sourceOp.getWrapper().getUnwrappedInputType().getLogical().get(i);
-                    newArgs[i] = mediator.mediate(child, childType, targetType.getLogical().get(i));
+            Object[] target = new Object[childElements.size()];
+
+            targetWrapperHandler = getWapperHandler(targetType.getLogical().get(0).getDataBinding(), false);
+            if (targetWrapperHandler != null) {
+                XmlSchemaElement wrapperElement = sourceOp.getWrapper().getInputWrapperElement();
+                // Object targetWrapper = targetWrapperHandler.create(wrapperElement, context);
+                DataType<QName> targetWrapperType =
+                        new DataType<QName>(targetType.getLogical().get(0).getDataBinding(), Object.class, wrapperElement.getQName());
+                Object targetWrapper =
+                        mediator.mediate(sourceWrapper, sourceType.getLogical().get(0), targetWrapperType, context
+                                .getMetadata());
+                for (int i = 0; i < childElements.size(); i++) {
+                    XmlSchemaElement childElement = childElements.get(i);
+                    target[i] = targetWrapperHandler.getChild(targetWrapper, i, childElement);
+                }
+            } else {
+                for (int i = 0; i < childElements.size(); i++) {
+                    XmlSchemaElement childElement = childElements.get(i);
+                    if (childElement.getSchemaType() instanceof XmlSchemaSimpleType) {
+                        target[i] = sourceWrapperHandler.getChild(sourceWrapper, i, childElement);
+                    } else {
+                        Object child = sourceWrapperHandler.getChild(sourceWrapper, i, childElement);
+                        DataType<QName> childType = sourceOp.getWrapper().getUnwrappedInputType().getLogical().get(i);
+                        target[i] =
+                                mediator.mediate(child, childType, targetType.getLogical().get(i), context
+                                        .getMetadata());
+                    }
                 }
             }
-            return newArgs;
+            return target;
         } else {
             // Assuming wrapper to wrapper conversion can be handled here as well
             Object[] newArgs = new Object[source.length];
             for (int i = 0; i < source.length; i++) {
                 Object child =
-                        mediator.mediate(source[i], sourceType.getLogical().get(i), targetType.getLogical().get(i));
+                        mediator.mediate(source[i], sourceType.getLogical().get(i), targetType.getLogical().get(i),
+                                context.getMetadata());
                 newArgs[i] = child;
             }
             return newArgs;
         }
     }
 
-    private WrapperHandler getWapperHandler(WSDLOperation sourceOp) {
-        String dataBindingId;
-        try {
-            dataBindingId = sourceOp.getOperation().getDataBinding();
-        } catch (InvalidServiceContractException e) {
-            throw new TransformationException(e);
-        }
+    private WrapperHandler getWapperHandler(String dataBindingId, boolean required) {
         DataBinding dataBinding = dataBindingRegistry.getDataBinding(dataBindingId);
-        WrapperHandler wrapperHandler = dataBinding==null? null : dataBinding.getWrapperHandler();
-        if (wrapperHandler == null) {
-            throw new TransformationException("No wrapper handler is provided for databinding: "+dataBindingId);
+        WrapperHandler wrapperHandler = dataBinding == null ? null : dataBinding.getWrapperHandler();
+        if (wrapperHandler == null && required) {
+            throw new TransformationException("No wrapper handler is provided for databinding: " + dataBindingId);
         }
         return wrapperHandler;
     }

Modified: incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Output2OutputTransformer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Output2OutputTransformer.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Output2OutputTransformer.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Output2OutputTransformer.java Sun Sep 17 22:33:12 2006
@@ -47,7 +47,9 @@
 public class Output2OutputTransformer extends TransformerExtension<Object, Object> implements
         PullTransformer<Object, Object> {
     private static final String IDL_OUTPUT = "idl:output";
+
     protected DataBindingRegistry dataBindingRegistry;
+
     protected Mediator mediator;
 
     /**
@@ -71,8 +73,8 @@
     @Autowire
     public void setDataBindingRegistry(DataBindingRegistry dataBindingRegistry) {
         this.dataBindingRegistry = dataBindingRegistry;
-    }  
-    
+    }
+
     @Override
     public String getSourceBinding() {
         return IDL_OUTPUT;
@@ -82,7 +84,7 @@
     public String getTargetBinding() {
         return IDL_OUTPUT;
     }
-    
+
     /**
      * @see org.apache.tuscany.databinding.extension.TransformerExtension#getSourceType()
      */
@@ -105,7 +107,7 @@
     public int getWeight() {
         return 10;
     }
-    
+
     private WrapperHandler getWapperHandler(WSDLOperation sourceOp) {
         String dataBindingId;
         try {
@@ -114,13 +116,17 @@
             throw new TransformationException(e);
         }
         DataBinding dataBinding = dataBindingRegistry.getDataBinding(dataBindingId);
-        WrapperHandler wrapperHandler = dataBinding==null? null : dataBinding.getWrapperHandler();
+        WrapperHandler wrapperHandler = dataBinding == null ? null : dataBinding.getWrapperHandler();
         if (wrapperHandler == null) {
-            throw new TransformationException("No wrapper handler is provided for databinding: "+dataBindingId);
+            throw new TransformationException("No wrapper handler is provided for databinding: " + dataBindingId);
         }
         return wrapperHandler;
     }
-    
+
+    private WrapperHandler getWapperHandler(String dataBindingId) {
+        DataBinding dataBinding = dataBindingRegistry.getDataBinding(dataBindingId);
+        return dataBinding == null ? null : dataBinding.getWrapperHandler();
+    }    
 
     @SuppressWarnings("unchecked")
     public Object transform(Object response, TransformationContext context) {
@@ -129,7 +135,7 @@
             WSDLOperation sourceOp = (WSDLOperation) sourceType.getMetadata(WSDLOperation.class.getName());
             boolean sourceWrapped = (sourceOp != null && sourceOp.isWrapperStyle());
             WrapperHandler sourceWrapperHandler = null;
-            if(sourceWrapped) {
+            if (sourceWrapped) {
                 sourceWrapperHandler = getWapperHandler(sourceOp);
             }
 
@@ -137,7 +143,7 @@
             WSDLOperation targetOp = (WSDLOperation) targetType.getMetadata(WSDLOperation.class.getName());
             boolean targetWrapped = (targetOp != null && targetOp.isWrapperStyle());
             WrapperHandler targetWrapperHandler = null;
-            if(targetWrapped) {
+            if (targetWrapped) {
                 targetWrapperHandler = getWapperHandler(targetOp);
             }
 
@@ -155,7 +161,7 @@
                 boolean isSimpleType = (argXSDType instanceof XmlSchemaSimpleType);
                 Object child = response;
                 if (!isSimpleType) {
-                    child = mediator.mediate(response, sourceType.getLogical(), argType);
+                    child = mediator.mediate(response, sourceType.getLogical(), argType, context.getMetadata());
                     targetWrapperHandler.setChild(targetWrapper, 0, argElement, child);
                 } else {
                     targetWrapperHandler.setChild(targetWrapper, 0, argElement, child);
@@ -166,16 +172,31 @@
                 Object sourceWrapper = response;
                 List<XmlSchemaElement> childElements = sourceOp.getWrapper().getOutputChildElements();
                 XmlSchemaElement childElement = childElements.get(0);
-                if (childElement.getSchemaType() instanceof XmlSchemaSimpleType) {
-                    return sourceWrapperHandler.getChild(sourceWrapper, 0, childElement);
+
+                targetWrapperHandler = getWapperHandler(targetType.getLogical().getDataBinding());
+                if (targetWrapperHandler != null) {
+                    XmlSchemaElement wrapperElement = sourceOp.getWrapper().getInputWrapperElement();
+                    // Object targetWrapper = targetWrapperHandler.create(wrapperElement, context);
+                    DataType<QName> targetWrapperType =
+                            new DataType<QName>(targetType.getLogical().getDataBinding(), Object.class, wrapperElement
+                                    .getQName());
+                    Object targetWrapper =
+                            mediator.mediate(sourceWrapper, sourceType.getLogical(), targetWrapperType, context
+                                    .getMetadata());
+                    return targetWrapperHandler.getChild(targetWrapper, 0, childElement);
                 } else {
-                    Object child = sourceWrapperHandler.getChild(sourceWrapper, 0, childElement);
-                    DataType<?> childType = sourceOp.getWrapper().getUnwrappedOutputType();
-                    return mediator.mediate(child, childType, targetType.getLogical());
+                    if (childElement.getSchemaType() instanceof XmlSchemaSimpleType) {
+                        return sourceWrapperHandler.getChild(sourceWrapper, 0, childElement);
+                    } else {
+                        Object child = sourceWrapperHandler.getChild(sourceWrapper, 0, childElement);
+                        DataType<?> childType = sourceOp.getWrapper().getUnwrappedOutputType();
+                        return mediator.mediate(child, childType, targetType.getLogical(), context.getMetadata());
+                    }
                 }
             } else {
                 // FIXME: Do we want to handle wrapped to wrapped?
-                return mediator.mediate(response, sourceType.getLogical(), targetType.getLogical());
+                return mediator.mediate(response, sourceType.getLogical(), targetType.getLogical(), context
+                        .getMetadata());
             }
         } catch (Exception e) {
             throw new TransformationException(e);

Modified: incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingInteceptor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingInteceptor.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingInteceptor.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingInteceptor.java Sun Sep 17 22:33:12 2006
@@ -19,8 +19,12 @@
 
 package org.apache.tuscany.databinding.impl;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.tuscany.databinding.Mediator;
 import org.apache.tuscany.idl.wsdl.WSDLOperation;
+import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.model.DataType;
 import org.apache.tuscany.spi.model.Operation;
 import org.apache.tuscany.spi.wire.Interceptor;
@@ -34,9 +38,7 @@
 public class DataBindingInteceptor implements Interceptor {
     private Interceptor next;
 
-    private RuntimeWire sourceWire; // NOPMD by rfeng on 8/29/06 10:15 AM
-
-    private RuntimeWire targetWire; // NOPMD by rfeng on 8/29/06 10:15 AM
+    private CompositeComponent compositeComponent;
 
     private Operation<?> sourceOperation;
 
@@ -47,10 +49,11 @@
     public DataBindingInteceptor(RuntimeWire sourceWire, Operation<?> sourceOperation, RuntimeWire targetWire,
             Operation<?> targetOperation) {
         super();
-        this.sourceWire = sourceWire;
+        // this.sourceWire = sourceWire;
         this.sourceOperation = sourceOperation;
-        this.targetWire = targetWire;
+        // this.targetWire = targetWire;
         this.targetOperation = targetOperation;
+        this.compositeComponent = (CompositeComponent) sourceWire.getContainer().getParent();
     }
 
     /**
@@ -69,15 +72,19 @@
         Message resultMsg = next.invoke(msg);
         Object result = resultMsg.getBody();
         // FIXME: How to deal with faults?
-        if(resultMsg.isFault()) {
+        if (resultMsg.isFault()) {
             // We need to figure out what fault type it is and then transform it back the source fault type
             throw new InvocationRuntimeException((Throwable) result);
         } else if (result != null) {
             // FIXME: Should we fix the Operation model so that getOutputType returns DataType<DataType<T>>?
-            DataType<DataType> targetType = new DataType<DataType>("idl:output", Object.class, targetOperation.getOutputType());
-            targetType.setMetadata(WSDLOperation.class.getName(), targetOperation.getOutputType().getMetadata(WSDLOperation.class.getName()));
-            DataType<DataType> sourceType = new DataType<DataType>("idl:output", Object.class, sourceOperation.getOutputType());
-            sourceType.setMetadata(WSDLOperation.class.getName(), sourceOperation.getOutputType().getMetadata(WSDLOperation.class.getName()));
+            DataType<DataType> targetType =
+                    new DataType<DataType>("idl:output", Object.class, targetOperation.getOutputType());
+            targetType.setMetadata(WSDLOperation.class.getName(), targetOperation.getOutputType().getMetadata(
+                    WSDLOperation.class.getName()));
+            DataType<DataType> sourceType =
+                    new DataType<DataType>("idl:output", Object.class, sourceOperation.getOutputType());
+            sourceType.setMetadata(WSDLOperation.class.getName(), sourceOperation.getOutputType().getMetadata(
+                    WSDLOperation.class.getName()));
 
             result = transform(result, targetType, sourceType);
             resultMsg.setBody(result);
@@ -93,7 +100,9 @@
         if (sourceType == targetType || (sourceType != null && sourceType.equals(targetType))) {
             return source;
         }
-        return mediator.mediate(source, sourceType, targetType);
+        Map<Class<?>, Object> metadata = new HashMap<Class<?>, Object>();
+        metadata.put(CompositeComponent.class, compositeComponent);
+        return mediator.mediate(source, sourceType, targetType, metadata);
     }
 
     /**

Modified: incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingJavaInterfaceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingJavaInterfaceProcessor.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingJavaInterfaceProcessor.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingJavaInterfaceProcessor.java Sun Sep 17 22:33:12 2006
@@ -43,7 +43,7 @@
             contract.setDataBinding(interfaceDataType.name());
             // FIXME: [rfeng] Keep data context as metadata?
             for (DataContext c : interfaceDataType.context()) {
-                contract.addMetaData(c.key(), c.value());
+                contract.setMetaData(c.key(), c.value());
             }
         }
         for (Method method : clazz.getMethods()) {
@@ -57,7 +57,7 @@
                 operation.setDataBinding(dataBinding);
                 // FIXME: [rfeng] Keep data context as metadata?
                 for (DataContext c : operationDataType.context()) {
-                    operation.addMetaData(c.key(), c.value());
+                    operation.setMetaData(c.key(), c.value());
                 }
                 for (org.apache.tuscany.spi.model.DataType<?> d : operation.getInputType().getLogical()) {
                     d.setDataBinding(dataBinding);

Modified: incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingRegistryImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingRegistryImpl.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingRegistryImpl.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingRegistryImpl.java Sun Sep 17 22:33:12 2006
@@ -35,6 +35,9 @@
      * @see org.apache.tuscany.databinding.DataBindingRegistry#getDataBinding(java.lang.String)
      */
     public DataBinding getDataBinding(String id) {
+        if (id == null) {
+            return null;
+        }
         return bindings.get(id.toLowerCase());
     }
 
@@ -49,6 +52,9 @@
      * @see org.apache.tuscany.databinding.DataBindingRegistry#unregister(java.lang.String)
      */
     public DataBinding unregister(String id) {
+        if (id == null) {
+            return null;
+        }
         return bindings.remove(id.toLowerCase());
     }
 

Modified: incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingWirePostProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingWirePostProcessor.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingWirePostProcessor.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingWirePostProcessor.java Sun Sep 17 22:33:12 2006
@@ -60,11 +60,11 @@
                 getTargetOperation(target.getInvocationChains().keySet(), sourceOperation.getName());
             String sourceDataBinding = getDataBinding(sourceOperation);
             String targetDataBinding = getDataBinding(targetOperation);
-            if (!sourceDataBinding.equals(targetDataBinding)) {
+            if (sourceDataBinding == null || targetDataBinding == null || !sourceDataBinding.equals(targetDataBinding)) {
                 // Add the interceptor to the source side because multiple references can be wired
                 // to the same service
                 DataBindingInteceptor interceptor =
-                    new DataBindingInteceptor(source, sourceOperation, target, targetOperation);
+                        new DataBindingInteceptor(source, sourceOperation, target, targetOperation);
                 interceptor.setMediator(mediator);
                 entry.getValue().addInterceptor(0, interceptor);
             }
@@ -83,7 +83,7 @@
                 getTargetOperation(target.getInvocationChains().keySet(), sourceOperation.getName());
             String sourceDataBinding = getDataBinding(sourceOperation);
             String targetDataBinding = getDataBinding(targetOperation);
-            if (!sourceDataBinding.equals(targetDataBinding)) {
+            if (sourceDataBinding == null || targetDataBinding == null || !sourceDataBinding.equals(targetDataBinding)) {
                 // Add the interceptor to the source side
                 DataBindingInteceptor interceptor =
                     new DataBindingInteceptor(source, sourceOperation, target, targetOperation);

Modified: incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/MediatorImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/MediatorImpl.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/MediatorImpl.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/MediatorImpl.java Sun Sep 17 22:33:12 2006
@@ -19,6 +19,7 @@
 package org.apache.tuscany.databinding.impl;
 
 import java.util.List;
+import java.util.Map;
 
 import org.apache.tuscany.databinding.DataBindingRegistry;
 import org.apache.tuscany.databinding.DataPipe;
@@ -58,10 +59,14 @@
 
     /**
      * @see org.apache.tuscany.databinding.Mediator#mediate(java.lang.Object, org.apache.tuscany.spi.model.DataType,
-     *      org.apache.tuscany.spi.model.DataType)
+     *      org.apache.tuscany.spi.model.DataType, Map)
      */
     @SuppressWarnings("unchecked")
-    public Object mediate(Object source, DataType sourceDataType, DataType targetDataType) {
+    public Object mediate(
+            Object source,
+            DataType sourceDataType,
+            DataType targetDataType,
+            Map<Class<?>, Object> metadata) {
         if (source == null) {
             // Shortcut for null value
             return null;
@@ -82,7 +87,7 @@
         for (int i = 0; i < size; i++) {
             Transformer transformer = path.get(i);
             TransformationContext context =
-                    createTransformationContext(sourceDataType, targetDataType, size, i, transformer);
+                    createTransformationContext(sourceDataType, targetDataType, size, i, transformer, metadata);
             // the source and target type
             if (transformer instanceof PullTransformer) {
                 // For intermediate node, set data type to null
@@ -102,7 +107,8 @@
             DataType targetDataType,
             int size,
             int index,
-            Transformer transformer) {
+            Transformer transformer,
+            Map<Class<?>, Object> metadata) {
         DataType sourceType =
                 (index == 0) ? sourceDataType
                         : new DataType<Object>(transformer.getSourceBinding(), Object.class, null);
@@ -110,12 +116,17 @@
                 (index == size - 1) ? targetDataType : new DataType<Object>(transformer.getTargetBinding(),
                         Object.class, null);
         ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-        TransformationContext context = new TransformationContextImpl(sourceType, targetType, classLoader);
+        TransformationContext context = new TransformationContextImpl(sourceType, targetType, classLoader, metadata);
         return context;
     }
 
     @SuppressWarnings("unchecked")
-    public void mediate(Object source, Object target, DataType sourceDataType, DataType targetDataType) {
+    public void mediate(
+            Object source,
+            Object target,
+            DataType sourceDataType,
+            DataType targetDataType,
+            Map<Class<?>, Object> metadata) {
         if (source == null) {
             // Shortcut for null value
             return;
@@ -135,7 +146,7 @@
         for (int i = 0; i < size; i++) {
             Transformer transformer = path.get(i);
             TransformationContext context =
-                    createTransformationContext(sourceDataType, targetDataType, size, i, transformer);
+                    createTransformationContext(sourceDataType, targetDataType, size, i, transformer, metadata);
 
             if (transformer instanceof PullTransformer) {
                 result = ((PullTransformer) transformer).transform(result, context);

Modified: incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/TransformationContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/TransformationContextImpl.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/TransformationContextImpl.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/TransformationContextImpl.java Sun Sep 17 22:33:12 2006
@@ -19,6 +19,8 @@
 package org.apache.tuscany.databinding.impl;
 
 import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.tuscany.databinding.TransformationContext;
 import org.apache.tuscany.spi.model.DataType;
@@ -28,6 +30,8 @@
 
     private DataType targetDataType;
 
+    private final Map<Class<?>, Object> metadata = new HashMap<Class<?>, Object>();
+
     private WeakReference<ClassLoader> classLoaderRef;
 
     public TransformationContextImpl() {
@@ -35,11 +39,15 @@
         setClassLoader(Thread.currentThread().getContextClassLoader());
     }
 
-    public TransformationContextImpl(DataType sourceDataType, DataType targetDataType, ClassLoader classLoader) {
+    public TransformationContextImpl(DataType sourceDataType, DataType targetDataType, ClassLoader classLoader,
+            Map<Class<?>, Object> metadata) {
         super();
         this.sourceDataType = sourceDataType;
         this.targetDataType = targetDataType;
         setClassLoader(classLoader);
+        if (metadata != null) {
+            this.metadata.putAll(metadata);
+        }
     }
 
     public DataType getSourceDataType() {
@@ -64,6 +72,10 @@
 
     public ClassLoader getClassLoader() {
         return classLoaderRef.get();
+    }
+
+    public Map<Class<?>, Object> getMetadata() {
+        return metadata;
     }
 
 }

Modified: incubator/tuscany/java/sca/databinding/databinding-framework/src/test/java/org/apache/tuscany/databinding/impl/DataBindingInterceptorTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-framework/src/test/java/org/apache/tuscany/databinding/impl/DataBindingInterceptorTestCase.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-framework/src/test/java/org/apache/tuscany/databinding/impl/DataBindingInterceptorTestCase.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-framework/src/test/java/org/apache/tuscany/databinding/impl/DataBindingInterceptorTestCase.java Sun Sep 17 22:33:12 2006
@@ -26,15 +26,21 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import junit.framework.Assert;
 import junit.framework.TestCase;
 
 import org.apache.tuscany.databinding.Mediator;
+import org.apache.tuscany.spi.component.Component;
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.component.SCAObject;
 import org.apache.tuscany.spi.model.DataType;
 import org.apache.tuscany.spi.model.Operation;
+import org.apache.tuscany.spi.wire.InboundWire;
 import org.apache.tuscany.spi.wire.Interceptor;
 import org.apache.tuscany.spi.wire.Message;
+import org.apache.tuscany.spi.wire.OutboundWire;
 import org.easymock.EasyMock;
 
 /**
@@ -54,6 +60,7 @@
      * Test method for
      * {@link org.apache.tuscany.databinding.impl.DataBindingInteceptor#invoke(org.apache.tuscany.spi.wire.Message)}.
      */
+    @SuppressWarnings("unchecked")
     public final void testInvoke() {
         DataType<Class> type1 = new DataType<Class>("xml:string", String.class, String.class);
         List<DataType<Class>> types1 = new ArrayList<DataType<Class>>();
@@ -64,24 +71,35 @@
         DataType<Class> type2 = new DataType<Class>("foo", Foo.class, Foo.class);
         List<DataType<Class>> types2 = new ArrayList<DataType<Class>>();
         types2.add(type2);
-        DataType<List<DataType<Class>>> inputType2 
-            = new DataType<List<DataType<Class>>>("foo", Object[].class, types2);
+        DataType<List<DataType<Class>>> inputType2 = new DataType<List<DataType<Class>>>("foo", Object[].class, types2);
 
         Operation<Class> operation1 = new Operation<Class>("call", inputType1, type1, null, false, "xml:string");
         Operation<Class> operation2 = new Operation<Class>("call", inputType2, type2, null, false, "org.w3c.dom.Node");
-        
+
         DataType<DataType> outputType1 = new DataType<DataType>("idl:output", Object.class, operation1.getOutputType());
         DataType<DataType> outputType2 = new DataType<DataType>("idl:output", Object.class, operation2.getOutputType());
-                
-        interceptor = new DataBindingInteceptor(null, operation1, null, operation2);
+
+        OutboundWire outboundWire = EasyMock.createMock(OutboundWire.class);
+        InboundWire inboundWire = EasyMock.createMock(InboundWire.class);
+        CompositeComponent composite = EasyMock.createMock(CompositeComponent.class);
+        Component component = EasyMock.createMock(Component.class);
+        EasyMock.expect(component.getParent()).andReturn(composite).once();
+        EasyMock.expect(outboundWire.getContainer()).andReturn(component);
+        EasyMock.replay(outboundWire, inboundWire, composite, component);
+
+        interceptor = new DataBindingInteceptor(outboundWire, operation1, inboundWire, operation2);
         Mediator mediator = createMock(Mediator.class);
         Object[] source = new Object[] { "<foo>bar</foo>" };
         Foo foo = new Foo();
         foo.bar = "bar";
         Object[] target = new Object[] { foo };
-        expect(mediator.mediate(source, inputType1, inputType2)).andReturn(target);
+        expect(
+                mediator.mediate(EasyMock.same(source), EasyMock.same(inputType1), EasyMock.same(inputType2), EasyMock
+                        .isA(Map.class))).andReturn(target);
         // expect(mediator.mediate(target[0], type2, type1)).andReturn(source[0]);
-        expect(mediator.mediate(EasyMock.same(target[0]), EasyMock.eq(outputType2), EasyMock.eq(outputType1))).andReturn(source[0]);
+        expect(
+                mediator.mediate(EasyMock.same(target[0]), EasyMock.eq(outputType2), EasyMock.eq(outputType1), EasyMock
+                        .isA(Map.class))).andReturn(source[0]);
         replay(mediator);
         interceptor.setMediator(mediator);
         Message msg = createMock(Message.class);

Modified: incubator/tuscany/java/sca/databinding/databinding-framework/src/test/java/org/apache/tuscany/databinding/impl/MediatorImplTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-framework/src/test/java/org/apache/tuscany/databinding/impl/MediatorImplTestCase.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-framework/src/test/java/org/apache/tuscany/databinding/impl/MediatorImplTestCase.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-framework/src/test/java/org/apache/tuscany/databinding/impl/MediatorImplTestCase.java Sun Sep 17 22:33:12 2006
@@ -83,7 +83,7 @@
 
     public void testTransform1() {
         TransformationContext context = createTransformationContext(String.class, Node.class);
-        Object node = mediator.mediate(IPO_XML, context.getSourceDataType(), context.getTargetDataType());
+        Object node = mediator.mediate(IPO_XML, context.getSourceDataType(), context.getTargetDataType(), null);
         Assert.assertTrue(node instanceof Document);
         Element root = ((Document) node).getDocumentElement();
         Assert.assertEquals(root.getNamespaceURI(), "http://www.example.com/IPO");
@@ -93,7 +93,7 @@
     public void testTransform2() {
         TransformationContext context = createTransformationContext(String.class, Writer.class);
         Writer writer = new StringWriter();
-        mediator.mediate(IPO_XML, writer, context.getSourceDataType(), context.getTargetDataType());
+        mediator.mediate(IPO_XML, writer, context.getSourceDataType(), context.getTargetDataType(), null);
         String str = writer.toString();
         Assert.assertTrue(str != null && str.indexOf("<shipDate>1999-12-05</shipDate>") != -1);
     }

Added: incubator/tuscany/java/sca/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java?view=auto&rev=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java (added)
+++ incubator/tuscany/java/sca/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java Sun Sep 17 22:33:12 2006
@@ -0,0 +1,102 @@
+/*
+ * 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.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Method;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.databinding.TransformationContext;
+import org.apache.tuscany.databinding.TransformationException;
+import org.apache.tuscany.databinding.idl.WrapperHandler;
+import org.apache.ws.commons.schema.XmlSchemaElement;
+
+/**
+ * JAXB WrapperHandler implementation
+ */
+public class JAXBWrapperHandler implements WrapperHandler<JAXBElement<?>> {
+
+    public JAXBElement<?> create(XmlSchemaElement element, TransformationContext context) {
+        try {
+            String packageName = null;
+            String factoryClassName = packageName + ".ObjectFactory";
+            Class<?> factoryClass = Class.forName(factoryClassName, true, context.getClassLoader());
+            assert factoryClass.isAnnotationPresent(XmlRegistry.class);
+            Object factory = factoryClass.newInstance();
+            QName elementName = element.getQName();
+            Method method = null;
+            for (Method m : factoryClass.getMethods()) {
+                XmlElementDecl xmlElement = m.getAnnotation(XmlElementDecl.class);
+                QName name = new QName(xmlElement.namespace(), xmlElement.name());
+                if (xmlElement != null && name.equals(elementName)) {
+                    method = m;
+                    break;
+                }
+            }
+            if (method != null) {
+                Class typeClass = method.getParameterTypes()[0];
+                Object value = typeClass.newInstance();
+                return (JAXBElement<?>) method.invoke(factory, new Object[] { value });
+            } else {
+                throw new TransformationException("ObjectFactory cannot be resolved.");
+            }
+        } catch (Exception e) {
+            throw new TransformationException(e);
+        }
+    }
+
+    public Object getChild(JAXBElement<?> wrapper, int i, XmlSchemaElement element) {
+        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[] {});
+                }
+            }
+            return null;
+        } catch (Exception e) {
+            throw new TransformationException(e);
+        }
+    }
+
+    public void setChild(JAXBElement<?> wrapper, int i, XmlSchemaElement 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;
+                }
+            }
+        } catch (Exception e) {
+            throw new TransformationException(e);
+        }
+    }
+
+}

Propchange: incubator/tuscany/java/sca/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandler.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2String.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2String.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2String.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2String.java Sun Sep 17 22:33:12 2006
@@ -20,22 +20,25 @@
 
 import javax.xml.namespace.QName;
 
+import org.apache.tuscany.databinding.PullTransformer;
 import org.apache.tuscany.databinding.TransformationContext;
 import org.apache.tuscany.databinding.TransformationException;
-import org.apache.tuscany.databinding.PullTransformer;
+import org.apache.tuscany.databinding.Transformer;
 import org.apache.tuscany.databinding.extension.TransformerExtension;
 import org.apache.tuscany.sdo.util.SDOUtil;
+import org.osoa.sca.annotations.Service;
 
 import commonj.sdo.DataObject;
 import commonj.sdo.helper.TypeHelper;
 import commonj.sdo.helper.XMLHelper;
 
+@Service(Transformer.class)
 public class DataObject2String extends TransformerExtension<DataObject, String> implements
         PullTransformer<DataObject, String> {
 
     public String transform(DataObject source, TransformationContext context) {
         try {
-            TypeHelper typeHelper = SDODataTypeHelper.getTypeHelper(context, true);
+            TypeHelper typeHelper = SDODataTypeHelper.getTypeHelper(context);
             XMLHelper xmlHelper = SDOUtil.createXMLHelper(typeHelper);
             Object logicalType = context.getSourceDataType().getLogical();
             if (logicalType instanceof QName) {

Modified: incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2XMLStreamReader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2XMLStreamReader.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2XMLStreamReader.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/DataObject2XMLStreamReader.java Sun Sep 17 22:33:12 2006
@@ -25,31 +25,32 @@
 import org.apache.tuscany.databinding.TransformationContext;
 import org.apache.tuscany.databinding.PullTransformer;
 import org.apache.tuscany.databinding.TransformationException;
+import org.apache.tuscany.databinding.Transformer;
 import org.apache.tuscany.databinding.extension.TransformerExtension;
 import org.apache.tuscany.sdo.helper.XMLStreamHelper;
 import org.apache.tuscany.sdo.util.SDOUtil;
+import org.osoa.sca.annotations.Service;
 
 import commonj.sdo.DataObject;
 import commonj.sdo.helper.TypeHelper;
 import commonj.sdo.helper.XMLDocument;
 import commonj.sdo.helper.XMLHelper;
 
+@Service(Transformer.class)
 public class DataObject2XMLStreamReader extends TransformerExtension<DataObject, XMLStreamReader> implements
         PullTransformer<DataObject, XMLStreamReader> {
 
     public XMLStreamReader transform(DataObject source, TransformationContext context) {
         try {
-            TypeHelper typeHelper = SDODataTypeHelper.getTypeHelper(context, true);
+            TypeHelper typeHelper = SDODataTypeHelper.getTypeHelper(context);
             XMLStreamHelper streamHelper = SDOUtil.createXMLStreamHelper(typeHelper);
             Object logicalType = context.getSourceDataType().getLogical();
-            if (logicalType instanceof QName) {
-                QName elementName = (QName) logicalType;
-                XMLHelper xmlHelper = SDOUtil.createXMLHelper(typeHelper);
-                XMLDocument document = xmlHelper.createDocument(source, elementName.getNamespaceURI(), elementName.getLocalPart());
-                return streamHelper.createXMLStreamReader(document);
-            } else {
-                return streamHelper.createXMLStreamReader(source);
-            }
+            QName elementName =
+                    (logicalType instanceof QName) ? (QName) logicalType : new QName("commonj.sdo", "dataObject");
+            XMLHelper xmlHelper = SDOUtil.createXMLHelper(typeHelper);
+            XMLDocument document =
+                    xmlHelper.createDocument(source, elementName.getNamespaceURI(), elementName.getLocalPart());
+            return streamHelper.createXMLStreamReader(document);
         } catch (XMLStreamException e) {
             // TODO: Add context to the exception
             throw new TransformationException(e);

Modified: incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataBinding.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataBinding.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataBinding.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDODataBinding.java Sun Sep 17 22:33:12 2006
@@ -22,6 +22,7 @@
 import javax.xml.namespace.QName;
 
 import org.apache.tuscany.databinding.extension.DataBindingExtension;
+import org.apache.tuscany.databinding.idl.WrapperHandler;
 import org.apache.tuscany.spi.model.DataType;
 
 import commonj.sdo.DataObject;
@@ -33,7 +34,8 @@
  * 
  */
 public class SDODataBinding extends DataBindingExtension {
-
+    private WrapperHandler<Object> wrapperHandler;
+    
     @Override
     public DataType introspect(Class<?> javaType) {
         if (javaType == DataObject.class) {
@@ -52,6 +54,12 @@
 
     public SDODataBinding() {
         super(DataObject.class);
+        wrapperHandler = new SDOWrapperHandler();
+    }
+
+    @Override
+    public WrapperHandler getWrapperHandler() {
+        return wrapperHandler;
     }
 
 }

Modified: incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOWrapperHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOWrapperHandler.java?view=diff&rev=447254&r1=447253&r2=447254
==============================================================================
--- incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOWrapperHandler.java (original)
+++ incubator/tuscany/java/sca/databinding/databinding-sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOWrapperHandler.java Sun Sep 17 22:33:12 2006
@@ -36,13 +36,13 @@
 /**
  * SDO Wrapper Handler
  */
-public class SDOWrapperHandler implements WrapperHandler<XMLDocument> {
+public class SDOWrapperHandler implements WrapperHandler<Object> {
 
     /**
      * @see org.apache.tuscany.databinding.idl.WrapperHandler#create(org.apache.ws.commons.schema.XmlSchemaElement,
      *      TransformationContext)
      */
-    public XMLDocument create(XmlSchemaElement element, TransformationContext context) {
+    public Object create(XmlSchemaElement element, TransformationContext context) {
         TypeHelper typeHelper = TypeHelper.INSTANCE;
         if (context != null) {
             DataType targetType = context.getTargetDataType();
@@ -64,16 +64,20 @@
      * @see org.apache.tuscany.databinding.idl.WrapperHandler#getChild(java.lang.Object, int,
      *      org.apache.ws.commons.schema.XmlSchemaElement)
      */
-    public Object getChild(XMLDocument wrapper, int i, XmlSchemaElement element) {
-        return wrapper.getRootObject().get(element.getName());
+    public Object getChild(Object wrapper, int i, XmlSchemaElement element) {
+        DataObject wrapperDO =
+                (wrapper instanceof XMLDocument) ? ((XMLDocument) wrapper).getRootObject() : (DataObject) wrapper;
+        return wrapperDO.get(element.getName());
     }
 
     /**
      * @see org.apache.tuscany.databinding.idl.WrapperHandler#setChild(java.lang.Object, int,
      *      org.apache.ws.commons.schema.XmlSchemaElement, java.lang.Object)
      */
-    public void setChild(XMLDocument wrapper, int i, XmlSchemaElement childElement, Object value) {
-        wrapper.getRootObject().set(childElement.getName(), value);
+    public void setChild(Object wrapper, int i, XmlSchemaElement childElement, Object value) {
+        DataObject wrapperDO =
+                (wrapper instanceof XMLDocument) ? ((XMLDocument) wrapper).getRootObject() : (DataObject) wrapper;
+        wrapperDO.set(childElement.getName(), value);
     }
 
 }



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