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 96a78170c2..1a2bbcaa6c 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 @@ -16,22 +16,21 @@ package org.springframework.integration.xml.config; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; - import org.springframework.beans.factory.config.BeanDefinition; 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.config.xml.AbstractConsumerEndpointParser; import org.springframework.integration.xml.router.XPathMultiChannelRouter; import org.springframework.integration.xml.router.XPathSingleChannelRouter; import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; /** * @author Jonas Partner */ -public class XPathRouterParser extends AbstractSingleBeanDefinitionParser { +public class XPathRouterParser extends AbstractConsumerEndpointParser { private XPathExpressionParser xpathParser = new XPathExpressionParser(); @@ -46,7 +45,9 @@ public class XPathRouterParser extends AbstractSingleBeanDefinitionParser { } @Override - protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + protected BeanDefinitionBuilder parseConsumer(Element element, ParserContext parserContext) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(); + boolean multiChannel = Boolean.parseBoolean(element.getAttribute("multi-channel")); String xPathExpressionRef = element.getAttribute("xpath-expression-ref"); NodeList xPathExpressionNodes = element.getElementsByTagNameNS( @@ -71,6 +72,7 @@ public class XPathRouterParser extends AbstractSingleBeanDefinitionParser { else { builder.addConstructorArgReference(xPathExpressionRef); } + 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 c804a9c91d..42f8b66641 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 @@ -94,6 +94,7 @@ + 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 7368b295bc..c8bffb1b66 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,13 +18,19 @@ package org.springframework.integration.xml.config; import static org.junit.Assert.assertEquals; +import org.junit.After; import org.junit.Test; -import org.w3c.dom.Document; - +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.integration.channel.MessageChannel; +import org.springframework.integration.channel.QueueChannel; +import org.springframework.integration.endpoint.SubscribingConsumerEndpoint; import org.springframework.integration.message.GenericMessage; -import org.springframework.integration.xml.router.XPathSingleChannelRouter; import org.springframework.integration.xml.util.XmlTestUtil; import org.springframework.test.context.ContextConfiguration; +import org.w3c.dom.Document; /** * @author Jonas Partner @@ -32,28 +38,50 @@ import org.springframework.test.context.ContextConfiguration; @ContextConfiguration public class XPathRouterParserTests { + String channelConfig = " "; + + @Autowired @Qualifier("test-input") + MessageChannel inputChannel; + + @Autowired @Qualifier("outputOne") + QueueChannel outputChannel; + + ConfigurableApplicationContext appContext; + + public SubscribingConsumerEndpoint buildContext(String routerDef){ + appContext = TestXmlApplicationContextHelper.getTestAppContext( channelConfig + routerDef); + appContext.getAutowireCapableBeanFactory().autowireBeanProperties(this, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false); + SubscribingConsumerEndpoint sce = (SubscribingConsumerEndpoint)appContext.getBean("router"); + sce.start(); + return sce; + } + + + @After + public void tearDown(){ + if(appContext != null){ + appContext.close(); + } + } + @Test public void testSimpleStringExpression() throws Exception { Document doc = XmlTestUtil.getDocumentForString("outputOne"); GenericMessage docMessage = new GenericMessage(doc); - TestXmlApplicationContext ctx = TestXmlApplicationContextHelper.getTestAppContext( - ""); - XPathSingleChannelRouter router = (XPathSingleChannelRouter) ctx.getBean("router"); - String[] channelNames = router.determineTargetChannelNames(docMessage); - assertEquals("Wrong number of channel names returned", 1, channelNames.length); - assertEquals("Wrong channel name", "outputOne", channelNames[0]); + SubscribingConsumerEndpoint sce = buildContext(""); + inputChannel.send(docMessage); + assertEquals("Wrong number of messages", 1, outputChannel.getMesssageCount()); + } @Test public void testNamespacedStringExpression() throws Exception { Document doc = XmlTestUtil.getDocumentForString("outputOne"); GenericMessage docMessage = new GenericMessage(doc); - TestXmlApplicationContext ctx = TestXmlApplicationContextHelper.getTestAppContext( - ""); - XPathSingleChannelRouter router = (XPathSingleChannelRouter) ctx.getBean("router"); - String[] channelNames = router.determineTargetChannelNames(docMessage); - assertEquals("Wrong number of channel names returned", 1, channelNames.length); - assertEquals("Wrong channel name", "outputOne", channelNames[0]); + SubscribingConsumerEndpoint sce = buildContext(""); + inputChannel.send(docMessage); + assertEquals("Wrong number of messages", 1, outputChannel.getMesssageCount()); + } @Test @@ -62,14 +90,13 @@ public class XPathRouterParserTests { "outputOne"); GenericMessage docMessage = new GenericMessage(doc); StringBuffer buffer = new StringBuffer( - " "); + " "); buffer.append(" "); buffer.append(""); - TestXmlApplicationContext ctx = TestXmlApplicationContextHelper.getTestAppContext(buffer.toString()); - XPathSingleChannelRouter router = (XPathSingleChannelRouter) ctx.getBean("router"); - String[] channelNames = router.determineTargetChannelNames(docMessage); - assertEquals("Wrong number of channel names returned", 1, channelNames.length); - assertEquals("Wrong channel name", "outputOne", channelNames[0]); + SubscribingConsumerEndpoint sce = buildContext(buffer.toString()); + inputChannel.send(docMessage); + assertEquals("Wrong number of messages", 1, outputChannel.getMesssageCount()); + } @Test @@ -78,14 +105,13 @@ public class XPathRouterParserTests { "outputOne"); GenericMessage docMessage = new GenericMessage(doc); StringBuffer buffer = new StringBuffer( - ""); + ""); buffer.append(""); buffer.append(""); - TestXmlApplicationContext ctx = TestXmlApplicationContextHelper.getTestAppContext(buffer.toString()); - XPathSingleChannelRouter router = (XPathSingleChannelRouter) ctx.getBean("router"); - String[] channelNames = router.determineTargetChannelNames(docMessage); - assertEquals("Wrong number of channel names returned", 1, channelNames.length); - assertEquals("Wrong channel name", "outputOne", channelNames[0]); + + SubscribingConsumerEndpoint sce = buildContext(buffer.toString()); + inputChannel.send(docMessage); + assertEquals("Wrong number of messages", 1, outputChannel.getMesssageCount()); } }