diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/ResultFactoryResultTypeHelper.java b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/ResultFactoryResultTypeHelper.java new file mode 100644 index 0000000000..ba0295f3c3 --- /dev/null +++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/ResultFactoryResultTypeHelper.java @@ -0,0 +1,66 @@ +/* + * 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 javax.xml.parsers.ParserConfigurationException; + +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.integration.xml.result.DomResultFactory; +import org.springframework.integration.xml.result.ResultFactory; +import org.springframework.integration.xml.result.StringResultFactory; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * helper class which encapsulates common logic for validating and building a + * bean definition for a {@link ResultFactory} based on either the + * result-factory or result-type + * + * @author Jonas Partner + * + */ +public class ResultFactoryResultTypeHelper { + + public static final String DOM_RESULT = "DOMResult"; + + public static final String STRING_RESULT = "StringResult"; + + protected void assertResultFactoryAndTypeValid(String resultFactory, String resultType) { + boolean bothHaveText = StringUtils.hasText(resultFactory) && StringUtils.hasText(resultType); + Assert.state(!bothHaveText, "Exactly one of result-factory or result-type should be specified"); + if (StringUtils.hasText(resultType)) { + Assert.state(resultType.equals(DOM_RESULT) || resultType.equals(STRING_RESULT), + "Result type must be either DOMResult or StringResult"); + } + } + + protected void addResultFactory(BeanDefinitionBuilder builder, String resultType, String resultFactory) { + if (StringUtils.hasText(resultFactory)) { + builder.addPropertyReference("resultFactory", resultFactory); + } + else if (resultType.equals(DOM_RESULT) || !StringUtils.hasText(resultType)) { + try { + builder.addPropertyValue("resultFactory", new DomResultFactory()); + } + catch (ParserConfigurationException e) { + throw new org.springframework.integration.ConfigurationException("Exception creating DomResultFactory"); + } + } + else if (resultType.equals(STRING_RESULT)) { + builder.addPropertyValue("resultFactory", new StringResultFactory()); + } + } +} diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParser.java b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParser.java index 19e19f64f4..9cce696bb6 100644 --- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParser.java +++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XmlMarshallingTransformerParser.java @@ -16,19 +16,14 @@ package org.springframework.integration.xml.config; -import javax.xml.parsers.ParserConfigurationException; - -import org.w3c.dom.Element; - import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.transformer.AbstractPayloadTransformer; import org.springframework.integration.transformer.config.AbstractPayloadTransformerParser; -import org.springframework.integration.xml.result.DomResultFactory; -import org.springframework.integration.xml.result.StringResultFactory; import org.springframework.integration.xml.transformer.XmlPayloadMarshallingTransformer; import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import org.w3c.dom.Element; /** * @author Jonas Partner @@ -36,59 +31,27 @@ import org.springframework.util.StringUtils; */ public class XmlMarshallingTransformerParser extends AbstractPayloadTransformerParser { - public static final String DOM_RESULT = "DOMResult"; - - public static final String STRING_RESULT = "StringResult"; - + private ResultFactoryResultTypeHelper resultFactoryHelper = new ResultFactoryResultTypeHelper(); + @Override protected Class> getTransformerClass() { return XmlPayloadMarshallingTransformer.class; } @Override - protected void parsePayloadTransformer(Element element, - ParserContext parserContext, BeanDefinitionBuilder builder) { + protected void parsePayloadTransformer(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { String resultFactory = element.getAttribute("result-factory"); String resultType = element.getAttribute("result-type"); String marshaller = element.getAttribute("marshaller"); String resultTransformer = element.getAttribute("result-transformer"); Assert.hasText(marshaller, "the 'marshaller' attribute is required"); - - assertResultFactoryAndTypeValid(resultFactory, resultType); - + builder.addConstructorArgReference(marshaller); - - if(StringUtils.hasText(resultTransformer)){ + if (StringUtils.hasText(resultTransformer)) { builder.addConstructorArgReference(resultTransformer); } - - if(StringUtils.hasText(resultFactory)){ - builder.addPropertyReference("resultFactory", resultFactory); - } else if (resultType.equals(DOM_RESULT) || !StringUtils.hasText(resultType)) { - try { - builder.addPropertyValue("resultFactory", new DomResultFactory()); - } - catch (ParserConfigurationException e) { - throw new org.springframework.integration.ConfigurationException( - "Exception creating DomResultFactory"); - } - } - else if (resultType.equals(STRING_RESULT)) { - builder.addPropertyValue("resultFactory", new StringResultFactory()); - } + resultFactoryHelper.assertResultFactoryAndTypeValid(resultFactory, resultType); + resultFactoryHelper.addResultFactory(builder, resultType, resultFactory); } - - protected void assertResultFactoryAndTypeValid(String resultFactory, String resultType){ - boolean bothHaveText = StringUtils.hasText(resultFactory) && StringUtils.hasText(resultType); - if(bothHaveText){ - System.out.println("bob"); - } - Assert.state(!bothHaveText , "Exactly one of result-factory or result-type should be specified"); - if(StringUtils.hasText(resultType)){ - Assert.state(resultType.equals(DOM_RESULT) || resultType.equals(STRING_RESULT), "Result type must be either DOMResult or StringResult"); - } - } - - } diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XsltPayloadTransformerParser.java b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XsltPayloadTransformerParser.java index 02b5760084..22a2aaecc9 100644 --- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XsltPayloadTransformerParser.java +++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/config/XsltPayloadTransformerParser.java @@ -16,8 +16,6 @@ package org.springframework.integration.xml.config; -import org.w3c.dom.Element; - import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.transformer.AbstractPayloadTransformer; @@ -25,6 +23,7 @@ import org.springframework.integration.transformer.config.AbstractPayloadTransfo import org.springframework.integration.xml.transformer.XsltPayloadTransformer; import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import org.w3c.dom.Element; /** * @author Jonas Partner @@ -32,9 +31,11 @@ import org.springframework.util.StringUtils; */ public class XsltPayloadTransformerParser extends AbstractPayloadTransformerParser { + private ResultFactoryResultTypeHelper resultFactoryHelper = new ResultFactoryResultTypeHelper(); + @Override protected Class> getTransformerClass() { - return XsltPayloadTransformer.class; + return XsltPayloadTransformer.class; } @Override @@ -42,11 +43,12 @@ public class XsltPayloadTransformerParser extends AbstractPayloadTransformerPars String xslResource = element.getAttribute("xsl-resource"); String xslTemplates = element.getAttribute("xsl-templates"); String resultTransformer = element.getAttribute("result-transformer"); - + String resultFactory = element.getAttribute("result-factory"); + String resultType = element.getAttribute("result-type"); + boolean bothHaveText = StringUtils.hasText(xslResource) && StringUtils.hasText(xslTemplates); boolean oneHasText = StringUtils.hasText(xslResource) || StringUtils.hasText(xslTemplates); - Assert.state(!bothHaveText && oneHasText, - "Exactly one of 'xsl-resource' or 'xsl-templates' is required."); + Assert.state(!bothHaveText && oneHasText, "Exactly one of 'xsl-resource' or 'xsl-templates' is required."); if (StringUtils.hasText(xslResource)) { builder.addConstructorArgValue(xslResource); } @@ -57,11 +59,10 @@ public class XsltPayloadTransformerParser extends AbstractPayloadTransformerPars if (StringUtils.hasText(sourceFactory)) { builder.addPropertyReference("sourceFactory", sourceFactory); } - String resultFactory = element.getAttribute("result-factory"); - if (StringUtils.hasText(resultFactory)) { - builder.addPropertyReference("resultFactory", resultFactory); - } - if(StringUtils.hasText(resultTransformer)){ + resultFactoryHelper.assertResultFactoryAndTypeValid(resultFactory, resultType); + resultFactoryHelper.addResultFactory(builder, resultType, resultFactory); + + if (StringUtils.hasText(resultTransformer)) { builder.addConstructorArgReference(resultTransformer); } } 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 67403bd51c..f20f411d68 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 @@ -1,23 +1,16 @@ - - - - - - @@ -26,8 +19,7 @@ - + @@ -37,10 +29,10 @@ - + - @@ -53,8 +45,6 @@ use="required" /> - - @@ -71,11 +61,18 @@ use="optional" /> - + + + + + + + + + - - @@ -92,5 +89,4 @@ default="false" /> - \ No newline at end of file diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml index 361492d143..dfa34bf3f3 100644 --- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml +++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml @@ -14,6 +14,12 @@ + + + + + diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java index d80912b61e..7d6d907655 100644 --- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java +++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java @@ -31,7 +31,9 @@ import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.integration.message.GenericMessage; import org.springframework.integration.message.Message; import org.springframework.integration.transformer.Transformer; +import org.springframework.integration.xml.config.StubResultFactory.StubStringResult; import org.springframework.integration.xml.util.XmlTestUtil; +import org.springframework.xml.transform.StringResult; /** * @author Jonas Partner @@ -81,5 +83,28 @@ public class XsltPayloadTransformerParserTests { String strResult = (String)result.getPayload(); assertEquals("Wrong payload", "testReturn", strResult); } + + @Test + public void testWithResourceProvidedndStubResultFactory() throws Exception { + Transformer transformer = (Transformer) applicationContext + .getBean("xsltTransformerWithTemplatesAndResultFactory"); + GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); + Message result = transformer.transform(message); + assertTrue("Payload was not a StubStringResult", result.getPayload() instanceof StubStringResult); + } + + @Test + public void testWithResourceAndStringResultType() throws Exception { + Transformer transformer = (Transformer) applicationContext + .getBean("xsltTransformerWithTemplatesAndStringResulType"); + GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); + Message result = transformer.transform(message); + assertTrue("Payload was not a StringResult", result.getPayload() instanceof StringResult); + } + + + + + }