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 7fe7ae6e4a..c27e198348 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 @@ -237,7 +237,7 @@ public abstract class AbstractWebServiceOutboundGateway extends AbstractReplyPro return siMessage; } else { - return message.getPayloadSource(); + return resultObject; } } diff --git a/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/StubMessageFactory.java b/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/StubMessageFactory.java index 6dbccfc3a4..cc010e2b72 100644 --- a/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/StubMessageFactory.java +++ b/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/StubMessageFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,16 +16,25 @@ package org.springframework.integration.ws.config; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; + +import org.w3c.dom.Document; +import org.xml.sax.InputSource; import org.springframework.ws.WebServiceMessage; import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.pox.dom.DomPoxMessage; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; /** * @author Mark Fisher @@ -40,7 +49,16 @@ public class StubMessageFactory implements WebServiceMessageFactory { } public WebServiceMessage createWebServiceMessage(InputStream inputStream) throws IOException { - return null; + try { + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + + DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + InputSource is = new InputSource( new InputStreamReader(inputStream)); + Document document = builder.parse(is); + return new DomPoxMessage(document, transformer, "text/xml"); + } catch (Exception e) { + throw new IllegalArgumentException(e); + } } } 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 0a5728dad2..95b30e91ca 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,11 @@ package org.springframework.integration.ws.config; +import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.URI; @@ -24,15 +29,14 @@ import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import org.junit.Test; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.integration.Message; @@ -49,17 +53,16 @@ import org.springframework.oxm.XmlMappingException; 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.soap.SoapHeader; import org.springframework.ws.soap.SoapMessage; import org.springframework.ws.soap.SoapMessageFactory; import org.springframework.ws.transport.WebServiceConnection; import org.springframework.ws.transport.WebServiceMessageSender; import org.springframework.xml.namespace.QNameUtils; - -import static junit.framework.Assert.assertEquals; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; +import org.springframework.xml.transform.StringResult; +import org.w3c.dom.Document; +import org.w3c.dom.Element; /** * @author Oleg Zhurakousky @@ -67,13 +70,16 @@ import static org.junit.Assert.assertNull; */ public class WebServiceOutboundGatewayWithHeaderMapperTests { - String responseMessage = " " + + String responseSoapMessage = " " + " " + "" + " " + "jane" + " " + ""; + + String responseNonSoapMessage = " " + + "oleg"; @SuppressWarnings("unchecked") @Test @@ -96,7 +102,18 @@ public class WebServiceOutboundGatewayWithHeaderMapperTests { @Test public void withHeaderMapperString() throws Exception{ String payload = "bill"; - this.process(payload, "withHeaderMapper", "inputChannel"); + Message replyMessage = this.process(payload, "withHeaderMapper", "inputChannel", true); + assertTrue(replyMessage.getPayload() instanceof String); + assertEquals("bar", replyMessage.getHeaders().get("bar")); + assertNull(replyMessage.getHeaders().get("baz")); + } + + @Test + public void withHeaderMapperStringPOX() throws Exception{ + String payload = "bill"; + Message replyMessage = this.process(payload, "withHeaderMapper", "inputChannel", false); + assertTrue(replyMessage.getPayload() instanceof String); + assertTrue(((String)replyMessage.getPayload()).contains("oleg")); } @Test @@ -105,7 +122,21 @@ public class WebServiceOutboundGatewayWithHeaderMapperTests { DocumentBuilder docBuilder = dbfac.newDocumentBuilder(); Document document = docBuilder.parse(new ByteArrayInputStream("bill".getBytes())); DOMSource payload = new DOMSource(document); - this.process(payload, "withHeaderMapper", "inputChannel"); + Message replyMessage = this.process(payload, "withHeaderMapper", "inputChannel", true); + assertTrue(replyMessage.getPayload() instanceof DOMSource); + assertEquals("bar", replyMessage.getHeaders().get("bar")); + assertNull(replyMessage.getHeaders().get("baz")); + } + + @Test + public void withHeaderMapperSourcePOX() throws Exception{ + DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = dbfac.newDocumentBuilder(); + Document document = docBuilder.parse(new ByteArrayInputStream("bill".getBytes())); + DOMSource payload = new DOMSource(document); + Message replyMessage = this.process(payload, "withHeaderMapper", "inputChannel", false); + assertTrue(replyMessage.getPayload() instanceof DOMSource); + assertTrue(this.extractStringResult(replyMessage).contains("oleg")); } @Test @@ -113,21 +144,41 @@ public class WebServiceOutboundGatewayWithHeaderMapperTests { DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = dbfac.newDocumentBuilder(); Document payload = docBuilder.parse(new ByteArrayInputStream("bill".getBytes())); - this.process(payload, "withHeaderMapper", "inputChannel"); + Message replyMessage = this.process(payload, "withHeaderMapper", "inputChannel", true); + assertTrue(replyMessage.getPayload() instanceof Document); + assertEquals("bar", replyMessage.getHeaders().get("bar")); + assertNull(replyMessage.getHeaders().get("baz")); + } + + @Test + public void withHeaderMapperDocumentPOX() throws Exception{ + DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = dbfac.newDocumentBuilder(); + Document payload = docBuilder.parse(new ByteArrayInputStream("bill".getBytes())); + Message replyMessage = this.process(payload, "withHeaderMapper", "inputChannel", false); + assertTrue(replyMessage.getPayload() instanceof Document); + assertTrue(this.extractStringResult(replyMessage).contains("oleg")); } @Test public void withHeaderMapperAndMarshaller() throws Exception{ Person person = new Person(); person.setName("Bill Clinton"); - this.process(person, "marshallingWithHeaderMapper", "inputMarshallingChannel"); + Message replyMessage = this.process(person, "marshallingWithHeaderMapper", "inputMarshallingChannel", true); + assertEquals("bar", replyMessage.getHeaders().get("bar")); + assertNull(replyMessage.getHeaders().get("baz")); } @SuppressWarnings("rawtypes") - public void process(Object payload, String gatewayName, String channelName) throws Exception{ + public Message process(Object payload, String gatewayName, String channelName, final boolean soap) throws Exception{ ApplicationContext context = new ClassPathXmlApplicationContext("ws-outbound-gateway-with-headermappers.xml", this.getClass()); AbstractWebServiceOutboundGateway gateway = TestUtils.getPropertyValue(context.getBean(gatewayName), "handler", AbstractWebServiceOutboundGateway.class); + if (!soap){ + WebServiceTemplate template = TestUtils.getPropertyValue(gateway, "webServiceTemplate", WebServiceTemplate.class); + template.setMessageFactory(new StubMessageFactory()); + } + WebServiceMessageSender messageSender = Mockito.mock(WebServiceMessageSender.class); WebServiceConnection wsConnection = Mockito.mock(WebServiceConnection.class); Mockito.when(messageSender.createConnection(Mockito.any(URI.class))).thenReturn(wsConnection); @@ -136,7 +187,7 @@ public class WebServiceOutboundGatewayWithHeaderMapperTests { Mockito.doAnswer(new Answer() { public Object answer(InvocationOnMock invocation) { Object[] args = invocation.getArguments(); - SoapMessage soapMessage = (SoapMessage) args[0]; + WebServiceMessage wsMessage = (WebServiceMessage) args[0]; // try { // uncomment if you want to see a pretty-print of SOAP message // Transformer transformer = TransformerFactory.newInstance().newTransformer(); // transformer.setOutputProperty(OutputKeys.INDENT, "yes"); @@ -144,11 +195,14 @@ public class WebServiceOutboundGatewayWithHeaderMapperTests { // } catch (Exception e) { // // ignore // } - SoapHeader soapHeader = soapMessage.getSoapHeader(); - assertNotNull(soapHeader.getAttributeValue(QNameUtils.parseQNameString("foo"))); - assertNotNull(soapHeader.getAttributeValue(QNameUtils.parseQNameString("foobar"))); - assertNotNull(soapHeader.getAttributeValue(QNameUtils.parseQNameString("abaz"))); - assertNull(soapHeader.getAttributeValue(QNameUtils.parseQNameString("bar"))); + if (soap){ + SoapHeader soapHeader = ((SoapMessage)wsMessage).getSoapHeader(); + assertNotNull(soapHeader.getAttributeValue(QNameUtils.parseQNameString("foo"))); + assertNotNull(soapHeader.getAttributeValue(QNameUtils.parseQNameString("foobar"))); + assertNotNull(soapHeader.getAttributeValue(QNameUtils.parseQNameString("abaz"))); + assertNull(soapHeader.getAttributeValue(QNameUtils.parseQNameString("bar"))); + } + return null; }}) .when(wsConnection).send(Mockito.any(WebServiceMessage.class)); @@ -156,10 +210,15 @@ public class WebServiceOutboundGatewayWithHeaderMapperTests { Mockito.doAnswer(new Answer() { public Object answer(InvocationOnMock invocation) throws Exception{ Object[] args = invocation.getArguments(); - SoapMessageFactory factory = (SoapMessageFactory) args[0]; - SoapMessage soapMessage = factory.createWebServiceMessage(new ByteArrayInputStream(responseMessage.getBytes())); - soapMessage.getSoapHeader().addAttribute(QNameUtils.parseQNameString("bar"), "bar"); - soapMessage.getSoapHeader().addAttribute(QNameUtils.parseQNameString("baz"), "baz"); + WebServiceMessageFactory factory = (WebServiceMessageFactory) args[0]; + String responseMessage = factory instanceof SoapMessageFactory ? responseSoapMessage : responseNonSoapMessage; + WebServiceMessage wsMessage = factory.createWebServiceMessage(new ByteArrayInputStream(responseMessage.getBytes())); + if (soap){ + + ((SoapMessage)wsMessage).getSoapHeader().addAttribute(QNameUtils.parseQNameString("bar"), "bar"); + ((SoapMessage)wsMessage).getSoapHeader().addAttribute(QNameUtils.parseQNameString("baz"), "baz"); + } + // try { // uncomment if you want to see a pretty-print of SOAP message // Transformer transformer = TransformerFactory.newInstance().newTransformer(); // transformer.setOutputProperty(OutputKeys.INDENT, "yes"); @@ -167,7 +226,7 @@ public class WebServiceOutboundGatewayWithHeaderMapperTests { // } catch (Exception e) { // // ignore // } - return soapMessage; + return wsMessage; }}) .when(wsConnection).receive(Mockito.any(WebServiceMessageFactory.class)); @@ -181,8 +240,7 @@ public class WebServiceOutboundGatewayWithHeaderMapperTests { inputChannel.send(message); QueueChannel outputChannel = context.getBean("outputChannel", QueueChannel.class); Message replyMessage = outputChannel.receive(0); - assertEquals("bar", replyMessage.getHeaders().get("bar")); - assertNull(replyMessage.getHeaders().get("baz")); + return replyMessage; } public static class Person{ @@ -212,4 +270,20 @@ public class WebServiceOutboundGatewayWithHeaderMapperTests { return person; } } + + private String extractStringResult(Message replyMessage) throws Exception{ + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + StringResult result = new StringResult(); + Object payload = replyMessage.getPayload(); + if (payload instanceof DOMSource){ + transformer.transform(((DOMSource)replyMessage.getPayload()), result); + } + else if (payload instanceof Document){ + transformer.transform(new DOMSource((Document)replyMessage.getPayload()), result); + } + else { + throw new IllegalArgumentException("Unsupported payload type: " + payload.getClass().getName()); + } + return result.toString(); + } }