INT-1972 MessageBuilder is now more diligent in determining the 'modified' flag value, and as a result it will return the originalMessage from a build() call any time that there have been no additions/removals/modifications to the payload or headers.

This commit is contained in:
Mark Fisher
2011-07-12 16:41:44 -04:00
parent 5bffa91a1b
commit 94ac56593f
2 changed files with 53 additions and 6 deletions

View File

@@ -60,6 +60,7 @@ public final class MessageBuilder<T> {
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<T> {
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<T> {
}
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<T> {
public MessageBuilder<T> 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;
}

View File

@@ -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<String> message1 = MessageBuilder.withPayload("test")
.setHeader("foo", "bar").build();
Message<String> message2 = MessageBuilder.fromMessage(message1).build();
Message<String> 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<String, Object> originalHeaders = new HashMap<String, Object>();
originalHeaders.put("b", "xyz");
originalHeaders.put("c", current);
Message<?> original = MessageBuilder.withPayload("foo").setHeader("a", 123).copyHeaders(originalHeaders).build();
Map<String, Object> newHeaders = new HashMap<String, Object>();
newHeaders.put("a", 123);
newHeaders.put("b", "xyz");
newHeaders.put("c", current);
Message<?> result = MessageBuilder.fromMessage(original).copyHeaders(newHeaders).build();
assertEquals(original, result);
}
}