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