From ae3aaf17ba0819fedcb31ac1c18fec2701ce630a Mon Sep 17 00:00:00 2001 From: David Syer Date: Tue, 10 Aug 2010 11:29:57 +0000 Subject: [PATCH] INT-665: test splitter and aggregator --- .../util/MessagingMethodInvokerHelper.java | 24 ++++++++-- ...hodInvokingMessageGroupProcessorTests.java | 6 +-- .../splitter/MethodInvokingSplitterTests.java | 45 ++++++++++++------- 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingMethodInvokerHelper.java b/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingMethodInvokerHelper.java index 6d133136a0..60730cfd97 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingMethodInvokerHelper.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingMethodInvokerHelper.java @@ -24,6 +24,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; @@ -109,8 +110,8 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator { this(targetObject, annotationType, null, canProcessMessageList); } - public MessagingMethodInvokerHelper(Object targetObject, Class annotationType, Class expectedType, - boolean canProcessMessageList) { + public MessagingMethodInvokerHelper(Object targetObject, Class annotationType, + Class expectedType, boolean canProcessMessageList) { this(targetObject, annotationType, (String) null, expectedType, canProcessMessageList); } @@ -127,7 +128,7 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator { public String toString() { return this.displayString; } - + /* * Private constructors for internal use */ @@ -477,11 +478,26 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator { else if (Collection.class.isAssignableFrom(parameterType) || parameterType.isArray()) { if (canProcessMessageList) { sb.append("messages.![payload]"); - } else { + } + else { sb.append("payload"); } this.setExclusiveTargetParameterType(parameterTypeDescriptor); } + else if (Iterator.class.isAssignableFrom(parameterType)) { + if (canProcessMessageList) { + if (parameterTypeDescriptor.getElementType()!=null && Message.class.isAssignableFrom(parameterTypeDescriptor.getElementType())) { + sb.append("messages.iterator()"); + } + else { + sb.append("messages.![payload].iterator()"); + } + } + else { + sb.append("payload.iterator()"); + } + this.setExclusiveTargetParameterType(parameterTypeDescriptor); + } else if (Map.class.isAssignableFrom(parameterType)) { if (Properties.class.isAssignableFrom(parameterType)) { sb.append("payload instanceof T(java.util.Map) or " diff --git a/spring-integration-core/src/test/java/org/springframework/integration/aggregator/MethodInvokingMessageGroupProcessorTests.java b/spring-integration-core/src/test/java/org/springframework/integration/aggregator/MethodInvokingMessageGroupProcessorTests.java index c6118c9534..fcc02c3358 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/aggregator/MethodInvokingMessageGroupProcessorTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/aggregator/MethodInvokingMessageGroupProcessorTests.java @@ -33,7 +33,6 @@ import java.util.List; import java.util.Map; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -239,7 +238,6 @@ public class MethodInvokingMessageGroupProcessorTests { assertThat((Integer) messageCaptor.getValue().getPayload(), is(7)); } - @Ignore("INT-938: it probably should work if there is a converter registered, but maybe a SpEL bug?") @Test @SuppressWarnings("unchecked") public void shouldFindSimpleAggregatorMethodWithIterator() throws Exception { @@ -248,8 +246,8 @@ public class MethodInvokingMessageGroupProcessorTests { class SimpleAggregator { public Integer and(Iterator flags) { int result = 0; - for (int flag = flags.next(); flags.hasNext();) { - result = result | flag; + while (flags.hasNext()) { + result = result | flags.next(); } return result; } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/splitter/MethodInvokingSplitterTests.java b/spring-integration-core/src/test/java/org/springframework/integration/splitter/MethodInvokingSplitterTests.java index 368c077204..02e0d8e608 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/splitter/MethodInvokingSplitterTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/splitter/MethodInvokingSplitterTests.java @@ -25,11 +25,11 @@ import java.util.Arrays; import java.util.List; import org.junit.Test; - import org.springframework.integration.Message; import org.springframework.integration.annotation.Header; import org.springframework.integration.annotation.Splitter; import org.springframework.integration.channel.QueueChannel; +import org.springframework.integration.core.GenericMessage; import org.springframework.integration.core.MessageBuilder; import org.springframework.integration.core.StringMessage; @@ -40,7 +40,6 @@ public class MethodInvokingSplitterTests { private SplitterTestBean testBean = new SplitterTestBean(); - @Test public void splitStringToStringArray() throws Exception { StringMessage message = new StringMessage("foo.bar"); @@ -297,6 +296,29 @@ public class MethodInvokingSplitterTests { assertEquals("bar", reply2.getPayload()); } + @Test + public void splitListPayload() throws Exception { + class ListSplitter { + @SuppressWarnings("unused") + public List split(List list) { + return list; + } + } + ; + GenericMessage> message = new GenericMessage>(Arrays.asList("foo", "bar")); + MethodInvokingSplitter splitter = new MethodInvokingSplitter(new ListSplitter(), "split"); + QueueChannel replyChannel = new QueueChannel(); + splitter.setOutputChannel(replyChannel); + splitter.handleMessage(message); + List> replies = replyChannel.clear(); + Message reply1 = replies.get(0); + assertNotNull(reply1); + assertEquals("foo", reply1.getPayload()); + Message reply2 = replies.get(1); + assertNotNull(reply2); + assertEquals("bar", reply2.getPayload()); + } + @Test public void headerForObjectReturnValues() throws Exception { StringMessage message = new StringMessage("foo.bar"); @@ -339,8 +361,7 @@ public class MethodInvokingSplitterTests { @Test public void splitMessageHeader() throws Exception { - Message message = MessageBuilder.withPayload("ignored") - .setHeader("testHeader", "foo.bar").build(); + Message message = MessageBuilder.withPayload("ignored").setHeader("testHeader", "foo.bar").build(); MethodInvokingSplitter splitter = this.getSplitter("splitHeader"); QueueChannel replyChannel = new QueueChannel(); splitter.setOutputChannel(replyChannel); @@ -356,9 +377,9 @@ public class MethodInvokingSplitterTests { @Test public void splitPayloadAndHeader() throws Exception { - Message message = MessageBuilder.withPayload("a.b") - .setHeader("testHeader", "c.d").build(); - Method splittingMethod = this.testBean.getClass().getMethod("splitPayloadAndHeader", String.class, String.class); + Message message = MessageBuilder.withPayload("a.b").setHeader("testHeader", "c.d").build(); + Method splittingMethod = this.testBean.getClass() + .getMethod("splitPayloadAndHeader", String.class, String.class); MethodInvokingSplitter splitter = new MethodInvokingSplitter(testBean, splittingMethod); QueueChannel replyChannel = new QueueChannel(); splitter.setOutputChannel(replyChannel); @@ -422,14 +443,12 @@ public class MethodInvokingSplitterTests { new MethodInvokingSplitter(new MultiplePublicMethodTestBean()); } - private MethodInvokingSplitter getSplitter(String methodName) throws Exception { Class paramType = methodName.startsWith("message") ? Message.class : String.class; Method splittingMethod = this.testBean.getClass().getMethod(methodName, paramType); return new MethodInvokingSplitter(testBean, splittingMethod); } - public static class SplitterTestBean { public String[] stringToStringArray(String input) { @@ -491,17 +510,16 @@ public class MethodInvokingSplitterTests { public List splitPayloadAndHeader(String payload, @Header("testHeader") String header) { String regex = "\\."; List results = new ArrayList(); - for (String s: payload.split(regex)) { + for (String s : payload.split(regex)) { results.add(s); } - for (String s: header.split(regex)) { + for (String s : header.split(regex)) { results.add(s); } return results; } } - public static class SingleAnnotationTestBean { @Splitter @@ -514,7 +532,6 @@ public class MethodInvokingSplitterTests { } } - public static class AmbiguousTypeMatchTestBean { @Splitter @@ -528,7 +545,6 @@ public class MethodInvokingSplitterTests { } } - public static class SinglePublicMethodTestBean { public String[] publicMethod(String input) { @@ -540,7 +556,6 @@ public class MethodInvokingSplitterTests { } } - public static class MultiplePublicMethodTestBean { public String[] method1(String input) {