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]

Reply via email to