diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XPathMessageSplitterParser.java b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XPathMessageSplitterParser.java index a6abdeb488..7e798632be 100644 --- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XPathMessageSplitterParser.java +++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XPathMessageSplitterParser.java @@ -49,10 +49,14 @@ public class XPathMessageSplitterParser extends AbstractConsumerEndpointParser { protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) { BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(XPathMessageSplitter.class); String xPathExpressionRef = element.getAttribute("xpath-expression-ref"); + String documentBuilderFactoryRef = element.getAttribute("doc-builder-factory"); + String createDocuments = element.getAttribute("create-documents"); + NodeList xPathExpressionNodes = element.getElementsByTagNameNS(element.getNamespaceURI(), "xpath-expression"); Assert.isTrue(xPathExpressionNodes.getLength() <= 1, "only one xpath-expression child can be specified"); boolean hasChild = xPathExpressionNodes.getLength() == 1; boolean hasReference = StringUtils.hasText(xPathExpressionRef); + Assert.isTrue(hasChild ^ hasReference, "Exactly one of 'xpath-expression' or 'xpath-expression-ref' is required."); if (hasChild) { BeanDefinition beanDefinition = this.xpathParser.parse((Element) xPathExpressionNodes.item(0), parserContext); @@ -61,6 +65,14 @@ public class XPathMessageSplitterParser extends AbstractConsumerEndpointParser { else { builder.addConstructorArgReference(xPathExpressionRef); } + + if(StringUtils.hasText(documentBuilderFactoryRef)){ + builder.addPropertyReference("documentBuilder", documentBuilderFactoryRef); + } + if(StringUtils.hasText("create-documents")){ + builder.addPropertyValue("createDocuments", Boolean.valueOf(createDocuments)); + } + return builder; } diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/StubDocumentBuilderFactory.java b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/StubDocumentBuilderFactory.java new file mode 100644 index 0000000000..6e2ba5f6ff --- /dev/null +++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/StubDocumentBuilderFactory.java @@ -0,0 +1,54 @@ +/* + * 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.xml.config; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +public class StubDocumentBuilderFactory extends DocumentBuilderFactory{ + + @Override + public Object getAttribute(String name) throws IllegalArgumentException { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean getFeature(String name) throws ParserConfigurationException { + // TODO Auto-generated method stub + return false; + } + + @Override + public DocumentBuilder newDocumentBuilder() throws ParserConfigurationException { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setAttribute(String name, Object value) throws IllegalArgumentException { + // TODO Auto-generated method stub + + } + + @Override + public void setFeature(String name, boolean value) throws ParserConfigurationException { + // TODO Auto-generated method stub + + } + +} diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XPathMessageSplitterParserTests.java b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XPathMessageSplitterParserTests.java index fd722a3a7b..4a83075e53 100644 --- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XPathMessageSplitterParserTests.java +++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XPathMessageSplitterParserTests.java @@ -17,19 +17,23 @@ package org.springframework.integration.xml.config; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import javax.xml.parsers.DocumentBuilderFactory; import org.junit.Test; -import org.w3c.dom.Document; - +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; import org.springframework.integration.channel.QueueChannel; +import org.springframework.integration.core.Message; import org.springframework.integration.core.MessageChannel; 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 @@ -39,23 +43,77 @@ public class XPathMessageSplitterParserTests { String channelDefinitions = ""; - @Autowired @Qualifier("test-input") + @Autowired + @Qualifier("test-input") MessageChannel inputChannel; - @Autowired @Qualifier("test-output") + @Autowired + @Qualifier("test-output") QueueChannel outputChannel; @Test public void testSimpleStringExpression() throws Exception { Document doc = XmlTestUtil.getDocumentForString("BobJohn"); GenericMessage docMessage = new GenericMessage(doc); - TestXmlApplicationContext ctx = TestXmlApplicationContextHelper.getTestAppContext( - channelDefinitions + ""); - EventDrivenConsumer consumer = (EventDrivenConsumer)ctx.getBean("splitter"); + TestXmlApplicationContext ctx = TestXmlApplicationContextHelper + .getTestAppContext(channelDefinitions + + ""); + EventDrivenConsumer consumer = (EventDrivenConsumer) ctx.getBean("splitter"); consumer.start(); - ctx.getAutowireCapableBeanFactory().autowireBeanProperties(this, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false); + ctx.getAutowireCapableBeanFactory().autowireBeanProperties(this, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, + false); inputChannel.send(docMessage); assertEquals("Wrong number of split messages ", 2, outputChannel.getMesssageCount()); } + @Test + public void testSimpleStringExpressionWithCreateDocuments() throws Exception { + Document doc = XmlTestUtil.getDocumentForString("BobJohn"); + GenericMessage docMessage = new GenericMessage(doc); + TestXmlApplicationContext ctx = TestXmlApplicationContextHelper + .getTestAppContext(channelDefinitions + + ""); + EventDrivenConsumer consumer = (EventDrivenConsumer) ctx.getBean("splitter"); + consumer.start(); + ctx.getAutowireCapableBeanFactory().autowireBeanProperties(this, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, + false); + inputChannel.send(docMessage); + assertEquals("Wrong number of split messages ", 2, outputChannel.getMesssageCount()); + assertTrue("Splitter failed to create documents ", + ((Message) outputChannel.receive(1000)).getPayload() instanceof Document); + assertTrue("Splitter failed to create documents ", + ((Message) outputChannel.receive(1000)).getPayload() instanceof Document); + } + + @Test + public void testProvideDocumentBuilder() throws Exception { + Document doc = XmlTestUtil.getDocumentForString("BobJohn"); + TestXmlApplicationContext ctx = TestXmlApplicationContextHelper + .getTestAppContext("" + + channelDefinitions + + ""); + EventDrivenConsumer consumer = (EventDrivenConsumer) ctx.getBean("splitter"); + DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(consumer); + Object handler = fieldAccessor.getPropertyValue("handler"); + fieldAccessor = new DirectFieldAccessor(handler); + Object documnetBuilderFactory = fieldAccessor.getPropertyValue("documentBuilderFactory"); + assertTrue("DocumnetBuilderFactory was not expected stub ", documnetBuilderFactory instanceof DocumentBuilderFactory); + } + + @Test + public void testXPathExpressionRef() throws Exception { + Document doc = XmlTestUtil.getDocumentForString("BobJohn"); + TestXmlApplicationContext ctx = TestXmlApplicationContextHelper + .getTestAppContext( + channelDefinitions + + "" + + ""); + EventDrivenConsumer consumer = (EventDrivenConsumer) ctx.getBean("splitter"); + DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(consumer); + Object handler = fieldAccessor.getPropertyValue("handler"); + fieldAccessor = new DirectFieldAccessor(handler); + Object documnetBuilderFactory = fieldAccessor.getPropertyValue("documentBuilderFactory"); + assertTrue("DocumnetBuilderFactory was not expected stub ", documnetBuilderFactory instanceof DocumentBuilderFactory); + } + }