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 68064dd597..cf4910a16c 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
@@ -52,12 +52,16 @@ public class XPathRouterParser extends AbstractConsumerEndpointParser {
boolean multiChannel = Boolean.parseBoolean(element.getAttribute("multi-channel"));
String xPathExpressionRef = element.getAttribute("xpath-expression-ref");
+ String channelResolver = element.getAttribute("channel-resolver");
+ String resolutionRequired = element.getAttribute("resolution-required");
+
NodeList xPathExpressionNodes = element.getElementsByTagNameNS(
element.getNamespaceURI(), "xpath-expression");
Assert.isTrue(xPathExpressionNodes.getLength() < 2,
"Only one xpath-expression child can be specified.");
boolean xPathExpressionChildPresent = (xPathExpressionNodes.getLength() == 1);
boolean xPathReferencePresent = StringUtils.hasText(xPathExpressionRef);
+
Assert.isTrue(xPathExpressionChildPresent ^ xPathReferencePresent,
"Exactly one of 'xpath-expression' or 'xpath-expression-ref' is required.");
if (multiChannel) {
@@ -74,6 +78,16 @@ public class XPathRouterParser extends AbstractConsumerEndpointParser {
else {
builder.addConstructorArgReference(xPathExpressionRef);
}
+
+ if(StringUtils.hasText(resolutionRequired)){
+ builder.addPropertyValue("resolutionRequired", Boolean.parseBoolean(resolutionRequired));
+ }
+
+ if(StringUtils.hasText(channelResolver)){
+ builder.addPropertyReference("channelResolver", channelResolver);
+ }
+
+
return builder;
}
diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/spring-integration-xml-1.0.xsd b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/spring-integration-xml-1.0.xsd
index 505eb22ed3..747c2b6401 100644
--- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/spring-integration-xml-1.0.xsd
+++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/spring-integration-xml-1.0.xsd
@@ -99,6 +99,8 @@
+
+
diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/XPathSingleChannelRouter.java b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/XPathSingleChannelRouter.java
index fe2a8da974..d77479ac5a 100644
--- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/XPathSingleChannelRouter.java
+++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/router/XPathSingleChannelRouter.java
@@ -76,12 +76,10 @@ public class XPathSingleChannelRouter extends AbstractXPathRouter {
public String[] determineTargetChannelNames(Message> message) {
Node node = getConverter().convertToNode(message.getPayload());
String result = getXPathExpression().evaluateAsString(node);
- if ("".equals(result)) {
- throw new MessagingException(message,"XPath expression must not be empty");
- }
- if (result == null) {
+ if (result == null || "".equals(result)) {
return null;
}
+
return new String[] { result };
}
diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/StubChannelResolver.java b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/StubChannelResolver.java
new file mode 100644
index 0000000000..92e3acb756
--- /dev/null
+++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/StubChannelResolver.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2002-2007 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.xml.config;
+
+import org.springframework.integration.channel.ChannelResolver;
+import org.springframework.integration.core.MessageChannel;
+
+class StubChannelResolver implements ChannelResolver{
+
+ public MessageChannel resolveChannelName(String channelName) {
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XPathRouterParserTests.java b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XPathRouterParserTests.java
index b1db3ed110..7e5890f7dd 100644
--- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XPathRouterParserTests.java
+++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XPathRouterParserTests.java
@@ -18,10 +18,9 @@ package org.springframework.integration.xml.config;
import static org.junit.Assert.assertEquals;
-import org.w3c.dom.Document;
import org.junit.After;
import org.junit.Test;
-
+import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
@@ -32,6 +31,7 @@ import org.springframework.integration.endpoint.EventDrivenConsumer;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.xml.util.XmlTestUtil;
import org.springframework.test.context.ContextConfiguration;
+import org.w3c.dom.Document;
/**
* @author Jonas Partner
@@ -114,5 +114,50 @@ public class XPathRouterParserTests {
inputChannel.send(docMessage);
assertEquals("Wrong number of messages", 1, outputChannel.getMesssageCount());
}
-
+
+ @Test
+ public void testSetChannelResolver() throws Exception {
+ Document doc = XmlTestUtil.getDocumentForString("outputOne");
+ GenericMessage docMessage = new GenericMessage(doc);
+ StringBuffer contextBuffer = new StringBuffer("");
+ contextBuffer.append("");
+ EventDrivenConsumer consumer = buildContext(contextBuffer.toString());
+
+ DirectFieldAccessor accessor = new DirectFieldAccessor(consumer);
+ Object handler = accessor.getPropertyValue("handler");
+ accessor = new DirectFieldAccessor(handler);
+ Object resolver = accessor.getPropertyValue("channelResolver");
+ assertEquals("Wrong channel resolver ",StubChannelResolver.class, resolver.getClass());
+
+ }
+
+ @Test
+ public void testSetResolutionRequiredFalse() throws Exception {
+ Document doc = XmlTestUtil.getDocumentForString("outputOne");
+ GenericMessage docMessage = new GenericMessage(doc);
+ StringBuffer contextBuffer = new StringBuffer("");
+ EventDrivenConsumer consumer = buildContext(contextBuffer.toString());
+
+ DirectFieldAccessor accessor = new DirectFieldAccessor(consumer);
+ Object handler = accessor.getPropertyValue("handler");
+ accessor = new DirectFieldAccessor(handler);
+ Object resolutionRequired = accessor.getPropertyValue("resolutionRequired");
+ assertEquals("Resolution required not set to false ", false, resolutionRequired);
+
+ }
+
+ @Test
+ public void testSetResolutionRequiredTrue() throws Exception {
+ Document doc = XmlTestUtil.getDocumentForString("outputOne");
+ GenericMessage docMessage = new GenericMessage(doc);
+ StringBuffer contextBuffer = new StringBuffer("");
+ EventDrivenConsumer consumer = buildContext(contextBuffer.toString());
+
+ DirectFieldAccessor accessor = new DirectFieldAccessor(consumer);
+ Object handler = accessor.getPropertyValue("handler");
+ accessor = new DirectFieldAccessor(handler);
+ Object resolutionRequired = accessor.getPropertyValue("resolutionRequired");
+ assertEquals("Resolution required not set to true ", true, resolutionRequired);
+ }
+
}
diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/router/XPathSingleChannelRouterTests.java b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/router/XPathSingleChannelRouterTests.java
index 7547b009c9..b9b3f331ce 100644
--- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/router/XPathSingleChannelRouterTests.java
+++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/router/XPathSingleChannelRouterTests.java
@@ -19,15 +19,14 @@ package org.springframework.integration.xml.router;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
import org.springframework.integration.core.MessagingException;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.StringMessage;
import org.springframework.integration.xml.util.XmlTestUtil;
import org.springframework.xml.xpath.XPathExpression;
import org.springframework.xml.xpath.XPathExpressionFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
/**
* @author Jonas Partner
@@ -62,16 +61,18 @@ public class XPathSingleChannelRouterTests {
public void testNodePayload() throws Exception {
XPathSingleChannelRouter router = new XPathSingleChannelRouter("./three/text()");
Document testDocument = XmlTestUtil.getDocumentForString("bob");
- String[] channelNames = router.determineTargetChannelNames(new GenericMessage(
- testDocument.getElementsByTagName("two").item(0)));
+ String[] channelNames = router.determineTargetChannelNames(new GenericMessage(testDocument
+ .getElementsByTagName("two").item(0)));
assertEquals("bob", channelNames[0]);
}
- @Test(expected=MessagingException.class)
+ @Test
public void testEvaluationReturnsEmptyString() throws Exception {
- XPathSingleChannelRouter router = new XPathSingleChannelRouter("/yellow");
- Document testDocument = XmlTestUtil.getDocumentForString("bob");
- router.determineTargetChannelNames(new GenericMessage(testDocument));
+ Document doc = XmlTestUtil.getDocumentForString("");
+ XPathExpression expression = XPathExpressionFactory.createXPathExpression("/somethingelse/@type");
+ XPathSingleChannelRouter router = new XPathSingleChannelRouter(expression);
+ Object channelNames = router.determineTargetChannelNames(new GenericMessage(doc));
+ assertEquals("Wrong channel name", null, channelNames);
}
}