diff --git a/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMessageRouter.java b/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMessageRouter.java index b91370bdc0..5b4062e22b 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMessageRouter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMessageRouter.java @@ -57,7 +57,7 @@ public abstract class AbstractMessageRouter extends AbstractMessageHandler { private volatile boolean applySequence; private final MessagingTemplate messagingTemplate = new MessagingTemplate(); - + private volatile String prefix; private volatile String suffix; @@ -65,9 +65,10 @@ public abstract class AbstractMessageRouter extends AbstractMessageHandler { private volatile ChannelResolver channelResolver; private volatile boolean ignoreChannelNameResolutionFailures; - + protected volatile Map channelIdentifierMap = new ConcurrentHashMap(); - + + /** * Specify the {@link ChannelResolver} strategy to use. * The default is a BeanFactoryChannelResolver. @@ -98,6 +99,7 @@ public abstract class AbstractMessageRouter extends AbstractMessageHandler { public void setIgnoreChannelNameResolutionFailures(boolean ignoreChannelNameResolutionFailures) { this.ignoreChannelNameResolutionFailures = ignoreChannelNameResolutionFailures; } + /** * Allows you to set the map which will map channel identifiers to channel names. * Channel names will be resolve via {@link ChannelResolver} @@ -107,10 +109,11 @@ public abstract class AbstractMessageRouter extends AbstractMessageHandler { this.channelIdentifierMap.clear(); this.channelIdentifierMap.putAll(channelIdentifierMap); } - + public void setChannelMapping(String channelIdentifier, String channelName){ this.channelIdentifierMap.put(channelIdentifier, channelName); } + /** * Removes channel mapping for a give channel identifier * @param channelIdentifier @@ -175,7 +178,7 @@ public abstract class AbstractMessageRouter extends AbstractMessageHandler { protected MessagingTemplate getMessagingTemplate() { return this.messagingTemplate; } - + @Override public void onInit() { BeanFactory beanFactory = this.getBeanFactory(); @@ -183,26 +186,28 @@ public abstract class AbstractMessageRouter extends AbstractMessageHandler { this.channelResolver = new BeanFactoryChannelResolver(beanFactory); } } - - protected Collection determineTargetChannels(Message message) { + + private Collection determineTargetChannels(Message message) { this.afterPropertiesSet(); Collection channels = new ArrayList(); Collection channelsReturned = this.getChannelIndicatorList(message); addToCollection(channels, channelsReturned, message); return channels; } - + protected ConversionService getRequiredConversionService() { if (this.getConversionService() == null) { this.setConversionService(ConversionServiceFactory.createDefaultConversionService()); } return this.getConversionService(); } + /** - * Subclasses must implement this method to return the channel indicators. + * Subclasses must implement this method to return the channel identifiers. */ protected abstract List getChannelIndicatorList(Message message); + @Override protected void handleMessageInternal(Message message) { boolean sent = false; @@ -259,7 +264,7 @@ public abstract class AbstractMessageRouter extends AbstractMessageHandler { } return channel; } - + private void addChannelFromString(Collection channels, String channelIdentifier, Message message) { if (channelIdentifier.indexOf(',') != -1) { for (String name : StringUtils.commaDelimitedListToStringArray(channelIdentifier)) { @@ -278,10 +283,9 @@ public abstract class AbstractMessageRouter extends AbstractMessageHandler { * to 'channelName' (e.g., PTR, EMETR) */ String channelName = channelIdentifier; - if (!CollectionUtils.isEmpty(channelIdentifierMap) && channelIdentifierMap.containsKey(channelIdentifier)){ + if (!CollectionUtils.isEmpty(channelIdentifierMap) && channelIdentifierMap.containsKey(channelIdentifier)) { channelName = channelIdentifierMap.get(channelIdentifier); } - if (this.channelResolver != null){ MessageChannel channel = resolveChannelForName(channelName, message); if (channel != null) { @@ -289,7 +293,7 @@ public abstract class AbstractMessageRouter extends AbstractMessageHandler { } } } - + private void addToCollection(Collection channels, Collection channelIndicators, Message message) { if (channelIndicators == null) { return; @@ -325,4 +329,5 @@ public abstract class AbstractMessageRouter extends AbstractMessageHandler { } } } + } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/router/PayloadTypeRouterTests.java b/spring-integration-core/src/test/java/org/springframework/integration/router/PayloadTypeRouterTests.java index f0c781fedb..e159fe552c 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/router/PayloadTypeRouterTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/router/PayloadTypeRouterTests.java @@ -28,7 +28,6 @@ import java.util.concurrent.ConcurrentHashMap; import org.junit.Test; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.integration.Message; -import org.springframework.integration.MessageChannel; import org.springframework.integration.MessageHandlingException; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.message.GenericMessage; @@ -57,20 +56,17 @@ public class PayloadTypeRouterTests { Message message1 = new GenericMessage("test"); Message message2 = new GenericMessage(123); - assertEquals(1, router.determineTargetChannels(message1).size()); - MessageChannel result1 = router.determineTargetChannels(message1).iterator().next(); - assertEquals(1, router.determineTargetChannels(message2).size()); - MessageChannel result2 = router.determineTargetChannels(message2).iterator().next(); + assertEquals(1, router.getChannelIndicatorList(message1).size()); + assertEquals("stringChannel", router.getChannelIndicatorList(message1).iterator().next()); + assertEquals(1, router.getChannelIndicatorList(message2).size()); + assertEquals("integerChannel", router.getChannelIndicatorList(message2).iterator().next()); - assertEquals(stringChannel, result1); - assertEquals(integerChannel, result2); // validate dynamics QueueChannel newChannel = new QueueChannel(); beanFactory.registerSingleton("newChannel", newChannel); router.setChannelMapping(String.class.getName(), "newChannel"); - assertEquals(1, router.determineTargetChannels(message1).size()); - result1 = router.determineTargetChannels(message1).iterator().next(); - assertEquals(newChannel, result1); + assertEquals(1, router.getChannelIndicatorList(message1).size()); + assertEquals("newChannel", router.getChannelIndicatorList(message1).iterator().next()); // validate nothing happens if mappings were removed and resolutionRequires = false router.removeChannelMapping(String.class.getName()); router.removeChannelMapping(Integer.class.getName()); @@ -112,7 +108,7 @@ public class PayloadTypeRouterTests { QueueChannel newChannel = new QueueChannel(); beanFactory.registerSingleton("newChannel", newChannel); router.setChannelMapping(Integer.class.getName(), "newChannel"); - assertEquals(1, router.determineTargetChannels(message).size()); + assertEquals(1, router.getChannelIndicatorList(message).size()); router.handleMessage(message); result = newChannel.receive(10); assertNotNull(result); @@ -212,7 +208,7 @@ public class PayloadTypeRouterTests { QueueChannel newChannel = new QueueChannel(); beanFactory.registerSingleton("newChannel", newChannel); router.setChannelMapping(Integer.class.getName(), "newChannel"); - assertEquals(1, router.determineTargetChannels(message).size()); + assertEquals(1, router.getChannelIndicatorList(message).size()); router.handleMessage(message); result = newChannel.receive(10); assertNotNull(result);