Author: davsclaus
Date: Tue Oct 25 13:06:49 2011
New Revision: 1188642
URL: http://svn.apache.org/viewvc?rev=1188642&view=rev
Log:
CAMEL-4579: Added option allowStAX to XSLT component.
Added:
camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltRouteAllowStAXTest.java
- copied, changed from r1188579,
camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltRouteTest.java
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java?rev=1188642&r1=1188641&r2=1188642&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java
Tue Oct 25 13:06:49 2011
@@ -32,6 +32,8 @@ import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.URIResolver;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamSource;
@@ -46,6 +48,8 @@ import org.apache.camel.support.Synchron
import org.apache.camel.util.ExchangeHelper;
import org.apache.camel.util.FileUtil;
import org.apache.camel.util.IOHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import static org.apache.camel.util.ObjectHelper.notNull;
@@ -59,6 +63,7 @@ import static org.apache.camel.util.Obje
* @version
*/
public class XsltBuilder implements Processor {
+ private final static Logger LOG =
LoggerFactory.getLogger(XsltBuilder.class);
private Map<String, Object> parameters = new HashMap<String, Object>();
private XmlConverter converter = new XmlConverter();
private Templates template;
@@ -67,6 +72,7 @@ public class XsltBuilder implements Proc
private URIResolver uriResolver;
private boolean deleteOutputFile;
private ErrorListener errorListener = new XsltErrorListener();
+ private boolean allowStAX;
public XsltBuilder() {
}
@@ -104,7 +110,9 @@ public class XsltBuilder implements Proc
try {
is = exchange.getIn().getBody(InputStream.class);
Source source = getSource(exchange, is);
+ LOG.trace("Using {} as source", source);
transformer.transform(source, result);
+ LOG.trace("Transform complete with result {}", result);
resultHandler.setBody(out);
} finally {
IOHelper.close(is);
@@ -211,6 +219,16 @@ public class XsltBuilder implements Proc
return this;
}
+ /**
+ * Enables to allow using StAX.
+ * <p/>
+ * When enabled StAX is preferred as the first choice as {@link Source}.
+ */
+ public XsltBuilder allowStAX() {
+ setAllowStAX(true);
+ return this;
+ }
+
// Properties
//
-------------------------------------------------------------------------
@@ -246,6 +264,14 @@ public class XsltBuilder implements Proc
this.resultHandlerFactory = resultHandlerFactory;
}
+ public boolean isAllowStAX() {
+ return allowStAX;
+ }
+
+ public void setAllowStAX(boolean allowStAX) {
+ this.allowStAX = allowStAX;
+ }
+
/**
* Sets the XSLT transformer from a Source
*
@@ -333,16 +359,32 @@ public class XsltBuilder implements Proc
/**
* Converts the inbound stream to a {@link Source}.
* <p/>
- * This implementation will prefer StAX first, and fallback to other kinds
of Source types.
+ * This implementation will prefer to source in the following order:
+ * <ul>
+ * <li>StAX - Is StAX is allowed</li>
+ * <li>SAX - SAX as 2nd choice</li>
+ * <li>Stream - Stream as 3rd choice</li>
+ * <li>DOM - DOM as 4th choice</li>
+ * </ul>
*/
protected Source getSource(Exchange exchange, InputStream is) {
- // try StAX first
- Source source =
exchange.getContext().getTypeConverter().convertTo(StAXSource.class, exchange,
is);
- if (source == null) {
- // fallback and try other kind of source
+ Source source = null;
+ if (isAllowStAX()) {
source =
exchange.getContext().getTypeConverter().convertTo(StAXSource.class, exchange,
is);
}
if (source == null) {
+ // then try SAX
+ source =
exchange.getContext().getTypeConverter().convertTo(SAXSource.class, exchange,
is);
+ }
+ if (source == null) {
+ // then try stream
+ source =
exchange.getContext().getTypeConverter().convertTo(StreamSource.class,
exchange, is);
+ }
+ if (source == null) {
+ // and fallback to DOM
+ source =
exchange.getContext().getTypeConverter().convertTo(DOMSource.class, exchange,
is);
+ }
+ if (source == null) {
if (isFailOnNullBody()) {
throw new ExpectedBodyTypeException(exchange, Source.class);
} else {
@@ -383,6 +425,7 @@ public class XsltBuilder implements Proc
String key = entry.getKey();
Object value = entry.getValue();
if (value != null) {
+ LOG.trace("Transformer set parameter {} -> {}", key, value);
transformer.setParameter(key, value);
}
}
Copied:
camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltRouteAllowStAXTest.java
(from r1188579,
camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltRouteTest.java)
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltRouteAllowStAXTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltRouteAllowStAXTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltRouteTest.java&r1=1188579&r2=1188642&rev=1188642&view=diff
==============================================================================
---
camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltRouteTest.java
(original)
+++
camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltRouteAllowStAXTest.java
Tue Oct 25 13:06:49 2011
@@ -16,43 +16,12 @@
*/
package org.apache.camel.component.xslt;
-import java.util.List;
-
-import org.apache.camel.ContextTestSupport;
-import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.impl.JndiRegistry;
/**
*
*/
-public class XsltRouteTest extends ContextTestSupport {
-
- public void testSendMessageAndHaveItTransformed() throws Exception {
- MockEndpoint endpoint = getMockEndpoint("mock:result");
- endpoint.expectedMessageCount(1);
-
- template.sendBody("direct:start",
- "<mail><subject>Hey</subject><body>Hello
world!</body></mail>");
-
- assertMockEndpointsSatisfied();
-
- List<Exchange> list = endpoint.getReceivedExchanges();
- Exchange exchange = list.get(0);
- String xml = exchange.getIn().getBody(String.class);
-
- assertNotNull("The transformed XML should not be null", xml);
- assertTrue(xml.indexOf("transformed") > -1);
- // the cheese tag is in the transform.xsl
- assertTrue(xml.indexOf("cheese") > -1);
- assertTrue(xml.indexOf("<subject>Hey</subject>") > -1);
- assertTrue(xml.indexOf("<body>Hello world!</body>") > -1);
-
- TestBean bean = context.getRegistry().lookup("testBean",
TestBean.class);
- assertNotNull(bean);
- assertEquals("bean.subject", "Hey", bean.getSubject());
- }
+public class XsltRouteAllowStAXTest extends XsltRouteTest {
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
@@ -60,7 +29,7 @@ public class XsltRouteTest extends Conte
@Override
public void configure() throws Exception {
from("direct:start")
- .to("xslt:org/apache/camel/component/xslt/transform.xsl")
+
.to("xslt:org/apache/camel/component/xslt/transform.xsl?allowStAX=true")
.multicast()
.beanRef("testBean")
.to("mock:result");
@@ -68,11 +37,4 @@ public class XsltRouteTest extends Conte
};
}
- @Override
- protected JndiRegistry createRegistry() throws Exception {
- JndiRegistry jndi = super.createRegistry();
- jndi.bind("testBean", new TestBean());
- return jndi;
- }
-
}