You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by na...@apache.org on 2008/05/05 02:34:25 UTC

svn commit: r653286 - in /incubator/tuscany/java/sca/modules: core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/module/ interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/ interface-wsdl-java2wsdl/src...

Author: nash
Date: Sun May  4 17:34:24 2008
New Revision: 653286

URL: http://svn.apache.org/viewvc?rev=653286&view=rev
Log:
Add exception/fault support to new Java2WSDL runtime mapping code

Added:
    incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestException.java
    incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestFault.java
    incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestFaultBean.java
Modified:
    incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/module/DataBindingModuleActivator.java
    incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSFaultExceptionMapper.java
    incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSJavaInterfaceProcessor.java
    incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/Interface2WSDLGenerator.java
    incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/WSDLDefinitionGenerator.java
    incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestJavaInterface.java
    incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/Java2WSDLGeneratorTestCase.java
    incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/java2wsdl/Java2WSDLHelperTestCase.java
    incubator/tuscany/java/sca/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/Operation.java
    incubator/tuscany/java/sca/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/impl/OperationImpl.java

Modified: incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/module/DataBindingModuleActivator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/module/DataBindingModuleActivator.java?rev=653286&r1=653285&r2=653286&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/module/DataBindingModuleActivator.java (original)
+++ incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/module/DataBindingModuleActivator.java Sun May  4 17:34:24 2008
@@ -81,7 +81,7 @@
 
         // [rfeng] The JAX-WS processor should come before the Databinding processor to make sure @WebService
         // is honored as Remoteable
-        javaFactory.addInterfaceVisitor(new JAXWSJavaInterfaceProcessor(faultExceptionMapper));
+        javaFactory.addInterfaceVisitor(new JAXWSJavaInterfaceProcessor(dataBindings, faultExceptionMapper));
 
         javaFactory.addInterfaceVisitor(new DataBindingJavaInterfaceProcessor(dataBindings));
 

Modified: incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSFaultExceptionMapper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSFaultExceptionMapper.java?rev=653286&r1=653285&r2=653286&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSFaultExceptionMapper.java (original)
+++ incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSFaultExceptionMapper.java Sun May  4 17:34:24 2008
@@ -41,6 +41,11 @@
  * @version $Rev$ $Date$
  */
 public class JAXWSFaultExceptionMapper implements FaultExceptionMapper {
+    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 static final Class<?>[] EMPTY_CLASS_ARRAY = new Class[0];
     private DataBindingExtensionPoint dataBindingExtensionPoint;
 
@@ -154,9 +159,7 @@
             for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) {
                 Method getter = pd.getReadMethod();
                 String name = getter.getName();
-                if ("getClass".equals(name) || "getStackTrace".equals(name)
-                    || "getCause".equals(name)
-                    || "getLocalizedMessage".equals(name)) {
+                if (!isMappedGetter(name)) {
                     continue;
                 }
                 String prefix = "get";
@@ -195,9 +198,16 @@
         Class<?> faultBean = null;
         WebFault fault = cls.getAnnotation(WebFault.class);
         if (fault != null) {
-            faultName = new QName(fault.targetNamespace(), fault.name());
-            XMLType xmlType = new XMLType(faultName, null);
-            faultType.setLogical(xmlType);
+            if (!"".equals(fault.name()) || !"".equals(fault.targetNamespace())) {
+                QName faultQName = ((XMLType)faultType.getLogical()).getElementName(); 
+                String faultNS = "".equals(fault.targetNamespace()) ?
+                                     faultQName.getNamespaceURI() : fault.targetNamespace(); 
+                String faultLocal = "".equals(fault.name()) ?
+                                        faultQName.getLocalPart() : fault.name(); 
+                faultName = new QName(faultNS, faultLocal);
+                XMLType xmlType = new XMLType(faultName, null);
+                faultType.setLogical(xmlType);
+            }
             if (!"".equals(fault.faultBean())) {
                 try {
                     faultBean = Class.forName(fault.faultBean(), false, cls.getClassLoader());
@@ -246,6 +256,17 @@
         return result;
     }
 
+    public static boolean isMappedGetter(String methodName) {
+        if (GETCAUSE.equals(methodName)
+            || GETLOCALIZEDMESSAGE.equals(methodName)
+            || GETSTACKTRACE.equals(methodName)
+            || GETCLASS.equals(methodName)) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+
     public void setDataBindingExtensionPoint(DataBindingExtensionPoint dataBindingExtensionPoint) {
         this.dataBindingExtensionPoint = dataBindingExtensionPoint;
     }

Modified: incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSJavaInterfaceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSJavaInterfaceProcessor.java?rev=653286&r1=653285&r2=653286&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSJavaInterfaceProcessor.java (original)
+++ incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSJavaInterfaceProcessor.java Sun May  4 17:34:24 2008
@@ -21,6 +21,7 @@
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -36,10 +37,13 @@
 import javax.xml.ws.RequestWrapper;
 import javax.xml.ws.ResponseWrapper;
 
+import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
+import org.apache.tuscany.sca.databinding.javabeans.JavaExceptionDataBinding;
 import org.apache.tuscany.sca.interfacedef.DataType;
 import org.apache.tuscany.sca.interfacedef.FaultExceptionMapper;
 import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
 import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
 import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
 import org.apache.tuscany.sca.interfacedef.java.JavaOperation;
 import org.apache.tuscany.sca.interfacedef.java.impl.JavaInterfaceUtil;
@@ -57,10 +61,14 @@
 public class JAXWSJavaInterfaceProcessor implements JavaInterfaceVisitor {
     private static final String JAXB_DATABINDING = "javax.xml.bind.JAXBElement";
     private static final String SCHEMA_NS = "http://www.w3.org/2001/XMLSchema";
+    private static final String GET = "get";
+    private DataBindingExtensionPoint dataBindingExtensionPoint;
     private FaultExceptionMapper faultExceptionMapper;
 
-    public JAXWSJavaInterfaceProcessor(FaultExceptionMapper faultExceptionMapper) {
+    public JAXWSJavaInterfaceProcessor(DataBindingExtensionPoint dataBindingExtensionPoint,
+                                       FaultExceptionMapper faultExceptionMapper) {
         super();
+        this.dataBindingExtensionPoint = dataBindingExtensionPoint;
         this.faultExceptionMapper = faultExceptionMapper;
     }
 
@@ -219,8 +227,56 @@
         if (operation!= null && operation.getFaultTypes() != null) {
             for (DataType exceptionType : operation.getFaultTypes()) {
                 faultExceptionMapper.introspectFaultDataType(exceptionType);
+                DataType faultType = (DataType)exceptionType.getLogical();
+                if (faultType.getDataBinding() == JavaExceptionDataBinding.NAME) {
+                    // The exception class doesn't have an associated bean class, so
+                    // synthesize a virtual bean by introspecting the exception class.
+                    createSyntheticBean(operation, exceptionType);
+                }
+            }
+        }
+    }
+
+    private void createSyntheticBean(Operation operation, DataType exceptionType) {
+        DataType faultType = (DataType)exceptionType.getLogical();
+        QName faultBeanName = ((XMLType)faultType.getLogical()).getElementName();
+        List<DataType<XMLType>> beanDataTypes = new ArrayList<DataType<XMLType>>();
+        for (Method aMethod : exceptionType.getPhysical().getMethods()) {
+            if (Modifier.isPublic(aMethod.getModifiers())
+                && aMethod.getName().startsWith(GET)
+                && aMethod.getParameterTypes().length == 0
+                && JAXWSFaultExceptionMapper.isMappedGetter(aMethod.getName())) {
+                String propName = resolvePropertyFromMethod(aMethod.getName());
+                QName propQName = new QName(faultBeanName.getNamespaceURI(), propName);
+                Class propType = aMethod.getReturnType();
+                XMLType xmlPropType = new XMLType(propQName, null);
+                DataType<XMLType> propDT = new DataTypeImpl<XMLType>(propType, xmlPropType);
+                org.apache.tuscany.sca.databinding.annotation.DataType dt =
+                    aMethod.getAnnotation(org.apache.tuscany.sca.databinding.annotation.DataType.class);
+                if (dt != null) {
+                    propDT.setDataBinding(dt.value());
+                }
+                dataBindingExtensionPoint.introspectType(propDT, aMethod.getAnnotations());
+
+                // sort the list lexicographically as specified in JAX-WS spec section 3.7
+                int i = 0;
+                for (; i < beanDataTypes.size(); i++) {
+                    if (beanDataTypes.get(i).getLogical().getElementName()
+                            .getLocalPart().compareTo(propName) > 0) {
+                        break;
+                    }
+                } 
+                beanDataTypes.add(i, propDT);
             }
         }
+        operation.getFaultBeans().put(faultBeanName, beanDataTypes);
+    }
+
+    private String resolvePropertyFromMethod(String methodName) {
+        StringBuffer propName = new StringBuffer();
+        propName.append(Character.toLowerCase(methodName.charAt(GET.length())));
+        propName.append(methodName.substring(GET.length() + 1));
+        return propName.toString();
     }
 
     private <T extends Annotation> T getAnnotation(Method method, int index, Class<T> annotationType) {

Modified: incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/Interface2WSDLGenerator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/Interface2WSDLGenerator.java?rev=653286&r1=653285&r2=653286&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/Interface2WSDLGenerator.java (original)
+++ incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/Interface2WSDLGenerator.java Sun May  4 17:34:24 2008
@@ -30,6 +30,7 @@
 import javax.wsdl.BindingOperation;
 import javax.wsdl.Definition;
 import javax.wsdl.Input;
+import javax.wsdl.Fault;
 import javax.wsdl.Message;
 import javax.wsdl.OperationType;
 import javax.wsdl.Output;
@@ -212,24 +213,31 @@
                 Element wrapper = schemaDoc.createElementNS(SCHEMA_NS, "xs:element");
                 schema.appendChild(wrapper);
                 wrapper.setAttribute("name", entry.getKey().getLocalPart());
-                Element complexType = schemaDoc.createElementNS(SCHEMA_NS, "xs:complexType");
-                wrapper.appendChild(complexType);
-                if (entry.getValue().size() > 0) {
-                    Element sequence = schemaDoc.createElementNS(SCHEMA_NS, "xs:sequence");
-                    complexType.appendChild(sequence);
-                    for (ElementInfo element: entry.getValue()) {
-                        Element xsElement = schemaDoc.createElementNS(SCHEMA_NS, "xs:element"); 
-                        if (element.isMany()) {
-                            xsElement.setAttribute("maxOccurs", "unbounded");
+                if (entry.getValue().size() == 1 && entry.getValue().get(0).getQName() == null) {
+                    // special case for global fault element
+                    QName typeName = entry.getValue().get(0).getType().getQName();
+                    wrapper.setAttribute("type", typeName.getLocalPart());
+                } else {
+                    // normal wrapper containing type definition inline
+                    Element complexType = schemaDoc.createElementNS(SCHEMA_NS, "xs:complexType");
+                    wrapper.appendChild(complexType);
+                    if (entry.getValue().size() > 0) {
+                        Element sequence = schemaDoc.createElementNS(SCHEMA_NS, "xs:sequence");
+                        complexType.appendChild(sequence);
+                        for (ElementInfo element: entry.getValue()) {
+                            Element xsElement = schemaDoc.createElementNS(SCHEMA_NS, "xs:element"); 
+                            if (element.isMany()) {
+                                xsElement.setAttribute("maxOccurs", "unbounded");
+                            }
+                            xsElement.setAttribute("minOccurs", "0");
+                            xsElement.setAttribute("name", element.getQName().getLocalPart());
+                            if (element.isNillable()) {
+                                xsElement.setAttribute("nillable", "true");
+                            }
+                            QName typeName = element.getType().getQName();
+                            xsElement.setAttribute("type", typeName.getLocalPart());
+                            sequence.appendChild(xsElement);
                         }
-                        xsElement.setAttribute("minOccurs", "0");
-                        xsElement.setAttribute("name", element.getQName().getLocalPart());
-                        if (element.isNillable()) {
-                            xsElement.setAttribute("nillable", "true");
-                        }
-                        QName typeName = element.getType().getQName();
-                        xsElement.setAttribute("type", typeName.getLocalPart());
-                        sequence.appendChild(xsElement);
                     }
                 }
             }
@@ -290,9 +298,9 @@
         operation.setUndefined(false);
 
         Input input = definition.createInput();
-        input.setName("input");
         Message inputMsg = definition.createMessage();
-        QName inputMsgName = new QName(definition.getQName().getNamespaceURI(), op.getName());
+        String namespaceURI = definition.getQName().getNamespaceURI();
+        QName inputMsgName = new QName(namespaceURI, op.getName());
         inputMsg.setQName(inputMsgName);
         inputMsg.setUndefined(false);
         definition.addMessage(inputMsg);
@@ -314,9 +322,8 @@
 
         if (!op.isNonBlocking()) {
             Output output = definition.createOutput();
-            output.setName("output");
             Message outputMsg = definition.createMessage();
-            QName outputMsgName = new QName(definition.getQName().getNamespaceURI(), op.getName() + "Response");
+            QName outputMsgName = new QName(namespaceURI, op.getName() + "Response");
             outputMsg.setQName(outputMsgName);
             outputMsg.setUndefined(false);
             definition.addMessage(outputMsg);
@@ -334,6 +341,37 @@
             operation.setStyle(OperationType.ONE_WAY);
         }
 
+        for (DataType<DataType> faultType: op.getFaultTypes()) {
+            Fault fault = definition.createFault();
+            QName faultName = ((XMLType)faultType.getLogical().getLogical()).getElementName();
+            fault.setName(faultName.getLocalPart());
+            Message faultMsg = definition.getMessage(faultName);
+            if (faultMsg == null) {
+                faultMsg = definition.createMessage();
+                faultMsg.setQName(faultName);
+                faultMsg.setUndefined(false);
+                definition.addMessage(faultMsg);
+                faultMsg.addPart(generatePart(definition, faultType.getLogical(), faultName.getLocalPart()));
+            }
+            fault.setMessage(faultMsg);
+            operation.addFault(fault);
+            List<ElementInfo> elements = null;
+            if (faultType.getLogical().getPhysical() != faultType.getPhysical()) {
+                // create special wrapper for type indirection to real fault bean
+                elements = new ArrayList<ElementInfo>(1);
+                DataType logical = faultType.getLogical();
+                elements.add(getElementInfo(logical.getPhysical(),logical.getLogical(), null, javaTypes));
+             } else {
+                // convert synthesized fault bean to a wrapper type
+                elements = new ArrayList<ElementInfo>();
+                for (DataType<XMLType> propDT: op.getFaultBeans().get(faultName)) {
+                    XMLType logical = propDT.getLogical();
+                    elements.add(getElementInfo(propDT.getPhysical(), logical, logical.getElementName(), javaTypes));
+                }
+            }
+            wrappers.put(faultName, elements);
+        }
+
         operation.setUndefined(false);
         return operation;
     }

Modified: incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/WSDLDefinitionGenerator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/WSDLDefinitionGenerator.java?rev=653286&r1=653285&r2=653286&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/WSDLDefinitionGenerator.java (original)
+++ incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/WSDLDefinitionGenerator.java Sun May  4 17:34:24 2008
@@ -40,10 +40,12 @@
 import javax.wsdl.extensions.soap.SOAPAddress;
 import javax.wsdl.extensions.soap.SOAPBinding;
 import javax.wsdl.extensions.soap.SOAPBody;
+import javax.wsdl.extensions.soap.SOAPFault;
 import javax.wsdl.extensions.soap.SOAPOperation;
 import javax.wsdl.extensions.soap12.SOAP12Address;
 import javax.wsdl.extensions.soap12.SOAP12Binding;
 import javax.wsdl.extensions.soap12.SOAP12Body;
+import javax.wsdl.extensions.soap12.SOAP12Fault;
 import javax.wsdl.extensions.soap12.SOAP12Operation;
 import javax.wsdl.factory.WSDLFactory;
 import javax.wsdl.xml.WSDLReader;
@@ -60,11 +62,13 @@
     private static final QName SOAP_ADDRESS = new QName(SOAP_NS, "address");
     private static final QName SOAP_BINDING = new QName(SOAP_NS, "binding");
     private static final QName SOAP_BODY = new QName(SOAP_NS, "body");
+    private static final QName SOAP_FAULT = new QName(SOAP_NS, "fault");
     private static final QName SOAP_OPERATION = new QName(SOAP_NS, "operation");
     private static final String SOAP12_NS = "http://schemas.xmlsoap.org/wsdl/soap12/";
     private static final QName SOAP12_ADDRESS = new QName(SOAP12_NS, "address");
     private static final QName SOAP12_BINDING = new QName(SOAP12_NS, "binding");
     private static final QName SOAP12_BODY = new QName(SOAP12_NS, "body");
+    private static final QName SOAP12_FAULT = new QName(SOAP12_NS, "fault");
     private static final QName SOAP12_OPERATION = new QName(SOAP12_NS, "operation");
 
     private static final String BINDING_SUFFIX = "Binding";
@@ -75,6 +79,7 @@
     private QName soapAddress;
     private QName soapBinding;
     private QName soapBody;
+    private QName soapFault;
     private QName soapOperation;
 
     public WSDLDefinitionGenerator(boolean requiresSOAP12) {
@@ -83,6 +88,7 @@
         soapAddress = requiresSOAP12 ? SOAP12_ADDRESS : SOAP_ADDRESS;
         soapBinding = requiresSOAP12 ? SOAP12_BINDING : SOAP_BINDING;
         soapBody = requiresSOAP12 ? SOAP12_BODY : SOAP_BODY;
+        soapFault = requiresSOAP12 ? SOAP12_FAULT : SOAP_FAULT;
         soapOperation = requiresSOAP12 ? SOAP12_OPERATION : SOAP_OPERATION;
     }
 
@@ -191,7 +197,10 @@
         for (Iterator fi = operation.getFaults().values().iterator(); fi.hasNext();) {
             Fault fault = (Fault)fi.next();
             BindingFault bindingFault = definition.createBindingFault();
-            configureBindingFault(bindingFault, fault);
+            ExtensibilityElement faultExtension =
+                definition.getExtensionRegistry().createExtension(BindingFault.class, soapFault);
+            configureBindingFault(bindingFault, faultExtension, fault);
+            bindingFault.addExtensibilityElement(faultExtension);
             bindingOperation.addBindingFault(bindingFault);
         }
         return bindingOperation;
@@ -210,8 +219,19 @@
         bindingOutput.setName(output.getName());
     }
 
-    protected void configureBindingFault(BindingFault bindingFault, Fault fault) throws WSDLException {
-        bindingFault.setName(fault.getName());
+    protected void configureBindingFault(BindingFault bindingFault,
+                                         ExtensibilityElement faultExtension,
+                                         Fault fault)
+                                     throws WSDLException {
+        String faultName = fault.getName();
+        bindingFault.setName(faultName);
+        if (requiresSOAP12) {
+            ((SOAP12Fault)faultExtension).setName(faultName);
+            ((SOAP12Fault)faultExtension).setUse("literal");
+        } else {
+            ((SOAPFault)faultExtension).setName(faultName);
+            ((SOAPFault)faultExtension).setUse("literal");
+        }
     }
 
     public Service createService(Definition definition, PortType portType) {

Added: incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestException.java?rev=653286&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestException.java (added)
+++ incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestException.java Sun May  4 17:34:24 2008
@@ -0,0 +1,43 @@
+/*
+ * 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.interfacedef.wsdl;
+
+public class TestException extends Exception {
+
+    private String userdata;
+
+    public TestException(String message) {
+        super(message);
+    }
+
+    public TestException(String message, String userdata) {
+        super(message);
+        this.userdata = userdata;
+    }
+
+    public String getUserdata() {
+        return userdata;
+    }
+
+    public void setUserdata(String userdata) {
+        this.userdata = userdata;
+    }
+
+}

Added: incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestFault.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestFault.java?rev=653286&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestFault.java (added)
+++ incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestFault.java Sun May  4 17:34:24 2008
@@ -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.sca.interfacedef.wsdl;
+
+import javax.xml.ws.WebFault;
+
+@WebFault(faultBean="org.apache.tuscany.sca.interfacedef.wsdl.TestFaultBean")
+public class TestFault extends Exception {
+
+    private TestFaultBean bean;
+
+    public TestFault(TestFaultBean bean, String message) {
+        super(message);
+        this.bean = bean;
+    }
+
+    public TestFault(TestFaultBean bean, String message, Throwable cause) {
+        super(message, cause);
+        this.bean = bean;
+    }
+
+    public TestFaultBean getFaultInfo() {
+        return bean;
+    }
+}

Added: incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestFaultBean.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestFaultBean.java?rev=653286&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestFaultBean.java (added)
+++ incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestFaultBean.java Sun May  4 17:34:24 2008
@@ -0,0 +1,50 @@
+/*
+ * 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.interfacedef.wsdl;
+
+public class TestFaultBean {
+    private String lastName;
+    private String firstName;
+    private float age;
+
+    public String getLastName() {
+        return lastName;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    public float getAge() {
+        return age;
+    }
+
+    public void setAge(float age) {
+        this.age = age;
+    }
+}

Modified: incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestJavaInterface.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestJavaInterface.java?rev=653286&r1=653285&r2=653286&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestJavaInterface.java (original)
+++ incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/TestJavaInterface.java Sun May  4 17:34:24 2008
@@ -46,5 +46,8 @@
     void dummy();
 
     @WebMethod
-    void m6(TestJavaClass info);
+    void m6(TestJavaClass info) throws TestException;
+
+    @WebMethod
+    void m7(TestJavaClass info) throws TestFault;
 }

Modified: incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/Java2WSDLGeneratorTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/Java2WSDLGeneratorTestCase.java?rev=653286&r1=653285&r2=653286&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/Java2WSDLGeneratorTestCase.java (original)
+++ incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/interface2wsdl/Java2WSDLGeneratorTestCase.java Sun May  4 17:34:24 2008
@@ -28,6 +28,7 @@
 import org.apache.tuscany.sca.databinding.DefaultDataBindingExtensionPoint;
 import org.apache.tuscany.sca.interfacedef.java.DefaultJavaInterfaceFactory;
 import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.interfacedef.java.jaxws.JAXWSFaultExceptionMapper;
 import org.apache.tuscany.sca.interfacedef.java.jaxws.JAXWSJavaInterfaceProcessor;
 import org.apache.tuscany.sca.interfacedef.wsdl.DefaultWSDLFactory;
 import org.apache.tuscany.sca.interfacedef.wsdl.TestJavaInterface;
@@ -43,8 +44,9 @@
     public void testGenerate() throws Exception {
         DefaultJavaInterfaceFactory iFactory = new DefaultJavaInterfaceFactory();
         JavaInterface iface = iFactory.createJavaInterface(TestJavaInterface.class);
-        new JAXWSJavaInterfaceProcessor().visitInterface(iface);
         DefaultDataBindingExtensionPoint dataBindings = new DefaultDataBindingExtensionPoint();
+        JAXWSFaultExceptionMapper faultExceptionMapper = new JAXWSFaultExceptionMapper(dataBindings);
+        new JAXWSJavaInterfaceProcessor(dataBindings, faultExceptionMapper).visitInterface(iface);
         new DataBindingJavaInterfaceProcessor(dataBindings).visitInterface(iface);
         WSDLDefinition wsdlDefinition = new DefaultWSDLFactory().createWSDLDefinition();
         Interface2WSDLGenerator generator = new Interface2WSDLGenerator(false);

Modified: incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/java2wsdl/Java2WSDLHelperTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/java2wsdl/Java2WSDLHelperTestCase.java?rev=653286&r1=653285&r2=653286&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/java2wsdl/Java2WSDLHelperTestCase.java (original)
+++ incubator/tuscany/java/sca/modules/interface-wsdl-java2wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/java2wsdl/Java2WSDLHelperTestCase.java Sun May  4 17:34:24 2008
@@ -34,6 +34,7 @@
 import org.apache.tuscany.sca.interfacedef.java.DefaultJavaInterfaceFactory;
 import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
 import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
+import org.apache.tuscany.sca.interfacedef.java.jaxws.JAXWSFaultExceptionMapper;
 import org.apache.tuscany.sca.interfacedef.java.jaxws.JAXWSJavaInterfaceProcessor;
 import org.apache.tuscany.sca.interfacedef.wsdl.TestJavaInterface;
 import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface;
@@ -66,8 +67,9 @@
         DefaultJavaInterfaceFactory factory = new DefaultJavaInterfaceFactory();
         JavaInterfaceContract javaIC = factory.createJavaInterfaceContract();
         JavaInterface iface = factory.createJavaInterface(HelloWorld.class);
-        new JAXWSJavaInterfaceProcessor().visitInterface(iface);
         DefaultDataBindingExtensionPoint dataBindings = new DefaultDataBindingExtensionPoint();
+        JAXWSFaultExceptionMapper faultExceptionMapper = new JAXWSFaultExceptionMapper(dataBindings);
+        new JAXWSJavaInterfaceProcessor(dataBindings, faultExceptionMapper).visitInterface(iface);
         new DataBindingJavaInterfaceProcessor(dataBindings).visitInterface(iface);
         javaIC.setInterface(iface);
         WSDLInterfaceContract wsdlIC = Java2WSDLHelper.createWSDLInterfaceContract(javaIC);
@@ -80,7 +82,7 @@
  
         JavaInterfaceContract javaIC2 = factory.createJavaInterfaceContract();
         JavaInterface iface2 = factory.createJavaInterface(TestJavaInterface.class);
-        new JAXWSJavaInterfaceProcessor().visitInterface(iface2);
+        new JAXWSJavaInterfaceProcessor(dataBindings, faultExceptionMapper).visitInterface(iface2);
         new DataBindingJavaInterfaceProcessor(dataBindings).visitInterface(iface2);
         javaIC2.setInterface(iface2);
         WSDLInterfaceContract wsdlIC2 = Java2WSDLHelper.createWSDLInterfaceContract(javaIC2);

Modified: incubator/tuscany/java/sca/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/Operation.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/Operation.java?rev=653286&r1=653285&r2=653286&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/Operation.java (original)
+++ incubator/tuscany/java/sca/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/Operation.java Sun May  4 17:34:24 2008
@@ -19,8 +19,11 @@
 package org.apache.tuscany.sca.interfacedef;
 
 import java.util.List;
+import java.util.Map;
+import javax.xml.namespace.QName;
 
 import org.apache.tuscany.sca.interfacedef.util.WrapperInfo;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
 import org.apache.tuscany.sca.policy.PolicySetAttachPoint;
 
 /**
@@ -173,6 +176,19 @@
     void setDynamic(boolean b);
 
     /**
+     * Get the synthesized fault beans for this operation
+     * 
+     * @return the fault beans
+     */
+    Map<QName, List<DataType<XMLType>>> getFaultBeans();
+    
+    /**
+     * Set the synthesized fault beans for this operation
+     * @param faultBeans
+     */
+    void setFaultBeans(Map<QName, List<DataType<XMLType>>> faultBeans);
+
+    /**
      * Implementations must support cloning.
      */
     Object clone() throws CloneNotSupportedException;

Modified: incubator/tuscany/java/sca/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/impl/OperationImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/impl/OperationImpl.java?rev=653286&r1=653285&r2=653286&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/impl/OperationImpl.java (original)
+++ incubator/tuscany/java/sca/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/impl/OperationImpl.java Sun May  4 17:34:24 2008
@@ -19,13 +19,17 @@
 package org.apache.tuscany.sca.interfacedef.impl;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import javax.xml.namespace.QName;
 
 import org.apache.tuscany.sca.interfacedef.ConversationSequence;
 import org.apache.tuscany.sca.interfacedef.DataType;
 import org.apache.tuscany.sca.interfacedef.Interface;
 import org.apache.tuscany.sca.interfacedef.Operation;
 import org.apache.tuscany.sca.interfacedef.util.WrapperInfo;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
 import org.apache.tuscany.sca.policy.Intent;
 import org.apache.tuscany.sca.policy.IntentAttachPointType;
 import org.apache.tuscany.sca.policy.PolicySet;
@@ -49,6 +53,7 @@
     private WrapperInfo wrapper;
     private String dataBinding;
     private boolean dynamic;
+    private Map<QName, List<DataType<XMLType>>> faultBeans;
     
     private List<PolicySet> applicablePolicySets = new ArrayList<PolicySet>();
     private List<PolicySet> policySets = new ArrayList<PolicySet>();
@@ -61,6 +66,7 @@
     public OperationImpl() {
         inputType = new DataTypeImpl<List<DataType>>("idl:input", Object[].class, new ArrayList<DataType>());
         faultTypes = new ArrayList<DataType>();
+        faultBeans = new HashMap<QName, List<DataType<XMLType>>>();
     }
 
     public String getName() {
@@ -272,6 +278,14 @@
     public void setDynamic(boolean b) {
         this.dynamic = b;
     }
+    
+    public Map<QName, List<DataType<XMLType>>> getFaultBeans() {
+        return faultBeans;
+    }
+    
+    public void setFaultBeans(Map<QName, List<DataType<XMLType>>> faultBeans) {
+        this.faultBeans = faultBeans;
+    }
 
     @Override
     public OperationImpl clone() throws CloneNotSupportedException {
@@ -293,7 +307,7 @@
         clonedInputType.setDataBinding(inputType.getDataBinding());
         copy.inputType = clonedInputType;
         
-        if(this.outputType!=null) {
+        if (this.outputType != null) {
             copy.outputType = (DataType) this.outputType.clone();
         }