From c00888f5376bcef7b28857f0b4007ce02a649e79 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Fri, 24 Jun 2011 15:20:04 -0400 Subject: [PATCH] INT-1953 refactored CORE and HTTP modules to make them compatible with Spring v3.1 while maintaining the target version of 3.0.* --- .../aop/MessagePublishingInterceptor.java | 4 +-- ...thodAnnotationPublisherMetadataSource.java | 2 +- .../util/MessagingMethodInvokerHelper.java | 12 ++++++++- ...hodInvokingMessageGroupProcessorTests.java | 27 +++++++++++++++++++ ...MessagePublishingAnnotationUsageTests.java | 1 + ...nnotationPublisherMetadataSourceTests.java | 4 +-- .../MethodInvokingMessageProcessorTests.java | 2 +- ...tpHeaderMapperFromMessageInboundTests.java | 4 +-- 8 files changed, 47 insertions(+), 9 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/aop/MessagePublishingInterceptor.java b/spring-integration-core/src/main/java/org/springframework/integration/aop/MessagePublishingInterceptor.java index 70664fab90..fc1cf8db6b 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/aop/MessagePublishingInterceptor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/aop/MessagePublishingInterceptor.java @@ -92,13 +92,13 @@ public class MessagePublishingInterceptor implements MethodInterceptor { String[] argumentNames = this.resolveArgumentNames(method); context.setVariable(PublisherMetadataSource.METHOD_NAME_VARIABLE_NAME, method.getName()); if (invocation.getArguments().length > 0 && argumentNames != null) { - Map argumentMap = new HashMap(); + Map argumentMap = new HashMap(); for (int i = 0; i < argumentNames.length; i++) { if (invocation.getArguments().length <= i) { break; } Object argValue = invocation.getArguments()[i]; - argumentMap.put("" + i, argValue); + argumentMap.put(i, argValue); argumentMap.put(argumentNames[i], argValue); } context.setVariable(PublisherMetadataSource.ARGUMENT_MAP_VARIABLE_NAME, argumentMap); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSource.java b/spring-integration-core/src/main/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSource.java index 26f2e0d5df..756128d6eb 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSource.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSource.java @@ -114,7 +114,7 @@ public class MethodAnnotationPublisherMetadataSource implements PublisherMetadat if (!StringUtils.hasText(name)) { name = parameterNames[i]; } - headerExpressions.put(name, "#" + PublisherMetadataSource.ARGUMENT_MAP_VARIABLE_NAME + "['" + i + "']"); + headerExpressions.put(name, "#" + PublisherMetadataSource.ARGUMENT_MAP_VARIABLE_NAME + "[" + i + "]"); } } } 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 bb3959f850..3b923d5baa 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 @@ -19,7 +19,9 @@ package org.springframework.integration.util; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Proxy; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -517,7 +519,15 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator } else if (Iterator.class.isAssignableFrom(parameterType)) { if (canProcessMessageList) { - if (parameterTypeDescriptor.getElementType()!=null && Message.class.isAssignableFrom(parameterTypeDescriptor.getElementType())) { + Type type = method.getGenericParameterTypes()[0]; + Type parameterizedType = null; + if (type instanceof ParameterizedType){ + parameterizedType = ((ParameterizedType)type).getActualTypeArguments()[0]; + if (parameterizedType instanceof ParameterizedType){ + parameterizedType = ((ParameterizedType) parameterizedType).getRawType(); + } + } + if (parameterizedType != null && Message.class.isAssignableFrom((Class)parameterizedType)){ sb.append("messages.iterator()"); } else { 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 9d43f6a027..729fbc55cb 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 @@ -16,6 +16,7 @@ package org.springframework.integration.aggregator; +import static junit.framework.Assert.assertTrue; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; @@ -278,6 +279,32 @@ public class MethodInvokingMessageGroupProcessorTests { Object result = processor.processMessageGroup(messageGroupMock); assertThat((Integer) ((Message) result).getPayload(), is(7)); } + + @Test + public void shouldFindFittingMethodForIteratorOfMessages() { + + @SuppressWarnings("unused") + class UnannotatedAggregator { + public Iterator and(Iterator> flags) { + + return flags; + } + + public void voidMethodShouldBeIgnored(List flags) { + fail("this method should not be invoked"); + } + + public String methodAcceptingNoCollectionShouldBeIgnored(String irrelevant) { + fail("this method should not be invoked"); + return null; + } + } + + MessageGroupProcessor processor = new MethodInvokingMessageGroupProcessor(new UnannotatedAggregator()); + when(messageGroupMock.getUnmarked()).thenReturn(messagesUpForProcessing); + Object result = processor.processMessageGroup(messageGroupMock); + assertTrue(((Message)result).getPayload() instanceof Iterator); + } @Test(expected = IllegalArgumentException.class) public void testTwoMethodsWithSameParameterTypesAmbiguous() { diff --git a/spring-integration-core/src/test/java/org/springframework/integration/aop/MessagePublishingAnnotationUsageTests.java b/spring-integration-core/src/test/java/org/springframework/integration/aop/MessagePublishingAnnotationUsageTests.java index 846aba14f2..d03c76741c 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/aop/MessagePublishingAnnotationUsageTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/aop/MessagePublishingAnnotationUsageTests.java @@ -94,6 +94,7 @@ public class MessagePublishingAnnotationUsageTests { @Publisher(channel="messagePublishingAnnotationUsageTestChannel") public String argumentAsPayload(@Payload String fname, @Header String lname) { + System.out.println("###### INVOKING"); return fname + " " + lname; } } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSourceTests.java b/spring-integration-core/src/test/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSourceTests.java index 650d61dc3e..99cd5a3862 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSourceTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSourceTests.java @@ -73,8 +73,8 @@ public class MethodAnnotationPublisherMetadataSourceTests { Map headerMap = source.getHeaderExpressions(method); assertNotNull(headerMap); assertEquals(2, headerMap.size()); - assertEquals("#args['1']", headerMap.get("foo")); - assertEquals("#args['2']", headerMap.get("bar")); + assertEquals("#args[1]", headerMap.get("foo")); + assertEquals("#args[2]", headerMap.get("bar")); } @Test diff --git a/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorTests.java b/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorTests.java index 2ed66bdf20..9fe258bada 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorTests.java @@ -283,7 +283,7 @@ public class MethodInvokingMessageProcessorTests { @Test public void testProcessMessageBadExpression() throws Exception { // TODO: should this be MessageHandlingException or NumberFormatException? - expected.expect(new ExceptionCauseMatcher(NumberFormatException.class)); + expected.expect(new ExceptionCauseMatcher(Exception.class)); AnnotatedTestService service = new AnnotatedTestService(); Method method = service.getClass().getMethod("integerMethod", Integer.class); MethodInvokingMessageProcessor processor = new MethodInvokingMessageProcessor(service, method); diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageInboundTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageInboundTests.java index 8a9bbfdd11..3dcd35f661 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageInboundTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageInboundTests.java @@ -174,11 +174,11 @@ public class DefaultHttpHeaderMapperFromMessageInboundTests { public void validateETag(){ HeaderMapper mapper = DefaultHttpHeaderMapper.inboundMapper(); Map messageHeaders = new HashMap(); - messageHeaders.put("ETag", "1234"); + messageHeaders.put("ETag", "\"1234\""); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); - assertEquals("1234", headers.getETag()); + assertEquals("\"1234\"", headers.getETag()); } // Expires tests