diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XmlNamespaceUtils.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XmlNamespaceUtils.java index 439e79cc46..cab52a5e9d 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XmlNamespaceUtils.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/XmlNamespaceUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2013 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. @@ -25,9 +25,10 @@ import org.springframework.util.StringUtils; /** * Utility methods for the XML namespace. - * + * * @author Jonas Partner * @author Mark Fisher + * @author Artem Bilan */ abstract class XmlNamespaceUtils { @@ -54,7 +55,7 @@ abstract class XmlNamespaceUtils { else if (resultType.equals(STRING_RESULT)) { builder.addPropertyValue("resultFactory", new StringResultFactory()); } - else { + else if (resultType.equals(DOM_RESULT)) { builder.addPropertyValue("resultFactory", new DomResultFactory()); } } 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 9ea7363fab..9423c4a71e 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 @@ -76,6 +76,7 @@ import org.springframework.xml.transform.StringSource; * @author Jonas Partner * @author Mark Fisher * @author Oleg Zhurakousky + * @author Artem Bilan */ public class XsltPayloadTransformer extends AbstractTransformer { @@ -93,6 +94,8 @@ public class XsltPayloadTransformer extends AbstractTransformer { private volatile ResultFactory resultFactory = new DomResultFactory(); + private volatile boolean resultFactoryExplicitlySet; + private volatile boolean alwaysUseSourceFactory = false; private volatile boolean alwaysUseResultFactory = false; @@ -135,6 +138,7 @@ public class XsltPayloadTransformer extends AbstractTransformer { public void setResultFactory(ResultFactory resultFactory) { Assert.notNull(sourceFactory, "ResultFactory must not be null"); this.resultFactory = resultFactory; + this.resultFactoryExplicitlySet = true; } /** @@ -214,7 +218,13 @@ public class XsltPayloadTransformer extends AbstractTransformer { } private Object transformSource(Source source, Object payload, Transformer transformer) throws TransformerException { - Result result = this.resultFactory.createResult(payload); + Result result; + if (!this.resultFactoryExplicitlySet && "text".equals(transformer.getOutputProperties().getProperty("method"))) { + result = new StringResult(); + } + else { + result = this.resultFactory.createResult(payload); + } transformer.transform(source, result); if (this.resultTransformer != null) { return this.resultTransformer.transformResult(result); 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 fa4d660ad6..e9b189370d 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 @@ -53,6 +53,12 @@ xsl-resource="classpath:org/springframework/integration/xml/transformer/transform-tostring.xsl"> + + + 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 3448edee87..9bf3986623 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 @@ -20,6 +20,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; +import java.io.IOException; import java.util.Properties; import org.junit.Test; @@ -28,6 +29,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; +import org.springframework.core.io.ClassPathResource; import org.springframework.integration.Message; import org.springframework.integration.MessageChannel; import org.springframework.integration.channel.QueueChannel; @@ -41,94 +43,103 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * @author Oleg Zhurakousky * @author Jonas Partner * @author Gunnar Hillert + * @author Artem Bilan */ @ContextConfiguration @RunWith(SpringJUnit4ClassRunner.class) public class XsltTransformerTests { - private String docAsString = "test"; - @Autowired - private ApplicationContext applicationContext; - @Autowired - @Qualifier("output") - private QueueChannel output; + private String docAsString = "test"; + @Autowired + private ApplicationContext applicationContext; + @Autowired + @Qualifier("output") + private QueueChannel output; - @Test - public void testParamHeadersWithStartWildCharacter() { - MessageChannel input = applicationContext.getBean("paramHeadersWithStartWildCharacterChannel", MessageChannel.class); - Message message = MessageBuilder.withPayload(this.docAsString). - setHeader("testParam", "testParamValue"). - setHeader("testParam2", "FOO"). - build(); - input.send(message); - Message resultMessage = output.receive(); - MessageHistory history = MessageHistory.read(resultMessage); - assertNotNull(history); - Properties componentHistoryRecord = TestUtils.locateComponentInHistory(history, "paramHeadersWithStartWildCharacter", 0); - assertNotNull(componentHistoryRecord); - assertEquals("xml:xslt-transformer", componentHistoryRecord.get("type")); - assertEquals("Wrong payload type", String.class, resultMessage.getPayload().getClass()); - assertTrue(((String) resultMessage.getPayload()).contains("testParamValue")); - assertFalse(((String) resultMessage.getPayload()).contains("FOO")); - } + @Test + public void testParamHeadersWithStartWildCharacter() { + MessageChannel input = applicationContext.getBean("paramHeadersWithStartWildCharacterChannel", MessageChannel.class); + Message message = MessageBuilder.withPayload(this.docAsString). + setHeader("testParam", "testParamValue"). + setHeader("testParam2", "FOO"). + build(); + input.send(message); + Message resultMessage = output.receive(); + MessageHistory history = MessageHistory.read(resultMessage); + assertNotNull(history); + Properties componentHistoryRecord = TestUtils.locateComponentInHistory(history, "paramHeadersWithStartWildCharacter", 0); + assertNotNull(componentHistoryRecord); + assertEquals("xml:xslt-transformer", componentHistoryRecord.get("type")); + assertEquals("Wrong payload type", String.class, resultMessage.getPayload().getClass()); + assertTrue(((String) resultMessage.getPayload()).contains("testParamValue")); + assertFalse(((String) resultMessage.getPayload()).contains("FOO")); + } - @Test - public void testParamHeadersWithEndWildCharacter() { - MessageChannel input = applicationContext.getBean("paramHeadersWithEndWildCharacterChannel", MessageChannel.class); - Message message = MessageBuilder.withPayload(this.docAsString). - setHeader("testParam", "testParamValue"). - setHeader("testParam2", "FOO"). - build(); - input.send(message); - Message resultMessage = output.receive(); - assertEquals("Wrong payload type", String.class, resultMessage.getPayload().getClass()); - assertTrue(((String) resultMessage.getPayload()).contains("testParamValue")); - assertTrue(((String) resultMessage.getPayload()).contains("FOO")); - } + @Test + public void testParamHeadersWithEndWildCharacter() { + MessageChannel input = applicationContext.getBean("paramHeadersWithEndWildCharacterChannel", MessageChannel.class); + Message message = MessageBuilder.withPayload(this.docAsString). + setHeader("testParam", "testParamValue"). + setHeader("testParam2", "FOO"). + build(); + input.send(message); + Message resultMessage = output.receive(); + assertEquals("Wrong payload type", String.class, resultMessage.getPayload().getClass()); + assertTrue(((String) resultMessage.getPayload()).contains("testParamValue")); + assertTrue(((String) resultMessage.getPayload()).contains("FOO")); + } - @Test - public void testParamHeadersWithIndividualParameters() { - MessageChannel input = applicationContext.getBean("paramHeadersWithIndividualParametersChannel", MessageChannel.class); - Message message = MessageBuilder.withPayload(this.docAsString). - setHeader("testParam", "testParamValue"). - setHeader("testParam2", "FOO"). - build(); - input.send(message); - Message resultMessage = output.receive(); - assertEquals("Wrong payload type", String.class, resultMessage.getPayload().getClass()); - assertTrue(((String) resultMessage.getPayload()).contains("testParamValue")); - assertTrue(((String) resultMessage.getPayload()).contains("FOO")); - assertTrue(((String) resultMessage.getPayload()).contains("hello")); - } + @Test + public void testParamHeadersWithIndividualParameters() { + MessageChannel input = applicationContext.getBean("paramHeadersWithIndividualParametersChannel", MessageChannel.class); + Message message = MessageBuilder.withPayload(this.docAsString). + setHeader("testParam", "testParamValue"). + setHeader("testParam2", "FOO"). + build(); + input.send(message); + Message resultMessage = output.receive(); + assertEquals("Wrong payload type", String.class, resultMessage.getPayload().getClass()); + assertTrue(((String) resultMessage.getPayload()).contains("testParamValue")); + assertTrue(((String) resultMessage.getPayload()).contains("FOO")); + assertTrue(((String) resultMessage.getPayload()).contains("hello")); + } - @Test - public void testParamHeadersCombo() { - MessageChannel input = applicationContext.getBean("paramHeadersComboChannel", MessageChannel.class); - Message message = MessageBuilder.withPayload(this.docAsString). - setHeader("testParam", "testParamValue"). - setHeader("testParam2", "FOO"). - build(); - input.send(message); - Message resultMessage = output.receive(); - assertEquals("Wrong payload type", String.class, resultMessage.getPayload().getClass()); - assertTrue(((String) resultMessage.getPayload()).contains("testParamValue")); - assertTrue(((String) resultMessage.getPayload()).contains("FOO")); - assertTrue(((String) resultMessage.getPayload()).contains("hello")); - } + @Test + public void testParamHeadersCombo() { + MessageChannel input = applicationContext.getBean("paramHeadersComboChannel", MessageChannel.class); + Message message = MessageBuilder.withPayload(this.docAsString). + setHeader("testParam", "testParamValue"). + setHeader("testParam2", "FOO"). + build(); + input.send(message); + Message resultMessage = output.receive(); + assertEquals("Wrong payload type", String.class, resultMessage.getPayload().getClass()); + assertTrue(((String) resultMessage.getPayload()).contains("testParamValue")); + assertTrue(((String) resultMessage.getPayload()).contains("FOO")); + assertTrue(((String) resultMessage.getPayload()).contains("hello")); + } - @Test - public void outputAsString() { - MessageChannel input = applicationContext.getBean("outputAsStringChannel", MessageChannel.class); - Message message = MessageBuilder.withPayload(this.docAsString). - build(); - input.send(message); - Message resultMessage = output.receive(); - assertEquals("Wrong payload type", String.class, resultMessage.getPayload().getClass()); - String stringPayload = (String)resultMessage.getPayload(); - assertEquals("Wrong content of payload", "hello world text",stringPayload.trim()); - } + @Test + public void outputAsString() { + MessageChannel input = applicationContext.getBean("outputAsStringChannel", MessageChannel.class); + Message message = MessageBuilder.withPayload(this.docAsString). + build(); + input.send(message); + Message resultMessage = output.receive(); + assertEquals("Wrong payload type", String.class, resultMessage.getPayload().getClass()); + String stringPayload = (String)resultMessage.getPayload(); + assertEquals("Wrong content of payload", "hello world text",stringPayload.trim()); + } + @Test + public void testInt3067OutputFileAsString() throws IOException { + MessageChannel input = applicationContext.getBean("outputFileAsStringChannel", MessageChannel.class); + Message message = MessageBuilder.withPayload(new ClassPathResource("org/springframework/integration/xml/transformer/xsl-text-file.xml").getFile()).build(); + input.send(message); + Message resultMessage = output.receive(); + assertEquals("Wrong payload type", String.class, resultMessage.getPayload().getClass()); + String stringPayload = (String) resultMessage.getPayload(); + assertEquals("Wrong content of payload", "hello world text", stringPayload.trim()); + } } - - diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/xsl-text-file.xml b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/xsl-text-file.xml new file mode 100644 index 0000000000..2f41331000 --- /dev/null +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/transformer/xsl-text-file.xml @@ -0,0 +1,3 @@ + + test + diff --git a/spring-integration-xml/src/test/resources/.svnignore b/spring-integration-xml/src/test/resources/.svnignore deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/reference/docbook/xml.xml b/src/reference/docbook/xml.xml index 228cce5516..813e86ac18 100644 --- a/src/reference/docbook/xml.xml +++ b/src/reference/docbook/xml.xml @@ -727,6 +727,22 @@ String, the resulting payload will be of type Document. + XsltPayloadTransformer and <xsl:output method="text"/> + <xsl:output method="text"/> tells the XSLT + template to only produce text content from the input source. + In this particuliar case there is no reason to have a + DomResult. Therefore, the + XsltPayloadTransformer + defaults to StringResult if the + output property + called method of the underlying + javax.xml.transform.Transformer returns "text". + This coercion is performed independent from the inbound payload type. Keep + in mind that this smart behavior is only available, if the + result-type or result-factory attributes + aren't provided for the respective <int-xml:xslt-transformer> + component. +