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 3500723cef..f029d3b5dc 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 @@ -60,6 +60,7 @@ public final class MessageBuilder { this.originalMessage = originalMessage; if (originalMessage != null) { this.copyHeaders(originalMessage.getHeaders()); + this.modified = (!this.payload.equals(originalMessage.getPayload())); } } @@ -93,12 +94,17 @@ public final class MessageBuilder { if (StringUtils.hasLength(headerName) && !headerName.equals(MessageHeaders.ID) && !headerName.equals(MessageHeaders.TIMESTAMP)) { this.verifyType(headerName, headerValue); - this.modified = true; if (headerValue == null) { - this.headers.remove(headerName); + Object removedValue = this.headers.remove(headerName); + if (removedValue != null) { + this.modified = true; + } } else { - this.headers.put(headerName, headerValue); + Object replacedValue = this.headers.put(headerName, headerValue); + if (!headerValue.equals(replacedValue)) { + this.modified = true; + } } } return this; @@ -113,6 +119,7 @@ public final class MessageBuilder { } return this; } + /** * Removes all headers provided via array of 'headerPatterns'. As the name suggests the array * may contain simple matching patterns for header names. Supported pattern styles are: @@ -147,8 +154,10 @@ public final class MessageBuilder { public MessageBuilder removeHeader(String headerName) { if (StringUtils.hasLength(headerName) && !headerName.equals(MessageHeaders.ID) && !headerName.equals(MessageHeaders.TIMESTAMP)) { - this.modified = true; - this.headers.remove(headerName); + Object removedValue = this.headers.remove(headerName); + if (removedValue != null) { + this.modified = true; + } } return this; } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java b/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java index ea54675a99..afa09e7f9b 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java @@ -22,6 +22,8 @@ import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; import java.util.Date; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; import org.junit.Test; @@ -106,7 +108,7 @@ public class MessageBuilderTests { public void createIdRegenerated() { Message message1 = MessageBuilder.withPayload("test") .setHeader("foo", "bar").build(); - Message message2 = MessageBuilder.fromMessage(message1).build(); + Message message2 = MessageBuilder.fromMessage(message1).setHeader("another", 1).build(); assertEquals("bar", message2.getHeaders().get("foo")); assertNotSame(message1.getHeaders().getId(), message2.getHeaders().getId()); } @@ -202,4 +204,40 @@ public class MessageBuilderTests { assertFalse(message3.getHeaders().containsKey(MessageHeaders.SEQUENCE_DETAILS)); } + @Test + public void testNotModifiedSameMessage() throws Exception { + Message original = MessageBuilder.withPayload("foo").build(); + Message result = MessageBuilder.fromMessage(original).build(); + assertEquals(original, result); + } + + @Test + public void testContainsHeaderNotModifiedSameMessage() throws Exception { + Message original = MessageBuilder.withPayload("foo").setHeader("bar", 42).build(); + Message result = MessageBuilder.fromMessage(original).build(); + assertEquals(original, result); + } + + @Test + public void testSameHeaderValueAddedNotModifiedSameMessage() throws Exception { + Message original = MessageBuilder.withPayload("foo").setHeader("bar", 42).build(); + Message result = MessageBuilder.fromMessage(original).setHeader("bar", 42).build(); + assertEquals(original, result); + } + + @Test + public void testCopySameHeaderValuesNotModifiedSameMessage() throws Exception { + Date current = new Date(); + Map originalHeaders = new HashMap(); + originalHeaders.put("b", "xyz"); + originalHeaders.put("c", current); + Message original = MessageBuilder.withPayload("foo").setHeader("a", 123).copyHeaders(originalHeaders).build(); + Map newHeaders = new HashMap(); + newHeaders.put("a", 123); + newHeaders.put("b", "xyz"); + newHeaders.put("c", current); + Message result = MessageBuilder.fromMessage(original).copyHeaders(newHeaders).build(); + assertEquals(original, result); + } + }