diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XPathRouterParser.java b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XPathRouterParser.java
index 732b03b0a9..51c5f98e40 100644
--- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XPathRouterParser.java
+++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XPathRouterParser.java
@@ -22,8 +22,6 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.ConfigurationException;
-import org.springframework.integration.router.MultiChannelRouter;
-import org.springframework.integration.router.SingleChannelRouter;
import org.springframework.integration.xml.router.XPathMultiChannelNameResolver;
import org.springframework.integration.xml.router.XPathSingleChannelNameResolver;
import org.springframework.util.StringUtils;
@@ -54,27 +52,19 @@ public class XPathRouterParser extends AbstractSingleBeanDefinitionParser {
|| (!StringUtils.hasText(xPathExpression) && !StringUtils.hasText(xPathExpressionRef))) {
throw new ConfigurationException("Exactly one of 'xpath-expression' or 'xpath-expression-ref' is required.");
}
-
- BeanDefinitionBuilder resolverDefinitionBuilder = null;
if (multiChannel) {
- builder.getBeanDefinition().setBeanClass(MultiChannelRouter.class);
- resolverDefinitionBuilder = BeanDefinitionBuilder
- .genericBeanDefinition(XPathMultiChannelNameResolver.class);
+ builder.getBeanDefinition().setBeanClass(XPathMultiChannelNameResolver.class);
}
else {
- builder.getBeanDefinition().setBeanClass(SingleChannelRouter.class);
- resolverDefinitionBuilder = BeanDefinitionBuilder
- .genericBeanDefinition(XPathSingleChannelNameResolver.class);
+ builder.getBeanDefinition().setBeanClass(XPathSingleChannelNameResolver.class);
}
-
if (StringUtils.hasText(xPathExpression)) {
XPathExpression expression = XPathExpressionFactory.createXPathExpression(xPathExpression);
- resolverDefinitionBuilder.addConstructorArgValue(expression);
+ builder.addConstructorArgValue(expression);
}
else {
- resolverDefinitionBuilder.addConstructorArgReference(xPathExpressionRef);
+ builder.addConstructorArgReference(xPathExpressionRef);
}
- builder.addPropertyValue("channelNameResolver", resolverDefinitionBuilder.getBeanDefinition());
}
}
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 3196b481f6..30d86bb8da 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
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2007 the original author or authors.
+ * 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.
@@ -18,39 +18,41 @@ package org.springframework.integration.xml.router;
import java.util.List;
-import org.springframework.integration.message.Message;
-import org.springframework.integration.router.MultiChannelNameResolver;
-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;
+import org.springframework.integration.message.Message;
+import org.springframework.integration.router.AbstractMultiChannelNameResolver;
+import org.springframework.integration.xml.util.XPathUtils;
+import org.springframework.util.Assert;
+import org.springframework.xml.xpath.NodeMapper;
+import org.springframework.xml.xpath.XPathExpression;
+
/**
- *
* @author Jonas Partner
- *
*/
-public class XPathMultiChannelNameResolver extends AbstractXPathChannelNameResolver implements MultiChannelNameResolver {
+public class XPathMultiChannelNameResolver extends AbstractMultiChannelNameResolver {
private final XPathExpression xPathExpression;
- private NodeMapper nodeMapper = new TextContentNodeMapper();
+ private volatile NodeMapper nodeMapper = new TextContentNodeMapper();
+
public XPathMultiChannelNameResolver(XPathExpression xPathExpression) {
- Assert.notNull("XPAthExpression must be provided");
+ Assert.notNull("XPathExpression must not be null");
this.xPathExpression = xPathExpression;
}
+
public void setNodeMapper(NodeMapper nodeMapper) {
- Assert.notNull(nodeMapper, "NodeMapper can not be null");
+ Assert.notNull(nodeMapper, "NodeMapper must not be null");
this.nodeMapper = nodeMapper;
}
@SuppressWarnings("unchecked")
- public String[] resolve(Message> message) {
- Node node = extractNode(message);
- List channelNamesList = xPathExpression.evaluate(node, nodeMapper);
+ public String[] resolveChannelNames(Message> message) {
+ Node node = XPathUtils.extractPayloadAsNode(message);
+ List channelNamesList = this.xPathExpression.evaluate(node, this.nodeMapper);
return (String[]) channelNamesList.toArray(new String[channelNamesList.size()]);
}
diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/XPathSingleChannelNameResolver.java b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/XPathSingleChannelNameResolver.java
index fc1eeaad97..39a67ddfc9 100644
--- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/XPathSingleChannelNameResolver.java
+++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/XPathSingleChannelNameResolver.java
@@ -19,24 +19,26 @@ package org.springframework.integration.xml.router;
import org.w3c.dom.Node;
import org.springframework.integration.message.Message;
-import org.springframework.integration.router.ChannelNameResolver;
+import org.springframework.integration.router.AbstractSingleChannelNameResolver;
+import org.springframework.integration.xml.util.XPathUtils;
import org.springframework.util.Assert;
import org.springframework.xml.xpath.XPathExpression;
/**
* @author Jonas Partner
*/
-public class XPathSingleChannelNameResolver extends AbstractXPathChannelNameResolver implements ChannelNameResolver {
+public class XPathSingleChannelNameResolver extends AbstractSingleChannelNameResolver {
private final XPathExpression xPathExpression;
+
public XPathSingleChannelNameResolver(XPathExpression xPathExpression) {
Assert.notNull("XPathExpression must be provided");
this.xPathExpression = xPathExpression;
}
- public String resolve(Message> message) {
- Node node = extractNode(message);
+ public String resolveChannelName(Message> message) {
+ Node node = XPathUtils.extractPayloadAsNode(message);
return xPathExpression.evaluateAsString(node);
}
diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/AbstractXPathChannelNameResolver.java b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/util/XPathUtils.java
similarity index 65%
rename from org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/AbstractXPathChannelNameResolver.java
rename to org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/util/XPathUtils.java
index 4d5ac85121..4560f3ee3b 100644
--- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/AbstractXPathChannelNameResolver.java
+++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/util/XPathUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2007 the original author or authors.
+ * 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.
@@ -14,23 +14,27 @@
* limitations under the License.
*/
-package org.springframework.integration.xml.router;
+package org.springframework.integration.xml.util;
+
+import org.w3c.dom.Node;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessagingException;
-import org.w3c.dom.Node;
/**
- *
* @author Jonas Partner
- *
+ * @author Mark Fisher
*/
-public class AbstractXPathChannelNameResolver {
+public abstract class XPathUtils {
- protected Node extractNode(Message> message) {
+ /**
+ * Return the given Message's payload as a Node if possible, else an Exception will be thrown.
+ */
+ public static Node extractPayloadAsNode(Message> message) {
if (!Node.class.isAssignableFrom(message.getPayload().getClass())) {
- throw new MessagingException(message, "Payload does not implement org.w3c.dom.Node so can not be evaluated");
+ throw new MessagingException(message, "payload is not assignable to [" + Node.class.getName() + "] so can not be evaluated");
}
return (Node) message.getPayload();
}
+
}
diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/router/XPathMultiChannelNameResolverTests.java b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/router/XPathMultiChannelNameResolverTests.java
index 1b78f02136..8a738dc09e 100644
--- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/router/XPathMultiChannelNameResolverTests.java
+++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/router/XPathMultiChannelNameResolverTests.java
@@ -34,24 +34,24 @@ import org.springframework.xml.xpath.XPathExpressionFactory;
*/
public class XPathMultiChannelNameResolverTests {
- @SuppressWarnings("unchecked")
@Test
+ @SuppressWarnings("unchecked")
public void testSimpleSingleeAttribute() throws Exception {
Document doc = XmlTestUtil.getDocumentForString("");
XPathExpression expression = XPathExpressionFactory.createXPathExpression("/doc/@type");
XPathMultiChannelNameResolver resolver = new XPathMultiChannelNameResolver(expression);
- String[] channelNames = resolver.resolve(new GenericMessage(doc));
+ String[] channelNames = resolver.resolveChannelNames(new GenericMessage(doc));
assertEquals("Wrong number of channels returend", 1, channelNames.length);
assertEquals("Wrong channel name", "one", channelNames[0]);
}
- @SuppressWarnings("unchecked")
@Test
+ @SuppressWarnings("unchecked")
public void testMultipleNodeValues() throws Exception {
Document doc = XmlTestUtil.getDocumentForString("bOnebTwo");
XPathExpression expression = XPathExpressionFactory.createXPathExpression("/doc/book");
XPathMultiChannelNameResolver resolver = new XPathMultiChannelNameResolver(expression);
- String[] channelNames = resolver.resolve(new GenericMessage(doc));
+ String[] channelNames = resolver.resolveChannelNames(new GenericMessage(doc));
assertEquals("Wrong number of channels returend", 2, channelNames.length);
assertEquals("Wrong channel name", "bOne", channelNames[0]);
assertEquals("Wrong channel name", "bTwo", channelNames[1]);
@@ -61,7 +61,7 @@ public class XPathMultiChannelNameResolverTests {
public void testNonNodePayload() throws Exception {
XPathExpression expression = XPathExpressionFactory.createXPathExpression("/doc/@type");
XPathMultiChannelNameResolver resolver = new XPathMultiChannelNameResolver(expression);
- resolver.resolve(new StringMessage("test"));
+ resolver.resolveChannelNames(new StringMessage("test"));
}
}
diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/router/XPathSingleChannelNameResolverTests.java b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/router/XPathSingleChannelNameResolverTests.java
index 534b7f3533..4a12621d7e 100644
--- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/router/XPathSingleChannelNameResolverTests.java
+++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/router/XPathSingleChannelNameResolverTests.java
@@ -24,7 +24,6 @@ import org.w3c.dom.Document;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.MessagingException;
import org.springframework.integration.message.StringMessage;
-import org.springframework.integration.xml.router.XPathSingleChannelNameResolver;
import org.springframework.integration.xml.util.XmlTestUtil;
import org.springframework.xml.xpath.XPathExpression;
import org.springframework.xml.xpath.XPathExpressionFactory;
@@ -34,13 +33,13 @@ import org.springframework.xml.xpath.XPathExpressionFactory;
*/
public class XPathSingleChannelNameResolverTests {
- @SuppressWarnings("unchecked")
@Test
+ @SuppressWarnings("unchecked")
public void testSimpleDocType() throws Exception {
Document doc = XmlTestUtil.getDocumentForString("");
XPathExpression expression = XPathExpressionFactory.createXPathExpression("/doc/@type");
XPathSingleChannelNameResolver resolver = new XPathSingleChannelNameResolver(expression);
- String channelName = resolver.resolve(new GenericMessage(doc));
+ String channelName = resolver.resolveChannelName(new GenericMessage(doc));
assertEquals("Wrong channel name", "one", channelName);
}
@@ -48,7 +47,7 @@ public class XPathSingleChannelNameResolverTests {
public void testNonNodePayload() throws Exception {
XPathExpression expression = XPathExpressionFactory.createXPathExpression("/doc/@type");
XPathSingleChannelNameResolver resolver = new XPathSingleChannelNameResolver(expression);
- resolver.resolve(new StringMessage("test"));
+ resolver.resolveChannelName(new StringMessage("test"));
}
}
diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/RouterParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/RouterParser.java
index 0ef4e0dbb9..b74522d9df 100644
--- a/org.springframework.integration/src/main/java/org/springframework/integration/config/RouterParser.java
+++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/RouterParser.java
@@ -17,7 +17,7 @@
package org.springframework.integration.config;
import org.springframework.integration.endpoint.MessageEndpoint;
-import org.springframework.integration.router.MethodInvokingRouter;
+import org.springframework.integration.router.MethodInvokingChannelResolver;
import org.springframework.integration.router.RouterEndpoint;
/**
@@ -34,7 +34,7 @@ public class RouterParser extends AbstractEndpointParser {
@Override
protected Class> getMethodInvokingAdapterClass() {
- return MethodInvokingRouter.class;
+ return MethodInvokingChannelResolver.class;
}
}
diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/annotation/RouterAnnotationPostProcessor.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/annotation/RouterAnnotationPostProcessor.java
index d12ebce593..5a6ec8508b 100644
--- a/org.springframework.integration/src/main/java/org/springframework/integration/config/annotation/RouterAnnotationPostProcessor.java
+++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/annotation/RouterAnnotationPostProcessor.java
@@ -24,7 +24,7 @@ import org.springframework.integration.annotation.Router;
import org.springframework.integration.bus.MessageBus;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.endpoint.AbstractEndpoint;
-import org.springframework.integration.router.MethodInvokingRouter;
+import org.springframework.integration.router.MethodInvokingChannelResolver;
import org.springframework.integration.router.RouterEndpoint;
import org.springframework.util.StringUtils;
@@ -42,13 +42,13 @@ public class RouterAnnotationPostProcessor extends AbstractMethodAnnotationPostP
@Override
protected Object createMethodInvokingAdapter(Object bean, Method method, Router annotation) {
- return new MethodInvokingRouter(bean, method);
+ return new MethodInvokingChannelResolver(bean, method);
}
@Override
protected AbstractEndpoint createEndpoint(Object adapter) {
- if (adapter instanceof MethodInvokingRouter) {
- return new RouterEndpoint((MethodInvokingRouter) adapter);
+ if (adapter instanceof MethodInvokingChannelResolver) {
+ return new RouterEndpoint((MethodInvokingChannelResolver) adapter);
}
return null;
}
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
new file mode 100644
index 0000000000..69c9d56005
--- /dev/null
+++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractChannelResolver.java
@@ -0,0 +1,56 @@
+/*
+ * 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/MultiChannelNameResolver.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractMultiChannelNameResolver.java
similarity index 51%
rename from org.springframework.integration/src/main/java/org/springframework/integration/router/MultiChannelNameResolver.java
rename to org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractMultiChannelNameResolver.java
index e8d68c6b0a..fa79e28f85 100644
--- a/org.springframework.integration/src/main/java/org/springframework/integration/router/MultiChannelNameResolver.java
+++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractMultiChannelNameResolver.java
@@ -16,15 +16,31 @@
package org.springframework.integration.router;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.message.Message;
/**
- * Strategy interface for content-based routing to multiple channel names.
- *
* @author Mark Fisher
*/
-public interface MultiChannelNameResolver {
+public abstract class AbstractMultiChannelNameResolver extends AbstractChannelResolver {
- String[] resolve(Message> message);
+ @Override
+ public 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);
+ }
+ return channels;
+ }
+
+ protected abstract String[] resolveChannelNames(Message> message);
}
diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractRouter.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractRouter.java
deleted file mode 100644
index ca1ddd1370..0000000000
--- a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractRouter.java
+++ /dev/null
@@ -1,92 +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.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.springframework.integration.channel.ChannelRegistry;
-import org.springframework.integration.channel.ChannelRegistryAware;
-import org.springframework.integration.message.Message;
-import org.springframework.integration.message.MessageDeliveryException;
-import org.springframework.integration.message.MessageExchangeTemplate;
-import org.springframework.integration.message.MessageTarget;
-import org.springframework.integration.message.MessagingException;
-
-/**
- * Base class for message router implementations.
- *
- * @author Mark Fisher
- */
-public abstract class AbstractRouter implements Router, ChannelRegistryAware {
-
- protected final Log logger = LogFactory.getLog(this.getClass());
-
- private volatile ChannelRegistry channelRegistry;
-
- private final MessageExchangeTemplate messageExchangeTemplate = new MessageExchangeTemplate();
-
-
- public void setChannelRegistry(ChannelRegistry channelRegistry) {
- this.channelRegistry = channelRegistry;
- }
-
- protected ChannelRegistry getChannelRegistry() {
- return this.channelRegistry;
- }
-
- public final boolean route(Message> message) {
- Collection> results = this.resolveChannels(message);
- if (results == null || results.isEmpty()) {
- return false;
- }
- boolean sent = false;
- for (Object channelOrName : results) {
- MessageTarget target = null;
- if (channelOrName == null) {
- continue;
- }
- if (channelOrName instanceof MessageTarget) {
- target = (MessageTarget) channelOrName;
- }
- else if (channelOrName instanceof String) {
- if (this.channelRegistry == null) {
- throw new MessagingException(message, "router has no ChannelRegistry");
- }
- target = this.channelRegistry.lookupChannel((String) channelOrName);
- }
- else {
- throw new MessagingException(message, "unsupported return type for router [" + channelOrName.getClass() + "]");
- }
- if (target == null) {
- throw new MessageDeliveryException(message, "unable to resolve channel for '" + channelOrName + "'");
- }
- this.messageExchangeTemplate.send(message, target);
- sent = true;
- }
- return sent;
- }
-
- /**
- * Subclasses must implement this method to return 0 or more MessageChannel
- * instances or channel names to which the given Message should be routed.
- */
- protected abstract Collection> resolveChannels(Message> message);
-
-}
diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/MultiChannelResolver.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelNameResolver.java
similarity index 70%
rename from org.springframework.integration/src/main/java/org/springframework/integration/router/MultiChannelResolver.java
rename to org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelNameResolver.java
index 0fa75155df..332f93fb91 100644
--- a/org.springframework.integration/src/main/java/org/springframework/integration/router/MultiChannelResolver.java
+++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelNameResolver.java
@@ -16,18 +16,20 @@
package org.springframework.integration.router;
-import java.util.List;
-
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.message.Message;
/**
- * Strategy interface for content-based routing to multiple channels.
- *
* @author Mark Fisher
*/
-public interface MultiChannelResolver {
+public abstract class AbstractSingleChannelNameResolver extends AbstractSingleChannelResolver {
- List resolve(Message> message);
+ @Override
+ protected MessageChannel resolveChannel(Message> message) {
+ String channelName = this.resolveChannelName(message);
+ return this.lookupChannel(channelName, true);
+ }
+
+ protected abstract String resolveChannelName(Message> message);
}
diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/Router.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelResolver.java
similarity index 60%
rename from org.springframework.integration/src/main/java/org/springframework/integration/router/Router.java
rename to org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelResolver.java
index 89fdcca2f2..460032ee01 100644
--- a/org.springframework.integration/src/main/java/org/springframework/integration/router/Router.java
+++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractSingleChannelResolver.java
@@ -16,15 +16,23 @@
package org.springframework.integration.router;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.message.Message;
/**
- * Strategy interface for routing a Message to one or more channels.
- *
* @author Mark Fisher
*/
-public interface Router {
+public abstract class AbstractSingleChannelResolver extends AbstractChannelResolver {
- boolean route(Message> message);
+ public Collection resolveChannels(Message> message) {
+ MessageChannel channel = this.resolveChannel(message);
+ return (channel != null) ?
+ Collections.singletonList(channel) : null;
+ }
+
+ protected abstract MessageChannel resolveChannel(Message> message);
}
diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/ChannelNameResolver.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/ChannelNameResolver.java
deleted file mode 100644
index ce9f8314b6..0000000000
--- a/org.springframework.integration/src/main/java/org/springframework/integration/router/ChannelNameResolver.java
+++ /dev/null
@@ -1,30 +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 org.springframework.integration.message.Message;
-
-/**
- * Strategy interface for content-based routing to a channel name.
- *
- * @author Mark Fisher
- */
-public interface ChannelNameResolver {
-
- String resolve(Message> message);
-
-}
diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/ChannelResolver.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/ChannelResolver.java
index ba402e8159..30b3b1cfcd 100644
--- a/org.springframework.integration/src/main/java/org/springframework/integration/router/ChannelResolver.java
+++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/ChannelResolver.java
@@ -16,16 +16,18 @@
package org.springframework.integration.router;
+import java.util.Collection;
+
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.message.Message;
/**
- * Strategy interface for content-based routing to a channel instance.
+ * Strategy interface for content-based routing.
*
* @author Mark Fisher
*/
public interface ChannelResolver {
- MessageChannel resolve(Message> message);
+ Collection resolveChannels(Message> message);
}
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/MethodInvokingChannelResolver.java
similarity index 59%
rename from org.springframework.integration/src/main/java/org/springframework/integration/router/MethodInvokingRouter.java
rename to org.springframework.integration/src/main/java/org/springframework/integration/router/MethodInvokingChannelResolver.java
index 2831a8111f..96ce315def 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/MethodInvokingChannelResolver.java
@@ -27,25 +27,26 @@ import org.springframework.integration.ConfigurationException;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageMappingMethodInvoker;
+import org.springframework.integration.message.MessagingException;
/**
- * A {@link Router} implementation that invokes the specified method
- * on the given object. The method's return value may be a single
- * MessageChannel instance, a single String to be interpreted as
- * a channel name, or a Collection (or Array) of either type.
+ * A {@link ChannelResolver} implementation that invokes the specified method
+ * on the given object. The method's return value may be a single MessageChannel
+ * instance, a single String to be interpreted as a channel name, or a Collection
+ * (or Array) of either type.
*
* @author Mark Fisher
*/
-public class MethodInvokingRouter extends AbstractRouter implements InitializingBean {
+public class MethodInvokingChannelResolver extends AbstractChannelResolver implements InitializingBean {
private final MessageMappingMethodInvoker invoker;
- public MethodInvokingRouter(Object object, Method method) {
+ public MethodInvokingChannelResolver(Object object, Method method) {
this.invoker = new MessageMappingMethodInvoker(object, method);
}
- public MethodInvokingRouter(Object object, String methodName) {
+ public MethodInvokingChannelResolver(Object object, String methodName) {
this.invoker = new MessageMappingMethodInvoker(object, methodName);
}
@@ -55,26 +56,30 @@ public class MethodInvokingRouter extends AbstractRouter implements Initializing
}
@Override
- protected Collection> resolveChannels(Message> message) {
+ public final Collection resolveChannels(Message> message) {
Object result = this.invoker.invokeMethod(message);
if (result == null) {
return null;
}
- List