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 2009/03/26 09:14:46 UTC

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

Author: ffang
Date: Thu Mar 26 08:14:41 2009
New Revision: 758549

URL: http://svn.apache.org/viewvc?rev=758549&view=rev
Log:
[SMXCOMP-487]cxf bc provider lost faultstring and faultcode for incoming soap fault message from externel service

Modified:
    servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java
    servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/CxfBcProviderMessageObserver.java
    servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/interceptors/JbiInWsdl1Interceptor.java
    servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderConsumerTest.java

Modified: servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java?rev=758549&r1=758548&r2=758549&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java (original)
+++ servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java Thu Mar 26 08:14:41 2009
@@ -747,7 +747,12 @@
                                         "Fault occured", (ResourceBundle) null));
                         if (exchange.getProperty("faultstring") != null) {
                             f.setMessage((String)exchange.getProperty("faultstring"));
-                        } else {
+                        }
+                        if (exchange.getProperty("faultcode") != null) {
+                            f.setFaultCode((QName) exchange
+                                    .getProperty("faultcode"));
+                        } 
+                        if (exchange.getProperty("hasdetail") == null) {
                             Element details = toElement(exchange.getFault()
                                 .getContent());
                             f.setDetail(details);

Modified: servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/CxfBcProviderMessageObserver.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/CxfBcProviderMessageObserver.java?rev=758549&r1=758548&r2=758549&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/CxfBcProviderMessageObserver.java (original)
+++ servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/CxfBcProviderMessageObserver.java Thu Mar 26 08:14:41 2009
@@ -154,6 +154,12 @@
                 if (soapMessage.get("faultstring") != null) {
                     messageExchange.setProperty("faultstring", soapMessage.get("faultstring"));
                 }
+                if (soapMessage.get("faultcode") != null) {
+                    messageExchange.setProperty("faultcode", soapMessage.get("faultcode"));
+                }
+                if (soapMessage.get("hasdetail") != null) {
+                    messageExchange.setProperty("hasdetail", soapMessage.get("hasdetail"));
+                }
 
             } else if (messageExchange instanceof InOut) {
                 NormalizedMessage msg = messageExchange.createMessage();

Modified: servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/interceptors/JbiInWsdl1Interceptor.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/interceptors/JbiInWsdl1Interceptor.java?rev=758549&r1=758548&r2=758549&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/interceptors/JbiInWsdl1Interceptor.java (original)
+++ servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/interceptors/JbiInWsdl1Interceptor.java Thu Mar 26 08:14:41 2009
@@ -234,25 +234,38 @@
                 CxfJbiConstants.WSDL11_WRAPPER_NAMESPACE, JbiFault.JBI_FAULT_ROOT));
         Node jbiFaultDetail = null;
         if (message.getVersion() instanceof Soap11) {
-            NodeList nodeList = soapFault.getElementsByTagName("detail");
-            if (nodeList == null || nodeList.getLength() == 0) {
-                //there is no detail in the fault, which means the fault is
-                //thrown during soap header process according to soap spec,
-                //try get the mandatory elemenet faultstring
+            NodeList nodeList = soapFault.getElementsByTagName("faultcode");
+            String faultCode = nodeList.item(0).getFirstChild().getTextContent();
+            String prefix = faultCode.substring(0, faultCode.indexOf(":"));
+            String localName = faultCode.substring(faultCode.indexOf(":") + 1);
+            message.put("faultcode", new QName(prefix, localName));
+            nodeList = soapFault.getElementsByTagName("faultstring");
+            message.put("faultstring", nodeList.item(0).getFirstChild().getTextContent());
+            nodeList = soapFault.getElementsByTagName("detail");
+            if (nodeList != null && nodeList.getLength() > 0) {
+                jbiFaultDetail = doc.importNode(nodeList.item(0).getFirstChild(), true);
+            } else {
+                message.put("hasdetail", false);
                 nodeList = soapFault.getElementsByTagName("faultstring");
-                message.put("faultstring", nodeList.item(0).getTextContent());
+                jbiFaultDetail = doc.importNode(nodeList.item(0).getFirstChild(), true);
             }
-            jbiFaultDetail = doc.importNode(nodeList.item(0).getFirstChild(), true);
+            
         } else {
-            NodeList nodeList = soapFault.getElementsByTagName("soap:Detail");
-            if (nodeList == null || nodeList.getLength() == 0) {
-                //there is no detail in the fault, which means the fault is
-                //thrown during soap header process according to soap spec,
-                //try get the mandatory elemenet soap:Reason
-                nodeList = soapFault.getElementsByTagName("soap:Reason");
-                message.put("faultstring", nodeList.item(0).getTextContent());
+            NodeList nodeList = soapFault.getElementsByTagName("soap:Code");
+            String faultCode = nodeList.item(0).getFirstChild().getTextContent();
+            String prefix = faultCode.substring(0, faultCode.indexOf(":"));
+            String localName = faultCode.substring(faultCode.indexOf(":") + 1);
+            message.put("faultcode", new QName(prefix, localName));
+            nodeList = soapFault.getElementsByTagName("soap:Reason");
+            message.put("faultstring", nodeList.item(0).getFirstChild().getTextContent());
+            nodeList = soapFault.getElementsByTagName("soap:Detail");
+            if (nodeList != null && nodeList.getLength() > 0) {
+                jbiFaultDetail = doc.importNode(nodeList.item(0).getFirstChild(), true);
+            } else {
+                message.put("hasdetail", false);
+                nodeList = soapFault.getElementsByTagName("faultstring");
+                jbiFaultDetail = doc.importNode(nodeList.item(0).getFirstChild(), true);
             }
-            jbiFaultDetail = doc.importNode(nodeList.item(0).getFirstChild(), true);
             
         }
 

Modified: servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderConsumerTest.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderConsumerTest.java?rev=758549&r1=758548&r2=758549&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderConsumerTest.java (original)
+++ servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderConsumerTest.java Thu Mar 26 08:14:41 2009
@@ -24,12 +24,10 @@
 import org.apache.cxf.calculator.CalculatorImpl;
 import org.apache.cxf.calculator.CalculatorPortType;
 import org.apache.cxf.calculator.CalculatorService;
-import org.apache.cxf.endpoint.Endpoint;
-import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.frontend.ClientProxy;
 import org.apache.cxf.interceptor.LoggingInInterceptor;
 import org.apache.cxf.interceptor.LoggingOutInterceptor;
-import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
-import org.apache.cxf.service.model.ServiceInfo;
+import org.apache.cxf.jaxws.EndpointImpl;
 import org.apache.servicemix.tck.SpringTestSupport;
 import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
 import org.springframework.context.support.AbstractXmlApplicationContext;
@@ -40,21 +38,14 @@
         
         URL wsdl = getClass().getResource("/wsdl/calculator.wsdl");
         // start external service
-        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
-        factory.setServiceClass(CalculatorPortType.class);
-        factory.setServiceBean(new CalculatorImpl());
-        factory.setWsdlURL(wsdl.toString());
-        factory.setServiceName(new QName("http://apache.org/cxf/calculator", 
-                "CalculatorService"));
-        factory.setBindingId("http://schemas.xmlsoap.org/wsdl/soap12/");
-        String address = "http://localhost:9001/bridgetest";
-        factory.setAddress(address);
-        Server server = factory.create();
-        Endpoint endpoint = server.getEndpoint();
+        EndpointImpl endpoint =
+            (EndpointImpl)javax.xml.ws.Endpoint.publish("http://localhost:9001/bridgetest", 
+                new CalculatorImpl());
+                        
         endpoint.getInInterceptors().add(new LoggingInInterceptor());
         endpoint.getOutInterceptors().add(new LoggingOutInterceptor());
-        ServiceInfo service = endpoint.getEndpointInfo().getService();
-        assertNotNull(service);
+        endpoint.getInFaultInterceptors().add(new LoggingInInterceptor());
+        endpoint.getOutFaultInterceptors().add(new LoggingOutInterceptor());
 
         // start external client
         
@@ -62,6 +53,10 @@
         CalculatorService service1 = new CalculatorService(wsdl, new QName(
                 "http://apache.org/cxf/calculator", "CalculatorService"));
         CalculatorPortType port = service1.getCalculatorPort();
+        ClientProxy.getClient(port).getInFaultInterceptors().add(new LoggingInInterceptor());
+        ClientProxy.getClient(port).getInInterceptors().add(new LoggingInInterceptor());
+        ClientProxy.getClient(port).getOutFaultInterceptors().add(new LoggingOutInterceptor());
+        ClientProxy.getClient(port).getOutInterceptors().add(new LoggingInInterceptor());
         int ret = port.add(1, 2);
         assertEquals(ret, 3);
         try {