From 94746fb6a4f034790d29ae38fa0e7cc99ac6dadd Mon Sep 17 00:00:00 2001 From: Jonas Partner Date: Tue, 19 Aug 2008 08:42:55 +0000 Subject: [PATCH] Updated logic to make it easier to wrok with XML as Document and String payloads INT-311 --- .../ResultToDocumentTransformer.java | 51 ++++---- .../xml/transformer/ResultTransformer.java | 22 ++++ .../XmlPayloadMarshallingTransformer.java | 2 +- .../transformer/XsltPayloadTransformer.java | 113 +++++++++++++++--- .../xml/source/StringSourceTests.java | 1 - .../ResultToDocumentTransformerTests.java | 6 +- .../XsltPayloadTransformerTest.java | 85 ++++++++++--- .../integration/xml/util/XmlTestUtil.java | 8 ++ 8 files changed, 219 insertions(+), 69 deletions(-) create mode 100644 org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/transformer/ResultTransformer.java diff --git a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/transformer/ResultToDocumentTransformer.java b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/transformer/ResultToDocumentTransformer.java index 068ed2915c..90cb701a56 100644 --- a/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/transformer/ResultToDocumentTransformer.java +++ b/org.springframework.integration.xml/src/main/java/org/springframework/integration/xml/transformer/ResultToDocumentTransformer.java @@ -24,25 +24,24 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Result; import javax.xml.transform.dom.DOMResult; +import org.springframework.integration.message.MessagingException; +import org.springframework.xml.transform.StringResult; import org.w3c.dom.Document; import org.xml.sax.InputSource; -import org.springframework.integration.message.MessagingException; -import org.springframework.integration.transformer.PayloadTransformer; -import org.springframework.xml.transform.StringResult; - /** - * Creates a {@link Document} from a {@link Result} payload. + * Creates a {@link Document} from a {@link Result} payload. Supports + * {@link DOMResult} and {@link StringResult} implementations. * * @author Jonas Partner */ -public class ResultToDocumentTransformer implements PayloadTransformer { +public class ResultToDocumentTransformer implements ResultTransformer { // Not guaranteed to be thread safe private final DocumentBuilderFactory documentBuilderFactory; - - public ResultToDocumentTransformer(DocumentBuilderFactory documentBuilderFactory) { + public ResultToDocumentTransformer( + DocumentBuilderFactory documentBuilderFactory) { this.documentBuilderFactory = documentBuilderFactory; } @@ -50,19 +49,16 @@ public class ResultToDocumentTransformer implements PayloadTransformer { +public class XsltPayloadTransformer implements + PayloadTransformer { private final Templates templates; private SourceFactory sourceFactory = new DomSourceFactory(); - private ResultFactory resultFactory; + private ResultFactory resultFactory = new DomResultFactory(); + private boolean alwaysUseSourceResultFactories = false; - public XsltPayloadTransformer(Templates templates) throws ParserConfigurationException { + private ResultTransformer resultTransformer; + + public XsltPayloadTransformer(Templates templates) + throws ParserConfigurationException { this.templates = templates; resultFactory = new DomResultFactory(); } public XsltPayloadTransformer(Resource xslResource) throws Exception { - this(TransformerFactory.newInstance().newTemplates(new StreamSource(xslResource.getInputStream()))); + this(TransformerFactory.newInstance().newTemplates( + new StreamSource(xslResource.getInputStream()))); } - public void setSourceFactory(SourceFactory sourceFactory) { this.sourceFactory = sourceFactory; } @@ -67,18 +93,69 @@ public class XsltPayloadTransformer implements PayloadTransformertest"; + private String docAsString = "test"; + private String outputAsString = "test"; @Before public void setUp() throws Exception { transformer = new XsltPayloadTransformer(getXslResource()); } - @Test public void testDocumentAsPayload() throws Exception { - Object transformed = transformer.transform(XmlTestUtil.getDocumentForString(doc)); - DOMResult result = (DOMResult) transformed; - String rootNodeName = ((Document) result.getNode()).getDocumentElement().getNodeName(); - assertEquals("Wrong name for root element after transform", "bob", rootNodeName); + Object transformed = transformer.transform(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.transform(new StringSource(doc)); + Object transformed = transformer + .transform(new StringSource(docAsString)); + assertEquals("Wrong return type for source payload", DOMResult.class, + transformed.getClass()); DOMResult result = (DOMResult) transformed; - String rootNodeName = ((Document) result.getNode()).getDocumentElement().getNodeName(); - assertEquals("Wrong name for root element after transform", "bob", rootNodeName); + assertXMLEqual("Document incorrect after transformation", XmlTestUtil + .getDocumentForString(outputAsString), (Document) result + .getNode()); } @Test public void testStringAsPayload() throws Exception { - Object transformed = transformer.transform(doc); - DOMResult result = (DOMResult) transformed; - String rootNodeName = ((Document) result.getNode()).getDocumentElement().getNodeName(); - assertEquals("Wrong name for root element after transform", "bob", rootNodeName); + Object transformed = transformer.transform(docAsString); + assertEquals("Wrong return type for string payload", String.class, + transformed.getClass()); + String transformedString = (String) transformed; + assertXMLEqual("String incorrect after transform", outputAsString, + transformedString); } - @Test(expected = MessagingException.class) + @Test + public void testStringAsPayloadUseFactoriesTrue() throws Exception { + transformer.setAlwaysUseSourceResultFactories(true); + Object transformed = transformer.transform(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 + .setResultTransformer(new StubResultTransformer(returnValue)); + Object transformed = transformer + .transform(new StringSource(docAsString)); + assertEquals("Wrong value from result conversion", returnValue, + transformed); + } + + @Test(expected = TransformerException.class) public void testNonXmlString() throws Exception { transformer.transform("test"); } @@ -81,10 +115,23 @@ public class XsltPayloadTransformerTest { transformer.transform(new Long(12)); } - private Resource getXslResource() throws Exception { String xsl = "test"; return new ByteArrayResource(xsl.getBytes("UTF-8")); } + public static class StubResultTransformer implements ResultTransformer { + + private Object objToReturn; + + public StubResultTransformer(Object objToReturn) { + this.objToReturn = objToReturn; + } + + public Object transformResult(Result res) { + return objToReturn; + } + + } + } diff --git a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/util/XmlTestUtil.java b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/util/XmlTestUtil.java index f9b1384ec1..b9581cba81 100644 --- a/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/util/XmlTestUtil.java +++ b/org.springframework.integration.xml/src/test/java/org/springframework/integration/xml/util/XmlTestUtil.java @@ -60,6 +60,14 @@ public class XmlTestUtil { return res; } + public static String docToString(Document doc) throws Exception{ + DOMSource source = new DOMSource(doc); + StringResult stringResult = new StringResult(); + transform(source, stringResult); + return stringResult.toString(); + } + + public static void transform(Source source, Result res) throws Exception { TransformerFactory.newInstance().newTransformer().transform(source, res); }