From 6c7755b68814d5fb7dcb45c5faf1eb06ef7c2b3d Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 1 Jun 2011 07:16:17 -0400 Subject: [PATCH] INT-1919 added support for treating '*' as literal value via 'pattern-match' boolean attribute on header-filter with default value 'true' --- .../config/xml/HeaderFilterParser.java | 2 + .../integration/transformer/HeaderFilter.java | 14 +++++- .../config/xml/spring-integration-2.0.xsd | 11 ++++ .../xml/HeaderFilterParserTests-context.xml | 6 +++ .../config/xml/HeaderFilterParserTests.java | 50 +++++++++++++++++++ 5 files changed, 82 insertions(+), 1 deletion(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/HeaderFilterParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/HeaderFilterParser.java index d8398a48d7..18816ed321 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/HeaderFilterParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/HeaderFilterParser.java @@ -42,6 +42,8 @@ public class HeaderFilterParser extends AbstractTransformerParser { parserContext.getReaderContext().error("The 'header-names' attribute must not be empty.", parserContext.extractSource(element)); } + String pattern = element.getAttribute("pattern-match"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "pattern-match"); builder.addConstructorArgValue(headerNames); } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderFilter.java b/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderFilter.java index a34e6991b6..d73a5d6a75 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderFilter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderFilter.java @@ -30,6 +30,8 @@ import org.springframework.util.Assert; public class HeaderFilter implements Transformer { private final String[] headersToRemove; + + private volatile boolean patternMatch; public HeaderFilter(String... headersToRemove) { @@ -37,10 +39,20 @@ public class HeaderFilter implements Transformer { this.headersToRemove = headersToRemove; } + public void setPatternMatch(boolean patternMatch) { + this.patternMatch = patternMatch; + } public Message transform(Message message) { MessageBuilder builder = MessageBuilder.fromMessage(message); - builder.removeHeaders(headersToRemove); + if (this.patternMatch){ + builder.removeHeaders(headersToRemove); + } + else { + for (String headerToRemove : headersToRemove) { + builder.removeHeader(headerToRemove); + } + } return builder.build(); } diff --git a/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd b/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd index 2a8ac6b877..2975db1e1e 100644 --- a/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd +++ b/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd @@ -1669,6 +1669,17 @@ endpoint itself is a Polling Consumer for a channel with a queue. + + + + Boolean flag that specifies whether values provided in 'header-names' should be treated as + match patterns or literal values. For example header-names='foo*' would mean remove all + headers that begin with 'foo' including the header named 'foo*'. However if you want to + treat '*' as literal value setting this flag to FALSE will not perform pattern match and + the only header that will be removed is that has an exact match + + + diff --git a/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests-context.xml b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests-context.xml index d23e4c4f3a..4676bacb5c 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests-context.xml +++ b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests-context.xml @@ -14,5 +14,11 @@ + + + + + + diff --git a/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests.java b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests.java index 62ed6f4db1..d06ddb6550 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/HeaderFilterParserTests.java @@ -47,6 +47,12 @@ public class HeaderFilterParserTests { @Autowired private MessageChannel inputC; + + @Autowired + private MessageChannel inputD; + + @Autowired + private MessageChannel inputE; @Test public void verifyHeadersRemoved() { @@ -113,5 +119,49 @@ public class HeaderFilterParserTests { assertNull(result.getHeaders().get("goo")); assertNotNull(result.getHeaders().get("e")); } + + @Test + public void verifyHeadersRemovedWhereHeaderNameContainsWildCard() { + QueueChannel replyChannel = new QueueChannel(); + Message message = MessageBuilder.withPayload("test") + .setReplyChannel(replyChannel) + .setHeader("bar*", 1) + .setHeader("bart", 2) + .setHeader("foo", 3) + .setHeader("goo", 4) + .setHeader("e", 5) + .build(); + inputD.send(message); + Message result = replyChannel.receive(0); + assertNotNull(result); + assertEquals("test", result.getPayload()); + assertNull(result.getHeaders().get("bar*")); + assertNull(result.getHeaders().get("bart")); + assertNull(result.getHeaders().get("foo")); + assertNull(result.getHeaders().get("goo")); + assertNotNull(result.getHeaders().get("e")); + } + + @Test + public void verifyHeadersRemovedWhereHeaderNameIsLiteral() { + QueueChannel replyChannel = new QueueChannel(); + Message message = MessageBuilder.withPayload("test") + .setReplyChannel(replyChannel) + .setHeader("bar*", 1) + .setHeader("bart", 2) + .setHeader("foo", 3) + .setHeader("goo", 4) + .setHeader("e", 5) + .build(); + inputE.send(message); + Message result = replyChannel.receive(0); + assertNotNull(result); + assertEquals("test", result.getPayload()); + assertNull(result.getHeaders().get("bar*")); + assertNotNull(result.getHeaders().get("bart")); + assertNull(result.getHeaders().get("foo")); + assertNotNull(result.getHeaders().get("goo")); + assertNotNull(result.getHeaders().get("e")); + } }