diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/AbstractMessageAggregator.java b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/AbstractMessageAggregator.java index 85f81cdb2f..08affd6355 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/AbstractMessageAggregator.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/AbstractMessageAggregator.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.List; import org.springframework.integration.core.Message; -import org.springframework.integration.core.MessageHistoryEvent; import org.springframework.integration.message.MessageBuilder; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -48,7 +47,7 @@ import org.springframework.util.CollectionUtils; public abstract class AbstractMessageAggregator extends AbstractMessageBarrierHandler>> { - private static final String COMPONENT_TYPE_LABEL = "aggregator"; + public static final String COMPONENT_TYPE_LABEL = "aggregator"; private volatile CompletionStrategy completionStrategy = new SequenceSizeCompletionStrategy(); @@ -89,11 +88,6 @@ public abstract class AbstractMessageAggregator extends } } - @Override - protected void postProcessHistoryEvent(MessageHistoryEvent event) { - event.setComponentType(COMPONENT_TYPE_LABEL); - } - protected abstract Message aggregateMessages(List> messages); } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/CorrelatingMessageHandler.java b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/CorrelatingMessageHandler.java index cd991840b6..9026594b94 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/CorrelatingMessageHandler.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/CorrelatingMessageHandler.java @@ -22,7 +22,6 @@ import org.springframework.integration.channel.NullChannel; import org.springframework.integration.core.Message; import org.springframework.integration.core.MessageChannel; import org.springframework.integration.core.MessageHeaders; -import org.springframework.integration.core.MessageHistoryEvent; import org.springframework.integration.handler.AbstractMessageHandler; import org.springframework.integration.store.MessageStore; import org.springframework.integration.store.SimpleMessageStore; @@ -50,6 +49,10 @@ import java.util.concurrent.locks.ReentrantLock; */ public class CorrelatingMessageHandler extends AbstractMessageHandler implements Lifecycle { + // TODO: need to support 'resequencer' as well + public static final String COMPONENT_TYPE_LABEL = "aggregator"; + + private MessageStore store = new SimpleMessageStore(100); private final CorrelationStrategy correlationStrategy; private final CompletionStrategy completionStrategy; @@ -119,12 +122,6 @@ public class CorrelatingMessageHandler extends AbstractMessageHandler implements this.sendPartialResultOnTimeout = sendPartialResultOnTimeout; } - @Override - protected void postProcessHistoryEvent(MessageHistoryEvent event) { - // TODO: need to support 'resequencer' as well - event.setComponentType("aggregator"); - } - @Override protected void handleMessageInternal(Message message) throws Exception { Object correlationKey = correlationStrategy.getCorrelationKey(message); diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/Resequencer.java b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/Resequencer.java index ef4d94001e..5757603c31 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/Resequencer.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/Resequencer.java @@ -23,7 +23,6 @@ import java.util.SortedSet; import java.util.TreeSet; import org.springframework.integration.core.Message; -import org.springframework.integration.core.MessageHistoryEvent; import org.springframework.util.CollectionUtils; /** @@ -54,7 +53,7 @@ import org.springframework.util.CollectionUtils; */ public class Resequencer extends AbstractMessageBarrierHandler>> { - private static final String COMPONENT_TYPE_LABEL = "resequencer"; + public static final String COMPONENT_TYPE_LABEL = "resequencer"; private volatile boolean releasePartialSequences = true; @@ -147,9 +146,4 @@ public class Resequencer extends AbstractMessageBarrierHandler message) { + MessageHistoryEvent event = message.getHeaders().getHistory().addEvent(this.componentName); + if (this.componentType != null) { + event.setComponentType(this.componentType); + } + this.handler.handleMessage(message); + } + + + private static String determineComponentTypeFromHandlerIfPossible(MessageHandler handler) { + String type = null; + try { + Field componentTypeField = handler.getClass().getField("COMPONENT_TYPE_LABEL"); + Object componentType = componentTypeField.get(null); + if (componentType instanceof String && StringUtils.hasText((String) componentType)) { + type = (String) componentType; + } + } + catch (Exception e) { + // no COMPONENT_TYPE_LABEL avaiable + } + return type; + } + +} diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/endpoint/PollingConsumer.java b/org.springframework.integration/src/main/java/org/springframework/integration/endpoint/PollingConsumer.java index 45da05398c..94c862fe65 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/endpoint/PollingConsumer.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/endpoint/PollingConsumer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 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. @@ -33,8 +33,14 @@ public class PollingConsumer extends AbstractPollingEndpoint { private final MessageHandler handler; + private volatile MessageHandler handlerInvocationChain; + private volatile long receiveTimeout = 1000; + private volatile boolean initialized; + + private final Object initializationMonitor = new Object(); + public PollingConsumer(PollableChannel inputChannel, MessageHandler handler) { Assert.notNull(inputChannel, "inputChannel must not be null"); @@ -48,6 +54,17 @@ public class PollingConsumer extends AbstractPollingEndpoint { this.receiveTimeout = receiveTimeout; } + @Override + protected void onInit() { + synchronized (this.initializationMonitor) { + if (!this.initialized) { + this.handlerInvocationChain = new HandlerInvocationChain(this.handler, this.getBeanName()); + } + this.initialized = true; + } + super.onInit(); + } + @Override protected boolean doPoll() { Message message = (this.receiveTimeout >= 0) @@ -56,7 +73,7 @@ public class PollingConsumer extends AbstractPollingEndpoint { if (message == null) { return false; } - this.handler.handleMessage(message); + this.handlerInvocationChain.handleMessage(message); return true; } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/filter/MessageFilter.java b/org.springframework.integration/src/main/java/org/springframework/integration/filter/MessageFilter.java index 698482ae06..77a9e82a16 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/filter/MessageFilter.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/filter/MessageFilter.java @@ -18,7 +18,6 @@ package org.springframework.integration.filter; import org.springframework.integration.core.Message; import org.springframework.integration.core.MessageChannel; -import org.springframework.integration.core.MessageHistoryEvent; import org.springframework.integration.handler.AbstractReplyProducingMessageHandler; import org.springframework.integration.message.MessageDeliveryException; import org.springframework.integration.message.MessageRejectedException; @@ -38,7 +37,7 @@ import org.springframework.util.Assert; */ public class MessageFilter extends AbstractReplyProducingMessageHandler { - private static final String COMPONENT_TYPE_LABEL = "filter"; + public static final String COMPONENT_TYPE_LABEL = "filter"; private final MessageSelector selector; @@ -103,9 +102,4 @@ public class MessageFilter extends AbstractReplyProducingMessageHandler { return null; } - @Override - protected void postProcessHistoryEvent(MessageHistoryEvent e) { - e.setComponentType(COMPONENT_TYPE_LABEL); - } - } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/gateway/GatewayInvokingMessageHandler.java b/org.springframework.integration/src/main/java/org/springframework/integration/gateway/GatewayInvokingMessageHandler.java index df6be93a3e..2b7639ac4d 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/gateway/GatewayInvokingMessageHandler.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/gateway/GatewayInvokingMessageHandler.java @@ -17,7 +17,6 @@ package org.springframework.integration.gateway; import org.springframework.integration.core.Message; -import org.springframework.integration.core.MessageHistoryEvent; import org.springframework.integration.handler.AbstractReplyProducingMessageHandler; import org.springframework.integration.message.MessageHandler; import org.springframework.util.Assert; @@ -30,7 +29,7 @@ import org.springframework.util.Assert; */ public class GatewayInvokingMessageHandler extends AbstractReplyProducingMessageHandler { - private static final String COMPONENT_TYPE_LABEL = "gateway"; + public static final String COMPONENT_TYPE_LABEL = "gateway"; private GenericSendAndRecieveGateway gateway; @@ -50,9 +49,4 @@ public class GatewayInvokingMessageHandler extends AbstractReplyProducingMessage return gateway.sendAndRecieve(requestMessage); } - @Override - protected void postProcessHistoryEvent(MessageHistoryEvent event) { - event.setComponentType(COMPONENT_TYPE_LABEL); - } - } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/handler/AbstractMessageHandler.java b/org.springframework.integration/src/main/java/org/springframework/integration/handler/AbstractMessageHandler.java index 1a23fa6c22..e6256de33e 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/handler/AbstractMessageHandler.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/handler/AbstractMessageHandler.java @@ -24,7 +24,6 @@ import org.springframework.integration.channel.ChannelResolutionException; import org.springframework.integration.channel.ChannelResolver; import org.springframework.integration.core.Message; import org.springframework.integration.core.MessageChannel; -import org.springframework.integration.core.MessageHistoryEvent; import org.springframework.integration.core.MessagingException; import org.springframework.integration.message.MessageHandler; import org.springframework.integration.message.MessageHandlingException; @@ -59,8 +58,6 @@ public abstract class AbstractMessageHandler implements MessageHandler, Ordered if (this.logger.isDebugEnabled()) { this.logger.debug(this + " received message: " + message); } - MessageHistoryEvent event = message.getHeaders().getHistory().addEvent(this.toString()); - this.postProcessHistoryEvent(event); try { this.handleMessageInternal(message); } @@ -73,16 +70,6 @@ public abstract class AbstractMessageHandler implements MessageHandler, Ordered } } - /** - * Post process the history event. For example, this method is commonly overridden - * to set the 'componentType' label for the specific handler implementation. As a - * result, the "logical" name is available in MessageHistory events. Such a name - * should typically match the corresponding configuration element's name (in XML or - * Annotations), such as "router" or "splitter". By default this method is a no-op. - */ - protected void postProcessHistoryEvent(MessageHistoryEvent event) { - } - protected abstract void handleMessageInternal(Message message) throws Exception; protected final MessageChannel resolveReplyChannel(Message requestMessage, diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/handler/BridgeHandler.java b/org.springframework.integration/src/main/java/org/springframework/integration/handler/BridgeHandler.java index a5824e8d0d..fedc1c80dc 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/handler/BridgeHandler.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/handler/BridgeHandler.java @@ -17,7 +17,6 @@ package org.springframework.integration.handler; import org.springframework.integration.core.Message; -import org.springframework.integration.core.MessageHistoryEvent; import org.springframework.util.Assert; /** @@ -36,7 +35,7 @@ import org.springframework.util.Assert; */ public class BridgeHandler extends AbstractReplyProducingMessageHandler { - private static final String COMPONENT_TYPE_LABEL = "bridge"; + public static final String COMPONENT_TYPE_LABEL = "bridge"; @Override @@ -47,11 +46,6 @@ public class BridgeHandler extends AbstractReplyProducingMessageHandler { return requestMessage; } - @Override - protected void postProcessHistoryEvent(MessageHistoryEvent e) { - e.setComponentType(COMPONENT_TYPE_LABEL); - } - private void verifyOutputChannel() { Assert.state(super.getOutputChannel() != null, "Bridge handler requires an output channel"); } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/handler/LoggingHandler.java b/org.springframework.integration/src/main/java/org/springframework/integration/handler/LoggingHandler.java index a4dc91123c..4c883e3ba1 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/handler/LoggingHandler.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/handler/LoggingHandler.java @@ -20,7 +20,6 @@ import java.io.PrintWriter; import java.io.StringWriter; import org.springframework.integration.core.Message; -import org.springframework.integration.core.MessageHistoryEvent; import org.springframework.util.StringUtils; /** @@ -36,7 +35,7 @@ public class LoggingHandler extends AbstractMessageHandler { private static enum Level { FATAL, ERROR, WARN, INFO, DEBUG, TRACE } - private static final String COMPONENT_TYPE_LABEL = "logging-channel-adapter"; + public static final String COMPONENT_TYPE_LABEL = "logging-channel-adapter"; private boolean shouldLogFullMessage; @@ -109,9 +108,4 @@ public class LoggingHandler extends AbstractMessageHandler { } } - @Override - protected void postProcessHistoryEvent(MessageHistoryEvent e) { - e.setComponentType(COMPONENT_TYPE_LABEL); - } - } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/handler/MethodInvokingMessageProcessor.java b/org.springframework.integration/src/main/java/org/springframework/integration/handler/MethodInvokingMessageProcessor.java index 66f1b676f6..28ac4b2d23 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/handler/MethodInvokingMessageProcessor.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/handler/MethodInvokingMessageProcessor.java @@ -49,6 +49,7 @@ import org.springframework.integration.annotation.Header; import org.springframework.integration.annotation.Headers; import org.springframework.integration.annotation.Payload; import org.springframework.integration.core.Message; +import org.springframework.integration.core.MessageHistoryEvent; import org.springframework.integration.core.MessagingException; import org.springframework.integration.message.MessageHandlingException; import org.springframework.integration.util.ClassUtils; @@ -166,12 +167,21 @@ public class MethodInvokingMessageProcessor implements MessageProcessor { List candidates = this.findHandlerMethodsForMessage(message); for (HandlerMethod candidate : candidates) { try { - Object result = candidate.getExpression().getValue(this.evaluationContext, message); + Expression expression = candidate.getExpression(); + Object result = expression.getValue(this.evaluationContext, message); if (this.requiresReply) { // TODO: remove this if SpEL is modified to throw an EvaluationException instead // e.g. we can invoke getValue(this.evaluationContext, message, candidate.getReturnType); Assert.notNull(result, "Expression evaluation result was null, but this processor requires a reply."); } + MessageHistoryEvent event = message.getHeaders().getHistory().getCurrentEvent(); + if (event != null) { + String typeName = org.springframework.util.ClassUtils.getShortNameAsProperty(this.targetObject.getClass()); + event.setProperty("targetType", typeName); + if (candidate.method != null) { + event.setProperty("targetMethod", candidate.method.getName()); + } + } return result; } catch (EvaluationException e) { 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 2cbb5720d4..cf616735d2 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 @@ -20,7 +20,6 @@ import java.lang.reflect.Method; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.core.Message; -import org.springframework.integration.core.MessageHistoryEvent; import org.springframework.integration.message.MessageHandlingException; /** @@ -28,7 +27,7 @@ import org.springframework.integration.message.MessageHandlingException; */ public class ServiceActivatingHandler extends AbstractReplyProducingMessageHandler { - private static final String COMPONENT_TYPE_LABEL = "service-activator"; + public static final String COMPONENT_TYPE_LABEL = "service-activator"; private final MethodInvokingMessageProcessor processor; @@ -60,11 +59,6 @@ public class ServiceActivatingHandler extends AbstractReplyProducingMessageHandl } } - @Override - protected void postProcessHistoryEvent(MessageHistoryEvent event) { - event.setComponentType(COMPONENT_TYPE_LABEL); - } - public String toString() { return "ServiceActivator for [" + this.processor + "]"; } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractMessageRouter.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractMessageRouter.java index baf7826818..e1bccaca83 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractMessageRouter.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractMessageRouter.java @@ -21,7 +21,6 @@ import java.util.Collection; import org.springframework.integration.channel.MessageChannelTemplate; import org.springframework.integration.core.Message; import org.springframework.integration.core.MessageChannel; -import org.springframework.integration.core.MessageHistoryEvent; import org.springframework.integration.handler.AbstractMessageHandler; import org.springframework.integration.message.MessageDeliveryException; @@ -32,7 +31,7 @@ import org.springframework.integration.message.MessageDeliveryException; */ public abstract class AbstractMessageRouter extends AbstractMessageHandler { - private static final String COMPONENT_TYPE_LABEL = "router"; + public static final String COMPONENT_TYPE_LABEL = "router"; private volatile MessageChannel defaultOutputChannel; @@ -94,11 +93,6 @@ public abstract class AbstractMessageRouter extends AbstractMessageHandler { } } - @Override - protected void postProcessHistoryEvent(MessageHistoryEvent event) { - event.setComponentType(COMPONENT_TYPE_LABEL); - } - /** * Subclasses must implement this method to return the target channels for * a given Message. diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/RecipientListRouter.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/RecipientListRouter.java index d9e1c7e02b..df9d4928d3 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/router/RecipientListRouter.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/RecipientListRouter.java @@ -16,20 +16,25 @@ package org.springframework.integration.router; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + import org.springframework.beans.factory.InitializingBean; import org.springframework.integration.channel.MessageChannelTemplate; import org.springframework.integration.core.Message; import org.springframework.integration.core.MessageChannel; import org.springframework.integration.core.MessageHeaders; -import org.springframework.integration.core.MessageHistoryEvent; import org.springframework.integration.handler.AbstractMessageHandler; import org.springframework.integration.message.MessageBuilder; import org.springframework.integration.message.MessageDeliveryException; import org.springframework.integration.selector.MessageSelector; import org.springframework.util.Assert; -import java.util.*; - /** *
  * <recipient-list-router id="simpleRouter" input-channel="routingChannelA">
@@ -60,7 +65,7 @@ import java.util.*;
  */
 public class RecipientListRouter extends AbstractMessageHandler implements InitializingBean {
 
-    private static final String COMPONENT_TYPE_LABEL = "recipient-list-router";
+    public static final String COMPONENT_TYPE_LABEL = "recipient-list-router";
 
 
 	private volatile boolean ignoreSendFailures;
@@ -159,9 +164,4 @@ public class RecipientListRouter extends AbstractMessageHandler implements Initi
         }
     }
 
-	@Override
-	protected void postProcessHistoryEvent(MessageHistoryEvent event) {
-		event.setComponentType(COMPONENT_TYPE_LABEL);
-	}
-
 }
diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/splitter/AbstractMessageSplitter.java b/org.springframework.integration/src/main/java/org/springframework/integration/splitter/AbstractMessageSplitter.java
index 18fa638fea..b70d92cf53 100644
--- a/org.springframework.integration/src/main/java/org/springframework/integration/splitter/AbstractMessageSplitter.java
+++ b/org.springframework.integration/src/main/java/org/springframework/integration/splitter/AbstractMessageSplitter.java
@@ -24,7 +24,6 @@ import java.util.UUID;
 import org.springframework.integration.core.Message;
 import org.springframework.integration.core.MessageChannel;
 import org.springframework.integration.core.MessageHeaders;
-import org.springframework.integration.core.MessageHistoryEvent;
 import org.springframework.integration.handler.AbstractReplyProducingMessageHandler;
 import org.springframework.integration.message.MessageBuilder;
 
@@ -35,7 +34,7 @@ import org.springframework.integration.message.MessageBuilder;
  */
 public abstract class AbstractMessageSplitter extends AbstractReplyProducingMessageHandler {
 
-	private static final String COMPONENT_TYPE_LABEL = "splitter";
+	public static final String COMPONENT_TYPE_LABEL = "splitter";
 
 
 	@Override
@@ -70,11 +69,6 @@ public abstract class AbstractMessageSplitter extends AbstractReplyProducingMess
 		return messageBuilders;
 	}
 
-	@Override
-	protected void postProcessHistoryEvent(MessageHistoryEvent event) {
-		event.setComponentType(COMPONENT_TYPE_LABEL);
-	}
-
 	@SuppressWarnings("unchecked")
 	private MessageBuilder createBuilder(Object item, Object correlationId, int sequenceNumber, int sequenceSize) {
 		MessageBuilder builder = (item instanceof Message) ?
diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MessageTransformingHandler.java b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MessageTransformingHandler.java
index b24ef5862b..e4caf18212 100644
--- a/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MessageTransformingHandler.java
+++ b/org.springframework.integration/src/main/java/org/springframework/integration/transformer/MessageTransformingHandler.java
@@ -17,7 +17,6 @@
 package org.springframework.integration.transformer;
 
 import org.springframework.integration.core.Message;
-import org.springframework.integration.core.MessageHistoryEvent;
 import org.springframework.integration.handler.AbstractReplyProducingMessageHandler;
 import org.springframework.util.Assert;
 
@@ -30,7 +29,7 @@ import org.springframework.util.Assert;
  */
 public class MessageTransformingHandler extends AbstractReplyProducingMessageHandler {
 
-	private static final String COMPONENT_TYPE_LABEL = "transformer";
+	public static final String COMPONENT_TYPE_LABEL = "transformer";
 
 
 	private final Transformer transformer;
@@ -59,9 +58,4 @@ public class MessageTransformingHandler extends AbstractReplyProducingMessageHan
 		}
 	}
 
-	@Override
-	protected void postProcessHistoryEvent(MessageHistoryEvent event) {
-		event.setComponentType(COMPONENT_TYPE_LABEL);
-	}
-
 }
diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/AggregatorParserTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/config/AggregatorParserTests.java
index a566b65c5c..a2cac5167f 100644
--- a/org.springframework.integration/src/test/java/org/springframework/integration/config/AggregatorParserTests.java
+++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/AggregatorParserTests.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2008 the original author or authors.
+ * Copyright 2002-2010 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.
@@ -80,7 +80,7 @@ public class AggregatorParserTests {
         CorrelationStrategy correlationStrategy = (CorrelationStrategy) context.getBean("correlationStrategy");
 		MessageChannel outputChannel = (MessageChannel) context.getBean("outputChannel");
 		MessageChannel discardChannel = (MessageChannel) context.getBean("discardChannel");
-		Object consumer = new DirectFieldAccessor(endpoint).getPropertyValue("handler");
+		Object consumer = TestUtils.getPropertyValue(endpoint, "handler");
 		Assert.assertEquals(MethodInvokingAggregator.class, consumer.getClass());
 		DirectFieldAccessor accessor = new DirectFieldAccessor(consumer);
 		Method expectedMethod = TestAggregatorBean.class.getMethod("createSingleMessageFromGroup", List.class);
@@ -141,8 +141,8 @@ public class AggregatorParserTests {
 		MessageChannel input = (MessageChannel) context.getBean("aggregatorWithPojoCompletionStrategyInput");
 		EventDrivenConsumer endpoint =
 				(EventDrivenConsumer) context.getBean("aggregatorWithPojoCompletionStrategy");
-		CompletionStrategy completionStrategy = (CompletionStrategy) new DirectFieldAccessor(
-				new DirectFieldAccessor(endpoint).getPropertyValue("handler")).getPropertyValue("completionStrategy");
+		CompletionStrategy completionStrategy = TestUtils.getPropertyValue(endpoint,
+				"handler.completionStrategy", CompletionStrategy.class);
 		Assert.assertTrue(completionStrategy instanceof CompletionStrategyAdapter);
 		DirectFieldAccessor completionStrategyAccessor = new DirectFieldAccessor(completionStrategy);
 		MethodInvoker invoker = (MethodInvoker) completionStrategyAccessor.getPropertyValue("invoker");
diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/ResequencerParserTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/config/ResequencerParserTests.java
index dc51abb80c..8d141d41fa 100644
--- a/org.springframework.integration/src/test/java/org/springframework/integration/config/ResequencerParserTests.java
+++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/ResequencerParserTests.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2009 the original author or authors.
+ * Copyright 2002-2010 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.
@@ -27,7 +27,6 @@ import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 
-import org.springframework.beans.DirectFieldAccessor;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.integration.aggregator.CorrelationStrategy;
@@ -38,6 +37,7 @@ import org.springframework.integration.core.Message;
 import org.springframework.integration.core.MessageChannel;
 import org.springframework.integration.endpoint.EventDrivenConsumer;
 import org.springframework.integration.message.MessageBuilder;
+import org.springframework.integration.test.util.TestUtils;
 
 /**
  * @author Marius Bogoevici
@@ -79,7 +79,7 @@ public class ResequencerParserTests {
 	@Test
 	public void testDefaultResequencerProperties() {
 		EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("defaultResequencer");
-		Resequencer resequencer = (Resequencer) new DirectFieldAccessor(endpoint).getPropertyValue("handler");
+		Resequencer resequencer = TestUtils.getPropertyValue(endpoint, "handler", Resequencer.class);
 		assertNull(getPropertyValue(resequencer, "outputChannel"));
 		assertNull(getPropertyValue(resequencer, "discardChannel"));
 		assertEquals("The ResequencerEndpoint is not set with the appropriate timeout value",
@@ -101,7 +101,7 @@ public class ResequencerParserTests {
 		EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("completelyDefinedResequencer");
 		MessageChannel outputChannel = (MessageChannel) context.getBean("outputChannel");
 		MessageChannel discardChannel = (MessageChannel) context.getBean("discardChannel");
-		Resequencer resequencer = (Resequencer) new DirectFieldAccessor(endpoint).getPropertyValue("handler");
+		Resequencer resequencer = TestUtils.getPropertyValue(endpoint, "handler", Resequencer.class);
 		assertEquals("The ResequencerEndpoint is not injected with the appropriate output channel",
 				outputChannel, getPropertyValue(resequencer, "outputChannel"));
 		assertEquals("The ResequencerEndpoint is not injected with the appropriate discard channel",
@@ -123,7 +123,7 @@ public class ResequencerParserTests {
 	@Test
 	public void testCorrelationStrategyRefOnly() throws Exception {
 		EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("resequencerWithCorrelationStrategyRefOnly");
-		Resequencer resequencer = (Resequencer) new DirectFieldAccessor(endpoint).getPropertyValue("handler");
+		Resequencer resequencer = TestUtils.getPropertyValue(endpoint, "handler", Resequencer.class);
 		assertEquals("The ResequencerEndpoint is not configured with the appropriate CorrelationStrategy",
 				context.getBean("testCorrelationStrategy"), getPropertyValue(resequencer, "correlationStrategy"));
 	}
@@ -131,7 +131,7 @@ public class ResequencerParserTests {
 	@Test
 	public void testCorrelationStrategyRefAndMethod() throws Exception {
 		EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("resequencerWithCorrelationStrategyRefAndMethod");
-		Resequencer resequencer = (Resequencer) new DirectFieldAccessor(endpoint).getPropertyValue("handler");
+		Resequencer resequencer = TestUtils.getPropertyValue(endpoint, "handler", Resequencer.class);
 		Object correlationStrategy = getPropertyValue(resequencer, "correlationStrategy");
 		assertEquals("The ResequencerEndpoint is not configured with a CorrelationStrategy adapter",
 				CorrelationStrategyAdapter.class, correlationStrategy.getClass());
diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/annotation/AggregatorAnnotationTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/config/annotation/AggregatorAnnotationTests.java
index fb8a8ef612..502716c2c6 100644
--- a/org.springframework.integration/src/test/java/org/springframework/integration/config/annotation/AggregatorAnnotationTests.java
+++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/annotation/AggregatorAnnotationTests.java
@@ -39,6 +39,7 @@ import org.springframework.integration.aggregator.SequenceSizeCompletionStrategy
 import org.springframework.integration.channel.BeanFactoryChannelResolver;
 import org.springframework.integration.channel.ChannelResolver;
 import org.springframework.integration.endpoint.EventDrivenConsumer;
+import org.springframework.integration.test.util.TestUtils;
 
 /**
  * @author Marius Bogoevici
@@ -127,7 +128,7 @@ public class AggregatorAnnotationTests {
 	private AbstractMessageAggregator getAggregator(ApplicationContext context, final String endpointName) {
 		EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean(
 				endpointName + ".aggregatingMethod.aggregator");
-		return (AbstractMessageAggregator) new DirectFieldAccessor(endpoint).getPropertyValue("handler");
+		return TestUtils.getPropertyValue(endpoint, "handler", AbstractMessageAggregator.class);
 	}
 
 }
diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/DelayerParserTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/DelayerParserTests.java
index 8c44240615..31b3cac772 100644
--- a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/DelayerParserTests.java
+++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/DelayerParserTests.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2009 the original author or authors.
+ * Copyright 2002-2010 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.
@@ -27,6 +27,7 @@ import org.springframework.context.ApplicationContext;
 import org.springframework.core.Ordered;
 import org.springframework.integration.endpoint.EventDrivenConsumer;
 import org.springframework.integration.handler.DelayHandler;
+import org.springframework.integration.test.util.TestUtils;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
@@ -46,7 +47,7 @@ public class DelayerParserTests {
 	public void defaultScheduler() {
 		Object endpoint = context.getBean("delayerWithDefaultScheduler");
 		assertEquals(EventDrivenConsumer.class, endpoint.getClass());
-		Object handler = new DirectFieldAccessor(endpoint).getPropertyValue("handler");
+		Object handler = TestUtils.getPropertyValue(endpoint, "handler");
 		assertEquals(DelayHandler.class, handler.getClass());
 		DelayHandler delayHandler = (DelayHandler) handler;
 		assertEquals(99, delayHandler.getOrder());
@@ -65,7 +66,7 @@ public class DelayerParserTests {
 	public void customScheduler() {
 		Object endpoint = context.getBean("delayerWithCustomScheduler");
 		assertEquals(EventDrivenConsumer.class, endpoint.getClass());
-		Object handler = new DirectFieldAccessor(endpoint).getPropertyValue("handler");
+		Object handler = TestUtils.getPropertyValue(endpoint, "handler");
 		assertEquals(DelayHandler.class, handler.getClass());
 		DelayHandler delayHandler = (DelayHandler) handler;
 		assertEquals(Ordered.LOWEST_PRECEDENCE, delayHandler.getOrder());
diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/MethodInvokingOutboundChannelAdapterParserTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/MethodInvokingOutboundChannelAdapterParserTests.java
index b90c37d21e..fdf8b8f7d4 100644
--- a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/MethodInvokingOutboundChannelAdapterParserTests.java
+++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/MethodInvokingOutboundChannelAdapterParserTests.java
@@ -26,6 +26,7 @@ import org.springframework.beans.DirectFieldAccessor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.integration.handler.MethodInvokingMessageHandler;
+import org.springframework.integration.test.util.TestUtils;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
@@ -43,23 +44,21 @@ public class MethodInvokingOutboundChannelAdapterParserTests {
 	@Test
 	public void checkConfig() {
 		Object adapter = context.getBean("adapter");
-		DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
-		Object handler = adapterAccessor.getPropertyValue("handler");
+		Object handler = TestUtils.getPropertyValue(adapter, "handler");
 		assertEquals(MethodInvokingMessageHandler.class, handler.getClass());
 		DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(handler);
 		assertEquals(99, handlerAccessor.getPropertyValue("order"));
-		assertEquals(Boolean.FALSE, adapterAccessor.getPropertyValue("autoStartup"));
+		assertEquals(Boolean.FALSE, TestUtils.getPropertyValue(adapter, "autoStartup"));
 	}
 	
 	@Test
 	public void checkConfigWithInnerBeanAndPoller() {
 		Object adapter = context.getBean("adapterB");
-		DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
-		Object handler = adapterAccessor.getPropertyValue("handler");
+		Object handler = TestUtils.getPropertyValue(adapter, "handler");
 		assertEquals(MethodInvokingMessageHandler.class, handler.getClass());
 		DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(handler);
 		assertEquals(99, handlerAccessor.getPropertyValue("order"));
-		assertEquals(Boolean.FALSE, adapterAccessor.getPropertyValue("autoStartup"));
+		assertEquals(Boolean.FALSE, TestUtils.getPropertyValue(adapter, "autoStartup"));
 	}
 
 
diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/PNamespaceTest.java b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/PNamespaceTest.java
index be5bbe9c53..879aaea26b 100644
--- a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/PNamespaceTest.java
+++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/PNamespaceTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2009 the original author or authors.
+ * Copyright 2002-2010 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.
@@ -20,10 +20,11 @@ import junit.framework.Assert;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.springframework.beans.DirectFieldAccessor;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.integration.endpoint.EventDrivenConsumer;
+import org.springframework.integration.test.util.TestUtils;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
@@ -86,12 +87,8 @@ public class PNamespaceTest {
 
 
 	private TestBean prepare(EventDrivenConsumer edc) {
-		DirectFieldAccessor serviceActivatorAccessor = new DirectFieldAccessor(serviceActivator);
-		Object handler =  serviceActivatorAccessor.getPropertyValue("handler");
-		DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(handler);
-		Object processor =  handlerAccessor.getPropertyValue("processor");
-		DirectFieldAccessor processorAccessor = new DirectFieldAccessor(processor);
-		return  (TestBean) processorAccessor.getPropertyValue("targetObject");
+		return TestUtils.getPropertyValue(serviceActivator,
+				"handler.processor.targetObject", TestBean.class);
 	}
 
 
diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/gateway/GatewayProxyFactoryBeanTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/gateway/GatewayProxyFactoryBeanTests.java
index 1bd04b80ba..8bc458ccd7 100644
--- a/org.springframework.integration/src/test/java/org/springframework/integration/gateway/GatewayProxyFactoryBeanTests.java
+++ b/org.springframework.integration/src/test/java/org/springframework/integration/gateway/GatewayProxyFactoryBeanTests.java
@@ -268,6 +268,7 @@ public class GatewayProxyFactoryBeanTests {
 		channel.setBeanName("testChannel");
 		EventDrivenConsumer consumer = new EventDrivenConsumer(channel, new BridgeHandler());
 		consumer.setBeanName("testBridge");
+		consumer.afterPropertiesSet();
 		consumer.start();
 		proxyFactory.setDefaultRequestChannel(channel);
 		proxyFactory.setServiceInterface(TestEchoService.class);
diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/handler/SendTimeoutConfigurationTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/handler/SendTimeoutConfigurationTests.java
index a93a7e69d2..91bd5e6a8b 100644
--- a/org.springframework.integration/src/test/java/org/springframework/integration/handler/SendTimeoutConfigurationTests.java
+++ b/org.springframework.integration/src/test/java/org/springframework/integration/handler/SendTimeoutConfigurationTests.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2009 the original author or authors.
+ * Copyright 2002-2010 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.
@@ -21,9 +21,9 @@ import static org.junit.Assert.assertEquals;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.springframework.beans.DirectFieldAccessor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
+import org.springframework.integration.test.util.TestUtils;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
@@ -65,10 +65,8 @@ public class SendTimeoutConfigurationTests {
 
 
 	private long getTimeout(String endpointName) {
-		DirectFieldAccessor endpointAccessor = new DirectFieldAccessor(context.getBean(endpointName));
-		DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(endpointAccessor.getPropertyValue("handler"));
-		DirectFieldAccessor templateAccessor = new DirectFieldAccessor(handlerAccessor.getPropertyValue("channelTemplate"));
-		return ((Long) templateAccessor.getPropertyValue("sendTimeout")).longValue();
+		return TestUtils.getPropertyValue(context.getBean(endpointName),
+				"handler.channelTemplate.sendTimeout", Long.class).longValue();
 	}
 
 }
diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/router/config/RecipientListRouterParserTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/router/config/RecipientListRouterParserTests.java
index b1b963e868..d0e9d80480 100644
--- a/org.springframework.integration/src/test/java/org/springframework/integration/router/config/RecipientListRouterParserTests.java
+++ b/org.springframework.integration/src/test/java/org/springframework/integration/router/config/RecipientListRouterParserTests.java
@@ -31,6 +31,7 @@ import org.springframework.integration.core.Message;
 import org.springframework.integration.core.MessageChannel;
 import org.springframework.integration.message.GenericMessage;
 import org.springframework.integration.router.RecipientListRouter;
+import org.springframework.integration.test.util.TestUtils;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
@@ -64,7 +65,7 @@ public class RecipientListRouterParserTests {
 	@Test
 	public void simpleRouter() {
 		Object endpoint = context.getBean("simpleRouter");
-		Object handler = new DirectFieldAccessor(endpoint).getPropertyValue("handler");
+		Object handler = TestUtils.getPropertyValue(endpoint, "handler");
 		assertEquals(RecipientListRouter.class, handler.getClass());
 		RecipientListRouter router = (RecipientListRouter) handler;
 		DirectFieldAccessor accessor = new DirectFieldAccessor(router);
@@ -77,7 +78,7 @@ public class RecipientListRouterParserTests {
 	@Test
 	public void customRouter() {
 		Object endpoint = context.getBean("customRouter");
-		Object handler = new DirectFieldAccessor(endpoint).getPropertyValue("handler");
+		Object handler = TestUtils.getPropertyValue(endpoint, "handler");
 		assertEquals(RecipientListRouter.class, handler.getClass());
 		RecipientListRouter router = (RecipientListRouter) handler;
 		DirectFieldAccessor accessor = new DirectFieldAccessor(router);
diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/router/config/RouterParserTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/router/config/RouterParserTests.java
index 4a46580802..dca97c94c3 100644
--- a/org.springframework.integration/src/test/java/org/springframework/integration/router/config/RouterParserTests.java
+++ b/org.springframework.integration/src/test/java/org/springframework/integration/router/config/RouterParserTests.java
@@ -39,6 +39,7 @@ import org.springframework.integration.message.MessageDeliveryException;
 import org.springframework.integration.message.StringMessage;
 import org.springframework.integration.router.AbstractMessageRouter;
 import org.springframework.integration.router.MethodInvokingRouter;
+import org.springframework.integration.test.util.TestUtils;
 
 /**
  * @author Mark Fisher
@@ -128,8 +129,8 @@ public class RouterParserTests {
 	public void timeoutValueConfigured() {
 		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
 				"routerParserTests.xml", this.getClass());
-		DirectFieldAccessor endpointAccessor = new DirectFieldAccessor(context.getBean("routerWithTimeout"));
-		MethodInvokingRouter router = (MethodInvokingRouter) endpointAccessor.getPropertyValue("handler");
+		Object endpoint = context.getBean("routerWithTimeout");
+		MethodInvokingRouter router = TestUtils.getPropertyValue(endpoint, "handler", MethodInvokingRouter.class);
 		MessageChannelTemplate template = (MessageChannelTemplate)
 				new DirectFieldAccessor(router).getPropertyValue("channelTemplate");
 		Long timeout = (Long) new DirectFieldAccessor(template).getPropertyValue("sendTimeout");
@@ -141,8 +142,8 @@ public class RouterParserTests {
 		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
 				"routerParserTests.xml", this.getClass());
 		Object channelResolverBean = context.getBean("testChannelResolver");
-		DirectFieldAccessor endpointAccessor = new DirectFieldAccessor(context.getBean("routerWithChannelResolver"));
-		MethodInvokingRouter router = (MethodInvokingRouter) endpointAccessor.getPropertyValue("handler");
+		Object endpoint = context.getBean("routerWithChannelResolver");
+		MethodInvokingRouter router = TestUtils.getPropertyValue(endpoint, "handler", MethodInvokingRouter.class);
 		ChannelResolver channelResolver = (ChannelResolver)
 				new DirectFieldAccessor(router).getPropertyValue("channelResolver");
 		assertSame(channelResolverBean, channelResolver);