Standardised support for result-factory ad result-type across XmlMarshallingTransfromer and XsltPayloadTransformer
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<? extends AbstractPayloadTransformer<?, ?>> 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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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<? extends AbstractPayloadTransformer<?, ?>> 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xsd:schema
|
||||
xmlns="http://www.springframework.org/schema/integration-xml"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:beans="http://www.springframework.org/schema/beans"
|
||||
<xsd:schema xmlns="http://www.springframework.org/schema/integration-xml"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans"
|
||||
xmlns:tool="http://www.springframework.org/schema/tool"
|
||||
targetNamespace="http://www.springframework.org/schema/integration-xml"
|
||||
elementFormDefault="qualified" attributeFormDefault="unqualified">
|
||||
|
||||
|
||||
|
||||
<xsd:import namespace="http://www.springframework.org/schema/beans" />
|
||||
<xsd:import namespace="http://www.springframework.org/schema/tool" />
|
||||
|
||||
<xsd:annotation>
|
||||
<xsd:documentation><![CDATA[
|
||||
Defines the configuration elements for Spring Integration's XML support.
|
||||
]]></xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
||||
<xsd:element name="marshalling-transformer">
|
||||
<xsd:complexType>
|
||||
<xsd:annotation>
|
||||
@@ -26,8 +19,7 @@
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:attribute name="id" type="xsd:string" use="required" />
|
||||
<xsd:attribute name="marshaller" type="xsd:string"
|
||||
use="required" />
|
||||
<xsd:attribute name="marshaller" type="xsd:string" use="required" />
|
||||
<xsd:attribute name="result-type" use="optional">
|
||||
<xsd:simpleType>
|
||||
<xsd:restriction base="xsd:string">
|
||||
@@ -37,10 +29,10 @@
|
||||
</xsd:simpleType>
|
||||
</xsd:attribute>
|
||||
<xsd:attribute name="result-factory" use="optional" />
|
||||
<xsd:attribute name="result-transformer" type="xsd:string" use="optional" />
|
||||
<xsd:attribute name="result-transformer" type="xsd:string"
|
||||
use="optional" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:element name="unmarshalling-transformer">
|
||||
<xsd:complexType>
|
||||
<xsd:annotation>
|
||||
@@ -53,8 +45,6 @@
|
||||
use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
|
||||
|
||||
<xsd:element name="xslt-transformer">
|
||||
<xsd:complexType>
|
||||
<xsd:annotation>
|
||||
@@ -71,11 +61,18 @@
|
||||
use="optional" />
|
||||
<xsd:attribute name="result-factory" type="xsd:string"
|
||||
use="optional" />
|
||||
<xsd:attribute name="result-transformer" type="xsd:string" use="optional" />
|
||||
<xsd:attribute name="result-type" use="optional">
|
||||
<xsd:simpleType>
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="DOMResult" />
|
||||
<xsd:enumeration value="StringResult" />
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:attribute>
|
||||
<xsd:attribute name="result-transformer" type="xsd:string"
|
||||
use="optional" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
|
||||
|
||||
<xsd:element name="xpath-router">
|
||||
<xsd:complexType>
|
||||
<xsd:annotation>
|
||||
@@ -92,5 +89,4 @@
|
||||
default="false" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
|
||||
</xsd:schema>
|
||||
@@ -14,6 +14,12 @@
|
||||
|
||||
<si-xml:xslt-transformer id="xsltTransformerWithTemplatesAndResultTransformer"
|
||||
xsl-templates="templates" result-transformer="resultTransformer" />
|
||||
|
||||
<si-xml:xslt-transformer id="xsltTransformerWithTemplatesAndResultFactory"
|
||||
xsl-templates="templates" result-factory="stubResultFactory" />
|
||||
|
||||
<si-xml:xslt-transformer id="xsltTransformerWithTemplatesAndStringResulType"
|
||||
xsl-templates="templates" result-type="StringResult" />
|
||||
|
||||
|
||||
<bean id="templates"
|
||||
@@ -25,5 +31,6 @@
|
||||
<constructor-arg value="testReturn" />
|
||||
</bean>
|
||||
|
||||
<bean id="stubResultFactory" class="org.springframework.integration.xml.config.StubResultFactory"/>
|
||||
|
||||
</beans>
|
||||
|
||||
@@ -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<Object> message = new GenericMessage<Object>(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<Object> message = new GenericMessage<Object>(XmlTestUtil.getDomSourceForString(doc));
|
||||
Message<?> result = transformer.transform(message);
|
||||
assertTrue("Payload was not a StringResult", result.getPayload() instanceof StringResult);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user