From fc00a926c019bfd59b56b96b202ada649051222b Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Sat, 29 Jan 2011 11:34:26 -0500 Subject: [PATCH] INT-1752 added test cases to validate 'rest-template' attribute support --- ...ils.java => HttpAdapterParsingUntils.java} | 2 +- .../HttpOutboundChannelAdapterParser.java | 4 +-- .../config/HttpOutboundGatewayParser.java | 7 ++--- .../HttpRequestExecutingMessageHandler.java | 15 +++++++---- ...boundChannelAdapterParserTests-context.xml | 4 +++ ...ChannelAdapterParserTests-fail-context.xml | 23 ++++++++++++++++ ...HttpOutboundChannelAdapterParserTests.java | 26 +++++++++++++++++++ 7 files changed, 68 insertions(+), 13 deletions(-) rename spring-integration-http/src/main/java/org/springframework/integration/http/config/{HttpParsingUtils.java => HttpAdapterParsingUntils.java} (97%) create mode 100644 spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests-fail-context.xml diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpParsingUtils.java b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpAdapterParsingUntils.java similarity index 97% rename from spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpParsingUtils.java rename to spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpAdapterParsingUntils.java index 6494409bad..cdfe48b36c 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpParsingUtils.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpAdapterParsingUntils.java @@ -23,7 +23,7 @@ import org.springframework.beans.factory.xml.ParserContext; * @author Oleg Zhurakousky * @since 2.0.2 */ -public class HttpParsingUtils { +class HttpAdapterParsingUtils { private static final String[] REST_TEMPLATE_ATTRIBUTES = { "request-factory", "error-handler", "message-converters" 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 479dde16eb..8b53cf1ed0 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 @@ -50,8 +50,8 @@ public class HttpOutboundChannelAdapterParser extends AbstractOutboundChannelAda String restTemplate = element.getAttribute("rest-template"); if (StringUtils.hasText(restTemplate)){ - HttpParsingUtils.verifyNoRestTemplateAttributes(element, parserContext); - builder.addPropertyReference("restTemplate", restTemplate); + HttpAdapterParsingUtils.verifyNoRestTemplateAttributes(element, parserContext); + builder.addConstructorArgReference("restTemplate"); } else { IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converters"); 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 1d2945ae40..89fad03af0 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 @@ -48,12 +48,11 @@ public class HttpOutboundGatewayParser extends AbstractConsumerEndpointParser { "org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler"); builder.addConstructorArgValue(element.getAttribute("url")); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "http-method"); - //IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converters"); String restTemplate = element.getAttribute("rest-template"); if (StringUtils.hasText(restTemplate)){ - HttpParsingUtils.verifyNoRestTemplateAttributes(element, parserContext); - builder.addPropertyReference("restTemplate", restTemplate); + HttpAdapterParsingUtils.verifyNoRestTemplateAttributes(element, parserContext); + builder.addConstructorArgReference("restTemplate"); } else { IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converters"); @@ -83,8 +82,6 @@ public class HttpOutboundGatewayParser extends AbstractConsumerEndpointParser { IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "extract-request-payload", "extractPayload"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "expected-response-type"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "request-timeout", "sendTimeout"); - //IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "request-factory"); - //IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "error-handler"); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "reply-channel", "outputChannel"); List uriVariableElements = DomUtils.getChildElementsByTagName(element, "uri-variable"); if (!CollectionUtils.isEmpty(uriVariableElements)) { 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 732f097b0d..6f0c69dd4e 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 @@ -94,7 +94,7 @@ public class HttpRequestExecutingMessageHandler extends AbstractReplyProducingMe private final Map uriVariableExpressions = new HashMap(); - private volatile RestTemplate restTemplate = new RestTemplate(); + private final RestTemplate restTemplate; private final StandardEvaluationContext evaluationContext = new StandardEvaluationContext(); @@ -110,15 +110,20 @@ public class HttpRequestExecutingMessageHandler extends AbstractReplyProducingMe * Create a handler that will send requests to the provided URI. */ public HttpRequestExecutingMessageHandler(String uri) { + this(uri, null); + } + /** + * Create a handler that will send requests to the provided URI using a provided RestTemplate + * @param uri + * @param resrTemplate + */ + public HttpRequestExecutingMessageHandler(String uri, RestTemplate restTemplate) { Assert.hasText(uri, "URI is required"); + this.restTemplate = (restTemplate == null ? new RestTemplate() : restTemplate); this.restTemplate.getMessageConverters().add(0, new SerializingHttpMessageConverter()); this.uri = uri; } - public void setRestTemplate(RestTemplate restTemplate) { - this.restTemplate = restTemplate; - } - /** * Specify the {@link HttpMethod} for requests. The default method will be POST. */ diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests-context.xml b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests-context.xml index 4a82103e37..57d757e260 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests-context.xml +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests-context.xml @@ -13,6 +13,10 @@ + + + + + + + + + + + + + + + diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests.java index 594eb13d3f..44c74d7b0b 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests.java @@ -16,6 +16,7 @@ package org.springframework.integration.http.config; +import static junit.framework.Assert.assertNotSame; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -29,7 +30,9 @@ import org.junit.runner.RunWith; import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.parsing.BeanDefinitionParsingException; import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.expression.Expression; import org.springframework.http.HttpMethod; import org.springframework.http.client.ClientHttpRequestFactory; @@ -37,10 +40,12 @@ import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.integration.endpoint.AbstractEndpoint; import org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler; +import org.springframework.integration.test.util.TestUtils; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.util.ObjectUtils; import org.springframework.web.client.ResponseErrorHandler; +import org.springframework.web.client.RestTemplate; /** * @author Mark Fisher @@ -54,14 +59,23 @@ public class HttpOutboundChannelAdapterParserTests { @Autowired @Qualifier("fullConfig") private AbstractEndpoint fullConfigEndpoint; + + @Autowired @Qualifier("restTemplateConfig") + private AbstractEndpoint restTemplateConfig; @Autowired private ApplicationContext applicationContext; + + @Autowired + private RestTemplate restTemplate; @Test public void minimalConfig() { DirectFieldAccessor endpointAccessor = new DirectFieldAccessor(this.minimalConfigEndpoint); + RestTemplate rTemplate = + TestUtils.getPropertyValue(this.minimalConfigEndpoint, "handler.restTemplate", RestTemplate.class); + assertNotSame(restTemplate, rTemplate); HttpRequestExecutingMessageHandler handler = (HttpRequestExecutingMessageHandler) endpointAccessor.getPropertyValue("handler"); DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(handler); assertEquals(false, handlerAccessor.getPropertyValue("expectReply")); @@ -115,6 +129,18 @@ public class HttpOutboundChannelAdapterParserTests { assertTrue(ObjectUtils.containsElement(mappedRequestHeaders, "requestHeader1")); assertTrue(ObjectUtils.containsElement(mappedRequestHeaders, "requestHeader2")); } + + @Test + public void restTemplateConfig() { + RestTemplate rTemplate = + TestUtils.getPropertyValue(this.restTemplateConfig, "handler.restTemplate", RestTemplate.class); + assertEquals(restTemplate, rTemplate); + } + + @Test(expected=BeanDefinitionParsingException.class) + public void failWithRestTemplateAndRestAttributes() { + new ClassPathXmlApplicationContext("HttpOutboundChannelAdapterParserTests-fail-context.xml", this.getClass()); + } public static class StubErrorHandler implements ResponseErrorHandler {