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/

Reply via email to