You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by mm...@apache.org on 2007/11/29 04:41:33 UTC

svn commit: r599254 - in /incubator/cxf/trunk: common/common/src/main/java/org/apache/cxf/common/util/ rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/ systests/src/test/java/org/apache/cxf/systest/ws/addr_feature/ systests/src/test/java/org/apac...

Author: mmao
Date: Wed Nov 28 19:41:28 2007
New Revision: 599254

URL: http://svn.apache.org/viewvc?rev=599254&view=rev
Log:
CXF-1191 
 * WS-A action support faultAction for both implicit and explicit action


Modified:
    incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/common/util/StringUtils.java
    incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_feature/AddNumberImpl.java
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_fromwsdl/AddNumberImpl.java
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_fromwsdl/WSAFromWSDLTest.java
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/RMPolicyTest.java
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/RMPolicyWsdlTest.java
    incubator/cxf/trunk/systests/src/test/resources/wsdl/add_numbers.wsdl

Modified: incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/common/util/StringUtils.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/common/util/StringUtils.java?rev=599254&r1=599253&r2=599254&view=diff
==============================================================================
--- incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/common/util/StringUtils.java (original)
+++ incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/common/util/StringUtils.java Wed Nov 28 19:41:28 2007
@@ -222,4 +222,15 @@
         chars[0] = Character.toUpperCase(chars[0]);
         return new String(chars);
     }
+    
+    public static String uncapitalize(String str) {
+        int strLen = str.length();
+        if (str == null || strLen == 0) {
+            return str;
+        }
+        return new StringBuffer(strLen)
+            .append(Character.toLowerCase(str.charAt(0)))
+            .append(str.substring(1))
+            .toString();
+    }    
 }

Modified: incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java?rev=599254&r1=599253&r2=599254&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java (original)
+++ incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java Wed Nov 28 19:41:28 2007
@@ -30,15 +30,19 @@
 import java.util.logging.Logger;
 import javax.wsdl.extensions.ExtensibilityElement;
 import javax.xml.namespace.QName;
+import javax.xml.ws.WebFault;
 
 import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.FaultMode;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.phase.AbstractPhaseInterceptor;
 import org.apache.cxf.phase.Phase;
 import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.service.model.FaultInfo;
 import org.apache.cxf.service.model.MessageInfo;
 import org.apache.cxf.service.model.OperationInfo;
 import org.apache.cxf.transport.Conduit;
@@ -415,12 +419,49 @@
         return null;
     }
 
+    private boolean isSameFault(final FaultInfo faultInfo, String faultName) {
+        String faultInfoName = faultInfo.getName().getLocalPart();
+        return faultInfoName.equals(faultName) 
+            || faultInfoName.equals(StringUtils.uncapitalize(faultName));
+    }
+
+    private String getActionBaseUri(final OperationInfo operation) {
+        String interfaceName = operation.getInterface().getName().getLocalPart();
+        return addPath(operation.getName().getNamespaceURI(), interfaceName);
+    }
+
+    private String getActionFromFaultMessage(final OperationInfo operation, final String faultName) {
+        if (operation.getFaults() != null) {
+            for (FaultInfo faultInfo : operation.getFaults()) {
+                if (isSameFault(faultInfo, faultName)) {
+                    if (faultInfo.getExtensionAttributes() != null) {
+                        QName faultAction = (QName)faultInfo.getExtensionAttribute(WSAW_ACTION_QNAME);
+                        return faultAction.getLocalPart();
+                    }
+                    return addPath(addPath(getActionBaseUri(operation), "Fault"), 
+                                   faultInfo.getName().getLocalPart());
+                }
+            }
+        }
+        return null;
+    }
+
+    private String getFaultNameFromMessage(final Message message) {
+        Exception e = message.getContent(Exception.class);
+        if (e instanceof Fault) {
+            WebFault t = e.getCause().getClass().getAnnotation(WebFault.class);
+            if (t != null) {
+                return t.name();
+            }
+        }
+        return null;    
+    }
+
     protected String getActionUri(Message message) {
         OperationInfo op = message.getExchange().get(OperationInfo.class);
-        String interfaceName = op.getInterface().getName().getLocalPart();
 
         String actionUri = null;
-        String opNamespace = addPath(op.getName().getNamespaceURI(), interfaceName);
+        String opNamespace = getActionBaseUri(op);
         
         if (ContextUtils.isRequestor(message)) {
             String explicitAction = getActionFromInputMessage(op);
@@ -431,6 +472,9 @@
             } else {
                 actionUri = addPath(opNamespace, op.getInputName());
             }
+        } else if (ContextUtils.isFault(message)) {
+            String faultName = getFaultNameFromMessage(message);
+            actionUri = getActionFromFaultMessage(op, faultName);
         } else {
             String explicitAction = getActionFromOutputMessage(op);
             if (explicitAction != null) {

Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_feature/AddNumberImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_feature/AddNumberImpl.java?rev=599254&r1=599253&r2=599254&view=diff
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_feature/AddNumberImpl.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_feature/AddNumberImpl.java Wed Nov 28 19:41:28 2007
@@ -27,15 +27,28 @@
 @Addressing
 @WebService
 public class AddNumberImpl implements AddNumbersPortType {
-    public int addNumbers(int number1, int number2) {
-        return number1 + number2;
+    public int addNumbers(int number1, int number2) throws AddNumbersFault_Exception {
+        return execute(number1, number2);
     }
 
     public int addNumbers2(int number1, int number2) {
         return number1 + number2;
     }
 
-    public int addNumbers3(int number1, int number2) {
+    public int addNumbers3(int number1, int number2) throws AddNumbersFault_Exception {
+        return execute(number1, number2);
+    }
+
+
+    int execute(int number1, int number2) throws AddNumbersFault_Exception {
+        if (number1 < 0 || number2 < 0) {
+            AddNumbersFault fb = new AddNumbersFault();
+            fb.setDetail("Negative numbers cant be added!");
+            fb.setMessage("Numbers: " + number1 + ", " + number2);
+
+            throw new AddNumbersFault_Exception(fb.getMessage(), fb);
+        }
+
         return number1 + number2;
     }
 }

Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_fromwsdl/AddNumberImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_fromwsdl/AddNumberImpl.java?rev=599254&r1=599253&r2=599254&view=diff
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_fromwsdl/AddNumberImpl.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_fromwsdl/AddNumberImpl.java Wed Nov 28 19:41:28 2007
@@ -21,6 +21,9 @@
 
 import javax.jws.WebService;
 import javax.xml.ws.soap.Addressing;
+
+import org.apache.cxf.systest.ws.addr_feature.AddNumbersFault;
+import org.apache.cxf.systest.ws.addr_feature.AddNumbersFault_Exception;
 import org.apache.cxf.systest.ws.addr_feature.AddNumbersPortType;
 
 // Jax-WS 2.1 WS-Addressing FromWsdl
@@ -29,15 +32,27 @@
 @WebService(serviceName = "AddNumbersService",
             targetNamespace = "http://apache.org/cxf/systest/ws/addr_feature/")
 public class AddNumberImpl implements AddNumbersPortType {
-    public int addNumbers(int number1, int number2) {
-        return number1 + number2;
+    public int addNumbers(int number1, int number2) throws AddNumbersFault_Exception {
+        return execute(number1, number2);
     }
 
     public int addNumbers2(int number1, int number2) {
         return number1 + number2;
     }
 
-    public int addNumbers3(int number1, int number2) {
+    public int addNumbers3(int number1, int number2) throws AddNumbersFault_Exception {
+        return execute(number1, number2);
+    }
+
+    int execute(int number1, int number2) throws AddNumbersFault_Exception {
+        if (number1 < 0 || number2 < 0) {
+            AddNumbersFault fb = new AddNumbersFault();
+            fb.setDetail("Negative numbers cant be added!");
+            fb.setMessage("Numbers: " + number1 + ", " + number2);
+
+            throw new AddNumbersFault_Exception(fb.getMessage(), fb);
+        }
+
         return number1 + number2;
     }
 }

Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_fromwsdl/WSAFromWSDLTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_fromwsdl/WSAFromWSDLTest.java?rev=599254&r1=599253&r2=599254&view=diff
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_fromwsdl/WSAFromWSDLTest.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/addr_fromwsdl/WSAFromWSDLTest.java Wed Nov 28 19:41:28 2007
@@ -27,6 +27,7 @@
 
 import org.apache.cxf.interceptor.LoggingInInterceptor;
 import org.apache.cxf.interceptor.LoggingOutInterceptor;
+import org.apache.cxf.systest.ws.addr_feature.AddNumbersFault_Exception;
 import org.apache.cxf.systest.ws.addr_feature.AddNumbersPortType;
 import org.apache.cxf.systest.ws.addr_feature.AddNumbersService;
 import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
@@ -81,7 +82,7 @@
 
         String expectedOut = BASE_URI + "addNumbersRequest";
         String expectedIn = BASE_URI + "addNumbersResponse";
-
+        
         assertTrue(output.toString().indexOf(expectedOut) != -1);
         assertTrue(input.toString().indexOf(expectedIn) != -1);
     }
@@ -114,6 +115,53 @@
 
         String expectedOut = "3in";
         String expectedIn = "3out";
+
+        assertTrue(output.toString().indexOf(expectedOut) != -1);
+        assertTrue(input.toString().indexOf(expectedIn) != -1);
+    }
+
+
+    @Test
+    public void testAddNumbersFault() throws Exception {
+        ByteArrayOutputStream input = setupInLogging();
+        ByteArrayOutputStream output = setupOutLogging();
+
+        AddNumbersPortType port = getPort();
+
+        try {
+            port.addNumbers(-1, 2);
+        } catch (AddNumbersFault_Exception ex) {
+            assert true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            assert false;
+        }
+
+        String expectedOut = BASE_URI + "addNumbersRequest";
+        String expectedIn = BASE_URI + "Fault/addNumbersFault";
+
+        assertTrue(output.toString().indexOf(expectedOut) != -1);
+        assertTrue(input.toString().indexOf(expectedIn) != -1);
+    }
+
+    @Test
+    public void testAddNumbersFault3() throws Exception {
+        ByteArrayOutputStream input = setupInLogging();
+        ByteArrayOutputStream output = setupOutLogging();
+
+        AddNumbersPortType port = getPort();
+
+        try {
+            port.addNumbers3(-1, 2);
+        } catch (AddNumbersFault_Exception ex) {
+            assert true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            assert false;
+        }
+
+        String expectedOut = "3in";
+        String expectedIn = "3fault";
 
         assertTrue(output.toString().indexOf(expectedOut) != -1);
         assertTrue(input.toString().indexOf(expectedIn) != -1);

Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/RMPolicyTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/RMPolicyTest.java?rev=599254&r1=599253&r2=599254&view=diff
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/RMPolicyTest.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/RMPolicyTest.java Wed Nov 28 19:41:28 2007
@@ -163,7 +163,7 @@
             RMConstants.getCreateSequenceResponseAction(),
             GREETME_RESPONSE_ACTION,
             PINGME_RESPONSE_ACTION,
-            PINGME_RESPONSE_ACTION
+            null
         };
         mf.verifyActions(expectedActions, false);
         mf.verifyMessageNumbers(new String[] {null, "1", "2", "3"}, false);

Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/RMPolicyWsdlTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/RMPolicyWsdlTest.java?rev=599254&r1=599253&r2=599254&view=diff
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/RMPolicyWsdlTest.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/RMPolicyWsdlTest.java Wed Nov 28 19:41:28 2007
@@ -169,7 +169,7 @@
             RMConstants.getCreateSequenceResponseAction(),
             GREETME_RESPONSE_ACTION,
             PINGME_RESPONSE_ACTION,
-            PINGME_RESPONSE_ACTION
+            null
         };
         mf.verifyActions(expectedActions, false);
         mf.verifyMessageNumbers(new String[] {null, "1", "2", "3"}, false);

Modified: incubator/cxf/trunk/systests/src/test/resources/wsdl/add_numbers.wsdl
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/resources/wsdl/add_numbers.wsdl?rev=599254&r1=599253&r2=599254&view=diff
==============================================================================
--- incubator/cxf/trunk/systests/src/test/resources/wsdl/add_numbers.wsdl (original)
+++ incubator/cxf/trunk/systests/src/test/resources/wsdl/add_numbers.wsdl Wed Nov 28 19:41:28 2007
@@ -82,7 +82,7 @@
 	<operation name="addNumbers">
 	    <input message="tns:addNumbers"/>
 	    <output message="tns:addNumbersResponse"/>
-	    <!-- <fault name="addNumbersFault" message="tns:addNumbersFault"/> -->
+	    <fault name="addNumbersFault" message="tns:addNumbersFault"/>
 	</operation>
 	<operation name="addNumbers2">
 	    <input message="tns:addNumbers2" name="add2In"/>
@@ -92,7 +92,7 @@
 	<operation name="addNumbers3">
 	    <input message="tns:addNumbers3" wsaw:Action="3in"/>
 	    <output message="tns:addNumbers3Response" wsaw:Action="3out"/>
-<!-- 	    <fault name="addNumbersFault" message="tns:addNumbersFault" wsaw:Action="3fault"/> -->
+	    <fault name="addNumbersFault" message="tns:addNumbersFault" wsaw:Action="3fault"/>
 	</operation>
     </portType>
     <binding name="AddNumbersBinding" type="tns:AddNumbersPortType">
@@ -106,11 +106,9 @@
 	    <output>
 		<soap:body use="literal" />
 	    </output>
-	    <!--
 	    <fault name="addNumbersFault">
 		<soap:fault name="addNumbersFault" use="literal" />
 	    </fault>
-	    -->
 	</operation>
 	<operation name="addNumbers2">
 	    <soap:operation soapAction="" />
@@ -132,9 +130,9 @@
 	    <output>
 		<soap:body use="literal" />
 	    </output>
-<!-- 	    <fault name="addNumbersFault"> -->
-<!-- 		<soap:fault name="addNumbersFault" use="literal" /> -->
-<!-- 	    </fault> -->
+	    <fault name="addNumbersFault">
+		<soap:fault name="addNumbersFault" use="literal" />
+	    </fault>
 	</operation>
     </binding>
     <service name="AddNumbersService">