INT-3309 Pluggable MessageBuilder

This is still a work in process.

There are a bunch of TODOs in classes
that are not managed by Spring and so
need to have the MessageBuilderFactory
injected.

But I am looking for feedback on the
approach.

INT-3309 Resolve TODOs

Provide access to the MessageBuilderFactory in all classes.

INT-3309 Polishing + Tests

* Fallback to 'fromMessage()' if mutating and inbound message is not MutableMessage
* Add 'alwaysMutate' boolean to MutableMessageBuilderFactory - coerces 'fromMessage' calls to 'mutateMessage'
* Add tests

INT-3309 Polishing; PR Comments

Also add tests to parent/child contexts where the parent has the
default message builder and the child has a mutable message builder.

INT-3309 More Polish; PR Comments

Also fix removeHeader in MMB.
This commit is contained in:
Gary Russell
2014-03-06 19:09:40 +02:00
committed by Artem Bilan
parent 4c775bce9d
commit ff845b5069
115 changed files with 1763 additions and 426 deletions

View File

@@ -18,10 +18,10 @@ package org.springframework.integration.ws;
import java.util.Map;
import org.springframework.expression.ExpressionException;
import org.springframework.integration.gateway.MessagingGatewaySupport;
import org.springframework.integration.support.AbstractIntegrationMessageBuilder;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessagingException;
import org.springframework.integration.gateway.MessagingGatewaySupport;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.ws.WebServiceMessage;
@@ -34,18 +34,19 @@ import org.springframework.ws.soap.SoapMessage;
* @since 2.1
*/
abstract public class AbstractWebServiceInboundGateway extends MessagingGatewaySupport implements MessageEndpoint {
protected volatile SoapHeaderMapper headerMapper = new DefaultSoapHeaderMapper();
@Override
public String getComponentType() {
return "ws:inbound-gateway";
}
public void setHeaderMapper(SoapHeaderMapper headerMapper) {
Assert.notNull(headerMapper, "headerMapper must not be null");
this.headerMapper = headerMapper;
}
public void invoke(MessageContext messageContext) throws Exception {
Assert.notNull(messageContext,"'messageContext' is required; it must not be null.");
@@ -60,8 +61,8 @@ abstract public class AbstractWebServiceInboundGateway extends MessagingGatewayS
throw e;
}
}
protected void fromSoapHeaders(MessageContext messageContext, MessageBuilder<?> builder){
protected void fromSoapHeaders(MessageContext messageContext, AbstractIntegrationMessageBuilder<?> builder){
WebServiceMessage request = messageContext.getRequest();
String[] propertyNames = messageContext.getPropertyNames();
if (propertyNames != null) {
@@ -77,13 +78,13 @@ abstract public class AbstractWebServiceInboundGateway extends MessagingGatewayS
}
}
}
protected void toSoapHeaders(WebServiceMessage response, Message<?> replyMessage){
if (response instanceof SoapMessage) {
this.headerMapper.fromHeadersToReply(
replyMessage.getHeaders(), (SoapMessage) response);
}
}
abstract protected void doInvoke(MessageContext messageContext) throws Exception;
}

View File

@@ -27,7 +27,6 @@ import org.springframework.expression.Expression;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.integration.expression.ExpressionUtils;
import org.springframework.integration.handler.AbstractReplyProducingMessageHandler;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageDeliveryException;
@@ -231,7 +230,7 @@ public abstract class AbstractWebServiceOutboundGateway extends AbstractReplyPro
if (resultObject != null && message instanceof SoapMessage){
Map<String, Object> mappedMessageHeaders =
AbstractWebServiceOutboundGateway.this.headerMapper.toHeadersFromReply((SoapMessage) message);
return MessageBuilder.withPayload(resultObject).copyHeaders(mappedMessageHeaders).build();
return AbstractWebServiceOutboundGateway.this.getMessageBuilderFactory().withPayload(resultObject).copyHeaders(mappedMessageHeaders).build();
}
else {
return resultObject;

View File

@@ -16,7 +16,7 @@
package org.springframework.integration.ws;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.integration.support.AbstractIntegrationMessageBuilder;
import org.springframework.messaging.Message;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.Unmarshaller;
@@ -98,7 +98,7 @@ public class MarshallingWebServiceInboundGateway extends AbstractWebServiceInbou
WebServiceMessage request = messageContext.getRequest();
Assert.notNull(request, "Invalid message context: request was null.");
Object requestObject = MarshallingUtils.unmarshal(unmarshaller, request);
MessageBuilder<?> builder = MessageBuilder.withPayload(requestObject);
AbstractIntegrationMessageBuilder<?> builder = this.getMessageBuilderFactory().withPayload(requestObject);
this.fromSoapHeaders(messageContext, builder);

View File

@@ -21,14 +21,15 @@ import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import org.w3c.dom.Document;
import org.springframework.integration.support.AbstractIntegrationMessageBuilder;
import org.springframework.messaging.Message;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.util.Assert;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.context.MessageContext;
import org.springframework.xml.transform.StringSource;
import org.springframework.xml.transform.TransformerObjectSupport;
import org.w3c.dom.Document;
/**
* @author Mark Fisher
@@ -45,18 +46,19 @@ public class SimpleWebServiceInboundGateway extends AbstractWebServiceInboundGat
this.extractPayload = extractPayload;
}
@Override
protected void doInvoke(MessageContext messageContext) throws Exception {
WebServiceMessage request = messageContext.getRequest();
Assert.notNull(request, "Invalid message context: request was null.");
MessageBuilder<?> builder = MessageBuilder.withPayload(
AbstractIntegrationMessageBuilder<?> builder = this.getMessageBuilderFactory().withPayload(
(this.extractPayload) ? request.getPayloadSource() : request);
this.fromSoapHeaders(messageContext, builder);
Message<?> replyMessage = this.sendAndReceiveMessage(builder.build());
if (replyMessage != null) {
Object replyPayload = replyMessage.getPayload();
Source responseSource = null;
@@ -77,9 +79,9 @@ public class SimpleWebServiceInboundGateway extends AbstractWebServiceInboundGat
}
WebServiceMessage response = messageContext.getResponse();
this.transformerSupportDelegate.transformSourceToResult(responseSource, response.getPayloadResult());
this.toSoapHeaders(response, replyMessage);
}
}