From 5092d482b525687d28238d0358d28637d2359fb9 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Mon, 9 Oct 2017 13:16:55 -0400 Subject: [PATCH] INT-4355: Add support for DomPOX WS communication JIRA: https://jira.spring.io/browse/INT-4355 **Cherry-pick to 4.3.x** --- .../ws/AbstractWebServiceOutboundGateway.java | 9 +- .../SimpleWebServiceOutboundGatewayTests.java | 83 +++++++++++++++---- ...eOutboundGatewayWithHeaderMapperTests.java | 3 +- 3 files changed, 72 insertions(+), 23 deletions(-) diff --git a/spring-integration-ws/src/main/java/org/springframework/integration/ws/AbstractWebServiceOutboundGateway.java b/spring-integration-ws/src/main/java/org/springframework/integration/ws/AbstractWebServiceOutboundGateway.java index a90ada18e7..cb3b0d4a4e 100644 --- a/spring-integration-ws/src/main/java/org/springframework/integration/ws/AbstractWebServiceOutboundGateway.java +++ b/spring-integration-ws/src/main/java/org/springframework/integration/ws/AbstractWebServiceOutboundGateway.java @@ -251,15 +251,14 @@ public abstract class AbstractWebServiceOutboundGateway extends AbstractReplyPro @Override public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException { Object payload = this.requestMessage.getPayload(); + doWithMessageInternal(message, payload); if (message instanceof SoapMessage) { - this.doWithMessageInternal(message, payload); AbstractWebServiceOutboundGateway.this.headerMapper .fromHeadersToRequest(this.requestMessage.getHeaders(), (SoapMessage) message); - if (this.requestCallback != null) { - this.requestCallback.doWithMessage(message); - } } - + if (this.requestCallback != null) { + this.requestCallback.doWithMessage(message); + } } public abstract void doWithMessageInternal(WebServiceMessage message, Object payload) diff --git a/spring-integration-ws/src/test/java/org/springframework/integration/ws/SimpleWebServiceOutboundGatewayTests.java b/spring-integration-ws/src/test/java/org/springframework/integration/ws/SimpleWebServiceOutboundGatewayTests.java index 0766e17389..be96aeea84 100644 --- a/spring-integration-ws/src/test/java/org/springframework/integration/ws/SimpleWebServiceOutboundGatewayTests.java +++ b/spring-integration-ws/src/test/java/org/springframework/integration/ws/SimpleWebServiceOutboundGatewayTests.java @@ -20,22 +20,18 @@ import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import java.io.ByteArrayInputStream; -import java.io.IOException; import java.net.URI; import java.nio.charset.Charset; -import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicReference; import javax.xml.soap.MessageFactory; -import javax.xml.soap.SOAPException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import org.hamcrest.Matchers; @@ -49,6 +45,7 @@ import org.springframework.integration.handler.ReplyRequiredException; import org.springframework.integration.support.MessageBuilder; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.MessageHandlingException; import org.springframework.messaging.PollableChannel; import org.springframework.messaging.support.GenericMessage; import org.springframework.util.StreamUtils; @@ -61,6 +58,8 @@ import org.springframework.ws.client.support.interceptor.ClientInterceptorAdapte import org.springframework.ws.context.MessageContext; import org.springframework.ws.mime.Attachment; import org.springframework.ws.mime.MimeMessage; +import org.springframework.ws.pox.PoxMessage; +import org.springframework.ws.pox.dom.DomPoxMessageFactory; import org.springframework.ws.soap.SoapMessage; import org.springframework.ws.soap.saaj.SaajSoapMessageFactory; import org.springframework.ws.transport.WebServiceConnection; @@ -72,22 +71,25 @@ import org.springframework.xml.transform.StringSource; * @author Mark Fisher * @author Artem Bilan * @author Gunnar Hillert + * * @since 2.0 */ public class SimpleWebServiceOutboundGatewayTests { private static final String response = "Test Name"; - public static final String responseSoapMessage = " " + - " " + - response + - " " + - ""; + public static final String responseSoapMessage = + " " + + " " + + response + + " " + + ""; - public static final String responseEmptyBodySoapMessage = "\n" + - "\n" + - "\n" + - ""; + public static final String responseEmptyBodySoapMessage = + "\n" + + "\n" + + "\n" + + ""; @Test // INT-1051 public void soapActionAndCustomCallback() { @@ -106,8 +108,9 @@ public class SimpleWebServiceOutboundGatewayTests { gateway.handleMessage(MessageBuilder.withPayload(request) .setHeader(WebServiceHeaders.SOAP_ACTION, soapActionHeaderValue) .build()); + fail("Expected MessageHandlingException"); } - catch (Exception e) { + catch (MessageHandlingException e) { // expected } assertNotNull(soapActionFromCallback.get()); @@ -137,7 +140,7 @@ public class SimpleWebServiceOutboundGatewayTests { } @Test - public void testAttachments() throws TransformerException, SOAPException, InterruptedException, ExecutionException, TimeoutException, IOException { + public void testAttachments() throws Exception { String uri = "http://www.example.org"; SimpleWebServiceOutboundGateway gateway = new SimpleWebServiceOutboundGateway(uri); gateway.setBeanFactory(mock(BeanFactory.class)); @@ -170,8 +173,9 @@ public class SimpleWebServiceOutboundGatewayTests { try { gateway.handleMessage(new GenericMessage<>(webServiceMessage)); + fail("Expected MessageHandlingException"); } - catch (Exception e) { + catch (MessageHandlingException e) { // expected } @@ -194,6 +198,50 @@ public class SimpleWebServiceOutboundGatewayTests { assertEquals("my_data", StreamUtils.copyToString(myAttachment.getInputStream(), Charset.forName("UTF-8"))); } + @Test + public void testDomPoxMessageFactory() throws Exception { + String uri = "http://www.example.org"; + SimpleWebServiceOutboundGateway gateway = new SimpleWebServiceOutboundGateway(uri); + gateway.setBeanFactory(mock(BeanFactory.class)); + + final SettableListenableFuture requestFuture = new SettableListenableFuture<>(); + + ClientInterceptorAdapter interceptorAdapter = new ClientInterceptorAdapter() { + + @Override + public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { + requestFuture.set(messageContext.getRequest()); + return super.handleRequest(messageContext); + } + + }; + gateway.setInterceptors(interceptorAdapter); + gateway.setMessageFactory(new DomPoxMessageFactory()); + gateway.afterPropertiesSet(); + + String request = "foo"; + try { + gateway.handleMessage(new GenericMessage<>(request)); + fail("Expected MessageHandlingException"); + } + catch (MessageHandlingException e) { + // expected + } + + WebServiceMessage requestMessage = requestFuture.get(10, TimeUnit.SECONDS); + + assertNotNull(requestMessage); + assertThat(requestMessage, instanceOf(PoxMessage.class)); + + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + + StringResult stringResult = new StringResult(); + transformer.transform(requestMessage.getPayloadSource(), stringResult); + + assertEquals(request, stringResult.toString()); + } public static WebServiceMessageSender createMockMessageSender(final String mockResponseMessage) throws Exception { WebServiceMessageSender messageSender = Mockito.mock(WebServiceMessageSender.class); @@ -222,6 +270,7 @@ public class SimpleWebServiceOutboundGatewayTests { public URI getDestination() { return this.uri; } + } } diff --git a/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceOutboundGatewayWithHeaderMapperTests.java b/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceOutboundGatewayWithHeaderMapperTests.java index e6bf397ea7..e4c61b3623 100644 --- a/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceOutboundGatewayWithHeaderMapperTests.java +++ b/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceOutboundGatewayWithHeaderMapperTests.java @@ -61,6 +61,7 @@ import org.springframework.util.xml.DomUtils; import org.springframework.ws.WebServiceMessage; import org.springframework.ws.WebServiceMessageFactory; import org.springframework.ws.client.core.WebServiceTemplate; +import org.springframework.ws.pox.dom.DomPoxMessageFactory; import org.springframework.ws.soap.SoapHeader; import org.springframework.ws.soap.SoapMessage; import org.springframework.ws.soap.SoapMessageFactory; @@ -210,7 +211,7 @@ public class WebServiceOutboundGatewayWithHeaderMapperTests { if (!soap) { WebServiceTemplate template = TestUtils.getPropertyValue(gateway, "webServiceTemplate", WebServiceTemplate.class); - template.setMessageFactory(new StubMessageFactory()); + template.setMessageFactory(new DomPoxMessageFactory()); } WebServiceMessageSender messageSender = Mockito.mock(WebServiceMessageSender.class);