You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ff...@apache.org on 2012/02/10 06:10:03 UTC

svn commit: r1242678 - in /servicemix/components/trunk/bindings/servicemix-cxf-bc/src: main/java/org/apache/servicemix/cxfbc/ test/java/org/apache/servicemix/cxfbc/ test/resources/org/apache/servicemix/cxfbc/

Author: ffang
Date: Fri Feb 10 05:10:03 2012
New Revision: 1242678

URL: http://svn.apache.org/viewvc?rev=1242678&view=rev
Log:
[SMXCOMP-923]cxf bc provider should be able to return correct fault when useSOAPEnvelope=true

Added:
    servicemix/components/trunk/bindings/servicemix-cxf-bc/src/test/resources/org/apache/servicemix/cxfbc/jms_transport_timeout.xml
Modified:
    servicemix/components/trunk/bindings/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java
    servicemix/components/trunk/bindings/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProvider.java
    servicemix/components/trunk/bindings/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcJmsTest.java

Modified: servicemix/components/trunk/bindings/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java
URL: http://svn.apache.org/viewvc/servicemix/components/trunk/bindings/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java?rev=1242678&r1=1242677&r2=1242678&view=diff
==============================================================================
--- servicemix/components/trunk/bindings/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java (original)
+++ servicemix/components/trunk/bindings/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java Fri Feb 10 05:10:03 2012
@@ -953,6 +953,8 @@ public class CxfBcConsumer extends Consu
                                 details.getNamespaceURI(), "Fault").item(0);
                         }
                         assert details != null;
+                        NodeList reason = details.getElementsByTagName("faultstring");
+                        NodeList code = details.getElementsByTagName("faultcode");
                         if (exchange.getProperty("faultstring") != null) {
                             details = (Element) details.getElementsByTagName("faultstring").item(0);
                         } else {
@@ -970,6 +972,11 @@ public class CxfBcConsumer extends Consu
                         f.setDetail(details);
                         if (exchange.getProperty("faultstring") != null) {
                             f.setMessage((String)exchange.getProperty("faultstring"));
+                        } else {
+                            if (reason != null && reason.item(0) != null 
+                                && ((Element)reason.item(0)).getTextContent() != null) {
+                                f.setMessage(((Element)reason.item(0)).getTextContent());
+                            }
                         }
                         
                         if (exchange.getProperty("faultcode") != null) {

Modified: servicemix/components/trunk/bindings/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProvider.java
URL: http://svn.apache.org/viewvc/servicemix/components/trunk/bindings/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProvider.java?rev=1242678&r1=1242677&r2=1242678&view=diff
==============================================================================
--- servicemix/components/trunk/bindings/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProvider.java (original)
+++ servicemix/components/trunk/bindings/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProvider.java Fri Feb 10 05:10:03 2012
@@ -53,6 +53,8 @@ import com.ibm.wsdl.Constants;
 
 import org.apache.cxf.Bus;
 
+import org.apache.cxf.binding.soap.Soap11;
+import org.apache.cxf.binding.soap.Soap12;
 import org.apache.cxf.binding.soap.SoapMessage;
 import org.apache.cxf.binding.soap.SoapVersion;
 import org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor;
@@ -272,10 +274,18 @@ public class CxfBcProvider extends Provi
     private void faultProcess(MessageExchange exchange, Message message, Exception e) throws MessagingException {
         javax.jbi.messaging.Fault fault = exchange.createFault();
         if (e.getCause() != null) {
-            handleJBIFault(message, e.getCause().getMessage());
+            if (isUseJBIWrapper()) {
+                handleJBIFault(message, e.getCause().getMessage());
+            } else {
+                handleSoapFault(message, e.getCause().getMessage(), exchange);
+            }
         } else {
-            handleJBIFault(message, e.getMessage());
-        }
+            if (isUseJBIWrapper()) {
+                handleJBIFault(message, e.getMessage());
+            } else {
+                handleSoapFault(message, e.getMessage(), exchange);
+            }
+        }        
         fault.setContent(message.getContent(Source.class));
         exchange.setFault(fault);
         boolean txSync = exchange.getStatus() == ExchangeStatus.ACTIVE
@@ -290,6 +300,72 @@ public class CxfBcProvider extends Provi
     }
 
    
+    private void handleSoapFault(Message message, String faultMessage, MessageExchange exchange) {
+        Document document = DomUtil.createDocument();
+        SoapVersion soapVersion = ((SoapMessage)message).getVersion();
+        
+        
+        if (isUseSOAPEnvelope()) {
+            Element soapEnv = DomUtil.createElement(document, new QName(
+                soapVersion.getEnvelope().getNamespaceURI(), soapVersion
+                        .getEnvelope().getLocalPart(), "soap"));
+            Element soapBody = DomUtil.createElement(soapEnv, new QName(
+                soapVersion.getBody().getNamespaceURI(), soapVersion
+                        .getBody().getLocalPart(), "soap"));
+                                  
+            soapEnv.appendChild(soapBody);
+            Element faultBody = DomUtil.createElement(soapBody, new QName(
+                                    soapVersion.getEnvelope().getNamespaceURI(),
+                                    "Fault", "soap"));
+            Element faultCode = DomUtil.createElement(faultBody, 
+                                                      new QName("", "faultcode"));
+            faultCode.setTextContent("soap:Client");
+            Element faultString = DomUtil.createElement(faultBody, 
+                                                      new QName("", "faultstring"));
+            faultString.setTextContent(faultMessage);
+            Element faultDetail = null;
+            if (soapVersion instanceof Soap12) {
+                faultDetail = DomUtil.createElement(faultBody, new QName(
+                                        soapVersion.getBody().getNamespaceURI(), 
+                                        "Detail", "soap"));
+            } else {
+                faultDetail = DomUtil.createElement(faultBody, new QName(
+                                        soapVersion.getBody().getNamespaceURI(), 
+                                        "detail"));
+            }
+            faultDetail.setTextContent(faultMessage);
+            /*exchange.setProperty("faultcode", 
+                                 new QName(soapVersion.getEnvelope().getNamespaceURI(), "Client"));
+            exchange.setProperty("faultstring", faultMessage);*/
+                   
+        } else {
+            Element faultBody = DomUtil.createElement(document, new QName(
+                                    soapVersion.getEnvelope().getNamespaceURI(),
+                                    "Fault", "soap"));
+            Element faultCode = DomUtil.createElement(faultBody, 
+                                                      new QName("", "faultcode"));
+            faultCode.setTextContent("soap:Client");
+            Element faultString = DomUtil.createElement(faultBody, 
+                                                      new QName("", "faultstring"));
+            faultString.setTextContent(faultMessage);
+            Element faultDetail = null;
+            if (soapVersion instanceof Soap12) {
+                faultDetail = DomUtil.createElement(faultBody, new QName(
+                                        soapVersion.getBody().getNamespaceURI(), 
+                                        "Detail", "soap"));
+            } else {
+                faultDetail = DomUtil.createElement(faultBody, new QName(
+                                        "", 
+                                        "detail"));
+            }
+            faultDetail.setTextContent(faultMessage);
+            /*exchange.setProperty("faultcode", 
+                                 new QName(soapVersion.getEnvelope().getNamespaceURI(), "Client"));
+            exchange.setProperty("faultstring", faultMessage);*/
+        }
+        message.setContent(Source.class, new DOMSource(document));
+    }
+
     private void handleJBIFault(Message message, String detail) {
         Document doc = DomUtil.createDocument();
         Element jbiFault = DomUtil.createElement(doc, new QName(

Modified: servicemix/components/trunk/bindings/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcJmsTest.java
URL: http://svn.apache.org/viewvc/servicemix/components/trunk/bindings/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcJmsTest.java?rev=1242678&r1=1242677&r2=1242678&view=diff
==============================================================================
--- servicemix/components/trunk/bindings/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcJmsTest.java (original)
+++ servicemix/components/trunk/bindings/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcJmsTest.java Fri Feb 10 05:10:03 2012
@@ -138,6 +138,37 @@ public class CxfBcJmsTest extends CxfBcS
         setUpJBI("org/apache/servicemix/cxfbc/jms_transport_asyn.xml");
         jmsTestBase();
     }
+    
+    public void testJMSTransportTimeoutException() throws Exception {
+        setUpJBI("org/apache/servicemix/cxfbc/jms_transport_timeout.xml");
+        SpringBusFactory bf = new SpringBusFactory();
+        Bus testBus = bf.createBus("org/apache/servicemix/cxfbc/jms_test_timeout.xml");
+        BusFactory.setDefaultBus(testBus);
+
+        URL wsdl = getWSDLURL("org/apache/servicemix/cxfbc/ws/security/hello_world.wsdl");
+
+        QName serviceName = getServiceName(new QName(
+                "http://apache.org/hello_world_soap_http", "HelloWorldService"));
+        QName portName = getPortName(new QName(
+                "http://apache.org/hello_world_soap_http", "HelloWorldPort"));
+        
+        assertNotNull(wsdl);
+
+        HelloWorldService service = new HelloWorldService(wsdl, serviceName);
+        assertNotNull(service);
+        try {
+            Greeter greeter = service.getPort(portName,
+                    Greeter.class);
+            try {
+                greeter.greetMe("wait");
+                fail("should get timeout exception");
+            } catch (Exception e) {
+                assertTrue(e.getMessage().startsWith("Timeout receiving message with correlationId"));
+            }
+        } catch (UndeclaredThrowableException ex) {
+            throw (Exception) ex.getCause();
+        }       
+    }
 
     private void jmsTestBase() throws Exception, NoSuchCodeLitFault, BadRecordLitFault {
         SpringBusFactory bf = new SpringBusFactory();

Added: servicemix/components/trunk/bindings/servicemix-cxf-bc/src/test/resources/org/apache/servicemix/cxfbc/jms_transport_timeout.xml
URL: http://svn.apache.org/viewvc/servicemix/components/trunk/bindings/servicemix-cxf-bc/src/test/resources/org/apache/servicemix/cxfbc/jms_transport_timeout.xml?rev=1242678&view=auto
==============================================================================
--- servicemix/components/trunk/bindings/servicemix-cxf-bc/src/test/resources/org/apache/servicemix/cxfbc/jms_transport_timeout.xml (added)
+++ servicemix/components/trunk/bindings/servicemix-cxf-bc/src/test/resources/org/apache/servicemix/cxfbc/jms_transport_timeout.xml Fri Feb 10 05:10:03 2012
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  
+  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.
+  
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0"
+       xmlns:cxfse="http://servicemix.apache.org/cxfse/1.0"
+       xmlns:cxfbc="http://servicemix.apache.org/cxfbc/1.0"
+       xmlns:test="urn:test"
+       xmlns:greeter="http://apache.org/hello_world_soap_http"
+       >
+  
+  <sm:container id="jbi" embedded="true">
+    
+    <sm:endpoints>
+      <cxfbc:consumer wsdl="org/apache/servicemix/cxfbc/ws/security/hello_world.wsdl"
+                      service="greeter:HelloWorldService"
+                      endpoint="HelloWorldPort"
+                      targetEndpoint="HelloWorldPortProxy"
+                      targetService="greeter:HelloWorldService"
+                      targetInterface="greeter:Greeter"
+                      useSOAPEnvelope="true" useJBIWrapper="false">
+        <cxfbc:inInterceptors>
+          <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
+        </cxfbc:inInterceptors>
+        <cxfbc:outInterceptors>
+          <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
+        </cxfbc:outInterceptors>
+        <cxfbc:inFaultInterceptors>
+          <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
+        </cxfbc:inFaultInterceptors>
+        <cxfbc:outFaultInterceptors>
+          <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
+        </cxfbc:outFaultInterceptors>
+        <cxfbc:features>
+           <bean class="org.apache.cxf.transport.jms.JMSConfigFeature">
+                <property name="jmsConfig">
+                    <bean class="org.apache.cxf.transport.jms.JMSConfiguration">
+                        <property name="concurrentConsumers">
+                            <value>5</value>
+                        </property>
+                        <property name="connectionFactory">
+                            <ref bean="myConnectionFactory" />
+                        </property>
+                        <property name="targetDestination">
+                            <value>test.jmstransport.text</value>
+                        </property>
+                        <property name="useJms11">
+                            <value>false</value>
+                        </property>
+                    </bean>
+                </property>
+            </bean>
+        </cxfbc:features>
+      </cxfbc:consumer>
+      <cxfbc:provider wsdl="org/apache/servicemix/cxfbc/ws/security/hello_world.wsdl"
+                      service="greeter:HelloWorldService"
+                      endpoint="HelloWorldPortProxy"
+                      interfaceName="greeter:Greeter"
+                      busCfg="org/apache/servicemix/cxfbc/jms_test_timeout.xml"
+                      useSOAPEnvelope="true" useJBIWrapper="false"
+                     >
+          <cxfbc:inInterceptors>
+            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
+          </cxfbc:inInterceptors>
+          <cxfbc:outInterceptors>
+            <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
+          </cxfbc:outInterceptors>
+          <cxfbc:inFaultInterceptors>
+            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
+          </cxfbc:inFaultInterceptors>
+          <cxfbc:outFaultInterceptors>
+            <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
+          </cxfbc:outFaultInterceptors>
+          <cxfbc:features>
+           <bean class="org.apache.cxf.transport.jms.JMSConfigFeature">
+                <property name="jmsConfig">
+                    <bean class="org.apache.cxf.transport.jms.JMSConfiguration">
+                        <property name="concurrentConsumers">
+                            <value>5</value>
+                        </property>
+                        <property name="connectionFactory">
+                            <ref bean="myConnectionFactory" />
+                        </property>
+                        <property name="targetDestination">
+                            <value>test.jmstransport.text.provider</value>
+                        </property>
+                        <property name="useJms11">
+                            <value>false</value>
+                        </property>
+                        <property name="receiveTimeout" value="3000" />
+                    </bean>
+                </property>
+            </bean>
+        </cxfbc:features>
+
+      </cxfbc:provider>
+    </sm:endpoints>
+    
+  </sm:container>
+  <bean id="myConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory102">
+        <property name="targetConnectionFactory">
+            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
+                <property name="brokerURL" value="tcp://localhost:61616" />
+            </bean>
+        </property>
+  </bean>
+</beans>