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/27 02:09:33 UTC

svn commit: r758952 - in /servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src: main/java/org/apache/servicemix/cxfbc/ main/java/org/apache/servicemix/cxfbc/interceptors/ test/java/org/apache/servicemix/cxfbc/

Author: ffang
Date: Fri Mar 27 01:09:32 2009
New Revision: 758952

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

Modified:
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProviderMessageObserver.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/interceptors/JbiInWsdl1Interceptor.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderConsumerTest.java

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java?rev=758952&r1=758951&r2=758952&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java Fri Mar 27 01:09:32 2009
@@ -753,7 +753,12 @@
                         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/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProviderMessageObserver.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProviderMessageObserver.java?rev=758952&r1=758951&r2=758952&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProviderMessageObserver.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProviderMessageObserver.java Fri Mar 27 01:09:32 2009
@@ -180,6 +180,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();
             msg.setContent(soapMessage.getContent(Source.class));

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/interceptors/JbiInWsdl1Interceptor.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/interceptors/JbiInWsdl1Interceptor.java?rev=758952&r1=758951&r2=758952&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/interceptors/JbiInWsdl1Interceptor.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/interceptors/JbiInWsdl1Interceptor.java Fri Mar 27 01:09:32 2009
@@ -237,31 +237,46 @@
                 JBIConstants.NS_JBI_BINDING, 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);
+            
         }
         SchemaInfo schemaInfo = 
             getOperation(message).getBinding().getService().getSchema(jbiFaultDetail.getNamespaceURI());
         if (schemaInfo != null && !schemaInfo.isElementFormQualified()) {
             //that's unquailied fault
             jbiFaultDetail = addEmptyDefaultTns((Element)jbiFaultDetail);
+            
         }
         jbiFault.appendChild(jbiFaultDetail);
         message.setContent(Source.class, new DOMSource(doc));

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderConsumerTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderConsumerTest.java?rev=758952&r1=758951&r2=758952&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderConsumerTest.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderConsumerTest.java Fri Mar 27 01:09:32 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 {