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();
+ }
}