diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/XPathMultiChannelNameResolver.java b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/XPathMultiChannelNameResolver.java index a1f9cb9356..10cf167a23 100644 --- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/XPathMultiChannelNameResolver.java +++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/XPathMultiChannelNameResolver.java @@ -18,20 +18,21 @@ package org.springframework.integration.xml.router; import java.util.List; +import org.w3c.dom.DOMException; +import org.w3c.dom.Node; + import org.springframework.integration.message.Message; -import org.springframework.integration.router.AbstractMultiChannelNameResolver; +import org.springframework.integration.router.AbstractChannelNameResolver; import org.springframework.integration.xml.DefaultXmlPayloadConverter; import org.springframework.integration.xml.XmlPayloadConverter; import org.springframework.util.Assert; import org.springframework.xml.xpath.NodeMapper; import org.springframework.xml.xpath.XPathExpression; -import org.w3c.dom.DOMException; -import org.w3c.dom.Node; /** * @author Jonas Partner */ -public class XPathMultiChannelNameResolver extends AbstractMultiChannelNameResolver { +public class XPathMultiChannelNameResolver extends AbstractChannelNameResolver { private final XPathExpression xPathExpression; @@ -39,11 +40,18 @@ public class XPathMultiChannelNameResolver extends AbstractMultiChannelNameResol private volatile NodeMapper nodeMapper = new TextContentNodeMapper(); + public XPathMultiChannelNameResolver(XPathExpression xPathExpression) { Assert.notNull("XPathExpression must not be null"); this.xPathExpression = xPathExpression; } + + public void setPayloadConvertor(XmlPayloadConverter payloadConvertor) { + Assert.notNull(payloadConvertor, "XmlPayloadConverter must not be null"); + this.payloadConvertor = payloadConvertor; + } + public void setNodeMapper(NodeMapper nodeMapper) { Assert.notNull(nodeMapper, "NodeMapper must not be null"); this.nodeMapper = nodeMapper; @@ -56,9 +64,6 @@ public class XPathMultiChannelNameResolver extends AbstractMultiChannelNameResol return (String[]) channelNamesList.toArray(new String[channelNamesList.size()]); } - public void setPayloadConvertor(XmlPayloadConverter payloadConvertor) { - this.payloadConvertor = payloadConvertor; - } private static class TextContentNodeMapper implements NodeMapper { diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractMultiChannelNameResolver.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractChannelNameResolver.java similarity index 50% rename from org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractMultiChannelNameResolver.java rename to org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractChannelNameResolver.java index fa79e28f85..7576b5960e 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractMultiChannelNameResolver.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractChannelNameResolver.java @@ -19,28 +19,52 @@ package org.springframework.integration.router; import java.util.ArrayList; import java.util.Collection; +import org.springframework.integration.channel.ChannelRegistry; +import org.springframework.integration.channel.ChannelRegistryAware; import org.springframework.integration.channel.MessageChannel; import org.springframework.integration.message.Message; +import org.springframework.integration.message.MessagingException; +import org.springframework.util.Assert; /** + * A base class for {@link ChannelResolver} implementations that return only + * the channel name(s) rather than {@link MessageChannel} instances. + * * @author Mark Fisher */ -public abstract class AbstractMultiChannelNameResolver extends AbstractChannelResolver { +public abstract class AbstractChannelNameResolver implements ChannelResolver, ChannelRegistryAware { - @Override - public Collection resolveChannels(Message message) { + private ChannelRegistry channelRegistry; + + + public void setChannelRegistry(ChannelRegistry channelRegistry) { + this.channelRegistry = channelRegistry; + } + + public final Collection resolveChannels(Message message) { Collection channels = new ArrayList(); String[] channelNames = this.resolveChannelNames(message); if (channelNames == null) { return null; } for (String channelName : channelNames) { - MessageChannel channel = this.lookupChannel(channelName, true); - channels.add(channel); + if (channelName != null) { + Assert.state(this.channelRegistry != null, + "unable to resolve channels, no ChannelRegistry available"); + MessageChannel channel = this.channelRegistry.lookupChannel(channelName); + if (channel == null) { + throw new MessagingException(message, + "unable to resolve chnanel '" + channelName + "'"); + } + channels.add(channel); + } } return channels; } + /** + * Subclasses must implement this method to return the channel name(s). + */ protected abstract String[] resolveChannelNames(Message message); } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractChannelResolver.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractChannelResolver.java deleted file mode 100644 index 69c9d56005..0000000000 --- a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractChannelResolver.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2002-2008 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.router; - -import java.util.Collection; - -import org.springframework.integration.ConfigurationException; -import org.springframework.integration.channel.ChannelRegistry; -import org.springframework.integration.channel.ChannelRegistryAware; -import org.springframework.integration.channel.MessageChannel; -import org.springframework.integration.message.Message; -import org.springframework.integration.message.MessagingException; - -/** - * @author Mark Fisher - */ -public abstract class AbstractChannelResolver implements ChannelResolver, ChannelRegistryAware { - - private volatile ChannelRegistry channelRegistry; - - - public void setChannelRegistry(ChannelRegistry channelRegistry) { - this.channelRegistry = channelRegistry; - } - - protected MessageChannel lookupChannel(String channelName, boolean required) { - MessageChannel channel = null; - if (channelName != null) { - if (this.channelRegistry == null) { - throw new ConfigurationException("unable to resolve channels, no ChannelRegistry available"); - } - channel = this.channelRegistry.lookupChannel(channelName); - } - if (channel == null && required) { - throw new MessagingException("unable to resolve channel '" + channelName + "'"); - } - return channel; - } - - public abstract Collection resolveChannels(Message message); - -} diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelNameResolver.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelNameResolver.java index 332f93fb91..b4b5e68d40 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelNameResolver.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelNameResolver.java @@ -16,18 +16,16 @@ package org.springframework.integration.router; -import org.springframework.integration.channel.MessageChannel; import org.springframework.integration.message.Message; /** * @author Mark Fisher */ -public abstract class AbstractSingleChannelNameResolver extends AbstractSingleChannelResolver { +public abstract class AbstractSingleChannelNameResolver extends AbstractChannelNameResolver { - @Override - protected MessageChannel resolveChannel(Message message) { + public final String[] resolveChannelNames(Message message) { String channelName = this.resolveChannelName(message); - return this.lookupChannel(channelName, true); + return (channelName != null) ? new String[] { channelName } : null; } protected abstract String resolveChannelName(Message message); diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelResolver.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelResolver.java index 460032ee01..d9dd2587f2 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelResolver.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelResolver.java @@ -25,7 +25,7 @@ import org.springframework.integration.message.Message; /** * @author Mark Fisher */ -public abstract class AbstractSingleChannelResolver extends AbstractChannelResolver { +public abstract class AbstractSingleChannelResolver implements ChannelResolver { public Collection resolveChannels(Message message) { MessageChannel channel = this.resolveChannel(message); diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/MethodInvokingChannelResolver.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/MethodInvokingChannelResolver.java index 96ce315def..f4cb018840 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/router/MethodInvokingChannelResolver.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/MethodInvokingChannelResolver.java @@ -24,10 +24,13 @@ import java.util.List; import org.springframework.beans.factory.InitializingBean; import org.springframework.integration.ConfigurationException; +import org.springframework.integration.channel.ChannelRegistry; +import org.springframework.integration.channel.ChannelRegistryAware; import org.springframework.integration.channel.MessageChannel; import org.springframework.integration.message.Message; import org.springframework.integration.message.MessageMappingMethodInvoker; import org.springframework.integration.message.MessagingException; +import org.springframework.util.Assert; /** * A {@link ChannelResolver} implementation that invokes the specified method @@ -37,10 +40,12 @@ import org.springframework.integration.message.MessagingException; * * @author Mark Fisher */ -public class MethodInvokingChannelResolver extends AbstractChannelResolver implements InitializingBean { +public class MethodInvokingChannelResolver implements ChannelResolver, ChannelRegistryAware, InitializingBean { private final MessageMappingMethodInvoker invoker; + private volatile ChannelRegistry channelRegistry; + public MethodInvokingChannelResolver(Object object, Method method) { this.invoker = new MessageMappingMethodInvoker(object, method); @@ -51,11 +56,14 @@ public class MethodInvokingChannelResolver extends AbstractChannelResolver imple } + public void setChannelRegistry(ChannelRegistry channelRegistry) { + this.channelRegistry = channelRegistry; + } + public void afterPropertiesSet() throws Exception { this.invoker.afterPropertiesSet(); } - @Override public final Collection resolveChannels(Message message) { Object result = this.invoker.invokeMethod(message); if (result == null) { @@ -96,7 +104,13 @@ public class MethodInvokingChannelResolver extends AbstractChannelResolver imple channels.add((MessageChannel) channelOrName); } else if (channelOrName instanceof String) { - MessageChannel channel = this.lookupChannel((String) channelOrName, true); + String channelName = (String) channelOrName; + Assert.state(this.channelRegistry != null, + "ChannelRegistry is required for resolving channel names"); + MessageChannel channel = this.channelRegistry.lookupChannel(channelName); + if (channel == null) { + throw new MessagingException("unable to resolve channel '" + channelName + "'"); + } channels.add(channel); } else { diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/RecipientListChannelResolver.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/RecipientListChannelResolver.java index ec4a478997..c992befc15 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/router/RecipientListChannelResolver.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/RecipientListChannelResolver.java @@ -29,11 +29,11 @@ import org.springframework.util.Assert; * configured list of recipients. The recipients are provided as a list of * {@link MessageChannel} instances. For dynamic recipient lists, consider * either implementing the {@link ChannelResolver} interface directly or - * extending the {@link AbstractMultiChannelNameResolver} base class. + * extending the {@link AbstractChannelNameResolver} base class. * * @author Mark Fisher */ -public class RecipientListChannelResolver extends AbstractChannelResolver implements InitializingBean { +public class RecipientListChannelResolver implements ChannelResolver, InitializingBean { private volatile List channels; @@ -47,7 +47,6 @@ public class RecipientListChannelResolver extends AbstractChannelResolver implem Assert.notEmpty(this.channels, "a non-empty channel list is required"); } - @Override public Collection resolveChannels(Message message) { return this.channels; } diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/router/MultiChannelRouterTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/router/MultiChannelRouterTests.java index 141e5c5634..6f1a8693d3 100644 --- a/org.springframework.integration/src/test/java/org/springframework/integration/router/MultiChannelRouterTests.java +++ b/org.springframework.integration/src/test/java/org/springframework/integration/router/MultiChannelRouterTests.java @@ -41,7 +41,7 @@ public class MultiChannelRouterTests { public void routeWithChannelResolver() { final QueueChannel channel1 = new QueueChannel(); final QueueChannel channel2 = new QueueChannel(); - AbstractChannelResolver channelResolver = new AbstractChannelResolver() { + ChannelResolver channelResolver = new ChannelResolver() { public List resolveChannels(Message message) { List channels = new ArrayList(); channels.add(channel1); @@ -62,7 +62,7 @@ public class MultiChannelRouterTests { @Test public void routeWithChannelNameResolver() { - AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() { + AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() { public String[] resolveChannelNames(Message message) { return new String[] {"channel1", "channel2"}; } @@ -88,7 +88,7 @@ public class MultiChannelRouterTests { @Test(expected = MessagingException.class) public void channelNameLookupFailure() { - AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() { + AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() { public String[] resolveChannelNames(Message message) { return new String[] {"noSuchChannel"}; } @@ -102,7 +102,7 @@ public class MultiChannelRouterTests { @Test(expected = MessagingException.class) public void channelRegistryNotAvailable() { - AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() { + AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() { public String[] resolveChannelNames(Message message) { return new String[] {"noSuchChannel"}; } diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/router/RouterEndpointTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/router/RouterEndpointTests.java index 79f5c82e88..3894db1502 100644 --- a/org.springframework.integration/src/test/java/org/springframework/integration/router/RouterEndpointTests.java +++ b/org.springframework.integration/src/test/java/org/springframework/integration/router/RouterEndpointTests.java @@ -86,7 +86,7 @@ public class RouterEndpointTests { @Test public void nullChannelNameArrayIgnoredByDefault() { - AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() { + AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() { public String[] resolveChannelNames(Message message) { return null; } @@ -100,7 +100,7 @@ public class RouterEndpointTests { @Test(expected = MessageDeliveryException.class) public void nullChannelNameArrayThrowsExceptionWhenResolutionRequired() { - AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() { + AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() { public String[] resolveChannelNames(Message message) { return null; } @@ -116,7 +116,7 @@ public class RouterEndpointTests { @Test public void emptyChannelNameArrayIgnoredByDefault() { - AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() { + AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() { public String[] resolveChannelNames(Message message) { return new String[] {}; } @@ -130,7 +130,7 @@ public class RouterEndpointTests { @Test(expected = MessageDeliveryException.class) public void emptyChannelNameArrayThrowsExceptionWhenResolutionRequired() { - AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() { + AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() { public String[] resolveChannelNames(Message message) { return new String[] {}; } @@ -156,7 +156,7 @@ public class RouterEndpointTests { @Test(expected = MessagingException.class) public void testChannelRegistryIsRequiredWhenUsingChannelNameResolverWithMultiChannelRouter() { - AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() { + AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() { public String[] resolveChannelNames(Message message) { return new String[] { "notImportant" }; }