On Tue, Oct 25, 2011 at 3:31 PM, Daniel Kulp <dk...@apache.org> wrote: > > > Is there a reason the default for this would be false? We claim to support > Java 6 as a requirement and the XSLT transform engine in the JDK DOES support > StAXSource. Thus, by default, it should work. If the user replaces the > XSLT engine with one that doesn't support StAX, that's really on them. > > Alternatively, is there a way we can better detect if we cannot use StAX? > > That said, the XSLT component needs some more work. On my TODO list once I > get CXF 2.5 out. It currently converts the body to an InputStream which, in > many cases, is sub-optimal. For example, if using CXF with the new streaming > stuff, the body is already a Source object of some sort. Converting to an > InputStream is a bad idea from a performance perspective. >
Ah we should most likely check if the body is Source already without converting. Then use the body as is, without the input stream. > Actually, I wonder if just: > exchange.getIn().getBody(Source.class) > would work better. Hmm..... something to try. > > Dan > > > > On Tuesday, October 25, 2011 1:06:49 PM davscl...@apache.org wrote: >> 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/XsltRo >> uteAllowStAXTest.java - copied, changed from r1188579, >> camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltRo >> uteTest.java Modified: >> >> camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuild >> er.java >> >> Modified: >> camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuild >> er.java URL: >> http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apach >> e/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/XsltBuild >> er.java (original) +++ >> camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuild >> er.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/XsltRo >> uteAllowStAXTest.java (from r1188579, >> camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltRo >> uteTest.java) URL: >> http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apach >> e/camel/component/xslt/XsltRouteAllowStAXTest.java?p2=camel/trunk/camel-core >> /src/test/java/org/apache/camel/component/xslt/XsltRouteAllowStAXTest.java&p >> 1=camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltR >> outeTest.java&r1=1188579&r2=1188642&rev=1188642&view=diff >> =========================================================================== >> === --- >> camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltRo >> uteTest.java (original) +++ >> camel/trunk/camel-core/src/test/java/org/apache/camel/component/xslt/XsltRo >> uteAllowStAXTest.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; >> - } >> - >> } > -- > Daniel Kulp > dk...@apache.org > http://dankulp.com/blog > Talend - http://www.talend.com > -- Claus Ibsen ----------------- FuseSource Email: cib...@fusesource.com Web: http://fusesource.com Twitter: davsclaus, fusenews Blog: http://davsclaus.blogspot.com/ Author of Camel in Action: http://www.manning.com/ibsen/