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); } }