diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/MessageBuilder.java b/spring-integration-core/src/main/java/org/springframework/integration/support/MessageBuilder.java index ede7441ec6..f007673152 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/MessageBuilder.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/MessageBuilder.java @@ -32,6 +32,7 @@ import org.springframework.integration.MessageHeaders; import org.springframework.integration.message.ErrorMessage; import org.springframework.integration.message.GenericMessage; import org.springframework.util.Assert; +import org.springframework.util.PatternMatchUtils; import org.springframework.util.StringUtils; /** @@ -117,12 +118,31 @@ public final class MessageBuilder { * Remove the value for the given header name. */ public MessageBuilder removeHeader(String headerName) { + if (StringUtils.hasLength(headerName)){ + if (headerName.contains("*")){ + List headersToRemove = new ArrayList(); + for (String hdrName : this.headers.keySet()) { + if (PatternMatchUtils.simpleMatch(headerName, hdrName)){ + headersToRemove.add(hdrName); + } + } + for (String headerToRemove : headersToRemove) { + this.doRemoveHeader(headerToRemove); + } + } + else { + this.doRemoveHeader(headerName); + } + } + return this; + } + + private void doRemoveHeader(String headerName){ if (StringUtils.hasLength(headerName) && !headerName.equals(MessageHeaders.ID) && !headerName.equals(MessageHeaders.TIMESTAMP)) { this.modified = true; this.headers.remove(headerName); } - return this; } /** 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 1c3b26f6e1..d23e4c4f3a 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 @@ -7,6 +7,12 @@ http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd"> - + + + + + + + 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 34650ebba2..62ed6f4db1 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 @@ -40,7 +40,13 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; public class HeaderFilterParserTests { @Autowired - private MessageChannel input; + private MessageChannel inputA; + + @Autowired + private MessageChannel inputB; + + @Autowired + private MessageChannel inputC; @Test public void verifyHeadersRemoved() { @@ -53,7 +59,7 @@ public class HeaderFilterParserTests { .setHeader("d", 4) .setHeader("e", 5) .build(); - input.send(message); + inputA.send(message); Message result = replyChannel.receive(0); assertNotNull(result); assertEquals("test", result.getPayload()); @@ -63,5 +69,49 @@ public class HeaderFilterParserTests { assertNotNull(result.getHeaders().get("b")); assertNotNull(result.getHeaders().get("e")); } + + @Test + public void verifyHeadersRemovedWithSingleWildcard() { + QueueChannel replyChannel = new QueueChannel(); + Message message = MessageBuilder.withPayload("test") + .setReplyChannel(replyChannel) + .setHeader("a", 1) + .setHeader("b", 2) + .setHeader("c", 3) + .setHeader("d", 4) + .setHeader("e", 5) + .build(); + inputB.send(message); + Message result = replyChannel.receive(0); + assertNotNull(result); + assertEquals("test", result.getPayload()); + assertNull(result.getHeaders().get("a")); + assertNull(result.getHeaders().get("c")); + assertNull(result.getHeaders().get("d")); + assertNull(result.getHeaders().get("b")); + assertNull(result.getHeaders().get("e")); + } + + @Test + public void verifyHeadersRemovedWithNamePatterns() { + QueueChannel replyChannel = new QueueChannel(); + Message message = MessageBuilder.withPayload("test") + .setReplyChannel(replyChannel) + .setHeader("bar", 1) + .setHeader("baz", 2) + .setHeader("foo", 3) + .setHeader("goo", 4) + .setHeader("e", 5) + .build(); + inputC.send(message); + Message result = replyChannel.receive(0); + assertNotNull(result); + assertEquals("test", result.getPayload()); + assertNull(result.getHeaders().get("bar")); + assertNull(result.getHeaders().get("baz")); + assertNull(result.getHeaders().get("foo")); + assertNull(result.getHeaders().get("goo")); + assertNotNull(result.getHeaders().get("e")); + } }