INT-1286 first step: the history header is now stored as a List<Properties> instead of relying on custom Object types. Also, the header is not mutated directly but now history is written by copying the Message. The next step might involve moving that into the MessageBuilder.

This commit is contained in:
Mark Fisher
2010-08-24 22:19:58 +00:00
parent aef97c4012
commit d67cbd2984
14 changed files with 326 additions and 300 deletions

View File

@@ -18,6 +18,7 @@ package org.springframework.integration.handler;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Method;
import java.util.HashMap;
@@ -29,6 +30,7 @@ import org.junit.Test;
import org.springframework.integration.Message;
import org.springframework.integration.MessageHandlingException;
import org.springframework.integration.MessageHeaders;
import org.springframework.integration.MessagingException;
import org.springframework.integration.annotation.Header;
import org.springframework.integration.annotation.Headers;
@@ -130,15 +132,15 @@ public class MethodInvokingMessageProcessorAnnotationTests {
}
@Test
@SuppressWarnings("unchecked")
public void fromMessageWithMapAndObjectMethod() throws Exception {
Method method = TestService.class.getMethod("mapHeadersAndPayload", Map.class, Object.class);
MethodInvokingMessageProcessor processor = new MethodInvokingMessageProcessor(testService, method);
Message<String> message = MessageBuilder.withPayload("test")
.setHeader("prop1", "foo").setHeader("prop2", "bar").build();
Map result = (Map) processor.processMessage(message);
// Map also contains id, timestamp, and history
assertEquals(6, result.size());
Map<?, ?> result = (Map<?, ?>) processor.processMessage(message);
assertEquals(5, result.size());
assertTrue(result.containsKey(MessageHeaders.ID));
assertTrue(result.containsKey(MessageHeaders.TIMESTAMP));
assertEquals("foo", result.get("prop1"));
assertEquals("bar", result.get("prop2"));
assertEquals("test", result.get("payload"));
@@ -208,7 +210,6 @@ public class MethodInvokingMessageProcessorAnnotationTests {
}
@Test
@SuppressWarnings("unchecked")
public void multipleAnnotatedArgs() throws Exception {
Message<?> message = this.getMessage();
Method method = TestService.class.getMethod("multipleAnnotatedArguments",
@@ -229,14 +230,13 @@ public class MethodInvokingMessageProcessorAnnotationTests {
}
@Test
@SuppressWarnings("unchecked")
public void fromMessageToPayload() throws Exception {
Method method = TestService.class.getMethod("mapOnly", Map.class);
MethodInvokingMessageProcessor processor = new MethodInvokingMessageProcessor(testService, method);
Message<Employee> message = MessageBuilder.withPayload(employee).setHeader("number", "jkl").build();
Object result = processor.processMessage(message);
Assert.assertTrue(result instanceof Map);
Assert.assertEquals("jkl", ((Map) result).get("number"));
Assert.assertEquals("jkl", ((Map<?, ?>) result).get("number"));
}
@Test
@@ -342,19 +342,16 @@ public class MethodInvokingMessageProcessorAnnotationTests {
return headers;
}
@SuppressWarnings("unchecked")
public Map mapPayload(Map map) {
public Map<?, ?> mapPayload(Map<?, ?> map) {
return map;
}
@SuppressWarnings("unchecked")
public Map mapHeaders(@Headers Map map) {
public Map<?, ?> mapHeaders(@Headers Map<?, ?> map) {
return map;
}
@SuppressWarnings("unchecked")
public Object mapHeadersAndPayload(Map headers, Object payload) {
Map map = new HashMap(headers);
public Object mapHeadersAndPayload(Map<String, Object> headers, Object payload) {
Map<String, Object> map = new HashMap<String, Object>(headers);
map.put("payload", payload);
return map;
}

View File

@@ -20,9 +20,11 @@ import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import org.junit.Test;
import org.mockito.Mockito;
@@ -33,9 +35,6 @@ import org.springframework.beans.factory.parsing.BeanDefinitionParsingException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.Message;
import org.springframework.integration.MessageDeliveryException;
import org.springframework.integration.MessageHandlingException;
import org.springframework.integration.MessageRejectedException;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.config.ConsumerEndpointFactoryBean;
import org.springframework.integration.core.MessageChannel;
@@ -69,72 +68,70 @@ public class MessageHistoryIntegrationTests {
}
@Test
public void tetsMessageHistoryWithHistoryWriter() {
public void testMessageHistoryWithHistoryWriter() {
ApplicationContext ac = new ClassPathXmlApplicationContext("messageHistoryWithHistoryWriter.xml", MessageHistoryIntegrationTests.class);
SampleGateway gateway = ac.getBean("sampleGateway", SampleGateway.class);
DirectChannel endOfThePipeChannel = ac.getBean("endOfThePipeChannel", DirectChannel.class);
MessageHandler handler = Mockito.spy(new MessageHandler() {
public void handleMessage(Message<?> message)
throws MessageRejectedException, MessageHandlingException,MessageDeliveryException {
System.out.println(message);
Iterator<MessageHistoryEvent> historyIterator = message.getHeaders().getHistory().iterator();
//1
MessageHistoryEvent event = historyIterator.next();
assertEquals("gateway", event.getType());
assertEquals("sampleGateway", event.getName());
//2
event = historyIterator.next();
assertEquals("channel", event.getType());
assertEquals("bridgeInChannel", event.getName());
//3
event = historyIterator.next();
assertEquals("bridge", event.getType());
assertEquals("testBridge", event.getName());
//4
event = historyIterator.next();
assertEquals("channel", event.getType());
assertEquals("headerEnricherChannel", event.getName());
//5
event = historyIterator.next();
assertEquals("transformer", event.getType());
assertEquals("testHeaderEnricher", event.getName());
//6
event = historyIterator.next();
assertEquals("channel", event.getType());
assertEquals("chainChannel", event.getName());
//7
event = historyIterator.next();
assertEquals("chain", event.getType());
assertEquals("sampleChain", event.getName());
//8
event = historyIterator.next();
assertEquals("channel", event.getType());
assertEquals("filterChannel", event.getName());
//9
event = historyIterator.next();
assertEquals("filter", event.getType());
assertEquals("testFilter", event.getName());
//10
event = historyIterator.next();
assertEquals("channel", event.getType());
assertEquals("splitterChannel", event.getName());
//11
event = historyIterator.next();
assertEquals("splitter", event.getType());
assertEquals("testSplitter", event.getName());
//12
event = historyIterator.next();
assertEquals("channel", event.getType());
assertEquals("aggregatorChannel", event.getName());
//13
event = historyIterator.next();
assertEquals("aggregator", event.getType());
assertEquals("testAggregator", event.getName());
//
event = historyIterator.next();
assertEquals("channel", event.getType());
assertEquals("endOfThePipeChannel", event.getName());
public void handleMessage(Message<?> message) {
Iterator<Properties> historyIterator = message.getHeaders().getHistory().iterator();
Properties event1 = historyIterator.next();
assertEquals("sampleGateway", event1.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("gateway", event1.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
Properties event2 = historyIterator.next();
assertEquals("bridgeInChannel", event2.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("channel", event2.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
Properties event3 = historyIterator.next();
assertEquals("testBridge", event3.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("bridge", event3.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
Properties event4 = historyIterator.next();
assertEquals("headerEnricherChannel", event4.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("channel", event4.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
Properties event5 = historyIterator.next();
assertEquals("testHeaderEnricher", event5.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("transformer", event5.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
Properties event6 = historyIterator.next();
assertEquals("chainChannel", event6.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("channel", event6.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
Properties event7 = historyIterator.next();
assertEquals("sampleChain", event7.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("chain", event7.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
Properties event8 = historyIterator.next();
assertEquals("filterChannel", event8.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("channel", event8.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
Properties event9 = historyIterator.next();
assertEquals("testFilter", event9.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("filter", event9.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
Properties event10 = historyIterator.next();
assertEquals("splitterChannel", event10.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("channel", event10.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
Properties event11 = historyIterator.next();
assertEquals("testSplitter", event11.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("splitter", event11.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
Properties event12 = historyIterator.next();
assertEquals("aggregatorChannel", event12.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("channel", event12.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
Properties event13 = historyIterator.next();
assertEquals("testAggregator", event13.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("aggregator", event13.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
Properties event14 = historyIterator.next();
assertEquals("endOfThePipeChannel", event14.getProperty(MessageHistoryWriter.NAME_PROPERTY));
assertEquals("channel", event14.getProperty(MessageHistoryWriter.TYPE_PROPERTY));
MessageChannel replyChannel = (MessageChannel) message.getHeaders().getReplyChannel();
replyChannel.send(message);
}
@@ -147,17 +144,13 @@ public class MessageHistoryIntegrationTests {
}
@Test
public void tetsMessageHistoryWithoutHistoryWriter() {
public void testMessageHistoryWithoutHistoryWriter() {
ApplicationContext ac = new ClassPathXmlApplicationContext("messageHistoryWithoutHistoryWriter.xml", MessageHistoryIntegrationTests.class);
SampleGateway gateway = ac.getBean("sampleGateway", SampleGateway.class);
DirectChannel endOfThePipeChannel = ac.getBean("endOfThePipeChannel", DirectChannel.class);
MessageHandler handler = Mockito.spy(new MessageHandler() {
public void handleMessage(Message<?> message)
throws MessageRejectedException, MessageHandlingException,MessageDeliveryException {
System.out.println(message);
Iterator<MessageHistoryEvent> historyIterator = message.getHeaders().getHistory().iterator();
assertFalse(historyIterator.hasNext());
public void handleMessage(Message<?> message) {
assertNull(message.getHeaders().getHistory());
MessageChannel replyChannel = (MessageChannel) message.getHeaders().getReplyChannel();
replyChannel.send(message);
}
@@ -173,10 +166,8 @@ public class MessageHistoryIntegrationTests {
SampleGateway gateway = ac.getBean("sampleGateway", SampleGateway.class);
DirectChannel endOfThePipeChannel = ac.getBean("endOfThePipeChannel", DirectChannel.class);
MessageHandler handler = Mockito.spy(new MessageHandler() {
public void handleMessage(Message<?> message)
throws MessageRejectedException, MessageHandlingException,MessageDeliveryException {
System.out.println(message);
Iterator<MessageHistoryEvent> historyIterator = message.getHeaders().getHistory().iterator();
public void handleMessage(Message<?> message) {
Iterator<Properties> historyIterator = message.getHeaders().getHistory().iterator();
assertTrue(historyIterator.hasNext());
MessageChannel replyChannel = (MessageChannel) message.getHeaders().getReplyChannel();
replyChannel.send(message);
@@ -201,4 +192,5 @@ public class MessageHistoryIntegrationTests {
public static interface SampleGateway {
public Message<?> echo(String value);
}
}

View File

@@ -45,7 +45,6 @@ public class OutboundJsonMessageMapperTests {
String result = mapper.fromMessage(testMessage);
assertTrue(result.contains("\"headers\":{"));
assertTrue(result.contains("\"$timestamp\":"+testMessage.getHeaders().getTimestamp()));
assertTrue(result.contains("\"$history\":[]"));
assertTrue(result.contains("\"$id\":\""+testMessage.getHeaders().getId()+"\""));
assertTrue(result.contains("\"payload\":\"myPayloadStuff\""));
}
@@ -68,7 +67,6 @@ public class OutboundJsonMessageMapperTests {
String result = mapper.fromMessage(testMessage);
assertTrue(result.contains("\"headers\":{"));
assertTrue(result.contains("\"$timestamp\":"+testMessage.getHeaders().getTimestamp()));
assertTrue(result.contains("\"$history\":[]"));
assertTrue(result.contains("\"$id\":\""+testMessage.getHeaders().getId()+"\""));
TestBean parsedPayload = extractJsonPayloadToTestBean(result);
assertEquals(payload, parsedPayload);