From 129df10cd63796b62182258c123318966c497b1e Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Thu, 20 Jan 2011 13:35:15 -0500 Subject: [PATCH] INT-1751 added mapped-request/response-type attributes to http inbound gateway/adapter --- spring-integration-http/.springBeans | 26 ++++++------ .../config/HttpInboundEndpointParser.java | 21 +++++++++- .../config/spring-integration-http-2.0.xsd | 30 ++++++++++++++ ...boundChannelAdapterParserTests-context.xml | 3 ++ .../HttpInboundChannelAdapterParserTests.java | 23 +++++++++++ .../HttpInboundGatewayParserTests-context.xml | 4 ++ .../config/HttpInboundGatewayParserTests.java | 41 +++++++++++++++++++ 7 files changed, 134 insertions(+), 14 deletions(-) diff --git a/spring-integration-http/.springBeans b/spring-integration-http/.springBeans index 85a1da38fa..ca9c181739 100644 --- a/spring-integration-http/.springBeans +++ b/spring-integration-http/.springBeans @@ -1,13 +1,13 @@ - - - 1 - - - - - - - - - - + + + 1 + + + + + + + + + + diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpInboundEndpointParser.java b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpInboundEndpointParser.java index 25c54faffc..b5aefc3faf 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpInboundEndpointParser.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpInboundEndpointParser.java @@ -92,7 +92,26 @@ public class HttpInboundEndpointParser extends AbstractSingleBeanDefinitionParse IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "errors-key"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "error-code"); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converters"); - IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "header-mapper"); + + + //IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "header-mapper"); + String headerMapper = element.getAttribute("header-mapper"); + String mappedRequestHeaders = element.getAttribute("mapped-request-headers"); + String mappedResponseHeaders = element.getAttribute("mapped-response-headers"); + if (StringUtils.hasText(headerMapper)) { + if (StringUtils.hasText(mappedRequestHeaders) || StringUtils.hasText(mappedResponseHeaders)) { + parserContext.getReaderContext().error("Neither 'mappped-request-headers' or 'mapped-response-headers' " + + "attributes are allowed when a 'header-mapper' has been specified.", parserContext.extractSource(element)); + } + builder.addPropertyReference("headerMapper", headerMapper); + } + else if (StringUtils.hasText(mappedRequestHeaders) || StringUtils.hasText(mappedResponseHeaders)) { + BeanDefinitionBuilder headerMapperBuilder = BeanDefinitionBuilder.genericBeanDefinition( + "org.springframework.integration.http.support.DefaultHttpHeaderMapper"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(headerMapperBuilder, element, "mapped-request-headers", "outboundHeaderNames"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(headerMapperBuilder, element, "mapped-response-headers", "inboundHeaderNames"); + builder.addPropertyValue("headerMapper", headerMapperBuilder.getBeanDefinition()); + } } private String getInputChannelAttributeName() { diff --git a/spring-integration-http/src/main/resources/org/springframework/integration/http/config/spring-integration-http-2.0.xsd b/spring-integration-http/src/main/resources/org/springframework/integration/http/config/spring-integration-http-2.0.xsd index 1bc3397c04..329a39d218 100644 --- a/spring-integration-http/src/main/resources/org/springframework/integration/http/config/spring-integration-http-2.0.xsd +++ b/spring-integration-http/src/main/resources/org/springframework/integration/http/config/spring-integration-http-2.0.xsd @@ -85,6 +85,16 @@ + + + + + @@ -159,6 +169,26 @@ + + + + + + + + + + diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundChannelAdapterParserTests-context.xml b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundChannelAdapterParserTests-context.xml index 0aa51b0c9e..2f74385c56 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundChannelAdapterParserTests-context.xml +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundChannelAdapterParserTests-context.xml @@ -23,5 +23,8 @@ + + diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundChannelAdapterParserTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundChannelAdapterParserTests.java index 0148cccf16..4bee52308c 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundChannelAdapterParserTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundChannelAdapterParserTests.java @@ -25,6 +25,7 @@ import java.io.ByteArrayOutputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.List; +import java.util.Map; import java.util.Properties; import javax.servlet.http.HttpServletResponse; @@ -34,6 +35,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.integration.Message; import org.springframework.integration.core.PollableChannel; @@ -41,6 +43,7 @@ import org.springframework.integration.history.MessageHistory; import org.springframework.integration.http.MockHttpServletRequest; import org.springframework.integration.http.inbound.HttpRequestHandlingController; import org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway; +import org.springframework.integration.http.support.DefaultHttpHeaderMapper; import org.springframework.integration.test.util.TestUtils; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.context.ContextConfiguration; @@ -49,6 +52,7 @@ import org.springframework.util.MultiValueMap; /** * @author Mark Fisher + * @author Oleg Zhurakousky */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @@ -65,6 +69,9 @@ public class HttpInboundChannelAdapterParserTests { @Autowired private HttpRequestHandlingMessagingGateway putOrDeleteAdapter; + + @Autowired + private HttpRequestHandlingMessagingGateway withMappedHeaders; @Autowired private HttpRequestHandlingController inboundController; @@ -89,6 +96,22 @@ public class HttpInboundChannelAdapterParserTests { assertEquals(1, map.get("foo").size()); assertEquals("bar", map.getFirst("foo")); } + + @Test + @SuppressWarnings("unchecked") + public void getRequestWithHeaders() throws Exception { + DefaultHttpHeaderMapper headerMapper = + (DefaultHttpHeaderMapper) TestUtils.getPropertyValue(withMappedHeaders, "headerMapper"); + + HttpHeaders headers = new HttpHeaders(); + headers.set("foo", "foo"); + headers.set("bar", "bar"); + headers.set("baz", "baz"); + Map map = (Map) headerMapper.toHeaders(headers); + assertTrue(map.size() == 2); + assertEquals("foo", map.get("foo")); + assertEquals("bar", map.get("bar")); + } @Test public void getRequestNotAllowed() throws Exception { diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests-context.xml b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests-context.xml index 6303b7a348..57f8bc55a3 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests-context.xml +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests-context.xml @@ -20,5 +20,9 @@ + + diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests.java index d926b35531..c3c0d14757 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests.java @@ -21,9 +21,14 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; import static org.springframework.integration.test.util.TestUtils.getPropertyValue; import static org.springframework.integration.test.util.TestUtils.handlerExpecting; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import javax.servlet.http.HttpServletResponse; import org.junit.Test; @@ -31,26 +36,37 @@ 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.http.HttpHeaders; import org.springframework.integration.Message; +import org.springframework.integration.MessageHeaders; import org.springframework.integration.core.PollableChannel; import org.springframework.integration.core.SubscribableChannel; import org.springframework.integration.http.MockHttpServletRequest; import org.springframework.integration.http.MockHttpServletResponse; import org.springframework.integration.http.inbound.HttpRequestHandlingController; import org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway; +import org.springframework.integration.http.support.DefaultHttpHeaderMapper; +import org.springframework.integration.test.util.TestUtils; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Mark Fisher * @author Iwein Fuld + * @author Oleg Zhurakousky */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class HttpInboundGatewayParserTests { @Autowired + @Qualifier("inboundGateway") private HttpRequestHandlingMessagingGateway gateway; + + @Autowired + @Qualifier("withMappedHeaders") + private HttpRequestHandlingMessagingGateway withMappedHeaders; @Autowired private HttpRequestHandlingController inboundController; @@ -89,5 +105,30 @@ public class HttpInboundGatewayParserTests { String errorCode = (String) accessor.getPropertyValue("errorCode"); assertEquals("oops", errorCode); } + + @Test + @SuppressWarnings("unchecked") + public void requestWithHeaders() throws Exception { + DefaultHttpHeaderMapper headerMapper = + (DefaultHttpHeaderMapper) TestUtils.getPropertyValue(withMappedHeaders, "headerMapper"); + + HttpHeaders headers = new HttpHeaders(); + headers.set("foo", "foo"); + headers.set("bar", "bar"); + headers.set("baz", "baz"); + Map map = (Map) headerMapper.toHeaders(headers); + assertTrue(map.size() == 2); + assertEquals("foo", map.get("foo")); + assertEquals("bar", map.get("bar")); + + Map mapOfHeaders = new HashMap(); + mapOfHeaders.put("abc", "abc"); + MessageHeaders mh = new MessageHeaders(mapOfHeaders); + headers = new HttpHeaders(); + headerMapper.fromHeaders(mh, headers); + assertTrue(headers.size() == 1); + List abc = headers.get("X-abc"); + assertEquals("abc", abc.get(0)); + } }