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.
+