diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpAdapterParsingUtils.java b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpAdapterParsingUtils.java index f03863c9b7..bd2420ffe3 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpAdapterParsingUtils.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpAdapterParsingUtils.java @@ -16,12 +16,20 @@ package org.springframework.integration.http.config; +import java.util.List; + import org.w3c.dom.Element; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.ManagedMap; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.integration.config.ExpressionFactoryBean; +import org.springframework.util.CollectionUtils; +import org.springframework.util.xml.DomUtils; /** * @author Oleg Zhurakousky + * @author Mark Fisher * @since 2.0.2 */ abstract class HttpAdapterParsingUtils { @@ -40,4 +48,19 @@ abstract class HttpAdapterParsingUtils { } } + static void configureUriVariableExpressions(BeanDefinitionBuilder builder, Element element) { + List uriVariableElements = DomUtils.getChildElementsByTagName(element, "uri-variable"); + if (!CollectionUtils.isEmpty(uriVariableElements)) { + ManagedMap uriVariableExpressions = new ManagedMap(); + for (Element uriVariableElement : uriVariableElements) { + String name = uriVariableElement.getAttribute("name"); + String expression = uriVariableElement.getAttribute("expression"); + BeanDefinitionBuilder factoryBeanBuilder = BeanDefinitionBuilder.genericBeanDefinition(ExpressionFactoryBean.class); + factoryBeanBuilder.addConstructorArgValue(expression); + uriVariableExpressions.put(name, factoryBeanBuilder.getBeanDefinition()); + } + builder.addPropertyValue("uriVariableExpressions", uriVariableExpressions); + } + } + } diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParser.java b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParser.java index 46569dc733..42bed9c4f3 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParser.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParser.java @@ -16,10 +16,6 @@ package org.springframework.integration.http.config; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import org.w3c.dom.Element; import org.springframework.beans.factory.support.AbstractBeanDefinition; @@ -27,9 +23,7 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.config.xml.AbstractOutboundChannelAdapterParser; import org.springframework.integration.config.xml.IntegrationNamespaceUtils; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -import org.springframework.util.xml.DomUtils; /** * Parser for the 'outbound-channel-adapter' element of the http namespace. @@ -78,16 +72,7 @@ public class HttpOutboundChannelAdapterParser extends AbstractOutboundChannelAda IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "charset"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "extract-payload"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "expected-response-type"); - List uriVariableElements = DomUtils.getChildElementsByTagName(element, "uri-variable"); - if (!CollectionUtils.isEmpty(uriVariableElements)) { - Map uriVariableExpressions = new HashMap(); - for (Element uriVariableElement : uriVariableElements) { - String name = uriVariableElement.getAttribute("name"); - String expression = uriVariableElement.getAttribute("expression"); - uriVariableExpressions.put(name, expression); - } - builder.addPropertyValue("uriVariableExpressions", uriVariableExpressions); - } + HttpAdapterParsingUtils.configureUriVariableExpressions(builder, element); return builder.getBeanDefinition(); } diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundGatewayParser.java b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundGatewayParser.java index f30bbd9a73..c20643b98f 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundGatewayParser.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundGatewayParser.java @@ -16,19 +16,13 @@ package org.springframework.integration.http.config; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import org.w3c.dom.Element; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.config.xml.AbstractConsumerEndpointParser; import org.springframework.integration.config.xml.IntegrationNamespaceUtils; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -import org.springframework.util.xml.DomUtils; /** * Parser for the 'outbound-gateway' element of the http namespace. @@ -85,16 +79,7 @@ public class HttpOutboundGatewayParser extends AbstractConsumerEndpointParser { IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "expected-response-type"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "request-timeout", "sendTimeout"); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "reply-channel", "outputChannel"); - List uriVariableElements = DomUtils.getChildElementsByTagName(element, "uri-variable"); - if (!CollectionUtils.isEmpty(uriVariableElements)) { - Map uriVariableExpressions = new HashMap(); - for (Element uriVariableElement : uriVariableElements) { - String name = uriVariableElement.getAttribute("name"); - String expression = uriVariableElement.getAttribute("expression"); - uriVariableExpressions.put(name, expression); - } - builder.addPropertyValue("uriVariableExpressions", uriVariableExpressions); - } + HttpAdapterParsingUtils.configureUriVariableExpressions(builder, element); return builder; } diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandler.java b/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandler.java index cf33dbb94f..060c78a902 100755 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandler.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandler.java @@ -32,8 +32,6 @@ import org.springframework.context.expression.BeanFactoryResolver; import org.springframework.context.expression.MapAccessor; import org.springframework.core.convert.ConversionService; import org.springframework.expression.Expression; -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.expression.spel.support.StandardTypeConverter; import org.springframework.http.HttpEntity; @@ -76,9 +74,6 @@ import org.springframework.web.client.RestTemplate; */ public class HttpRequestExecutingMessageHandler extends AbstractReplyProducingMessageHandler { - private static final ExpressionParser PARSER = new SpelExpressionParser(); - - private final String uri; private volatile HttpMethod httpMethod = HttpMethod.POST; @@ -210,14 +205,10 @@ public class HttpRequestExecutingMessageHandler extends AbstractReplyProducingMe * Set the Map of URI variable expressions to evaluate against the outbound message * when replacing the variable placeholders in a URI template. */ - public void setUriVariableExpressions(Map uriVariableExpressions) { + public void setUriVariableExpressions(Map uriVariableExpressions) { synchronized (this.uriVariableExpressions) { this.uriVariableExpressions.clear(); - if (!CollectionUtils.isEmpty(uriVariableExpressions)) { - for (Map.Entry entry : uriVariableExpressions.entrySet()) { - this.uriVariableExpressions.put(entry.getKey(), PARSER.parseExpression(entry.getValue())); - } - } + this.uriVariableExpressions.putAll(uriVariableExpressions); } } diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/outbound/UriVariableExpressionTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/outbound/UriVariableExpressionTests.java index 3a22094838..f81d54d0e0 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/outbound/UriVariableExpressionTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/outbound/UriVariableExpressionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2011 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. @@ -25,6 +25,7 @@ import java.util.concurrent.atomic.AtomicReference; import org.junit.Test; +import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.http.HttpMethod; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.SimpleClientHttpRequestFactory; @@ -43,7 +44,8 @@ public class UriVariableExpressionTests { public void testFromMessageWithExpressions() throws Exception { final AtomicReference uriHolder = new AtomicReference(); HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("http://test/{foo}"); - handler.setUriVariableExpressions(Collections.singletonMap("foo", "payload")); + SpelExpressionParser parser = new SpelExpressionParser(); + handler.setUriVariableExpressions(Collections.singletonMap("foo", parser.parseExpression("payload"))); handler.setRequestFactory(new SimpleClientHttpRequestFactory() { public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException { uriHolder.set(uri); 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 6d414b3a2b..5d4024cc59 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 @@ -28,8 +28,6 @@ import org.springframework.context.expression.BeanFactoryResolver; import org.springframework.context.expression.MapAccessor; import org.springframework.core.convert.ConversionService; import org.springframework.expression.Expression; -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.expression.spel.support.StandardTypeConverter; import org.springframework.integration.Message; @@ -38,7 +36,6 @@ import org.springframework.integration.MessageDeliveryException; import org.springframework.integration.MessagingException; import org.springframework.integration.handler.AbstractReplyProducingMessageHandler; import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.util.UriTemplate; import org.springframework.web.util.UriUtils; @@ -61,9 +58,6 @@ import org.springframework.ws.transport.WebServiceMessageSender; */ public abstract class AbstractWebServiceOutboundGateway extends AbstractReplyProducingMessageHandler { - private static final ExpressionParser PARSER = new SpelExpressionParser(); - - private final WebServiceTemplate webServiceTemplate; private final UriTemplate uriTemplate; @@ -103,14 +97,10 @@ public abstract class AbstractWebServiceOutboundGateway extends AbstractReplyPro * Set the Map of URI variable expressions to evaluate against the outbound message * when replacing the variable placeholders in a URI template. */ - public void setUriVariableExpressions(Map uriVariableExpressions) { + public void setUriVariableExpressions(Map uriVariableExpressions) { synchronized (this.uriVariableExpressions) { this.uriVariableExpressions.clear(); - if (!CollectionUtils.isEmpty(uriVariableExpressions)) { - for (Map.Entry entry : uriVariableExpressions.entrySet()) { - this.uriVariableExpressions.put(entry.getKey(), PARSER.parseExpression(entry.getValue())); - } - } + this.uriVariableExpressions.putAll(uriVariableExpressions); } } diff --git a/spring-integration-ws/src/main/java/org/springframework/integration/ws/config/WebServiceOutboundGatewayParser.java b/spring-integration-ws/src/main/java/org/springframework/integration/ws/config/WebServiceOutboundGatewayParser.java index 717659e5e7..201415a110 100644 --- a/spring-integration-ws/src/main/java/org/springframework/integration/ws/config/WebServiceOutboundGatewayParser.java +++ b/spring-integration-ws/src/main/java/org/springframework/integration/ws/config/WebServiceOutboundGatewayParser.java @@ -16,16 +16,16 @@ package org.springframework.integration.ws.config; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.w3c.dom.Element; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.ManagedList; +import org.springframework.beans.factory.support.ManagedMap; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.integration.config.ExpressionFactoryBean; import org.springframework.integration.config.xml.AbstractOutboundGatewayParser; import org.springframework.integration.config.xml.IntegrationNamespaceUtils; import org.springframework.util.CollectionUtils; @@ -70,11 +70,13 @@ public class WebServiceOutboundGatewayParser extends AbstractOutboundGatewayPars else { builder.addConstructorArgValue(uri); if (!CollectionUtils.isEmpty(uriVariableElements)) { - Map uriVariableExpressions = new HashMap(); + ManagedMap uriVariableExpressions = new ManagedMap(); for (Element uriVariableElement : uriVariableElements) { String name = uriVariableElement.getAttribute("name"); String expression = uriVariableElement.getAttribute("expression"); - uriVariableExpressions.put(name, expression); + BeanDefinitionBuilder factoryBeanBuilder = BeanDefinitionBuilder.genericBeanDefinition(ExpressionFactoryBean.class); + factoryBeanBuilder.addConstructorArgValue(expression); + uriVariableExpressions.put(name, factoryBeanBuilder.getBeanDefinition()); } builder.addPropertyValue("uriVariableExpressions", uriVariableExpressions); }