From 653c61e8d1b4cc7e96865ddda4ec295f0ef70978 Mon Sep 17 00:00:00 2001 From: Jonas Partner Date: Tue, 8 Mar 2011 17:29:26 +0000 Subject: [PATCH] INT-1812 namespace parser for xsl transformer now sets always use source and result factories if result factory or type is specified --- .../config/XsltPayloadTransformerParser.java | 8 +- .../transformer/XsltPayloadTransformer.java | 355 ++++++++++-------- ...tPayloadTransformerParserTests-context.xml | 105 ++++-- .../XsltPayloadTransformerParserTests.java | 153 +++++--- .../transformer/CustomTestResultFactory.java | 43 +++ .../XsltPayloadTransformerTests.java | 208 +++++----- .../XsltTransformerTests-context.xml | 87 +++-- .../xml/transformer/XsltTransformerTests.java | 10 + 8 files changed, 580 insertions(+), 389 deletions(-) create mode 100644 spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/CustomTestResultFactory.java diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XsltPayloadTransformerParser.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XsltPayloadTransformerParser.java index 2661711074..59c24cfad5 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XsltPayloadTransformerParser.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XsltPayloadTransformerParser.java @@ -61,6 +61,10 @@ public class XsltPayloadTransformerParser extends AbstractTransformerParser { builder.addConstructorArgReference(xslTemplates); } XmlNamespaceUtils.configureResultFactory(builder, resultType, resultFactory); + boolean resultFactorySpecified = StringUtils.hasText(resultFactory) || StringUtils.hasText(resultType); + if(resultFactorySpecified){ + builder.addPropertyValue("alwaysUseResultFactory", true); + } if (StringUtils.hasText(resultTransformer)) { builder.addConstructorArgReference(resultTransformer); } @@ -88,7 +92,9 @@ public class XsltPayloadTransformerParser extends AbstractTransformerParser { } builder.addPropertyValue("xslParameterMappings", xslParameterMappings); } - IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "source-factory"); + + IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "source-factory"); + } } diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XsltPayloadTransformer.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XsltPayloadTransformer.java index e6adbf96cc..36879324b2 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XsltPayloadTransformer.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XsltPayloadTransformer.java @@ -70,188 +70,225 @@ import org.w3c.dom.Document; * payload and the {@link Result} to pass into the transformer. An instance of * {@link ResultTransformer} can also be provided to convert the Result prior to * returning. - * + * * @author Jonas Partner * @author Mark Fisher * @author Oleg Zhurakousky */ public class XsltPayloadTransformer extends AbstractTransformer { - private final Log logger = LogFactory.getLog(this.getClass()); + private final Log logger = LogFactory.getLog(this.getClass()); - private final Templates templates; + private final Templates templates; - private final StandardEvaluationContext evaluationContext = new StandardEvaluationContext(); + private final StandardEvaluationContext evaluationContext = new StandardEvaluationContext(); - private Map xslParameterMappings; + private Map xslParameterMappings; - private final ResultTransformer resultTransformer; + private final ResultTransformer resultTransformer; - private volatile SourceFactory sourceFactory = new DomSourceFactory(); + private volatile SourceFactory sourceFactory = new DomSourceFactory(); - private volatile ResultFactory resultFactory = new DomResultFactory(); + private volatile ResultFactory resultFactory = new DomResultFactory(); - private volatile boolean alwaysUseSourceResultFactories = false; + private volatile boolean alwaysUseSourceFactory = false; - private volatile String[] xsltParamHeaders; + private volatile boolean alwaysUseResultFactory = false; + + private volatile String[] xsltParamHeaders; - public XsltPayloadTransformer(Templates templates) throws ParserConfigurationException { - this(templates, null); - } + public XsltPayloadTransformer(Templates templates) throws ParserConfigurationException { + this(templates, null); + } - public XsltPayloadTransformer(Resource xslResource) throws Exception { - this(TransformerFactory.newInstance().newTemplates(createStreamSourceOnResource(xslResource)), null); - } + public XsltPayloadTransformer(Resource xslResource) throws Exception { + this(TransformerFactory.newInstance().newTemplates(createStreamSourceOnResource(xslResource)), null); + } - public XsltPayloadTransformer(Resource xslResource, ResultTransformer resultTransformer) throws Exception { - this(TransformerFactory.newInstance().newTemplates(createStreamSourceOnResource(xslResource)), resultTransformer); - } + public XsltPayloadTransformer(Resource xslResource, ResultTransformer resultTransformer) throws Exception { + this(TransformerFactory.newInstance().newTemplates(createStreamSourceOnResource(xslResource)), resultTransformer); + } - public XsltPayloadTransformer(Templates templates, ResultTransformer resultTransformer) throws ParserConfigurationException { - this.templates = templates; - this.resultTransformer = resultTransformer; - this.evaluationContext.addPropertyAccessor(new MapAccessor()); - } + public XsltPayloadTransformer(Templates templates, ResultTransformer resultTransformer) throws ParserConfigurationException { + this.templates = templates; + this.resultTransformer = resultTransformer; + this.evaluationContext.addPropertyAccessor(new MapAccessor()); + } - /** - * Sets the SourceFactory. - */ - public void setSourceFactory(SourceFactory sourceFactory) { - Assert.notNull(sourceFactory, "SourceFactory must not be null"); - this.sourceFactory = sourceFactory; - } + /** + * Sets the SourceFactory. + */ + public void setSourceFactory(SourceFactory sourceFactory) { + Assert.notNull(sourceFactory, "SourceFactory must not be null"); + this.sourceFactory = sourceFactory; + } - /** - * Sets the ResultFactory - */ - public void setResultFactory(ResultFactory resultFactory) { - Assert.notNull(sourceFactory, "ResultFactory must not be null"); - this.resultFactory = resultFactory; - } - - /** - * Specifies whether {@link ResultFactory} and {@link SourceFactory} should always - * be used, even for directly supported payloads such as {@link String} and {@link Document}. - */ - public void setAlwaysUseSourceResultFactories(boolean alwaysUseSourceResultFactories) { - this.alwaysUseSourceResultFactories = alwaysUseSourceResultFactories; - } - - public void setXslParameterMappings(Map xslParameterMappings) { - this.xslParameterMappings = xslParameterMappings; - } - - public void setXsltParamHeaders(String[] xsltParamHeaders) { - this.xsltParamHeaders = xsltParamHeaders; - } - - public String getComponentType() { - return "xml:xslt-transformer"; - } - - @Override - protected Object doTransform(Message message) throws Exception { - Transformer transformer = buildTransformer(message); - Object payload = message.getPayload(); - Object transformedPayload = null; - if (this.alwaysUseSourceResultFactories) { - transformedPayload = transformUsingFactories(payload, transformer); - } - else if (payload instanceof String) { - transformedPayload = transformString((String) payload, transformer); - } - else if (payload instanceof Document) { - transformedPayload = transformDocument((Document) payload, transformer); - } - else if (payload instanceof Source) { - transformedPayload = transformSource((Source) payload, payload, transformer); - } - else { - // fall back to trying factories - transformedPayload = transformUsingFactories(payload, transformer); - } - return transformedPayload; - } - - private Object transformUsingFactories(Object payload, Transformer transformer) throws TransformerException { - Source source = this.sourceFactory.createSource(payload); - return transformSource(source, payload, transformer); - } - - private Object transformSource(Source source, Object payload, Transformer transformer) throws TransformerException { - Result result = this.resultFactory.createResult(payload); - transformer.transform(source, result); - if (this.resultTransformer != null) { - return this.resultTransformer.transformResult(result); - } - return result; - } - - private String transformString(String stringPayload, Transformer transformer) throws TransformerException { - StringResult result = new StringResult(); - transformer.transform(new StringSource(stringPayload), result); - return result.toString(); - } - - private Document transformDocument(Document documentPayload, Transformer transformer) throws TransformerException { - DOMSource source = new DOMSource(documentPayload); - Result result = this.resultFactory.createResult(documentPayload); - if (!DOMResult.class.isAssignableFrom(result.getClass())) { - throw new MessagingException( - "Document to Document conversion requires a DOMResult-producing ResultFactory implementation."); - } - DOMResult domResult = (DOMResult) result; - transformer.transform(source, domResult); - return (Document) domResult.getNode(); - } - - private Transformer buildTransformer(Message message) throws TransformerException { - //process individual mappings - Transformer transformer = this.templates.newTransformer(); - if (this.xslParameterMappings != null){ - for (String parameterName: this.xslParameterMappings.keySet()) { - Expression expression = this.xslParameterMappings.get(parameterName); - try { - Object value = expression.getValue(this.evaluationContext, message); - transformer.setParameter(parameterName, value); - } - catch (Exception e) { - if (logger.isWarnEnabled()) { - logger.warn("Evaluation of header expression '" + expression.getExpressionString() + - "' failed. The XSLT parameter '" + parameterName + "' will be skipped."); - } - } - } - } - // process xslt-parameter-headers - MessageHeaders headers = message.getHeaders(); - if (!ObjectUtils.isEmpty(this.xsltParamHeaders)) { - for (String headerName : headers.keySet()) { - if (PatternMatchUtils.simpleMatch(this.xsltParamHeaders, headerName)) { - transformer.setParameter(headerName, headers.get(headerName)); - } - } - } - return transformer; - } + /** + * Sets the ResultFactory + */ + public void setResultFactory(ResultFactory resultFactory) { + Assert.notNull(sourceFactory, "ResultFactory must not be null"); + this.resultFactory = resultFactory; + } - /** - * Compensate for the fact that a Resource may not be a File or even - * addressable through a URI. If it is, we want the created StreamSource to - * read other resources relative to the provided one. If it isn't, it loads - * from the default path. - */ - private static StreamSource createStreamSourceOnResource(Resource xslResource) throws IOException { - try { - String systemId = xslResource.getURI().toString(); - return new StreamSource(xslResource.getInputStream(), systemId); - } - catch (IOException e) { - return new StreamSource(xslResource.getInputStream()); - } - } + /** + * User source factory even for directly supported payloads + * + * @return + */ + public void setAlwaysUseSourceFactory(boolean alwaysUseSourceFactory) { + this.alwaysUseSourceFactory = alwaysUseSourceFactory; + } + + + /** + * Always use result factory even for directly supported payload types + * + * @param alwaysUseResultFactory + */ + public void setAlwaysUseResultFactory(boolean alwaysUseResultFactory) { + this.alwaysUseResultFactory = alwaysUseResultFactory; + } + + public void setXslParameterMappings(Map xslParameterMappings) { + this.xslParameterMappings = xslParameterMappings; + } + + public void setXsltParamHeaders(String[] xsltParamHeaders) { + this.xsltParamHeaders = xsltParamHeaders; + } + + public String getComponentType() { + return "xml:xslt-transformer"; + } + + @Override + protected Object doTransform(Message message) throws Exception { + Transformer transformer = buildTransformer(message); + Object payload; + if (this.alwaysUseSourceFactory) { + payload = sourceFactory.createSource(message.getPayload()); + } else { + payload = message.getPayload(); + } + + + Object transformedPayload = null; + if (this.alwaysUseResultFactory) { + transformedPayload = transformUsingResultFactory(payload, transformer); + } else if (payload instanceof String) { + transformedPayload = transformString((String) payload, transformer); + } else if (payload instanceof Document) { + transformedPayload = transformDocument((Document) payload, transformer); + } else if (payload instanceof Source) { + transformedPayload = transformSource((Source) payload, payload, transformer); + } else { + // fall back to trying factories + transformedPayload = transformUsingResultFactory(payload, transformer); + } + return transformedPayload; + } + + private Object transformUsingResultFactory(Object payload, Transformer transformer) throws TransformerException { + Source source; + if (this.alwaysUseSourceFactory) { + source = this.sourceFactory.createSource(payload); + } else if (payload instanceof String) { + source = new StringSource((String) payload); + } else if (payload instanceof Document) { + source = new DOMSource((Document) payload); + } else if (payload instanceof Source) { + source = (Source) payload; + } else { + source = this.sourceFactory.createSource(payload); + } + return transformSource(source, payload, transformer); + } + + private Object transformSource(Source source, Object payload, Transformer transformer) throws TransformerException { + Result result = this.resultFactory.createResult(payload); + transformer.transform(source, result); + if (this.resultTransformer != null) { + return this.resultTransformer.transformResult(result); + } + return result; + } + + private String transformString(String stringPayload, Transformer transformer) throws TransformerException { + StringResult result = new StringResult(); + Source source; + if (this.alwaysUseSourceFactory) { + source = this.sourceFactory.createSource(stringPayload); + } else { + source = new StringSource(stringPayload); + } + transformer.transform(source, result); + return result.toString(); + } + + private Document transformDocument(Document documentPayload, Transformer transformer) throws TransformerException { + Source source; + if (this.alwaysUseSourceFactory) { + source = this.sourceFactory.createSource(documentPayload); + } else { + source = new DOMSource(documentPayload); + } + Result result = this.resultFactory.createResult(documentPayload); + if (!DOMResult.class.isAssignableFrom(result.getClass())) { + throw new MessagingException( + "Document to Document conversion requires a DOMResult-producing ResultFactory implementation."); + } + DOMResult domResult = (DOMResult) result; + transformer.transform(source, domResult); + return (Document) domResult.getNode(); + } + + private Transformer buildTransformer(Message message) throws TransformerException { + //process individual mappings + Transformer transformer = this.templates.newTransformer(); + if (this.xslParameterMappings != null) { + for (String parameterName : this.xslParameterMappings.keySet()) { + Expression expression = this.xslParameterMappings.get(parameterName); + try { + Object value = expression.getValue(this.evaluationContext, message); + transformer.setParameter(parameterName, value); + } catch (Exception e) { + if (logger.isWarnEnabled()) { + logger.warn("Evaluation of header expression '" + expression.getExpressionString() + + "' failed. The XSLT parameter '" + parameterName + "' will be skipped."); + } + } + } + } + // process xslt-parameter-headers + MessageHeaders headers = message.getHeaders(); + if (!ObjectUtils.isEmpty(this.xsltParamHeaders)) { + for (String headerName : headers.keySet()) { + if (PatternMatchUtils.simpleMatch(this.xsltParamHeaders, headerName)) { + transformer.setParameter(headerName, headers.get(headerName)); + } + } + } + return transformer; + } + + + /** + * Compensate for the fact that a Resource may not be a File or even + * addressable through a URI. If it is, we want the created StreamSource to + * read other resources relative to the provided one. If it isn't, it loads + * from the default path. + */ + private static StreamSource createStreamSourceOnResource(Resource xslResource) throws IOException { + try { + String systemId = xslResource.getURI().toString(); + return new StreamSource(xslResource.getInputStream(), systemId); + } catch (IOException e) { + return new StreamSource(xslResource.getInputStream()); + } + } } diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml index 96e96c4330..ea7d44dc81 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests-context.xml @@ -1,59 +1,84 @@ - - - + + + - - + + - - + + - - + + - - + + - - + + - + + - - - - + + + + + + + + + + + + + + + + + + + diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java index ce218fc13a..244fc6f3b2 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XsltPayloadTransformerParserTests.java @@ -21,8 +21,11 @@ import static org.junit.Assert.assertTrue; import javax.xml.transform.dom.DOMResult; +import junit.framework.Assert; import org.junit.Before; import org.junit.Test; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.integration.xml.transformer.CustomTestResultFactory; import org.w3c.dom.Document; import org.springframework.context.ApplicationContext; @@ -41,74 +44,108 @@ import org.springframework.xml.transform.StringResult; */ public class XsltPayloadTransformerParserTests { - private String doc = "test"; + private String doc = "test"; - private ApplicationContext applicationContext; + private ApplicationContext applicationContext; - private PollableChannel output; + private PollableChannel output; - @Before - public void setUp() { - applicationContext = new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-context.xml", getClass()); - output = (PollableChannel) applicationContext.getBean("output"); - } + @Before + public void setUp() { + applicationContext = new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-context.xml", getClass()); + output = (PollableChannel) applicationContext.getBean("output"); + } - @Test - public void testWithResourceProvided() throws Exception { - MessageChannel input = (MessageChannel) applicationContext.getBean("withResourceIn"); - GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - input.send(message); - Message result = output.receive(0); - assertTrue("Payload was not a DOMResult", result.getPayload() instanceof DOMResult); - Document doc = (Document) ((DOMResult) result.getPayload()).getNode(); - assertEquals("Wrong payload", "test", doc.getDocumentElement().getTextContent()); - } + @Test + public void testWithResourceProvided() throws Exception { + MessageChannel input = (MessageChannel) applicationContext.getBean("withResourceIn"); + GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); + input.send(message); + Message result = output.receive(0); + assertTrue("Payload was not a DOMResult", result.getPayload() instanceof DOMResult); + Document doc = (Document) ((DOMResult) result.getPayload()).getNode(); + assertEquals("Wrong payload", "test", doc.getDocumentElement().getTextContent()); + } - @Test - public void testWithTemplatesProvided() throws Exception { - MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesIn"); - GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - input.send(message); - Message result = output.receive(0); - assertTrue("Payload was not a DOMResult", result.getPayload() instanceof DOMResult); - Document doc = (Document) ((DOMResult) result.getPayload()).getNode(); - assertEquals("Wrong payload", "test", doc.getDocumentElement().getTextContent()); - } + @Test + public void testWithTemplatesProvided() throws Exception { + MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesIn"); + GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); + input.send(message); + Message result = output.receive(0); + assertTrue("Payload was not a DOMResult", result.getPayload() instanceof DOMResult); + Document doc = (Document) ((DOMResult) result.getPayload()).getNode(); + assertEquals("Wrong payload", "test", doc.getDocumentElement().getTextContent()); + } - @Test - public void testWithTemplatesAndResultTransformer() throws Exception { - MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndResultTransformerIn"); - GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - input.send(message); - Message result = output.receive(0); - assertEquals("Wrong payload type", String.class, result.getPayload().getClass()); - String strResult = (String)result.getPayload(); - assertEquals("Wrong payload", "testReturn", strResult); - } + @Test + public void testWithTemplatesAndResultTransformer() throws Exception { + MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndResultTransformerIn"); + GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); + input.send(message); + Message result = output.receive(0); + assertEquals("Wrong payload type", String.class, result.getPayload().getClass()); + String strResult = (String) result.getPayload(); + assertEquals("Wrong payload", "testReturn", strResult); + } - @Test - public void testWithResourceProvidedAndStubResultFactory() throws Exception { - MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndResultFactoryIn"); - GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - input.send(message); - Message result = output.receive(0); - assertTrue("Payload was not a StubStringResult", result.getPayload() instanceof StubStringResult); - } + @Test + public void testWithResourceProvidedAndStubResultFactory() throws Exception { + MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndResultFactoryIn"); + GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); + input.send(message); + Message result = output.receive(0); + assertTrue("Payload was not a StubStringResult", result.getPayload() instanceof StubStringResult); + } - @Test - public void testWithResourceAndStringResultType() throws Exception { - MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndStringResultTypeIn"); - GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); - input.send(message); - Message result = output.receive(0); - assertTrue("Payload was not a StringResult", result.getPayload() instanceof StringResult); - } - - - + @Test + public void testWithResourceAndStringResultType() throws Exception { + MessageChannel input = (MessageChannel) applicationContext.getBean("withTemplatesAndStringResultTypeIn"); + GenericMessage message = new GenericMessage(XmlTestUtil.getDomSourceForString(doc)); + input.send(message); + Message result = output.receive(0); + assertTrue("Payload was not a StringResult", result.getPayload() instanceof StringResult); + } + + + @Test + public void docInStringResultOut() throws Exception { + MessageChannel input = applicationContext.getBean("docinStringResultOutTransformerChannel", MessageChannel.class); + Message message = MessageBuilder.withPayload(XmlTestUtil.getDocumentForString(this.doc)). + build(); + input.send(message); + Message resultMessage = output.receive(); + Assert.assertEquals("Wrong payload type", StringResult.class, resultMessage.getPayload().getClass()); + String payload = resultMessage.getPayload().toString(); + Assert.assertTrue(payload.contains("test")); + } + + @Test + public void stringInDocResultOut() throws Exception { + MessageChannel input = applicationContext.getBean("stringResultOutTransformerChannel", MessageChannel.class); + Message message = MessageBuilder.withPayload(this.doc). + build(); + input.send(message); + Message resultMessage = output.receive(); + Assert.assertEquals("Wrong payload type", DOMResult.class, resultMessage.getPayload().getClass()); + Document payload = (Document) ((DOMResult) resultMessage.getPayload()).getNode(); + Assert.assertTrue(XmlTestUtil.docToString(payload).contains("test")); + } + + + @Test + public void stringInAndCustomResultFactory() throws Exception { + MessageChannel input = applicationContext.getBean("stringInCustomResultFactoryChannel", MessageChannel.class); + Message message = MessageBuilder.withPayload(XmlTestUtil.getDocumentForString(this.doc)). + build(); + input.send(message); + Message resultMessage = output.receive(); + Assert.assertEquals("Wrong payload type", CustomTestResultFactory.FixedStringResult.class, resultMessage.getPayload().getClass()); + String payload = resultMessage.getPayload().toString(); + Assert.assertTrue(payload.contains("fixedStringForTesting")); + } - } diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/CustomTestResultFactory.java b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/CustomTestResultFactory.java new file mode 100644 index 0000000000..29c5fa86a4 --- /dev/null +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/CustomTestResultFactory.java @@ -0,0 +1,43 @@ +package org.springframework.integration.xml.transformer; + + +import org.springframework.integration.xml.result.ResultFactory; + +import javax.xml.transform.Result; +import javax.xml.transform.stream.StreamResult; +import java.io.StringWriter; + +public class CustomTestResultFactory implements ResultFactory { + + private final String stringToReturn; + + + public CustomTestResultFactory(String stringToReturn) { + this.stringToReturn = stringToReturn; + } + + public Result createResult(Object payload) { + return new FixedStringResult(this.stringToReturn); //To change body of implemented methods use File | Settings | File Templates. + } + + public static class FixedStringResult extends StreamResult { + + + private final String stringToReturn; + + public FixedStringResult(String stringToReturn) { + super(new StringWriter()); + this.stringToReturn = stringToReturn; + } + + /** + * Returns the written XML as a string. + */ + public String toString() { + return this.stringToReturn; + } + + } + + +} diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltPayloadTransformerTests.java b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltPayloadTransformerTests.java index 9b16f0dfe2..14dd1bb0df 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltPayloadTransformerTests.java +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltPayloadTransformerTests.java @@ -28,7 +28,9 @@ import org.springframework.core.io.Resource; import org.springframework.integration.Message; import org.springframework.integration.MessagingException; import org.springframework.integration.support.MessageBuilder; +import org.springframework.integration.xml.result.StringResultFactory; import org.springframework.integration.xml.util.XmlTestUtil; +import org.springframework.xml.transform.StringResult; import org.springframework.xml.transform.StringSource; import org.w3c.dom.Document; @@ -43,111 +45,137 @@ import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; */ public class XsltPayloadTransformerTests { - private XsltPayloadTransformer transformer; + private XsltPayloadTransformer transformer; - private String docAsString = "test"; + private String docAsString = "test"; - private String outputAsString = "test"; + private String outputAsString = "test"; - @Before - public void setUp() throws Exception { - transformer = new XsltPayloadTransformer(getXslResource()); - } + @Before + public void setUp() throws Exception { + transformer = new XsltPayloadTransformer(getXslResource()); + } - @Test - public void testDocumentAsPayload() throws Exception { - Object transformed = transformer.doTransform(buildMessage(XmlTestUtil - .getDocumentForString(docAsString))); - assertTrue("Wrong return type for document payload", Document.class - .isAssignableFrom(transformed.getClass())); - Document transformedDocument = (Document) transformed; - assertXMLEqual(outputAsString, XmlTestUtil - .docToString(transformedDocument)); - } + @Test + public void testDocumentAsPayload() throws Exception { + Object transformed = transformer.doTransform(buildMessage(XmlTestUtil + .getDocumentForString(docAsString))); + assertTrue("Wrong return type for document payload", Document.class + .isAssignableFrom(transformed.getClass())); + Document transformedDocument = (Document) transformed; + assertXMLEqual(outputAsString, XmlTestUtil + .docToString(transformedDocument)); + } - @Test - public void testSourceAsPayload() throws Exception { - Object transformed = transformer - .doTransform(buildMessage(new StringSource(docAsString))); - assertEquals("Wrong return type for source payload", DOMResult.class, - transformed.getClass()); - DOMResult result = (DOMResult) transformed; - assertXMLEqual("Document incorrect after transformation", XmlTestUtil - .getDocumentForString(outputAsString), (Document) result - .getNode()); - } + @Test + public void testSourceAsPayload() throws Exception { + Object transformed = transformer + .doTransform(buildMessage(new StringSource(docAsString))); + assertEquals("Wrong return type for source payload", DOMResult.class, + transformed.getClass()); + DOMResult result = (DOMResult) transformed; + assertXMLEqual("Document incorrect after transformation", XmlTestUtil + .getDocumentForString(outputAsString), (Document) result + .getNode()); + } - @Test - public void testStringAsPayload() throws Exception { - Object transformed = transformer.doTransform(buildMessage(docAsString)); - assertEquals("Wrong return type for string payload", String.class, - transformed.getClass()); - String transformedString = (String) transformed; - assertXMLEqual("String incorrect after transform", outputAsString, - transformedString); - } + @Test + public void testStringAsPayload() throws Exception { + Object transformed = transformer.doTransform(buildMessage(docAsString)); + assertEquals("Wrong return type for string payload", String.class, + transformed.getClass()); + String transformedString = (String) transformed; + assertXMLEqual("String incorrect after transform", outputAsString, + transformedString); + } - @Test - public void testStringAsPayloadUseFactoriesTrue() throws Exception { - transformer.setAlwaysUseSourceResultFactories(true); - Object transformed = transformer.doTransform(buildMessage(docAsString)); - assertEquals("Wrong return type for useFactories true", - DOMResult.class, transformed.getClass()); - DOMResult result = (DOMResult) transformed; - assertXMLEqual("Document incorrect after transformation", XmlTestUtil - .getDocumentForString(outputAsString), (Document) result - .getNode()); - } + @Test + public void testStringAsPayloadUseResultFactoryTrue() throws Exception { + transformer.setAlwaysUseResultFactory(true); + Object transformed = transformer.doTransform(buildMessage(docAsString)); + assertEquals("Wrong return type for useFactories true", + DOMResult.class, transformed.getClass()); + DOMResult result = (DOMResult) transformed; + assertXMLEqual("Document incorrect after transformation", XmlTestUtil + .getDocumentForString(outputAsString), (Document) result + .getNode()); + } - @Test - public void testSourceWithResultTransformer() throws Exception { - Integer returnValue = new Integer(13); - transformer = new XsltPayloadTransformer(getXslResource(), - new StubResultTransformer(returnValue)); - Object transformed = transformer - .doTransform(buildMessage(new StringSource(docAsString))); - assertEquals("Wrong value from result conversion", returnValue, - transformed); - } + @Test + public void testSourceWithResultTransformer() throws Exception { + Integer returnValue = new Integer(13); + transformer = new XsltPayloadTransformer(getXslResource(), + new StubResultTransformer(returnValue)); + Object transformed = transformer + .doTransform(buildMessage(new StringSource(docAsString))); + assertEquals("Wrong value from result conversion", returnValue, + transformed); + } - @Test(expected = TransformerException.class) - public void testNonXmlString() throws Exception { - transformer.doTransform(buildMessage("test")); - } + @Test(expected = TransformerException.class) + public void testNonXmlString() throws Exception { + transformer.doTransform(buildMessage("test")); + } - @Test(expected = MessagingException.class) - public void testUnsupportedPayloadType() throws Exception { - transformer.doTransform(buildMessage(new Long(12))); - } + @Test(expected = MessagingException.class) + public void testUnsupportedPayloadType() throws Exception { + transformer.doTransform(buildMessage(new Long(12))); + } - @Test - public void testXsltWithImports() throws Exception { - Resource resource = new ClassPathResource("transform-with-import.xsl", - this.getClass()); - transformer = new XsltPayloadTransformer(resource); - assertEquals(transformer.doTransform(buildMessage(docAsString)), - outputAsString); - } + @Test + public void testXsltWithImports() throws Exception { + Resource resource = new ClassPathResource("transform-with-import.xsl", + this.getClass()); + transformer = new XsltPayloadTransformer(resource); + assertEquals(transformer.doTransform(buildMessage(docAsString)), + outputAsString); + } - protected Message buildMessage(Object payload) { - return MessageBuilder.withPayload(payload).build(); - } - private Resource getXslResource() throws Exception { - String xsl = "test"; - return new ByteArrayResource(xsl.getBytes("UTF-8")); - } - public static class StubResultTransformer implements ResultTransformer { + @Test + public void documentInStringResultOut() throws Exception { + Resource resource = new ClassPathResource("transform-with-import.xsl", + this.getClass()); + transformer = new XsltPayloadTransformer(resource); + transformer.setResultFactory(new StringResultFactory()); + transformer.setAlwaysUseResultFactory(true); + Object returned = transformer.doTransform(buildMessage(XmlTestUtil.getDocumentForString(docAsString))); + assertEquals("Wrong type of return ", StringResult.class, returned.getClass()); + } - private Object objectToReturn; - public StubResultTransformer(Object objectToReturn) { - this.objectToReturn = objectToReturn; - } + @Test + public void stringInDomResultOut() throws Exception { + Resource resource = new ClassPathResource("transform-with-import.xsl", + this.getClass()); + transformer = new XsltPayloadTransformer(resource); + transformer.setResultFactory(new StringResultFactory()); + transformer.setAlwaysUseResultFactory(true); + Object returned = transformer.doTransform(buildMessage(XmlTestUtil.getDocumentForString(docAsString))); + assertEquals("Wrong type of return ", StringResult.class, returned.getClass()); + } - public Object transformResult(Result result) { - return objectToReturn; - } - } + + protected Message buildMessage(Object payload) { + return MessageBuilder.withPayload(payload).build(); + } + + private Resource getXslResource() throws Exception { + String xsl = "test"; + return new ByteArrayResource(xsl.getBytes("UTF-8")); + } + + public static class StubResultTransformer implements ResultTransformer { + + private Object objectToReturn; + + public StubResultTransformer(Object objectToReturn) { + this.objectToReturn = objectToReturn; + } + + public Object transformResult(Result result) { + return objectToReturn; + } + } } diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltTransformerTests-context.xml b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltTransformerTests-context.xml index ec8d54befe..b2c572bec7 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltTransformerTests-context.xml +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltTransformerTests-context.xml @@ -1,48 +1,53 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltTransformerTests.java b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltTransformerTests.java index 726efcb680..22707976f2 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltTransformerTests.java +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/XsltTransformerTests.java @@ -28,8 +28,13 @@ import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.history.MessageHistory; import org.springframework.integration.support.MessageBuilder; import org.springframework.integration.test.util.TestUtils; +import org.springframework.integration.xml.util.XmlTestUtil; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.xml.transform.StringResult; +import org.w3c.dom.Document; + +import javax.xml.transform.dom.DOMResult; import static org.junit.Assert.assertFalse; @@ -39,6 +44,7 @@ import static junit.framework.Assert.assertTrue; /** * @author Oleg Zhurakousky + * @author Jonas Partner * */ @ContextConfiguration @@ -110,4 +116,8 @@ public class XsltTransformerTests { assertTrue(((String) resultMessage.getPayload()).contains("FOO")); assertTrue(((String) resultMessage.getPayload()).contains("hello")); } + } + + +