From abedfb0b3d3d945df8b7a323508738c4160caf51 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Tue, 26 Feb 2008 01:04:43 +0000 Subject: [PATCH] Using the header-copying constructor when creating Messages from Object-typed return values. --- .../router/SplitterMessageHandlerAdapter.java | 14 +++++--- .../SplitterMessageHandlerAdapterTests.java | 34 +++++++++++++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/router/SplitterMessageHandlerAdapter.java b/spring-integration-core/src/main/java/org/springframework/integration/router/SplitterMessageHandlerAdapter.java index 96e9d30c7b..54da49d6e5 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/router/SplitterMessageHandlerAdapter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/router/SplitterMessageHandlerAdapter.java @@ -28,6 +28,7 @@ import org.springframework.integration.channel.MessageChannel; import org.springframework.integration.handler.AbstractMessageHandlerAdapter; import org.springframework.integration.message.GenericMessage; import org.springframework.integration.message.Message; +import org.springframework.integration.message.MessageHeader; import org.springframework.integration.util.SimpleMethodInvoker; import org.springframework.util.Assert; @@ -72,6 +73,7 @@ public class SplitterMessageHandlerAdapter extends AbstractMessageHandlerAdap @Override protected final Object doHandle(Message message, SimpleMethodInvoker invoker) { + final MessageHeader originalMessageHeader = message.getHeader(); if (method.getParameterTypes().length != 1) { throw new MessagingConfigurationException( "Splitter method must accept exactly one parameter"); @@ -102,7 +104,9 @@ public class SplitterMessageHandlerAdapter extends AbstractMessageHandlerAdap int sequenceNumber = 0; int sequenceSize = items.size(); for (Object item : items) { - Message splitMessage = prepareMessage(item, message.getId(), ++sequenceNumber, sequenceSize); + Message splitMessage = (item instanceof Message) ? (Message) item : + this.createReplyMessage(item, originalMessageHeader); + this.prepareMessage(splitMessage, message.getId(), ++sequenceNumber, sequenceSize); this.sendMessage(splitMessage, channelName); } } @@ -111,7 +115,9 @@ public class SplitterMessageHandlerAdapter extends AbstractMessageHandlerAdap int sequenceNumber = 0; int sequenceSize = array.length; for (Object item : array) { - Message splitMessage = prepareMessage(item, message.getId(), ++sequenceNumber, sequenceSize); + Message splitMessage = (item instanceof Message) ? (Message) item : + this.createReplyMessage(item, originalMessageHeader); + this.prepareMessage(splitMessage, message.getId(), ++sequenceNumber, sequenceSize); this.sendMessage(splitMessage, channelName); } } @@ -122,12 +128,10 @@ public class SplitterMessageHandlerAdapter extends AbstractMessageHandlerAdap return null; } - private Message prepareMessage(Object item, Object correlationId, int sequenceNumber, int sequenceSize) { - Message message = (item instanceof Message) ? (Message) item : new GenericMessage(item); + private void prepareMessage(Message message, Object correlationId, int sequenceNumber, int sequenceSize) { message.getHeader().setCorrelationId(correlationId); message.getHeader().setSequenceNumber(sequenceNumber); message.getHeader().setSequenceSize(sequenceSize); - return message; } private boolean sendMessage(Message message, String channelName) { diff --git a/spring-integration-core/src/test/java/org/springframework/integration/router/SplitterMessageHandlerAdapterTests.java b/spring-integration-core/src/test/java/org/springframework/integration/router/SplitterMessageHandlerAdapterTests.java index ae8ad6e9ef..65a8f7723c 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/router/SplitterMessageHandlerAdapterTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/router/SplitterMessageHandlerAdapterTests.java @@ -169,6 +169,40 @@ public class SplitterMessageHandlerAdapterTests { adapter.handle(message); } + @Test + public void testHeaderForObjectReturnValues() throws Exception { + StringMessage message = new StringMessage("foo.bar"); + SplitterMessageHandlerAdapter adapter = this.getAdapter("stringToStringArray"); + adapter.handle(message); + Message reply1 = testChannel.receive(0); + assertNotNull(reply1); + assertEquals(2, reply1.getHeader().getSequenceSize()); + assertEquals(1, reply1.getHeader().getSequenceNumber()); + assertEquals(message.getId(), reply1.getHeader().getCorrelationId()); + Message reply2 = testChannel.receive(0); + assertNotNull(reply2); + assertEquals(2, reply2.getHeader().getSequenceSize()); + assertEquals(2, reply2.getHeader().getSequenceNumber()); + assertEquals(message.getId(), reply2.getHeader().getCorrelationId()); + } + + @Test + public void testHeaderForMessageReturnValues() throws Exception { + StringMessage message = new StringMessage("foo.bar"); + SplitterMessageHandlerAdapter adapter = this.getAdapter("messageToMessageList"); + adapter.handle(message); + Message reply1 = testChannel.receive(0); + assertNotNull(reply1); + assertEquals(2, reply1.getHeader().getSequenceSize()); + assertEquals(1, reply1.getHeader().getSequenceNumber()); + assertEquals(message.getId(), reply1.getHeader().getCorrelationId()); + Message reply2 = testChannel.receive(0); + assertNotNull(reply2); + assertEquals(2, reply2.getHeader().getSequenceSize()); + assertEquals(2, reply2.getHeader().getSequenceNumber()); + assertEquals(message.getId(), reply2.getHeader().getCorrelationId()); + } + private SplitterMessageHandlerAdapter getAdapter(String methodName) throws Exception { Class paramType = methodName.startsWith("message") ? Message.class : String.class;