From e0dfba2ae94d140efb7a65093d8863e2490c3a5f Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Fri, 21 Aug 2009 22:32:02 +0000 Subject: [PATCH] INT-765, INT-766 Added MessageProcessor interface. The MessageMappingMethodInvoking now implements that interface. --- .../CorrelationStrategyAdapter.java | 29 ++++++----- .../filter/MethodInvokingSelector.java | 2 +- .../handler/MessageMappingMethodInvoker.java | 9 ++-- .../integration/handler/MessageProcessor.java | 49 +++++++++++++++++++ .../handler/MethodInvokingMessageHandler.java | 2 +- .../handler/ServiceActivatingHandler.java | 2 +- .../router/MethodInvokingRouter.java | 2 +- .../splitter/MethodInvokingSplitter.java | 2 +- .../MethodInvokingTransformer.java | 11 +++-- .../MessageMappingMethodInvokerTests.java | 34 ++++++------- 10 files changed, 95 insertions(+), 47 deletions(-) create mode 100644 org.springframework.integration/src/main/java/org/springframework/integration/handler/MessageProcessor.java diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/CorrelationStrategyAdapter.java b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/CorrelationStrategyAdapter.java index 00f976c9e5..756eeb5c85 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/CorrelationStrategyAdapter.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/CorrelationStrategyAdapter.java @@ -29,24 +29,23 @@ import org.springframework.util.Assert; */ public class CorrelationStrategyAdapter implements CorrelationStrategy { - private final MessageMappingMethodInvoker invoker; + private final MessageMappingMethodInvoker invoker; - public CorrelationStrategyAdapter(Object object, String methodName) { - this.invoker = new MessageMappingMethodInvoker(object, methodName, true); - } + public CorrelationStrategyAdapter(Object object, String methodName) { + this.invoker = new MessageMappingMethodInvoker(object, methodName, true); + } - public CorrelationStrategyAdapter(Object object, Method method) { - Assert.notNull(object, "'object' must not be null"); - Assert.notNull(method, "'method' must not be null"); - Assert.isTrue(method.getParameterTypes().length == 1, "Method must accept exactly one parameter"); - Assert.isTrue(!Void.TYPE.equals(method.getReturnType()), "Method return type must not be void"); - this.invoker = new MessageMappingMethodInvoker(object, method); - } + public CorrelationStrategyAdapter(Object object, Method method) { + Assert.notNull(object, "'object' must not be null"); + Assert.notNull(method, "'method' must not be null"); + Assert.isTrue(method.getParameterTypes().length == 1, "Method must accept exactly one parameter"); + Assert.isTrue(!Void.TYPE.equals(method.getReturnType()), "Method return type must not be void"); + this.invoker = new MessageMappingMethodInvoker(object, method); + } + public Object getCorrelationKey(Message message) { + return invoker.processMessage(message); + } - public Object getCorrelationKey(Message message) { - return invoker.invokeMethod(message); - } - } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/filter/MethodInvokingSelector.java b/org.springframework.integration/src/main/java/org/springframework/integration/filter/MethodInvokingSelector.java index 7dae7b84ae..ecc71730b9 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/filter/MethodInvokingSelector.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/filter/MethodInvokingSelector.java @@ -47,7 +47,7 @@ public class MethodInvokingSelector implements MessageSelector { public boolean accept(Message message) { - Object result = this.invoker.invokeMethod(message); + Object result = this.invoker.processMessage(message); Assert.notNull(result, "result must not be null"); Assert.isAssignable(Boolean.class, result.getClass(), "a boolean result is required"); return (Boolean) result; diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/handler/MessageMappingMethodInvoker.java b/org.springframework.integration/src/main/java/org/springframework/integration/handler/MessageMappingMethodInvoker.java index d1eba9b842..53cb8810ca 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/handler/MessageMappingMethodInvoker.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/handler/MessageMappingMethodInvoker.java @@ -50,7 +50,7 @@ import org.springframework.util.StringUtils; * @author Marius Bogoevici * @see MethodParameterMessageMapper */ -public class MessageMappingMethodInvoker { +public class MessageMappingMethodInvoker implements MessageProcessor { protected static final Log logger = LogFactory.getLog(MessageMappingMethodInvoker.class); @@ -90,9 +90,8 @@ public class MessageMappingMethodInvoker { this.object = object; this.methodResolver = this.createResolverForMethodName(methodName, requiresReturnValue); } - - public Object invokeMethod(Message message) { + public Object processMessage(Message message) { Assert.notNull(message, "message must not be null"); if (message.getPayload() == null) { if (logger.isDebugEnabled()) { @@ -104,7 +103,7 @@ public class MessageMappingMethodInvoker { Object[] args = null; try { args = this.createArgumentArrayFromMessage(method, message); - return this.doInvokeMethod(method, args, message); + return this.invokeMethod(method, args, message); } catch (InvocationTargetException e) { if (e.getCause() != null && e.getCause() instanceof RuntimeException) { @@ -122,7 +121,7 @@ public class MessageMappingMethodInvoker { } } - private Object doInvokeMethod(Method method, Object[] args, Message message) throws Exception { + private Object invokeMethod(Method method, Object[] args, Message message) throws Exception { Object result = null; MethodInvoker invoker = null; try { diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/handler/MessageProcessor.java b/org.springframework.integration/src/main/java/org/springframework/integration/handler/MessageProcessor.java new file mode 100644 index 0000000000..17a1eb2eeb --- /dev/null +++ b/org.springframework.integration/src/main/java/org/springframework/integration/handler/MessageProcessor.java @@ -0,0 +1,49 @@ +/* + * Copyright 2002-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.handler; + +import org.springframework.integration.core.Message; + +/** + * This defines the lowest-level strategy of processing a Message and returning + * some Object (or null). Implementations will be focused on generic concerns, + * such as invoking a method, running a script, or evaluating an expression. + *

+ * Higher level MessageHandler implementations can delegate to these processors + * for such functionality, but it is the responsibility of each handler type to + * add the semantics such as routing, splitting, transforming, etc. + *

+ * In some cases the return value might be a Message itself, but it does not + * need to be. It is the responsibility of the caller to determine how to treat + * the return value. That may require creating a Message or even creating + * multiple Messages from that value. + *

+ * This strategy and its various implementations are considered part of the + * internal "support" API, intended for use by Spring Integration's various + * message-handling components. As such, it is subject to change. + * + * @author Mark Fisher + * @since 2.0 + */ +public interface MessageProcessor { + + /** + * Process the Message and return a value (or null). + */ + Object processMessage(Message message); + +} diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/handler/MethodInvokingMessageHandler.java b/org.springframework.integration/src/main/java/org/springframework/integration/handler/MethodInvokingMessageHandler.java index a72ac07aa0..6c50b0a864 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/handler/MethodInvokingMessageHandler.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/handler/MethodInvokingMessageHandler.java @@ -54,7 +54,7 @@ public class MethodInvokingMessageHandler extends MessageMappingMethodInvoker im } public void handleMessage(Message message) { - Object result = this.invokeMethod(message); + Object result = this.processMessage(message); if (result != null) { throw new MessagingException(message, "the MethodInvokingMessageHandler method must " + "have a void return, but '" + this + "' received a value: [" + result + "]"); diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/handler/ServiceActivatingHandler.java b/org.springframework.integration/src/main/java/org/springframework/integration/handler/ServiceActivatingHandler.java index cfbe38205a..16e241c5c8 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/handler/ServiceActivatingHandler.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/handler/ServiceActivatingHandler.java @@ -46,7 +46,7 @@ public class ServiceActivatingHandler extends AbstractReplyProducingMessageHandl @Override protected void handleRequestMessage(Message message, ReplyMessageHolder replyHolder) { try { - Object result = this.invoker.invokeMethod(message); + Object result = this.invoker.processMessage(message); if (result != null) { replyHolder.set(result); } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/MethodInvokingRouter.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/MethodInvokingRouter.java index 0742c18458..94fcd6147d 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/router/MethodInvokingRouter.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/MethodInvokingRouter.java @@ -54,7 +54,7 @@ public class MethodInvokingRouter extends AbstractChannelNameResolvingMessageRou @Override protected List getChannelIndicatorList(Message message) { - Object result = this.invoker.invokeMethod(message); + Object result = this.invoker.processMessage(message); List asList = new ArrayList(); asList.add(result); return asList; diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/splitter/MethodInvokingSplitter.java b/org.springframework.integration/src/main/java/org/springframework/integration/splitter/MethodInvokingSplitter.java index c7d3d9efcf..5816490e96 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/splitter/MethodInvokingSplitter.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/splitter/MethodInvokingSplitter.java @@ -51,7 +51,7 @@ public class MethodInvokingSplitter extends AbstractMessageSplitter { @Override protected Object splitMessage(Message message) { - return this.invoker.invokeMethod(message); + return this.invoker.processMessage(message); } } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MethodInvokingTransformer.java b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MethodInvokingTransformer.java index 9975893d15..be576db517 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MethodInvokingTransformer.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MethodInvokingTransformer.java @@ -22,6 +22,7 @@ import java.util.Properties; import org.springframework.integration.core.Message; import org.springframework.integration.handler.MessageMappingMethodInvoker; +import org.springframework.integration.handler.MessageProcessor; import org.springframework.integration.message.MessageBuilder; import org.springframework.integration.message.MessageHandlingException; @@ -30,25 +31,25 @@ import org.springframework.integration.message.MessageHandlingException; */ public class MethodInvokingTransformer implements Transformer { - private final MessageMappingMethodInvoker invoker; + private final MessageProcessor messageProcessor; public MethodInvokingTransformer(Object object, Method method) { - this.invoker = new MessageMappingMethodInvoker(object, method); + this.messageProcessor = new MessageMappingMethodInvoker(object, method); } public MethodInvokingTransformer(Object object, String methodName) { - this.invoker = new MessageMappingMethodInvoker(object, methodName); + this.messageProcessor = new MessageMappingMethodInvoker(object, methodName); } public MethodInvokingTransformer(Object object) { - this.invoker = new MessageMappingMethodInvoker(object, + this.messageProcessor = new MessageMappingMethodInvoker(object, org.springframework.integration.annotation.Transformer.class); } public Message transform(Message message) { - Object result = this.invoker.invokeMethod(message); + Object result = this.messageProcessor.processMessage(message); if (result == null) { return null; } diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/handler/MessageMappingMethodInvokerTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/handler/MessageMappingMethodInvokerTests.java index 8785eb31ca..48522b36f3 100644 --- a/org.springframework.integration/src/test/java/org/springframework/integration/handler/MessageMappingMethodInvokerTests.java +++ b/org.springframework.integration/src/test/java/org/springframework/integration/handler/MessageMappingMethodInvokerTests.java @@ -42,7 +42,7 @@ public class MessageMappingMethodInvokerTests { public void payloadAsMethodParameterAndObjectAsReturnValue() { MessageMappingMethodInvoker invoker = new MessageMappingMethodInvoker( new TestBean(), "acceptPayloadAndReturnObject"); - Object result = invoker.invokeMethod(new StringMessage("testing")); + Object result = invoker.processMessage(new StringMessage("testing")); assertEquals("testing-1", result); } @@ -50,7 +50,7 @@ public class MessageMappingMethodInvokerTests { public void payloadAsMethodParameterAndMessageAsReturnValue() { MessageMappingMethodInvoker invoker = new MessageMappingMethodInvoker( new TestBean(), "acceptPayloadAndReturnMessage"); - Message result = (Message) invoker.invokeMethod(new StringMessage("testing")); + Message result = (Message) invoker.processMessage(new StringMessage("testing")); assertEquals("testing-2", result.getPayload()); } @@ -58,7 +58,7 @@ public class MessageMappingMethodInvokerTests { public void messageAsMethodParameterAndObjectAsReturnValue() { MessageMappingMethodInvoker invoker = new MessageMappingMethodInvoker( new TestBean(), "acceptMessageAndReturnObject"); - Object result = invoker.invokeMethod(new StringMessage("testing")); + Object result = invoker.processMessage(new StringMessage("testing")); assertEquals("testing-3", result); } @@ -66,7 +66,7 @@ public class MessageMappingMethodInvokerTests { public void messageAsMethodParameterAndMessageAsReturnValue() { MessageMappingMethodInvoker invoker = new MessageMappingMethodInvoker( new TestBean(), "acceptMessageAndReturnMessage"); - Message result = (Message) invoker.invokeMethod(new StringMessage("testing")); + Message result = (Message) invoker.processMessage(new StringMessage("testing")); assertEquals("testing-4", result.getPayload()); } @@ -74,7 +74,7 @@ public class MessageMappingMethodInvokerTests { public void messageSubclassAsMethodParameterAndMessageAsReturnValue() { MessageMappingMethodInvoker invoker = new MessageMappingMethodInvoker( new TestBean(), "acceptMessageSubclassAndReturnMessage"); - Message result = (Message) invoker.invokeMethod(new StringMessage("testing")); + Message result = (Message) invoker.processMessage(new StringMessage("testing")); assertEquals("testing-5", result.getPayload()); } @@ -82,7 +82,7 @@ public class MessageMappingMethodInvokerTests { public void messageSubclassAsMethodParameterAndMessageSubclassAsReturnValue() { MessageMappingMethodInvoker invoker = new MessageMappingMethodInvoker( new TestBean(), "acceptMessageSubclassAndReturnMessageSubclass"); - Message result = (Message) invoker.invokeMethod(new StringMessage("testing")); + Message result = (Message) invoker.processMessage(new StringMessage("testing")); assertEquals("testing-6", result.getPayload()); } @@ -92,23 +92,23 @@ public class MessageMappingMethodInvokerTests { new TestBean(), "acceptPayloadAndHeaderAndReturnObject"); Message request = MessageBuilder.withPayload("testing") .setHeader("number", new Integer(123)).build(); - Object result = invoker.invokeMethod(request); + Object result = invoker.processMessage(request); assertEquals("testing-123", result); } @Test public void testVoidMethodsIncludedbyDefault() { MessageMappingMethodInvoker invoker = new MessageMappingMethodInvoker(new TestBean(), "testVoidReturningMethods"); - assertNull(invoker.invokeMethod(MessageBuilder.withPayload("Something").build())); - assertEquals(12, invoker.invokeMethod(MessageBuilder.withPayload(12).build())); + assertNull(invoker.processMessage(MessageBuilder.withPayload("Something").build())); + assertEquals(12, invoker.processMessage(MessageBuilder.withPayload(12).build())); } @Test public void testVoidMethodsExcludedByFlag() { MessageMappingMethodInvoker invoker = new MessageMappingMethodInvoker(new TestBean(), "testVoidReturningMethods", true); - assertEquals(12, invoker.invokeMethod(MessageBuilder.withPayload(12).build())); + assertEquals(12, invoker.processMessage(MessageBuilder.withPayload(12).build())); try { - assertNull(invoker.invokeMethod(MessageBuilder.withPayload("Something").build())); + assertNull(invoker.processMessage(MessageBuilder.withPayload("Something").build())); fail(); } catch(IllegalArgumentException ex){ @@ -120,7 +120,7 @@ public class MessageMappingMethodInvokerTests { AnnotatedTestService service = new AnnotatedTestService(); Method method = service.getClass().getMethod("messageOnly", Message.class); MessageMappingMethodInvoker invoker = new MessageMappingMethodInvoker(service, method); - Object result = invoker.invokeMethod(new StringMessage("foo")); + Object result = invoker.processMessage(new StringMessage("foo")); assertEquals("foo", result); } @@ -129,7 +129,7 @@ public class MessageMappingMethodInvokerTests { AnnotatedTestService service = new AnnotatedTestService(); Method method = service.getClass().getMethod("integerMethod", Integer.class); MessageMappingMethodInvoker invoker = new MessageMappingMethodInvoker(service, method); - Object result = invoker.invokeMethod(new GenericMessage(new Integer(123))); + Object result = invoker.processMessage(new GenericMessage(new Integer(123))); assertEquals(new Integer(123), result); } @@ -138,7 +138,7 @@ public class MessageMappingMethodInvokerTests { AnnotatedTestService service = new AnnotatedTestService(); Method method = service.getClass().getMethod("integerMethod", Integer.class); MessageMappingMethodInvoker invoker = new MessageMappingMethodInvoker(service, method); - Object result = invoker.invokeMethod(new StringMessage("456")); + Object result = invoker.processMessage(new StringMessage("456")); assertEquals(new Integer(456), result); } @@ -147,7 +147,7 @@ public class MessageMappingMethodInvokerTests { AnnotatedTestService service = new AnnotatedTestService(); Method method = service.getClass().getMethod("integerMethod", Integer.class); MessageMappingMethodInvoker invoker = new MessageMappingMethodInvoker(service, method); - Object result = invoker.invokeMethod(new StringMessage("foo")); + Object result = invoker.processMessage(new StringMessage("foo")); assertEquals(new Integer(123), result); } @@ -158,7 +158,7 @@ public class MessageMappingMethodInvokerTests { MessageMappingMethodInvoker invoker = new MessageMappingMethodInvoker(service, method); Message message = MessageBuilder.withPayload("foo") .setHeader("number", 42).build(); - Object result = invoker.invokeMethod(message); + Object result = invoker.processMessage(message); assertEquals("foo-42", result); } @@ -170,7 +170,7 @@ public class MessageMappingMethodInvokerTests { Message message = MessageBuilder.withPayload("foo") .setHeader("prop", "bar") .setHeader("number", 42).build(); - Object result = invoker.invokeMethod(message); + Object result = invoker.processMessage(message); assertEquals("bar-42", result); }