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/20 20:28:36 UTC

svn commit: r448288 [1/2] - in /incubator/tuscany/java: samples/sca/echo.databinding/src/test/resources/META-INF/tuscany/ samples/sca/helloworldws/src/main/webapp/META-INF/tuscany/ samples/sca/helloworldwsclient/src/main/resources/wsdl/ samples/sca/hel...

Author: rfeng
Date: Wed Sep 20 11:28:34 2006
New Revision: 448288

URL: http://svn.apache.org/viewvc?view=rev&rev=448288
Log:
Improve the simple type conversions for Java/XML databindings

Added:
    incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/OMElement2Object.java   (with props)
    incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/Object2OMElement.java   (with props)
    incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/TypeSystem.java   (with props)
    incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/extension/SimpleTypeMapperExtension.java   (with props)
    incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/SimpleTypeMapper.java   (with props)
    incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/util/XSDDataTypeConverter.java   (with props)
Modified:
    incubator/tuscany/java/samples/sca/echo.databinding/src/test/resources/META-INF/tuscany/test-databinding-axiom.scdl
    incubator/tuscany/java/samples/sca/helloworldws/src/main/webapp/META-INF/tuscany/databinding.axiom.scdl
    incubator/tuscany/java/samples/sca/helloworldwsclient/src/main/resources/wsdl/helloworld.wsdl
    incubator/tuscany/java/samples/sca/helloworldwsclient/src/test/java/helloworld/HelloWorldWSClient.java
    incubator/tuscany/java/samples/sca/helloworldwsclient/src/test/resources/META-INF/tuscany/databinding.axiom.scdl
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImpl.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StAXUtil.java
    incubator/tuscany/java/sca/services/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/Axis2BindingBuilder.java
    incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/OMElementWrapperHandler.java
    incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/resources/META-INF/sca/databinding-axiom.scdl
    incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementTestCase.java
    incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementWrapperTransformerTestCase.java
    incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Input2InputTransformer.java
    incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Output2OutputTransformer.java
    incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingJavaInterfaceProcessor.java
    incubator/tuscany/java/sca/services/databinding/databinding-framework/src/test/java/org/apache/tuscany/databinding/impl/DataBindingJavaInterfaceProcessorTestCase.java

Modified: incubator/tuscany/java/samples/sca/echo.databinding/src/test/resources/META-INF/tuscany/test-databinding-axiom.scdl
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/samples/sca/echo.databinding/src/test/resources/META-INF/tuscany/test-databinding-axiom.scdl?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/samples/sca/echo.databinding/src/test/resources/META-INF/tuscany/test-databinding-axiom.scdl (original)
+++ incubator/tuscany/java/samples/sca/echo.databinding/src/test/resources/META-INF/tuscany/test-databinding-axiom.scdl Wed Sep 20 11:28:34 2006
@@ -37,4 +37,11 @@
     <component name="transformer.OMElement2String">
         <system:implementation.system class="org.apache.tuscany.databinding.axiom.OMElement2String" />
     </component>    
+    <component name="transformer.Object2OMElement">
+        <system:implementation.system class="org.apache.tuscany.databinding.axiom.Object2OMElement" />
+    </component>
+    
+    <component name="transformer.OMElement2Object">
+        <system:implementation.system class="org.apache.tuscany.databinding.axiom.OMElement2Object" />
+    </component>         
 </composite>

Modified: incubator/tuscany/java/samples/sca/helloworldws/src/main/webapp/META-INF/tuscany/databinding.axiom.scdl
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/samples/sca/helloworldws/src/main/webapp/META-INF/tuscany/databinding.axiom.scdl?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/samples/sca/helloworldws/src/main/webapp/META-INF/tuscany/databinding.axiom.scdl (original)
+++ incubator/tuscany/java/samples/sca/helloworldws/src/main/webapp/META-INF/tuscany/databinding.axiom.scdl Wed Sep 20 11:28:34 2006
@@ -37,4 +37,12 @@
     <component name="transformer.OMElement2String">
         <system:implementation.system class="org.apache.tuscany.databinding.axiom.OMElement2String" />
     </component>    
+
+    <component name="transformer.Object2OMElement">
+        <system:implementation.system class="org.apache.tuscany.databinding.axiom.Object2OMElement" />
+    </component>
+    
+    <component name="transformer.OMElement2Object">
+        <system:implementation.system class="org.apache.tuscany.databinding.axiom.OMElement2Object" />
+    </component>     
 </composite>

Modified: incubator/tuscany/java/samples/sca/helloworldwsclient/src/main/resources/wsdl/helloworld.wsdl
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/samples/sca/helloworldwsclient/src/main/resources/wsdl/helloworld.wsdl?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/samples/sca/helloworldwsclient/src/main/resources/wsdl/helloworld.wsdl (original)
+++ incubator/tuscany/java/samples/sca/helloworldwsclient/src/main/resources/wsdl/helloworld.wsdl Wed Sep 20 11:28:34 2006
@@ -118,7 +118,7 @@
 
     <wsdl:service name="HelloWorldService">
         <wsdl:port binding="tns:HelloWorldSoapBinding" name="HelloWorldSoapPort">
-            <wsdlsoap:address location="http://localhost:8080/sample-helloworldws-1.0-SNAPSHOT/services/HelloWorldWebService"/>
+            <wsdlsoap:address location="http://localhost:8080/sample-helloworldws-1.0-incubator-M2-SNAPSHOT/services/HelloWorldWebService"/>
         </wsdl:port>
     </wsdl:service>
 

Modified: incubator/tuscany/java/samples/sca/helloworldwsclient/src/test/java/helloworld/HelloWorldWSClient.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/samples/sca/helloworldwsclient/src/test/java/helloworld/HelloWorldWSClient.java?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/samples/sca/helloworldwsclient/src/test/java/helloworld/HelloWorldWSClient.java (original)
+++ incubator/tuscany/java/samples/sca/helloworldwsclient/src/test/java/helloworld/HelloWorldWSClient.java Wed Sep 20 11:28:34 2006
@@ -51,14 +51,15 @@
         URL wsdl = getClass().getResource("/wsdl/helloworld.wsdl");
         XSDHelper.INSTANCE.define(wsdl.openStream(), wsdl.toExternalForm());
         
+        String msg = helloWorldService.getGreetings("John");
+        Assert.assertEquals("Hello John", msg);
+        
         DataObject name = DataFactory.INSTANCE.create("http://helloworld", "NameType");
         name.setString("firstName", "John");
         name.setString("lastName", "Smith");
         String msg1 = helloWorldService.getGreetings1(name);
         Assert.assertEquals("Hello John Smith", msg1);
-        
-        String msg = helloWorldService.getGreetings("John");
-        Assert.assertEquals("Hello John", msg);
+
         msg = helloWorldService.getGreetings("Smith");
         Assert.assertEquals("Hello Smith", msg);
     }

Modified: incubator/tuscany/java/samples/sca/helloworldwsclient/src/test/resources/META-INF/tuscany/databinding.axiom.scdl
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/samples/sca/helloworldwsclient/src/test/resources/META-INF/tuscany/databinding.axiom.scdl?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/samples/sca/helloworldwsclient/src/test/resources/META-INF/tuscany/databinding.axiom.scdl (original)
+++ incubator/tuscany/java/samples/sca/helloworldwsclient/src/test/resources/META-INF/tuscany/databinding.axiom.scdl Wed Sep 20 11:28:34 2006
@@ -37,4 +37,13 @@
     <component name="transformer.OMElement2String">
         <system:implementation.system class="org.apache.tuscany.databinding.axiom.OMElement2String" />
     </component>    
+
+    <component name="transformer.Object2OMElement">
+        <system:implementation.system class="org.apache.tuscany.databinding.axiom.Object2OMElement" />
+    </component>
+    
+    <component name="transformer.OMElement2Object">
+        <system:implementation.system class="org.apache.tuscany.databinding.axiom.OMElement2Object" />
+    </component>     
+
 </composite>

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImpl.java?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImpl.java Wed Sep 20 11:28:34 2006
@@ -48,6 +48,8 @@
  */
 public class JavaInterfaceProcessorRegistryImpl implements JavaInterfaceProcessorRegistry {
 
+    private static final String UNKNOWN_DATABINDING = null;
+
     public static final String IDL_INPUT = "idl:input";
     
     private List<JavaInterfaceProcessor> processors = new ArrayList<JavaInterfaceProcessor>();
@@ -122,21 +124,20 @@
             Type[] faultTypes = method.getGenericExceptionTypes();
             boolean nonBlocking = method.isAnnotationPresent(OneWay.class);
 
-            DataType<Type> returnDataType = new DataType<Type>(returnType, returnType);
+            DataType<Type> returnDataType = new DataType<Type>(UNKNOWN_DATABINDING, returnType, returnType);
             List<DataType<Type>> paramDataTypes = new ArrayList<DataType<Type>>(paramTypes.length);
             for (Type paramType : paramTypes) {
-                paramDataTypes.add(new DataType<Type>(paramType, paramType));
+                paramDataTypes.add(new DataType<Type>(UNKNOWN_DATABINDING, paramType, paramType));
             }
             List<DataType<Type>> faultDataTypes = new ArrayList<DataType<Type>>(faultTypes.length);
             for (Type faultType : faultTypes) {
-                faultDataTypes.add(new DataType<Type>(faultType, faultType));
+                faultDataTypes.add(new DataType<Type>(UNKNOWN_DATABINDING, faultType, faultType));
             }
 
-            String dataBinding = "java.lang.Object";
             DataType<List<DataType<Type>>> inputType =
                 new DataType<List<DataType<Type>>>(IDL_INPUT, Object[].class, paramDataTypes);
             Operation<Type> operation =
-                new Operation<Type>(name, inputType, returnDataType, faultDataTypes, nonBlocking, dataBinding);
+                new Operation<Type>(name, inputType, returnDataType, faultDataTypes, nonBlocking, UNKNOWN_DATABINDING);
             operations.put(name, operation);
         }
         return operations;

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StAXUtil.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StAXUtil.java?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StAXUtil.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StAXUtil.java Wed Sep 20 11:28:34 2006
@@ -84,6 +84,7 @@
 
         // root element has no namespace and local name "value"
         Element root = doc.createElementNS(null, "value");
+        doc.appendChild(root);
         loadPropertyValue(reader, root);
 
         return doc;

Modified: incubator/tuscany/java/sca/services/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/Axis2BindingBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/Axis2BindingBuilder.java?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/sca/services/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/Axis2BindingBuilder.java (original)
+++ incubator/tuscany/java/sca/services/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/Axis2BindingBuilder.java Wed Sep 20 11:28:34 2006
@@ -18,6 +18,7 @@
  */
 package org.apache.tuscany.binding.axis2;
 
+import javax.wsdl.Port;
 import javax.wsdl.PortType;
 
 import org.apache.axiom.om.OMElement;
@@ -86,23 +87,37 @@
 
         try {
             // Set the default databinding
-            serviceDefinition.getServiceContract().setDataBinding(OM_DATA_BINDING);
+            ServiceContract<?> outboundContract = serviceDefinition.getServiceContract();
+            outboundContract.setDataBinding(OM_DATA_BINDING);
 
             // FIXME: We need to define how the WSDL PortType is honored in the case that
             // both the binding.ws and interface.wsdl are in place.
             // The WSDL portType from the WSDL Port decides the incoming SOAP message format
             // There are also cases that interface.java is used.
             
+            ServiceContract<?> inboundContract = null;
             WebServiceBinding wsBinding = serviceDefinition.getBinding();
-            PortType portType = wsBinding.getWSDLPort().getBinding().getPortType();
-            ServiceContract<?> serviceContract = introspector.introspect(portType);
+            Port port = wsBinding.getWSDLPort();
+            if (port == null) {
+                // FIXME: [rfeng] No WSDL is referenced by binding.ws, we need to create one from
+                // the outbound service contract if it's JavaServiceContract
+                inboundContract = outboundContract;
+            }            PortType portType = wsBinding.getWSDLPort().getBinding().getPortType();
+            inboundContract = introspector.introspect(portType);
             
             // FIXME:  
-            serviceContract.setInterfaceClass(serviceDefinition.getServiceContract().getInterfaceClass());
-            serviceContract.setDataBinding(serviceDefinition.getServiceContract().getDataBinding());
+            inboundContract.setInterfaceClass(serviceDefinition.getServiceContract().getInterfaceClass());
+            inboundContract.setDataBinding(serviceDefinition.getServiceContract().getDataBinding());
 
-            return new Axis2Service(serviceDefinition.getName(), serviceContract, parent, wireService, wsBinding,
+            if (!wireService.isWireable(inboundContract, outboundContract)) {
+                throw new Axis2BindingBuilderRuntimeException("Incompatible interface");
+            }
+            
+            Service service = new Axis2Service(serviceDefinition.getName(), inboundContract, parent, wireService, wsBinding,
                     servletHost, configContext, workContext);
+            
+            return service;
+            
         } catch (InvalidServiceContractException e) {
             throw new Axis2BindingBuilderRuntimeException(e);
         }
@@ -116,21 +131,36 @@
 
         try {
             // Set the default binding
-            boundReferenceDefinition.getServiceContract().setDataBinding(OM_DATA_BINDING);
+            ServiceContract<?> inboundContract = boundReferenceDefinition.getServiceContract();
+            inboundContract.setDataBinding(OM_DATA_BINDING);
             
             // FIXME: We need to define how the WSDL PortType is honored in the case that
             // both the binding.ws and interface.wsdl are in place
             // The WSDL portType from the WSDL Port decides the incoming SOAP message format
 
+            ServiceContract<?> outboundContract = inboundContract;
             WebServiceBinding wsBinding = boundReferenceDefinition.getBinding();
-            PortType portType = wsBinding.getWSDLPort().getBinding().getPortType();
-            ServiceContract<?> serviceContract = introspector.introspect(portType);
+            Port port = wsBinding.getWSDLPort();
+            if (port == null) {
+                // FIXME: [rfeng] No WSDL is referenced by binding.ws, we need to create one from
+                // the inbound service contract if it's JavaServiceContract
+                outboundContract = inboundContract;
+            }
+            PortType portType = port.getBinding().getPortType();
+            outboundContract = introspector.introspect(portType);
             
             // Set the default databinding
-            serviceContract.setDataBinding(OM_DATA_BINDING);
+            outboundContract.setDataBinding(OM_DATA_BINDING);
+            
+            if (!wireService.isWireable(inboundContract, outboundContract)) {
+                throw new Axis2BindingBuilderRuntimeException("Incompatible interface");
+            }
+            
+            Reference reference = new Axis2Reference(boundReferenceDefinition.getName(), parent, wireService, wsBinding,
+                    outboundContract, workContext);
+            
+            return reference;
             
-            return new Axis2Reference(boundReferenceDefinition.getName(), parent, wireService, wsBinding,
-                    serviceContract, workContext);
         } catch (InvalidServiceContractException e) {
             throw new Axis2BindingBuilderRuntimeException(e);
         }

Added: incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/OMElement2Object.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/OMElement2Object.java?view=auto&rev=448288
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/OMElement2Object.java (added)
+++ incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/OMElement2Object.java Wed Sep 20 11:28:34 2006
@@ -0,0 +1,66 @@
+/*
+ * 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.axiom;
+
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.tuscany.databinding.PullTransformer;
+import org.apache.tuscany.databinding.TransformationContext;
+import org.apache.tuscany.databinding.Transformer;
+import org.apache.tuscany.databinding.extension.SimpleTypeMapperExtension;
+import org.apache.tuscany.databinding.extension.TransformerExtension;
+import org.apache.tuscany.databinding.idl.SimpleTypeMapper;
+import org.apache.ws.commons.schema.XmlSchemaElement;
+import org.apache.ws.commons.schema.XmlSchemaSimpleType;
+import org.osoa.sca.annotations.Service;
+
+/**
+ * Transformer to convert data from a simple java bject to OMElement
+ */
+@Service(Transformer.class)
+public class OMElement2Object extends TransformerExtension<Object, OMElement> implements
+        PullTransformer<Object, OMElement> {
+    
+    private SimpleTypeMapper mapper = new SimpleTypeMapperExtension();
+    private OMFactory factory = OMAbstractFactory.getOMFactory();
+
+    public OMElement transform(Object source, TransformationContext context) {
+        XmlSchemaElement element =
+                (XmlSchemaElement) context.getTargetDataType().getMetadata(XmlSchemaElement.class.getName());
+        XmlSchemaSimpleType simpleType = (XmlSchemaSimpleType) element.getSchemaType();
+        String text = mapper.toString(simpleType, source);
+        OMElement omElement = factory.createOMElement(element.getQName(), null);
+        factory.createOMText(omElement, text);
+        return omElement;
+    }
+
+    public Class getSourceType() {
+        return Object.class;
+    }
+
+    public Class getTargetType() {
+        return OMElement.class;
+    }
+
+    public int getWeight() {
+        return 10;
+    }
+
+}

Propchange: incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/OMElement2Object.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/OMElement2Object.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/OMElementWrapperHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/OMElementWrapperHandler.java?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/OMElementWrapperHandler.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/OMElementWrapperHandler.java Wed Sep 20 11:28:34 2006
@@ -19,24 +19,7 @@
 
 package org.apache.tuscany.databinding.axiom;
 
-import static org.apache.ws.commons.schema.constants.Constants.XSD_BOOLEAN;
-import static org.apache.ws.commons.schema.constants.Constants.XSD_BYTE;
-import static org.apache.ws.commons.schema.constants.Constants.XSD_DATETIME;
-import static org.apache.ws.commons.schema.constants.Constants.XSD_DOUBLE;
-import static org.apache.ws.commons.schema.constants.Constants.XSD_FLOAT;
-import static org.apache.ws.commons.schema.constants.Constants.XSD_INT;
-import static org.apache.ws.commons.schema.constants.Constants.XSD_LONG;
-import static org.apache.ws.commons.schema.constants.Constants.XSD_SHORT;
-import static org.apache.ws.commons.schema.constants.Constants.XSD_STRING;
-
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
 import java.util.Iterator;
-import java.util.TimeZone;
-
-import javax.xml.namespace.QName;
 
 import org.apache.axiom.om.OMAbstractFactory;
 import org.apache.axiom.om.OMElement;
@@ -44,8 +27,6 @@
 import org.apache.tuscany.databinding.TransformationContext;
 import org.apache.tuscany.databinding.idl.WrapperHandler;
 import org.apache.ws.commons.schema.XmlSchemaElement;
-import org.apache.ws.commons.schema.XmlSchemaSimpleType;
-import org.apache.ws.commons.schema.XmlSchemaType;
 
 /**
  * OMElement wrapper handler implementation
@@ -72,177 +53,14 @@
                 continue;
             }
             if (child.getQName().equals(element.getQName())) {
-                XmlSchemaType type = element.getSchemaType();
-                if (type instanceof XmlSchemaSimpleType) {
-                    return SimpleTypeMapper.getSimpleTypeObject(type.getQName(), child);
-                } else {
-                    return child;
-                }
+                return child;
             }
         }
         return null;
     }
 
     public void setChild(OMElement wrapper, int i, XmlSchemaElement childElement, Object value) {
-        if (childElement.getSchemaType() instanceof XmlSchemaSimpleType) {
-            OMElement child = factory.createOMElement(childElement.getQName(), wrapper);
-            factory.createOMText(child, SimpleTypeMapper.getStringValue(value));
-        } else {
-            wrapper.addChild((OMElement) value);
-        }
-    }
-
-    public static class SimpleTypeMapper {
-        private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
-        // 0123456789 0 123456789
-
-        static {
-            format.setTimeZone(TimeZone.getTimeZone("GMT"));
-        }
-
-        public static Object getSimpleTypeObject(QName type, OMElement value) {
-            if (type.equals(XSD_STRING)) {
-                return value.getText();
-            } else if (type.equals(XSD_INT)) {
-                return new Integer(value.getText());
-            } else if (type.equals(XSD_BOOLEAN)) {
-                return Boolean.valueOf(value.getText());
-            } else if (type.equals(XSD_BYTE)) {
-                return new Byte(value.getText());
-            } else if (type.equals(XSD_DOUBLE)) {
-                return new Double(value.getText());
-            } else if (type.equals(XSD_SHORT)) {
-                return new Short(value.getText());
-            } else if (type.equals(XSD_LONG)) {
-                return new Long(value.getText());
-            } else if (type.equals(XSD_FLOAT)) {
-                return new Float(value.getText());
-            } else if (type.equals(XSD_DATETIME)) {
-                return makeCalendar(value.getText(), false);
-            } else {
-                return value.getText();
-            }
-        }
-
-        public static String getStringValue(Object obj) {
-            if (obj instanceof Float || obj instanceof Double) {
-                double data;
-                if (obj instanceof Float) {
-                    data = ((Float) obj).doubleValue();
-                } else {
-                    data = ((Double) obj).doubleValue();
-                }
-                if (Double.isNaN(data)) {
-                    return "NaN";
-                } else if (data == Double.POSITIVE_INFINITY) {
-                    return "INF";
-                } else if (data == Double.NEGATIVE_INFINITY) {
-                    return "-INF";
-                } else {
-                    return obj.toString();
-                }
-            } else if (obj instanceof Calendar) {
-                return format.format(((Calendar) obj).getTime());
-            }
-            return obj.toString();
-        }
-
-        public static Object makeCalendar(String source, boolean returnDate) {
-            Calendar calendar = Calendar.getInstance();
-            Date date;
-            boolean bc = false;
-
-            // validate fixed portion of format
-            if (source == null || source.length() == 0) {
-                throw new NumberFormatException("badDateTime00");
-            }
-            if (source.charAt(0) == '+') {
-                source = source.substring(1);
-            }
-            if (source.charAt(0) == '-') {
-                source = source.substring(1);
-                bc = true;
-            }
-            if (source.length() < 19) {
-                throw new NumberFormatException("badDateTime00");
-            }
-            if (source.charAt(4) != '-' || source.charAt(7) != '-' || source.charAt(10) != 'T') {
-                throw new NumberFormatException("badDate00");
-            }
-            if (source.charAt(13) != ':' || source.charAt(16) != ':') {
-                throw new NumberFormatException("badTime00");
-            }
-            // convert what we have validated so far
-            try {
-                synchronized (format) {
-                    date = format.parse(source.substring(0, 19) + ".000Z");
-                }
-            } catch (Exception e) {
-                throw new NumberFormatException(e.toString());
-            }
-            int pos = 19;
-
-            // parse optional milliseconds
-            if (pos < source.length() && source.charAt(pos) == '.') {
-                int milliseconds;
-                int start = ++pos;
-                while (pos < source.length() && Character.isDigit(source.charAt(pos))) {
-                    pos++;
-                }
-                String decimal = source.substring(start, pos);
-                if (decimal.length() == 3) {
-                    milliseconds = Integer.parseInt(decimal);
-                } else if (decimal.length() < 3) {
-                    milliseconds = Integer.parseInt((decimal + "000").substring(0, 3));
-                } else {
-                    milliseconds = Integer.parseInt(decimal.substring(0, 3));
-                    if (decimal.charAt(3) >= '5') {
-                        ++milliseconds;
-                    }
-                }
-
-                // add milliseconds to the current date
-                date.setTime(date.getTime() + milliseconds);
-            }
-
-            // parse optional timezone
-            if (pos + 5 < source.length() && (source.charAt(pos) == '+' || (source.charAt(pos) == '-'))) {
-                if (!Character.isDigit(source.charAt(pos + 1)) || !Character.isDigit(source.charAt(pos + 2))
-                        || source.charAt(pos + 3) != ':' || !Character.isDigit(source.charAt(pos + 4))
-                        || !Character.isDigit(source.charAt(pos + 5))) {
-                    throw new NumberFormatException("badTimezone00");
-                }
-                int hours = (source.charAt(pos + 1) - '0') * 10 + source.charAt(pos + 2) - '0';
-                int mins = (source.charAt(pos + 4) - '0') * 10 + source.charAt(pos + 5) - '0';
-                int milliseconds = (hours * 60 + mins) * 60 * 1000;
-
-                // subtract milliseconds from current date to obtain GMT
-                if (source.charAt(pos) == '+') {
-                    milliseconds = -milliseconds;
-                }
-                date.setTime(date.getTime() + milliseconds);
-                pos += 6;
-            }
-            if (pos < source.length() && source.charAt(pos) == 'Z') {
-                pos++;
-                calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
-            }
-            if (pos < source.length()) {
-                throw new NumberFormatException("badChars00");
-            }
-            calendar.setTime(date);
-
-            // support dates before the Christian era
-            if (bc) {
-                calendar.set(Calendar.ERA, GregorianCalendar.BC);
-            }
-
-            if (returnDate) {
-                return date;
-            } else {
-                return calendar;
-            }
-        }
+        wrapper.addChild((OMElement) value);
     }
 
 }

Added: incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/Object2OMElement.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/Object2OMElement.java?view=auto&rev=448288
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/Object2OMElement.java (added)
+++ incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/Object2OMElement.java Wed Sep 20 11:28:34 2006
@@ -0,0 +1,59 @@
+/*
+ * 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.axiom;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.tuscany.databinding.PullTransformer;
+import org.apache.tuscany.databinding.TransformationContext;
+import org.apache.tuscany.databinding.Transformer;
+import org.apache.tuscany.databinding.extension.SimpleTypeMapperExtension;
+import org.apache.tuscany.databinding.extension.TransformerExtension;
+import org.apache.tuscany.databinding.idl.SimpleTypeMapper;
+import org.apache.ws.commons.schema.XmlSchemaElement;
+import org.apache.ws.commons.schema.XmlSchemaSimpleType;
+import org.osoa.sca.annotations.Service;
+
+/**
+ * Transformer to convert data from an simple OMElement to Java Object
+ */
+@Service(Transformer.class)
+public class Object2OMElement extends TransformerExtension<OMElement, Object> implements
+        PullTransformer<OMElement, Object> {
+    private SimpleTypeMapper mapper = new SimpleTypeMapperExtension();
+
+    public Object transform(OMElement source, TransformationContext context) {
+        XmlSchemaElement element =
+                (XmlSchemaElement) context.getSourceDataType().getMetadata(XmlSchemaElement.class.getName());
+        XmlSchemaSimpleType simpleType = (XmlSchemaSimpleType) element.getSchemaType();
+        return mapper.parse(simpleType, source.getText());
+    }
+
+    public Class getSourceType() {
+        return OMElement.class;
+    }
+
+    public Class getTargetType() {
+        return Object.class;
+    }
+
+    public int getWeight() {
+        return 10;
+    }
+
+}

Propchange: incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/Object2OMElement.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/java/org/apache/tuscany/databinding/axiom/Object2OMElement.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/resources/META-INF/sca/databinding-axiom.scdl
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/resources/META-INF/sca/databinding-axiom.scdl?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/resources/META-INF/sca/databinding-axiom.scdl (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/main/resources/META-INF/sca/databinding-axiom.scdl Wed Sep 20 11:28:34 2006
@@ -36,4 +36,12 @@
     <component name="transformer.OMElement2String">
         <system:implementation.system class="org.apache.tuscany.databinding.axiom.OMElement2String" />
     </component>    
+    
+    <component name="transformer.Object2OMElement">
+        <system:implementation.system class="org.apache.tuscany.databinding.axiom.Object2OMElement" />
+    </component>
+    
+    <component name="transformer.OMElement2Object">
+        <system:implementation.system class="org.apache.tuscany.databinding.axiom.OMElement2Object" />
+    </component>        
 </composite>

Modified: incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementTestCase.java?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementTestCase.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementTestCase.java Wed Sep 20 11:28:34 2006
@@ -18,30 +18,51 @@
  */
 package org.apache.tuscany.databinding.axiom;
 
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
+
 import junit.framework.Assert;
 import junit.framework.TestCase;
 
 import org.apache.axiom.om.OMElement;
 
 public class OMElementTestCase extends TestCase {
-    private static final String IPO_XML = "<?xml version=\"1.0\"?>" + "<ipo:purchaseOrder"
-    + "  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + "  xmlns:ipo=\"http://www.example.com/IPO\""
-    + "  xsi:schemaLocation=\"http://www.example.com/IPO ipo.xsd\"" + "  orderDate=\"1999-12-01\">"
-    + "  <shipTo exportCode=\"1\" xsi:type=\"ipo:UKAddress\">" + "    <name>Helen Zoe</name>" + "    <street>47 Eden Street</street>"
-    + "    <city>Cambridge</city>" + "    <postcode>CB1 1JR</postcode>" + "  </shipTo>" + "  <billTo xsi:type=\"ipo:USAddress\">"
-    + "    <name>Robert Smith</name>" + "    <street>8 Oak Avenue</street>" + "    <city>Old Town</city>" + "    <state>PA</state>"
-    + "    <zip>95819</zip>" + "  </billTo>" + "  <items>" + "    <item partNum=\"833-AA\">"
-    + "      <productName>Lapis necklace</productName>" + "      <quantity>1</quantity>" + "      <USPrice>99.95</USPrice>"
-    + "      <ipo:comment>Want this for the holidays</ipo:comment>" + "      <shipDate>1999-12-05</shipDate>" + "    </item>" + "  </items>"
-    + "</ipo:purchaseOrder>";
+    private static final String IPO_XML =
+            "<?xml version=\"1.0\"?>" + "<ipo:purchaseOrder"
+                    + "  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+                    + "  xmlns:ipo=\"http://www.example.com/IPO\""
+                    + "  xsi:schemaLocation=\"http://www.example.com/IPO ipo.xsd\"" + "  orderDate=\"1999-12-01\">"
+                    + "  <shipTo exportCode=\"1\" xsi:type=\"ipo:UKAddress\">" + "    <name>Helen Zoe</name>"
+                    + "    <street>47 Eden Street</street>" + "    <city>Cambridge</city>"
+                    + "    <postcode>CB1 1JR</postcode>" + "  </shipTo>" + "  <billTo xsi:type=\"ipo:USAddress\">"
+                    + "    <name>Robert Smith</name>" + "    <street>8 Oak Avenue</street>"
+                    + "    <city>Old Town</city>" + "    <state>PA</state>" + "    <zip>95819</zip>" + "  </billTo>"
+                    + "  <items>" + "    <item partNum=\"833-AA\">" + "      <productName>Lapis necklace</productName>"
+                    + "      <quantity>1</quantity>" + "      <USPrice>99.95</USPrice>"
+                    + "      <ipo:comment>Want this for the holidays</ipo:comment>"
+                    + "      <shipDate>1999-12-05</shipDate>" + "    </item>" + "  </items>" + "</ipo:purchaseOrder>";
 
-    public final void testTransform() {
+    public final void testStringTransform() {
         String2OMElement t1 = new String2OMElement();
         OMElement element = t1.transform(IPO_XML, null);
-        OMElement2String t2= new OMElement2String();
+        OMElement2String t2 = new OMElement2String();
         String xml = t2.transform(element, null);
         Assert.assertNotNull(xml);
-        Assert.assertNotNull(xml.indexOf("<ipo:comment>")!=-1);
+        Assert.assertNotNull(xml.indexOf("<ipo:comment>") != -1);
+    }
+
+    public final void testStAXTransform() {
+        String2OMElement t1 = new String2OMElement();
+        OMElement element = t1.transform(IPO_XML, null);
+
+        OMElement2XMLStreamReader t2 = new OMElement2XMLStreamReader();
+        XMLStreamReader reader = t2.transform(element, null);
+
+        XMLStreamReader2OMElement t3 = new XMLStreamReader2OMElement();
+        OMElement element2 = t3.transform(reader, null);
+
+        Assert.assertEquals(element2.getQName(), element.getQName());
+        Assert.assertEquals(new QName("http://www.example.com/IPO", "purchaseOrder"), element2.getQName());
     }
 
 }

Modified: incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementWrapperTransformerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementWrapperTransformerTestCase.java?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementWrapperTransformerTestCase.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-axiom/src/test/java/org/apache/tuscany/databinding/axiom/OMElementWrapperTransformerTestCase.java Wed Sep 20 11:28:34 2006
@@ -86,6 +86,8 @@
         TransformerRegistryImpl tr = new TransformerRegistryImpl();
         tr.registerTransformer(new String2OMElement());
         tr.registerTransformer(new OMElement2String());
+        tr.registerTransformer(new Object2OMElement());
+        tr.registerTransformer(new OMElement2Object());
         m.setTransformerRegistry(tr);
         DataBindingRegistry dataBindingRegistry = new DataBindingRegistryImpl();
         dataBindingRegistry.register(new AxiomDataBinding());
@@ -98,9 +100,9 @@
 
         TransformationContext context = new TransformationContextImpl();
         List<DataType<Class>> types = new ArrayList<DataType<Class>>();
-        types.add(new DataType<Class>(null, String.class, String.class));
+        types.add(new DataType<Class>(Object.class.getName(), String.class, String.class));
         types.add(new DataType<Class>("java.lang.String", String.class, String.class));
-        types.add(new DataType<Class>(null, int.class, int.class));
+        types.add(new DataType<Class>(Object.class.getName(), int.class, int.class));
         DataType<List<DataType<Class>>> inputType1 =
                 new DataType<List<DataType<Class>>>("idl:input", Object[].class, types);
         context.setSourceDataType(inputType1);
@@ -118,7 +120,7 @@
         
         context1.setSourceDataType(sourceType);
         DataType<DataType> targetType =
-                new DataType<DataType>("idl:output", Object.class, new DataType<Class>("java.lang.String",
+                new DataType<DataType>("idl:output", Object.class, new DataType<Class>("java.lang.Object",
                         String.class, String.class));
         context1.setTargetDataType(targetType);
 

Added: incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/TypeSystem.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/TypeSystem.java?view=auto&rev=448288
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/TypeSystem.java (added)
+++ incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/TypeSystem.java Wed Sep 20 11:28:34 2006
@@ -0,0 +1,29 @@
+/*
+ * 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;
+
+import org.apache.tuscany.spi.model.ModelObject;
+
+/**
+ *
+ */
+public class TypeSystem extends ModelObject {
+
+}

Propchange: incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/TypeSystem.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/TypeSystem.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/extension/SimpleTypeMapperExtension.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/extension/SimpleTypeMapperExtension.java?view=auto&rev=448288
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/extension/SimpleTypeMapperExtension.java (added)
+++ incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/extension/SimpleTypeMapperExtension.java Wed Sep 20 11:28:34 2006
@@ -0,0 +1,221 @@
+/*
+ * 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.extension;
+
+import static org.apache.ws.commons.schema.constants.Constants.XSD_BASE64;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_BOOLEAN;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_BYTE;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_DATE;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_DATETIME;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_DAY;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_DECIMAL;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_DOUBLE;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_DURATION;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_FLOAT;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_HEXBIN;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_INT;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_INTEGER;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_LONG;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_MONTH;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_MONTHDAY;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_NOTATION;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_QNAME;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_SHORT;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_STRING;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_TIME;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_UNSIGNEDBYTE;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_UNSIGNEDINT;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_UNSIGNEDLONG;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_UNSIGNEDSHORT;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_YEAR;
+import static org.apache.ws.commons.schema.constants.Constants.XSD_YEARMONTH;
+
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.databinding.idl.SimpleTypeMapper;
+import org.apache.tuscany.databinding.util.XSDDataTypeConverter;
+import org.apache.ws.commons.schema.XmlSchemaSimpleType;
+
+public class SimpleTypeMapperExtension extends XSDDataTypeConverter implements SimpleTypeMapper {
+    private DatatypeFactory factory;
+
+    public SimpleTypeMapperExtension() {
+        super();
+        try {
+            this.factory = DatatypeFactory.newInstance();
+        } catch (DatatypeConfigurationException e) {
+            throw new IllegalArgumentException(e);
+        }
+    }
+
+    public Object parse(XmlSchemaSimpleType schemaSimpleType, String value) {
+
+        /**
+         * <ul>
+         * <li>xsd:string --- java.lang.String
+         * <li>xsd:integer --- java.math.BigInteger
+         * <li>xsd:int --- int
+         * <li>xsd:long --- long
+         * <li>xsd:short --- short
+         * <li>xsd:decimal --- java.math.BigDecimal
+         * <li>xsd:float --- float
+         * <li>xsd:double --- double
+         * <li>xsd:boolean --- boolean
+         * <li>xsd:byte --- byte
+         * <li>xsd:QName --- javax.xml.namespace.QName
+         * <li>xsd:dateTime --- javax.xml.datatype.XMLGregorianCalendar
+         * <li>xsd:base64Binary --- byte[]
+         * <li>xsd:hexBinary --- byte[]
+         * <li>xsd:unsignedInt --- long
+         * <li>xsd:unsignedShort --- int
+         * <li>xsd:unsignedByte --- short
+         * <li>xsd:time --- javax.xml.datatype.XMLGregorianCalendar
+         * <li>xsd:date --- javax.xml.datatype.XMLGregorianCalendar
+         * <li>xsd:g* --- javax.xml.datatype.XMLGregorianCalendar
+         * <li>xsd:anySimpleType (for xsd:element of this type)a java.lang.Object
+         * <li>xsd:anySimpleType (for xsd:attribute of this type) java.lang.String
+         * <li>xsd:duration javax.xml.datatype.Duration
+         * <li>xsd:NOTATION javax.xml.namespace.QName
+         * </ul>
+         */
+
+        XmlSchemaSimpleType baseType = schemaSimpleType;
+        while (baseType.getBaseSchemaType() != null) {
+            baseType = (XmlSchemaSimpleType) baseType.getBaseSchemaType();
+        }
+        QName type = baseType.getQName();
+        if (type.equals(XSD_STRING)) {
+            return parseString(value);
+        } else if (type.equals(XSD_INT)) {
+            return parseInt(value);
+        } else if (type.equals(XSD_INTEGER)) {
+            return parseInteger(value);
+        } else if (type.equals(XSD_INT)) {
+            return parseInt(value);
+        } else if (type.equals(XSD_FLOAT)) {
+            return parseFloat(value);
+        } else if (type.equals(XSD_DOUBLE)) {
+            return parseDouble(value);
+        } else if (type.equals(XSD_SHORT)) {
+            return parseShort(value);
+        } else if (type.equals(XSD_DECIMAL)) {
+            return parseDecimal(value);
+        } else if (type.equals(XSD_BOOLEAN)) {
+            return parseBoolean(value);
+        } else if (type.equals(XSD_BYTE)) {
+            return parseByte(value);
+        } else if (type.equals(XSD_LONG)) {
+            return parseLong(value);
+        } else if (type.equals(XSD_UNSIGNEDBYTE)) {
+            return parseUnsignedShort(value);
+        } else if (type.equals(XSD_UNSIGNEDSHORT)) {
+            return parseUnsignedShort(value);
+        } else if (type.equals(XSD_UNSIGNEDINT)) {
+            return parseUnsignedInt(value);
+        } else if (type.equals(XSD_UNSIGNEDLONG)) {
+            return parseUnsignedInt(value);
+        } else if (type.equals(XSD_DATETIME)) {
+            return parseDateTime(value);
+        } else if (type.equals(XSD_DATE)) {
+            return parseDate(value);
+        } else if (type.equals(XSD_TIME)) {
+            return parseTime(value);
+        } else if (type.equals(XSD_DURATION)) {
+            return parseDuration(value);
+        } else if (type.equals(XSD_HEXBIN)) {
+            return parseHexBinary(value);
+        } else if (type.equals(XSD_BASE64)) {
+            return parseBase64Binary(value);
+        } else if (type.equals(XSD_QNAME)) {
+            return parseQName(value, null);
+        } else if (type.equals(XSD_NOTATION)) {
+            return parseQName(value, null);
+        } else if (type.equals(XSD_YEAR)) {
+            return factory.newXMLGregorianCalendar(value);
+        } else if (type.equals(XSD_MONTH)) {
+            return factory.newXMLGregorianCalendar(value);
+        } else if (type.equals(XSD_DAY)) {
+            return factory.newXMLGregorianCalendar(value);
+        } else if (type.equals(XSD_YEARMONTH)) {
+            return factory.newXMLGregorianCalendar(value);
+        } else if (type.equals(XSD_MONTHDAY)) {
+            return factory.newXMLGregorianCalendar(value);
+        } else if (type.equals(XSD_NOTATION)) {
+            return parseQName(value, null);
+        } else if (type.equals(XSD_NOTATION)) {
+            return parseQName(value, null);
+        } else {
+            return value;
+        }
+    }
+
+    public String toString(XmlSchemaSimpleType schemaSimpleType, Object obj) {
+        if (obj instanceof Float || obj instanceof Double) {
+            double data;
+            if (obj instanceof Float) {
+                data = ((Float) obj).doubleValue();
+            } else {
+                data = ((Double) obj).doubleValue();
+            }
+            if (Double.isNaN(data)) {
+                return "NaN";
+            } else if (data == Double.POSITIVE_INFINITY) {
+                return "INF";
+            } else if (data == Double.NEGATIVE_INFINITY) {
+                return "-INF";
+            } else {
+                return obj.toString();
+            }
+        } else if (obj instanceof GregorianCalendar) {
+            GregorianCalendar calendar = (GregorianCalendar) obj;
+            /*
+             * if (type.equals(XSD_DATE)) { return printDate(calendar); } else if (type.equals(XSD_TIME)) { return
+             * printTime(calendar); } else if (type.equals(XSD_DATETIME)) { return printDateTime(calendar); } else {
+             * return printDateTime(calendar); }
+             */
+            return toXMLGregorianCalendar(calendar).toXMLFormat();
+        } else if (obj instanceof Date) {
+            return toXMLGregorianCalendar((Date) obj).toXMLFormat();
+        } else if (obj instanceof XMLGregorianCalendar) {
+            XMLGregorianCalendar calendar = (XMLGregorianCalendar) obj;
+            return calendar.toXMLFormat();
+        }
+        return obj.toString();
+    }
+
+    private XMLGregorianCalendar toXMLGregorianCalendar(GregorianCalendar calendar) {
+        return factory.newXMLGregorianCalendar(calendar);
+    }
+
+    @SuppressWarnings("deprecation")
+    private XMLGregorianCalendar toXMLGregorianCalendar(Date date) {
+        GregorianCalendar c =
+                new GregorianCalendar(date.getYear(), date.getMonth(), date.getDate(), date.getHours(), date
+                        .getMinutes(), date.getSeconds());
+        return factory.newXMLGregorianCalendar(c);
+    }
+
+}
\ No newline at end of file

Propchange: incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/extension/SimpleTypeMapperExtension.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/extension/SimpleTypeMapperExtension.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Input2InputTransformer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Input2InputTransformer.java?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Input2InputTransformer.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Input2InputTransformer.java Wed Sep 20 11:28:34 2006
@@ -35,8 +35,6 @@
 import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.model.DataType;
 import org.apache.ws.commons.schema.XmlSchemaElement;
-import org.apache.ws.commons.schema.XmlSchemaSimpleType;
-import org.apache.ws.commons.schema.XmlSchemaType;
 import org.osoa.sca.annotations.Service;
 
 /**
@@ -146,15 +144,9 @@
             for (int i = 0; i < source.length; i++) {
                 XmlSchemaElement argElement = wrapper.getInputChildElements().get(i);
                 DataType<QName> argType = argTypes.get(i);
-                XmlSchemaType argXSDType = argElement.getSchemaType();
-                boolean isSimpleType = (argXSDType instanceof XmlSchemaSimpleType);
                 Object child = source[i];
-                if (!isSimpleType) {
-                    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);
-                }
+                child = mediator.mediate(source[i], sourceType.getLogical().get(i), argType, context.getMetadata());
+                targetWrapperHandler.setChild(targetWrapper, i, argElement, child);
             }
             return new Object[] { targetWrapper };
         } else if (sourceWrapped && (!targetWrapped)) {
@@ -168,7 +160,8 @@
                 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());
+                        new DataType<QName>(targetType.getLogical().get(0).getDataBinding(), Object.class,
+                                wrapperElement.getQName());
                 Object targetWrapper =
                         mediator.mediate(sourceWrapper, sourceType.getLogical().get(0), targetWrapperType, context
                                 .getMetadata());
@@ -179,15 +172,10 @@
             } 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());
-                    }
+                    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 target;

Modified: incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Output2OutputTransformer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Output2OutputTransformer.java?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Output2OutputTransformer.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/Output2OutputTransformer.java Wed Sep 20 11:28:34 2006
@@ -36,8 +36,6 @@
 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;
-import org.apache.ws.commons.schema.XmlSchemaType;
 import org.osoa.sca.annotations.Service;
 
 /**
@@ -126,7 +124,7 @@
     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) {
@@ -157,15 +155,9 @@
 
                 XmlSchemaElement argElement = wrapper.getOutputChildElements().get(0);
                 DataType<QName> argType = wrapper.getUnwrappedOutputType();
-                XmlSchemaType argXSDType = argElement.getSchemaType();
-                boolean isSimpleType = (argXSDType instanceof XmlSchemaSimpleType);
                 Object child = response;
-                if (!isSimpleType) {
-                    child = mediator.mediate(response, sourceType.getLogical(), argType, context.getMetadata());
-                    targetWrapperHandler.setChild(targetWrapper, 0, argElement, child);
-                } else {
-                    targetWrapperHandler.setChild(targetWrapper, 0, argElement, child);
-                }
+                child = mediator.mediate(response, sourceType.getLogical(), argType, context.getMetadata());
+                targetWrapperHandler.setChild(targetWrapper, 0, argElement, child);
                 return targetWrapper;
             } else if (sourceWrapped && (!targetWrapped)) {
                 // Wrapped to Unwrapped
@@ -185,13 +177,9 @@
                                     .getMetadata());
                     return targetWrapperHandler.getChild(targetWrapper, 0, childElement);
                 } else {
-                    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());
-                    }
+                    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?

Added: incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/SimpleTypeMapper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/SimpleTypeMapper.java?view=auto&rev=448288
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/SimpleTypeMapper.java (added)
+++ incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/SimpleTypeMapper.java Wed Sep 20 11:28:34 2006
@@ -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.databinding.idl;
+
+import org.apache.ws.commons.schema.XmlSchemaSimpleType;
+
+/**
+ * Type Mapper between XML schema simple data types and java objects
+ */
+public interface SimpleTypeMapper {
+    /**
+     * Parse the XML lexical representation into a java object 
+     * @param schemaSimpleType The XSD simple type
+     * @param value the XML lexical representation
+     * @return A java object for the XML value
+     */
+    Object parse(XmlSchemaSimpleType schemaSimpleType, String value);
+    /**
+     * Create the XML lexical representation for a java object
+     * @param schemaSimpleType The XSD simple type
+     * @param obj The java object
+     * @return The XML lexical representation
+     */
+    String toString(XmlSchemaSimpleType schemaSimpleType, Object obj);
+}

Propchange: incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/SimpleTypeMapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/idl/SimpleTypeMapper.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingJavaInterfaceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingJavaInterfaceProcessor.java?view=diff&rev=448288&r1=448287&r2=448288
==============================================================================
--- incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingJavaInterfaceProcessor.java (original)
+++ incubator/tuscany/java/sca/services/databinding/databinding-framework/src/main/java/org/apache/tuscany/databinding/impl/DataBindingJavaInterfaceProcessor.java Wed Sep 20 11:28:34 2006
@@ -20,6 +20,16 @@
 package org.apache.tuscany.databinding.impl;
 
 import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashSet;
+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;
@@ -33,6 +43,8 @@
  */
 public class DataBindingJavaInterfaceProcessor extends JavaInterfaceProcessorExtension {
 
+    private static final String SIMPLE_JAVA_OBJECTS = "java.lang.Object";
+
     /**
      * @see org.apache.tuscany.spi.idl.java.JavaInterfaceProcessor#visitInterface(java.lang.Class,
      *      org.apache.tuscany.spi.idl.java.JavaServiceContract)
@@ -47,27 +59,48 @@
             }
         }
         for (Method method : clazz.getMethods()) {
+            Operation<?> operation = contract.getOperations().get(method.getName());
             DataType operationDataType = method.getAnnotation(DataType.class);
-            if (operationDataType == null) {
-                operationDataType = interfaceDataType;
-            }
+
             if (operationDataType != null) {
-                Operation<?> operation = contract.getOperations().get(method.getName());
-                String dataBinding = operationDataType.name();
-                operation.setDataBinding(dataBinding);
+                operation.setDataBinding(operationDataType.name());
                 // FIXME: [rfeng] Keep data context as metadata?
                 for (DataContext c : operationDataType.context()) {
                     operation.setMetaData(c.key(), c.value());
                 }
-                for (org.apache.tuscany.spi.model.DataType<?> d : operation.getInputType().getLogical()) {
-                    d.setDataBinding(dataBinding);
-                }
-                if (operation.getOutputType() != null) {
-                    operation.getOutputType().setDataBinding(dataBinding);
-                }
-                for (org.apache.tuscany.spi.model.DataType<?> d : operation.getFaultTypes()) {
-                    d.setDataBinding(dataBinding);
-                }
+            }
+
+            String dataBinding = operation.getDataBinding();
+
+            for (org.apache.tuscany.spi.model.DataType<?> d : operation.getInputType().getLogical()) {
+                adjustSimpleType(d, dataBinding);
+            }
+            if (operation.getOutputType() != null) {
+                adjustSimpleType(operation.getOutputType(), dataBinding);
+            }
+            for (org.apache.tuscany.spi.model.DataType<?> d : operation.getFaultTypes()) {
+                adjustSimpleType(d, dataBinding);
+            }
+        }
+    }
+
+    private final static Class[] simpleTypes =
+            { Byte.class, Character.class, Short.class, Integer.class, Long.class, Float.class, Double.class,
+                    Date.class, Calendar.class, GregorianCalendar.class, Duration.class, XMLGregorianCalendar.class };
+
+    private final static Set<Class> simpleTypeSet = new HashSet<Class>(Arrays.asList(simpleTypes));
+
+    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() || simpleTypeSet.contains(cls)) {
+            dataType.setDataBinding(SIMPLE_JAVA_OBJECTS);
+        } else if (cls == String.class) {
+            if (dataBinding == null || !dataBinding.equals(String.class.getName())) {
+                dataType.setDataBinding(SIMPLE_JAVA_OBJECTS);
             }
         }
     }



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