Author: nash
Date: Wed Jan 2 12:39:27 2008
New Revision: 608213
URL: http://svn.apache.org/viewvc?rev=608213&view=rev
Log:
Transform thrown POJO exceptions using JAX-WS mapping (TUSCANY-1939)
Added:
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/Exception2OMElement.java
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/OMElement2Exception.java
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaExceptionDataBinding.java
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaExceptionExceptionHandler.java
Modified:
incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/BusinessException.java
incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/ExampleClientImpl.java
incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/ExampleServiceImpl.java
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.PullTransformer
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/DefaultDataBindingExtensionPoint.java
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/DOMNode2JavaBeanTransformer.java
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2DOMNodeTransformer.java
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2XMLTransformer.java
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBeansDataBinding.java
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/XML2JavaBeanTransformer.java
incubator/tuscany/java/sca/modules/databinding/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.DataBinding
Modified:
incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/BusinessException.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/BusinessException.java?rev=608213&r1=608212&r2=608213&view=diff
==============================================================================
---
incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/BusinessException.java
(original)
+++
incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/BusinessException.java
Wed Jan 2 12:39:27 2008
@@ -20,26 +20,24 @@
public class BusinessException extends Exception {
- private String message;
-
- public BusinessException() {
- super();
- }
+ private String clientName;
public BusinessException(String message) {
super(message);
- setDetailMessage(message);
}
- public String getMessage() {
- return message;
+ public BusinessException(String message, String clientName) {
+ super(message);
+ this.clientName = clientName;
}
- public String getDetailMessage() {
- return message;
+ public String getClientName() {
+ return clientName;
}
- public void setDetailMessage(String message) {
- this.message = message;
+ public void setClientName(String clientName) {
+ this.clientName = clientName;
}
+
}
+
Modified:
incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/ExampleClientImpl.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/ExampleClientImpl.java?rev=608213&r1=608212&r2=608213&view=diff
==============================================================================
---
incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/ExampleClientImpl.java
(original)
+++
incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/ExampleClientImpl.java
Wed Jan 2 12:39:27 2008
@@ -37,8 +37,8 @@
try {
Object result = myService.hello("John");
System.out.println("myService returned " +
result.getClass().getName());
- } catch(BusinessException e) {
- System.out.println("caught exception from hello(): " +
e.getMessage());
+ } catch (BusinessException e) {
+ System.out.println("caught exception from hello(): " +
e.getMessage() + " for " + e.getClientName());
}
}
}
Modified:
incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/ExampleServiceImpl.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/ExampleServiceImpl.java?rev=608213&r1=608212&r2=608213&view=diff
==============================================================================
---
incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/ExampleServiceImpl.java
(original)
+++
incubator/tuscany/java/sca/itest/exceptions-simple-ws/src/main/java/com/example/ExampleServiceImpl.java
Wed Jan 2 12:39:27 2008
@@ -20,7 +20,7 @@
public class ExampleServiceImpl implements ExampleService {
public String hello(String name) throws BusinessException {
- throw new BusinessException("bad news");
- //return "Hello, " + name;
+ throw new BusinessException("bad news", name);
+ // return "Hello, " + name;
}
}
Added:
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/Exception2OMElement.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/Exception2OMElement.java?rev=608213&view=auto
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/Exception2OMElement.java
(added)
+++
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/Exception2OMElement.java
Wed Jan 2 12:39:27 2008
@@ -0,0 +1,91 @@
+/*
+ * 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.sca.databinding.axiom;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
+import org.apache.tuscany.sca.databinding.TransformationContext;
+import org.apache.tuscany.sca.databinding.javabeans.Java2XMLMapperException;
+import org.apache.tuscany.sca.databinding.javabeans.JavaBean2XMLTransformer;
+
+public class Exception2OMElement extends JavaBean2XMLTransformer<OMElement> {
+
+ public static final String GETCAUSE = "getCause";
+ public static final String GETLOCALIZEDMESSAGE = "getLocalizedMessage";
+ public static final String GETSTACKTRACE = "getStackTrace";
+ public static final String GETCLASS = "getClass";
+
+ private OMFactory factory;
+
+ public Exception2OMElement() {
+ super();
+ factory = OMAbstractFactory.getOMFactory();
+ }
+
+ @Override
+ public OMElement transform(Object source, TransformationContext context) {
+ OMElement element = super.transform(source, context);
+ AxiomHelper.adjustElementName(context, element);
+ return element;
+ }
+
+ @Override
+ protected boolean isMappedGetter(String methodName) {
+ if (GETCAUSE.equals(methodName)
+ || GETLOCALIZEDMESSAGE.equals(methodName)
+ || GETSTACKTRACE.equals(methodName)
+ || GETCLASS.equals(methodName)) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ @Override
+ public void appendChild(OMElement parentElement, OMElement childElement)
throws Java2XMLMapperException {
+ parentElement.addChild(childElement);
+ }
+
+ @Override
+ public OMElement createElement(QName qName) throws Java2XMLMapperException
{
+ return factory.createOMElement(qName);
+ }
+
+ @Override
+ public void appendText(OMElement parentElement, String textData) throws
Java2XMLMapperException {
+ if (textData == null) {
+ OMNamespace xsi =
factory.createOMNamespace("http://www.w3.org/2001/XMLSchema-instance", "xsi");
+ OMAttribute nil = factory.createOMAttribute("nil", xsi, "true");
+ parentElement.addAttribute(nil);
+ } else {
+ factory.createOMText(parentElement, textData);
+ }
+ }
+
+ @Override
+ public Class getTargetType() {
+ return OMElement.class;
+ }
+
+}
Added:
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/OMElement2Exception.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/OMElement2Exception.java?rev=608213&view=auto
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/OMElement2Exception.java
(added)
+++
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/OMElement2Exception.java
Wed Jan 2 12:39:27 2008
@@ -0,0 +1,81 @@
+/*
+ * 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.sca.databinding.axiom;
+
+import java.util.Iterator;
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
+import org.apache.axiom.om.OMNode;
+import org.apache.axiom.om.OMText;
+import org.apache.tuscany.sca.databinding.TransformationContext;
+import org.apache.tuscany.sca.databinding.javabeans.XML2JavaMapperException;
+import org.apache.tuscany.sca.databinding.javabeans.XML2JavaBeanTransformer;
+
+/**
+ * Transformer to convert data from an OMElement to a Java Exception
+ */
+public class OMElement2Exception extends XML2JavaBeanTransformer<OMElement> {
+
+ @Override
+ public OMElement getRootElement(OMElement element) throws
XML2JavaMapperException {
+ return element;
+ }
+
+ @Override
+ public Iterator<OMElement> getChildElements(OMElement parent) throws
XML2JavaMapperException {
+ return parent.getChildElements();
+ }
+
+ @Override
+ public String getElementName(OMElement element) throws
XML2JavaMapperException {
+ return element.getLocalName();
+ }
+
+ @Override
+ public String getText(OMElement element) throws XML2JavaMapperException {
+ return element.getText();
+ }
+
+ @Override
+ public boolean isTextElement(OMElement element) throws
XML2JavaMapperException {
+ return false;
+ }
+
+ @Override
+ public boolean isTextOnly(OMElement element) throws
XML2JavaMapperException {
+ OMNode firstChild = element.getFirstOMChild();
+ return firstChild instanceof OMText && firstChild.getNextOMSibling()
== null;
+ }
+
+ @Override
+ public OMElement getFirstChildWithName(OMElement element, QName name)
throws XML2JavaMapperException {
+ return element.getFirstChildWithName(name);
+ }
+
+ @Override
+ public Class getSourceType() {
+ return OMElement.class;
+ }
+
+}
Modified:
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.PullTransformer
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-axiom/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.PullTransformer?rev=608213&r1=608212&r2=608213&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.PullTransformer
(original)
+++
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.PullTransformer
Wed Jan 2 12:39:27 2008
@@ -20,6 +20,8 @@
#
org.apache.tuscany.sca.databinding.axiom.OMElement2CallableReference;source=org.apache.axiom.om.OMElement,target=org.osoa.sca.CallableReference,weight=10
org.apache.tuscany.sca.databinding.axiom.Externalizable2OMElement;source=java.io.Externalizable,target=org.apache.axiom.om.OMElement,weight=10
org.apache.tuscany.sca.databinding.axiom.OMElement2Externalizable;source=org.apache.axiom.om.OMElement,target=java.io.Externalizable,weight=10
+org.apache.tuscany.sca.databinding.axiom.Exception2OMElement;source=java:exception,target=org.apache.axiom.om.OMElement,weight=10
+org.apache.tuscany.sca.databinding.axiom.OMElement2Exception;source=org.apache.axiom.om.OMElement,target=java:exception,weight=10
#
org.apache.tuscany.sca.databinding.axiom.Object2OMElement;source=java:simpleType,target=org.apache.axiom.om.OMElement,weight=80000
#
org.apache.tuscany.sca.databinding.axiom.OMElement2Object;source=org.apache.axiom.om.OMElement,target=java:simpleType,weight=80000
org.apache.tuscany.sca.databinding.axiom.OMElement2String;source=org.apache.axiom.om.OMElement,target=java.lang.String,weight=80
Modified:
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/DefaultDataBindingExtensionPoint.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/DefaultDataBindingExtensionPoint.java?rev=608213&r1=608212&r2=608213&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/DefaultDataBindingExtensionPoint.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/DefaultDataBindingExtensionPoint.java
Wed Jan 2 12:39:27 2008
@@ -241,7 +241,7 @@
DataType faultType = excHandler.getFaultType(dataType);
if (faultType != null) {
dataType.setDataBinding(binding.getName());
- dataType.setLogical(faultType);
+ dataType.setLogical(faultType.getLogical());
return true;
}
}
Modified:
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/DOMNode2JavaBeanTransformer.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/DOMNode2JavaBeanTransformer.java?rev=608213&r1=608212&r2=608213&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/DOMNode2JavaBeanTransformer.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/DOMNode2JavaBeanTransformer.java
Wed Jan 2 12:39:27 2008
@@ -19,7 +19,9 @@
package org.apache.tuscany.sca.databinding.javabeans;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
+import javax.xml.namespace.QName;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
@@ -41,14 +43,14 @@
}
@Override
- public List<Node> getChildElements(Node parent) throws
XML2JavaMapperException {
+ public Iterator<Node> getChildElements(Node parent) throws
XML2JavaMapperException {
NodeList nodeList = parent.getChildNodes();
List<Node> nodeArrayList = new ArrayList<Node>(nodeList.getLength());
for (int count = 0; count < nodeList.getLength(); ++count) {
nodeArrayList.add(nodeList.item(count));
}
- return nodeArrayList;
+ return nodeArrayList.iterator();
}
@Override
@@ -67,6 +69,23 @@
@Override
public boolean isTextElement(Node element) throws XML2JavaMapperException {
return element.getNodeType() == Node.TEXT_NODE;
+ }
+
+ @Override
+ public boolean isTextOnly(Node element) throws XML2JavaMapperException {
+ NodeList childNodes = element.getChildNodes();
+ return childNodes.getLength() == 1 &&
isTextElement(childNodes.item(0));
+ }
+
+ @Override
+ public Node getFirstChildWithName(Node element, QName name) throws
XML2JavaMapperException {
+ Node child;
+ for (child = element.getFirstChild();
+ child != null && !(child.getNodeName() == name.getLocalPart()
+ && child.getNamespaceURI() ==
name.getNamespaceURI()) ;
+ child = child.getNextSibling()) {
+ }
+ return child;
}
@Override
Modified:
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2DOMNodeTransformer.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2DOMNodeTransformer.java?rev=608213&r1=608212&r2=608213&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2DOMNodeTransformer.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2DOMNodeTransformer.java
Wed Jan 2 12:39:27 2008
@@ -57,14 +57,16 @@
}
@Override
- public Node createText(String textData) throws Java2XMLMapperException {
+ public void appendText(Node parentElement, String textData) throws
Java2XMLMapperException {
+ Node textNode;
if (textData != null) {
- return factory.createTextNode(textData);
+ textNode = factory.createTextNode(textData);
} else {
Attr nil =
factory.createAttributeNS("http://www.w3.org/2001/XMLSchema-instance",
"xsi:nil");
nil.setValue("true");
- return nil;
- }
+ textNode = nil;
+ }
+ appendChild(parentElement, textNode);
}
@Override
Modified:
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2XMLTransformer.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2XMLTransformer.java?rev=608213&r1=608212&r2=608213&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2XMLTransformer.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2XMLTransformer.java
Wed Jan 2 12:39:27 2008
@@ -85,7 +85,7 @@
T element = null;
if (javaObject != null) {
if (javaType.isPrimitive() || isSimpleJavaType(javaObject)) {
- appendChild(parent, createText(mapper.toXMLLiteral(null,
javaObject, context)));
+ appendText(parent, mapper.toXMLLiteral(null, javaObject,
context));
} else if (javaType.isArray()) {
int size = Array.getLength(javaObject);
for (int count = 0; count < size; ++count) {
@@ -127,7 +127,8 @@
for (Method aMethod : methods) {
try {
if (Modifier.isPublic(aMethod.getModifiers()) &&
aMethod.getName().startsWith(GET)
- && aMethod.getParameterTypes().length == 0) {
+ && aMethod.getParameterTypes().length == 0
+ && isMappedGetter(aMethod.getName())) {
fieldName =
resolveFieldFromMethod(aMethod.getName());
try {
javaType.getField(fieldName);
@@ -160,6 +161,15 @@
}
}
+ /*
+ * Subclasses can override this method to prevent some getter methods
+ * from being mapped. The default implementation provided by this class
+ * maps all getter methods.
+ */
+ protected boolean isMappedGetter(String methodName) {
+ return true;
+ }
+
@Override
public String getSourceDataBinding() {
return JavaBeansDataBinding.NAME;
@@ -233,12 +243,12 @@
public abstract T createElement(QName qName) throws
Java2XMLMapperException;
/**
- * Create a text node with the given text data
+ * Create a text node and add it to the parent
+ * @param parentElement
* @param textData
- * @return
* @throws Java2XMLMapperException
*/
- public abstract T createText(String textData) throws
Java2XMLMapperException;
+ public abstract void appendText(T parentElement, String textData) throws
Java2XMLMapperException;
/**
* Add the child element to the parent
Modified:
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBeansDataBinding.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBeansDataBinding.java?rev=608213&r1=608212&r2=608213&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBeansDataBinding.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBeansDataBinding.java
Wed Jan 2 12:39:27 2008
@@ -46,6 +46,10 @@
public JavaBeansDataBinding() {
super(NAME, Object.class);
}
+
+ protected JavaBeansDataBinding(String name, Class<?> baseType) {
+ super(name, baseType);
+ }
@Override
public Object copy(Object arg) {
Added:
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaExceptionDataBinding.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaExceptionDataBinding.java?rev=608213&view=auto
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaExceptionDataBinding.java
(added)
+++
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaExceptionDataBinding.java
Wed Jan 2 12:39:27 2008
@@ -0,0 +1,40 @@
+/*
+ * 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.sca.databinding.javabeans;
+
+import org.apache.tuscany.sca.databinding.ExceptionHandler;
+
+/**
+ * DataBinding for Java Exceptions
+ */
+public class JavaExceptionDataBinding extends JavaBeansDataBinding {
+
+ public static final String NAME = "java:exception";
+
+ public JavaExceptionDataBinding() {
+ super(NAME, null);
+ }
+
+ @Override
+ public ExceptionHandler getExceptionHandler() {
+ return new JavaExceptionExceptionHandler();
+ }
+
+}
Added:
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaExceptionExceptionHandler.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaExceptionExceptionHandler.java?rev=608213&view=auto
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaExceptionExceptionHandler.java
(added)
+++
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaExceptionExceptionHandler.java
Wed Jan 2 12:39:27 2008
@@ -0,0 +1,34 @@
+/*
+ * 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.sca.databinding.javabeans;
+
+import org.apache.tuscany.sca.interfacedef.DataType;
+
+/**
+ * Exception handler for the JavaException data binding.
+ */
+public class JavaExceptionExceptionHandler extends JavaBeansExceptionHandler {
+
+ public DataType<?> getFaultType(DataType exceptionDataType) {
+ // needed to make exception handling code in
DefaultDataBindingExtensionPoint work correctly
+ return exceptionDataType;
+ }
+
+}
Modified:
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/XML2JavaBeanTransformer.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/XML2JavaBeanTransformer.java?rev=608213&r1=608212&r2=608213&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/XML2JavaBeanTransformer.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/XML2JavaBeanTransformer.java
Wed Jan 2 12:39:27 2008
@@ -19,11 +19,13 @@
package org.apache.tuscany.sca.databinding.javabeans;
import java.lang.reflect.Array;
+import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Hashtable;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -42,6 +44,7 @@
PullTransformer<T, Object> {
public static final String SET = "set";
+ public static final QName QNAME_MESSAGE = new QName("message");
protected SimpleTypeMapperImpl mapper;
@@ -76,25 +79,39 @@
@SuppressWarnings("unchecked")
private <L> L createJavaObject(T element, Class<L> javaType,
TransformationContext context)
throws XML2JavaMapperException {
- List<T> childElements = getChildElements(element);
- if (childElements.size() == 1 && isTextElement(childElements.get(0))) {
+ if (isTextOnly(element)) {
return (L)
mapper.toJavaObject(mapper.getXMLType(javaType).getQName(),
- getText(childElements.get(0)),
+ getText(element),
context);
} else {
String fieldName = null;
try {
- L javaInstance = javaType.newInstance();
+ L javaInstance;
+ T detailMsg = null;
+ if (Throwable.class.isAssignableFrom(javaType)) {
+ T msgElement = getFirstChildWithName(element,
QNAME_MESSAGE);
+ if (msgElement != null && isTextOnly(msgElement)) {
+ detailMsg = msgElement; // skip this when handling
child elements
+ Constructor constructor = javaType.getConstructor(new
Class[] {String.class});
+ javaInstance = (L)constructor.newInstance(new Object[]
{getText(detailMsg)});
+ } else {
+ javaInstance = javaType.newInstance();
+ }
+ } else {
+ javaInstance = javaType.newInstance();
+ }
Map<Field, List<Object>> arrayFields = new Hashtable<Field,
List<Object>>();
Map<Method, List<Object>> arraySetters = new Hashtable<Method,
List<Object>>();
- for (int count = 0; count < childElements.size(); ++count) {
- if (!isTextElement(childElements.get(count))) {
- fieldName = getElementName(childElements.get(count));
+
+ for (Iterator<T> childElements = getChildElements(element);
childElements.hasNext(); ) {
+ T childElement = childElements.next();
+ if (!isTextElement(childElement) && childElement !=
detailMsg) {
+ fieldName = getElementName(childElement);
try {
Field javaField = javaType.getField(fieldName);
setFieldValue(javaInstance,
javaField,
- childElements.get(count),
+ childElement,
arrayFields,
context);
@@ -102,7 +119,7 @@
setFieldValueUsingSetter(javaType,
javaInstance,
fieldName,
- childElements.get(count),
+ childElement,
arraySetters,
context);
}
@@ -286,12 +303,16 @@
public abstract String getText(T source) throws XML2JavaMapperException;
- public abstract List<T> getChildElements(T parent) throws
XML2JavaMapperException;
+ public abstract Iterator<T> getChildElements(T parent) throws
XML2JavaMapperException;
public abstract String getElementName(T element) throws
XML2JavaMapperException;
public abstract boolean isTextElement(T element) throws
XML2JavaMapperException;
+ public abstract boolean isTextOnly(T element) throws
XML2JavaMapperException;
+
+ public abstract T getFirstChildWithName(T element, QName name) throws
XML2JavaMapperException;
+
public abstract T getRootElement(T element) throws XML2JavaMapperException;
@Override
Modified:
incubator/tuscany/java/sca/modules/databinding/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.DataBinding
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.DataBinding?rev=608213&r1=608212&r2=608213&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.DataBinding
(original)
+++
incubator/tuscany/java/sca/modules/databinding/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.DataBinding
Wed Jan 2 12:39:27 2008
@@ -1,26 +1,26 @@
-# 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.
-
-# implementation classes for the databindings
-org.apache.tuscany.sca.databinding.xml.DOMDataBinding;type=org.w3c.dom.Node,name=dom
-org.apache.tuscany.sca.databinding.xml.XMLStringDataBinding;type=java.lang.String,name=xml.string
-org.apache.tuscany.sca.databinding.xml.XMLGroupDataBinding;type=databinding:group
-org.apache.tuscany.sca.databinding.javabeans.JavaBeansDataBinding;type=java:complexType
-org.apache.tuscany.sca.databinding.javabeans.SimpleJavaDataBinding;type=java:simpleType
-org.apache.tuscany.sca.databinding.externalizable.ExternalizableDataBinding;type=java.io.Externalizable,name=externalizable
-org.apache.tuscany.sca.databinding.impl.CallableReferenceDataBinding;type=org.osoa.sca.CallableReference,name=callablereference
-
+# 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.
+
+# implementation classes for the databindings
+org.apache.tuscany.sca.databinding.xml.DOMDataBinding;type=org.w3c.dom.Node,name=dom
+org.apache.tuscany.sca.databinding.xml.XMLStringDataBinding;type=java.lang.String,name=xml.string
+org.apache.tuscany.sca.databinding.xml.XMLGroupDataBinding;type=databinding:group
+org.apache.tuscany.sca.databinding.javabeans.JavaBeansDataBinding;type=java:complexType
+org.apache.tuscany.sca.databinding.javabeans.SimpleJavaDataBinding;type=java:simpleType
+org.apache.tuscany.sca.databinding.javabeans.JavaExceptionDataBinding;type=java:exception
+org.apache.tuscany.sca.databinding.externalizable.ExternalizableDataBinding;type=java.io.Externalizable,name=externalizable
+org.apache.tuscany.sca.databinding.impl.CallableReferenceDataBinding;type=org.osoa.sca.CallableReference,name=callablereference
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]