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; - } - }