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>