CAMEL-9534: XsltBuilder: always convert StAXSource to SAXSource

Some older TrAX implementations such as Xalan and Saxon-B do not support
StAXSource.

Using the Woodstox StAX parser with the default TrAX implementation (XSLTC)
doesn't handle CDATA sections correctly (Woodstox reports these as CDATA
events, which are ignored by XSLTC's StAXStream2SAX adapter).

Using StAXSource instead of SAXSource with the default TrAX implementation
(XSLTC) or Saxon results in a significant performance penalty.

Rename Camel's StaxSource adapter to StAX2SAXSource to better reflect what
it does. Use the adapter for all TrAX implementations (not just Xalan).

Signed-off-by: Karsten Blees <karsten.bl...@dcon.de>


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/fe0e85a9
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/fe0e85a9
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/fe0e85a9

Branch: refs/heads/master
Commit: fe0e85a92200662f441d71baafc5bfe40108894f
Parents: 7d781cc
Author: Karsten Blees <bl...@dcon.de>
Authored: Thu Jan 28 21:27:54 2016 +0100
Committer: Daniel Kulp <dk...@apache.org>
Committed: Mon Feb 1 16:06:24 2016 -0500

----------------------------------------------------------------------
 .../apache/camel/builder/xml/XsltBuilder.java   |  33 +--
 .../camel/converter/jaxp/StAX2SAXSource.java    | 275 +++++++++++++++++++
 .../apache/camel/converter/jaxp/StaxSource.java | 275 -------------------
 .../builder/xml/XsltTestErrorListenerTest.java  |   2 +-
 .../converter/jaxp/StAX2SAXSourceTest.java      |  63 +++++
 .../camel/converter/jaxp/StaxSourceTest.java    |  63 -----
 6 files changed, 354 insertions(+), 357 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/fe0e85a9/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java 
b/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java
index 7a5a610..d9d65f4 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java
@@ -27,7 +27,6 @@ import java.util.Set;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.BlockingQueue;
 import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.ErrorListener;
 import javax.xml.transform.Result;
 import javax.xml.transform.Source;
@@ -51,7 +50,7 @@ import org.apache.camel.Message;
 import org.apache.camel.Processor;
 import org.apache.camel.RuntimeTransformException;
 import org.apache.camel.TypeConverter;
-import org.apache.camel.converter.jaxp.StaxSource;
+import org.apache.camel.converter.jaxp.StAX2SAXSource;
 import org.apache.camel.converter.jaxp.XmlConverter;
 import org.apache.camel.support.ServiceSupport;
 import org.apache.camel.support.SynchronizationAdapter;
@@ -120,7 +119,6 @@ public class XsltBuilder extends ServiceSupport implements 
Processor, CamelConte
 
         ResultHandler resultHandler = 
resultHandlerFactory.createResult(exchange);
         Result result = resultHandler.getResult();
-        exchange.setProperty("isXalanTransformer", 
isXalanTransformer(transformer));
         // let's copy the headers before we invoke the transform in case they 
modify them
         Message out = exchange.getOut();
         out.copyFrom(exchange.getIn());
@@ -137,6 +135,17 @@ public class XsltBuilder extends ServiceSupport implements 
Processor, CamelConte
                 Object body = exchange.getIn().getBody();
                 source = getSource(exchange, body);
             }
+
+            if (source instanceof StAXSource) {
+                // Always convert StAXSource to SAXSource.
+                // * Xalan and Saxon-B don't support StAXSource.
+                // * The JDK default implementation (XSLTC) doesn't handle 
CDATA events
+                //   (see 
com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX).
+                // * Saxon-HE/PE/EE seem to support StAXSource, but don't 
advertise this
+                //   officially (via 
TransformerFactory.getFeature(StAXSource.FEATURE))
+                source = new StAX2SAXSource(((StAXSource) 
source).getXMLStreamReader());
+            }
+
             LOG.trace("Using {} as source", source);
             transformer.transform(source, result);
             LOG.trace("Transform complete with result {}", result);
@@ -148,10 +157,6 @@ public class XsltBuilder extends ServiceSupport implements 
Processor, CamelConte
         }
     }
     
-    boolean isXalanTransformer(Transformer transformer) {
-        return 
transformer.getClass().getName().startsWith("org.apache.xalan.transformer");
-    }
-
     boolean isSaxonTransformer(Transformer transformer) {
         return transformer.getClass().getName().startsWith("net.sf.saxon");
     }
@@ -494,14 +499,13 @@ public class XsltBuilder extends ServiceSupport 
implements Processor, CamelConte
      * <p/>
      * This implementation will prefer to source in the following order:
      * <ul>
-     *   <li>StAX - Is StAX is allowed</li>
+     *   <li>StAX - If 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, Object body) {
-        Boolean isXalanTransformer = 
exchange.getProperty("isXalanTransformer", Boolean.class);
         // body may already be a source
         if (body instanceof Source) {
             return (Source) body;
@@ -509,15 +513,8 @@ public class XsltBuilder extends ServiceSupport implements 
Processor, CamelConte
         Source source = null;
         if (body != null) {
             if (isAllowStAX()) {
-                if (isXalanTransformer) {
-                    XMLStreamReader reader = 
exchange.getContext().getTypeConverter().tryConvertTo(XMLStreamReader.class, 
exchange, body);
-                    if (reader != null) {
-                        // create a new SAXSource with stax parser API
-                        source = new StaxSource(reader);
-                    }
-                } else {
-                    source = 
exchange.getContext().getTypeConverter().tryConvertTo(StAXSource.class, 
exchange, body);
-                }
+                // try StAX if enabled
+                source = 
exchange.getContext().getTypeConverter().tryConvertTo(StAXSource.class, 
exchange, body);
             }
             if (source == null) {
                 // then try SAX

http://git-wip-us.apache.org/repos/asf/camel/blob/fe0e85a9/camel-core/src/main/java/org/apache/camel/converter/jaxp/StAX2SAXSource.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/converter/jaxp/StAX2SAXSource.java 
b/camel-core/src/main/java/org/apache/camel/converter/jaxp/StAX2SAXSource.java
new file mode 100644
index 0000000..e4a68b6
--- /dev/null
+++ 
b/camel-core/src/main/java/org/apache/camel/converter/jaxp/StAX2SAXSource.java
@@ -0,0 +1,275 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.converter.jaxp;
+
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.sax.SAXSource;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.DTDHandler;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.ext.LexicalHandler;
+import org.xml.sax.helpers.AttributesImpl;
+
+/**
+ * Adapter to turn a StAX {@link XMLStreamReader} into a {@link SAXSource}.
+ */
+public class StAX2SAXSource extends SAXSource implements XMLReader {
+
+    private XMLStreamReader streamReader;
+
+    private ContentHandler contentHandler;
+
+    private LexicalHandler lexicalHandler;
+
+    public StAX2SAXSource(XMLStreamReader streamReader) {
+        this.streamReader = streamReader;
+        setInputSource(new InputSource());
+    }
+
+    public XMLReader getXMLReader() {
+        return this;
+    }
+
+    public XMLStreamReader getXMLStreamReader() {
+        return streamReader;
+    }
+
+    protected void parse() throws SAXException {
+        try {
+            while (true) {
+                switch (streamReader.getEventType()) {
+                // Attributes are handled in START_ELEMENT
+                case XMLStreamConstants.ATTRIBUTE:
+                    break;
+                case XMLStreamConstants.CDATA:
+                {
+                    if (lexicalHandler != null) {
+                        lexicalHandler.startCDATA();
+                    }
+                    int length = streamReader.getTextLength();
+                    int start = streamReader.getTextStart();
+                    char[] chars = streamReader.getTextCharacters();
+                    contentHandler.characters(chars, start, length);
+                    if (lexicalHandler != null) {
+                        lexicalHandler.endCDATA();
+                    }
+                    break;
+                }
+                case XMLStreamConstants.CHARACTERS:
+                {
+                    int length = streamReader.getTextLength();
+                    int start = streamReader.getTextStart();
+                    char[] chars = streamReader.getTextCharacters();
+                    contentHandler.characters(chars, start, length);
+                    break;
+                }
+                case XMLStreamConstants.SPACE:
+                {
+                    int length = streamReader.getTextLength();
+                    int start = streamReader.getTextStart();
+                    char[] chars = streamReader.getTextCharacters();
+                    contentHandler.ignorableWhitespace(chars, start, length);
+                    break;
+                }
+                case XMLStreamConstants.COMMENT:
+                    if (lexicalHandler != null) {
+                        int length = streamReader.getTextLength();
+                        int start = streamReader.getTextStart();
+                        char[] chars = streamReader.getTextCharacters();
+                        lexicalHandler.comment(chars, start, length);
+                    }
+                    break;
+                case XMLStreamConstants.DTD:
+                    break;
+                case XMLStreamConstants.END_DOCUMENT:
+                    contentHandler.endDocument();
+                    return;
+                case XMLStreamConstants.END_ELEMENT: {
+                    String uri = streamReader.getNamespaceURI();
+                    String localName = streamReader.getLocalName();
+                    String prefix = streamReader.getPrefix();
+                    String qname = prefix != null && prefix.length() > 0
+                        ? prefix + ":" + localName : localName;
+                    contentHandler.endElement(uri, localName, qname);
+                    // namespaces
+                    for (int i = 0; i < streamReader.getNamespaceCount(); i++) 
{
+                        String nsPrefix = streamReader.getNamespacePrefix(i);
+                        String nsUri = streamReader.getNamespaceURI(i);
+                        if (nsUri == null) {
+                            nsUri = "";
+                        }
+                        contentHandler.endPrefixMapping(nsPrefix);
+                    }
+                    break;
+                }
+                case XMLStreamConstants.ENTITY_DECLARATION:
+                case XMLStreamConstants.ENTITY_REFERENCE:
+                case XMLStreamConstants.NAMESPACE:
+                case XMLStreamConstants.NOTATION_DECLARATION:
+                    break;
+                case XMLStreamConstants.PROCESSING_INSTRUCTION:
+                    break;
+                case XMLStreamConstants.START_DOCUMENT:
+                    contentHandler.startDocument();
+                    break;
+                case XMLStreamConstants.START_ELEMENT: {
+                    String uri = streamReader.getNamespaceURI();
+                    String localName = streamReader.getLocalName();
+                    String prefix = streamReader.getPrefix();
+                    String qname = prefix != null && prefix.length() > 0
+                        ? prefix + ":" + localName : localName;
+                    // namespaces
+                    for (int i = 0; i < streamReader.getNamespaceCount(); i++) 
{
+                        String nsPrefix = streamReader.getNamespacePrefix(i);
+                        String nsUri = streamReader.getNamespaceURI(i);
+                        if (nsUri == null) {
+                            nsUri = "";
+                        }
+                        contentHandler.startPrefixMapping(nsPrefix, nsUri);
+                    }
+                    contentHandler.startElement(uri == null ? "" : uri, 
localName, qname, getAttributes());
+                    break;
+                }
+                default:
+                    break;
+                }
+                if (!streamReader.hasNext()) {
+                    return;
+                }
+                streamReader.next();
+            }
+        } catch (XMLStreamException e) {
+            SAXParseException spe;
+            if (e.getLocation() != null) {
+                spe = new SAXParseException(e.getMessage(), null, null,
+                                            e.getLocation().getLineNumber(),
+                                            e.getLocation().getColumnNumber(), 
e);
+            } else {
+                spe = new SAXParseException(e.getMessage(), null, null, -1, 
-1, e);
+            }
+            spe.initCause(e);
+            throw spe;
+        }
+    }
+
+    protected String getQualifiedName() {
+        String prefix = streamReader.getPrefix();
+        if (prefix != null && prefix.length() > 0) {
+            return prefix + ":" + streamReader.getLocalName();
+        } else {
+            return streamReader.getLocalName();
+        }
+    }
+
+    protected Attributes getAttributes() {
+        AttributesImpl attrs = new AttributesImpl();
+
+        for (int i = 0; i < streamReader.getAttributeCount(); i++) {
+            String uri = streamReader.getAttributeNamespace(i);
+            String localName = streamReader.getAttributeLocalName(i);
+            String prefix = streamReader.getAttributePrefix(i);
+            String qName;
+            if (prefix != null && prefix.length() > 0) {
+                qName = prefix + ':' + localName;
+            } else {
+                qName = localName;
+            }
+            String type = streamReader.getAttributeType(i);
+            String value = streamReader.getAttributeValue(i);
+            if (value == null) {
+                value = "";
+            }
+
+            attrs.addAttribute(uri == null ? "" : uri, localName, qName, type, 
value);
+        }
+        return attrs;
+    }
+
+    public boolean getFeature(String name) throws SAXNotRecognizedException, 
SAXNotSupportedException {
+        return false;
+    }
+
+    public void setFeature(String name, boolean value)
+        throws SAXNotRecognizedException, SAXNotSupportedException {
+    }
+
+    public Object getProperty(String name) throws SAXNotRecognizedException, 
SAXNotSupportedException {
+        return null;
+    }
+
+    public void setProperty(String name, Object value)
+        throws SAXNotRecognizedException, SAXNotSupportedException {
+        if ("http://xml.org/sax/properties/lexical-handler".equals(name)) {
+            lexicalHandler = (LexicalHandler) value;
+        } else {
+            throw new SAXNotRecognizedException(name);
+        }
+    }
+
+    public void setEntityResolver(EntityResolver resolver) {
+    }
+
+    public EntityResolver getEntityResolver() {
+        return null;
+    }
+
+    public void setDTDHandler(DTDHandler handler) {
+    }
+
+    public DTDHandler getDTDHandler() {
+        return null;
+    }
+
+    public void setContentHandler(ContentHandler handler) {
+        this.contentHandler = handler;
+        if (handler instanceof LexicalHandler
+            && lexicalHandler == null) {
+            lexicalHandler = (LexicalHandler)handler;
+        }
+    }
+
+    public ContentHandler getContentHandler() {
+        return this.contentHandler;
+    }
+
+    public void setErrorHandler(ErrorHandler handler) {
+    }
+
+    public ErrorHandler getErrorHandler() {
+        return null;
+    }
+
+    public void parse(InputSource input) throws SAXException {
+        StAX2SAXSource.this.parse();
+    }
+
+    public void parse(String systemId) throws SAXException {
+        StAX2SAXSource.this.parse();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/fe0e85a9/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxSource.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxSource.java 
b/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxSource.java
deleted file mode 100644
index d8d764a..0000000
--- a/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxSource.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.converter.jaxp;
-
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.transform.sax.SAXSource;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.DTDHandler;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.SAXNotSupportedException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.ext.LexicalHandler;
-import org.xml.sax.helpers.AttributesImpl;
-
-/**
- * A streaming {@link javax.xml.transform.sax.SAXSource}
- */
-public class StaxSource extends SAXSource implements XMLReader {
-
-    private XMLStreamReader streamReader;
-
-    private ContentHandler contentHandler;
-
-    private LexicalHandler lexicalHandler;
-
-    public StaxSource(XMLStreamReader streamReader) {
-        this.streamReader = streamReader;
-        setInputSource(new InputSource());
-    }
-
-    public XMLReader getXMLReader() {
-        return this;
-    }
-
-    public XMLStreamReader getXMLStreamReader() {
-        return streamReader;
-    }
-
-    protected void parse() throws SAXException {
-        try {
-            while (true) {
-                switch (streamReader.getEventType()) {
-                // Attributes are handled in START_ELEMENT
-                case XMLStreamConstants.ATTRIBUTE:
-                    break;
-                case XMLStreamConstants.CDATA:
-                {
-                    if (lexicalHandler != null) {
-                        lexicalHandler.startCDATA();
-                    }
-                    int length = streamReader.getTextLength();
-                    int start = streamReader.getTextStart();
-                    char[] chars = streamReader.getTextCharacters();
-                    contentHandler.characters(chars, start, length);
-                    if (lexicalHandler != null) {
-                        lexicalHandler.endCDATA();
-                    }
-                    break;
-                }
-                case XMLStreamConstants.CHARACTERS:
-                {
-                    int length = streamReader.getTextLength();
-                    int start = streamReader.getTextStart();
-                    char[] chars = streamReader.getTextCharacters();
-                    contentHandler.characters(chars, start, length);
-                    break;
-                }
-                case XMLStreamConstants.SPACE:
-                {
-                    int length = streamReader.getTextLength();
-                    int start = streamReader.getTextStart();
-                    char[] chars = streamReader.getTextCharacters();
-                    contentHandler.ignorableWhitespace(chars, start, length);
-                    break;
-                }
-                case XMLStreamConstants.COMMENT:
-                    if (lexicalHandler != null) {
-                        int length = streamReader.getTextLength();
-                        int start = streamReader.getTextStart();
-                        char[] chars = streamReader.getTextCharacters();
-                        lexicalHandler.comment(chars, start, length);
-                    }
-                    break;
-                case XMLStreamConstants.DTD:
-                    break;
-                case XMLStreamConstants.END_DOCUMENT:
-                    contentHandler.endDocument();
-                    return;
-                case XMLStreamConstants.END_ELEMENT: {
-                    String uri = streamReader.getNamespaceURI();
-                    String localName = streamReader.getLocalName();
-                    String prefix = streamReader.getPrefix();
-                    String qname = prefix != null && prefix.length() > 0
-                        ? prefix + ":" + localName : localName;
-                    contentHandler.endElement(uri, localName, qname);
-                    // namespaces
-                    for (int i = 0; i < streamReader.getNamespaceCount(); i++) 
{
-                        String nsPrefix = streamReader.getNamespacePrefix(i);
-                        String nsUri = streamReader.getNamespaceURI(i);
-                        if (nsUri == null) {
-                            nsUri = "";
-                        }
-                        contentHandler.endPrefixMapping(nsPrefix);
-                    }
-                    break;
-                }
-                case XMLStreamConstants.ENTITY_DECLARATION:
-                case XMLStreamConstants.ENTITY_REFERENCE:
-                case XMLStreamConstants.NAMESPACE:
-                case XMLStreamConstants.NOTATION_DECLARATION:
-                    break;
-                case XMLStreamConstants.PROCESSING_INSTRUCTION:
-                    break;
-                case XMLStreamConstants.START_DOCUMENT:
-                    contentHandler.startDocument();
-                    break;
-                case XMLStreamConstants.START_ELEMENT: {
-                    String uri = streamReader.getNamespaceURI();
-                    String localName = streamReader.getLocalName();
-                    String prefix = streamReader.getPrefix();
-                    String qname = prefix != null && prefix.length() > 0
-                        ? prefix + ":" + localName : localName;
-                    // namespaces
-                    for (int i = 0; i < streamReader.getNamespaceCount(); i++) 
{
-                        String nsPrefix = streamReader.getNamespacePrefix(i);
-                        String nsUri = streamReader.getNamespaceURI(i);
-                        if (nsUri == null) {
-                            nsUri = "";
-                        }
-                        contentHandler.startPrefixMapping(nsPrefix, nsUri);
-                    }
-                    contentHandler.startElement(uri == null ? "" : uri, 
localName, qname, getAttributes());
-                    break;
-                }
-                default:
-                    break;
-                }
-                if (!streamReader.hasNext()) {
-                    return;
-                }
-                streamReader.next();
-            }
-        } catch (XMLStreamException e) {
-            SAXParseException spe;
-            if (e.getLocation() != null) {
-                spe = new SAXParseException(e.getMessage(), null, null,
-                                            e.getLocation().getLineNumber(),
-                                            e.getLocation().getColumnNumber(), 
e);
-            } else {
-                spe = new SAXParseException(e.getMessage(), null, null, -1, 
-1, e);
-            }
-            spe.initCause(e);
-            throw spe;
-        }
-    }
-
-    protected String getQualifiedName() {
-        String prefix = streamReader.getPrefix();
-        if (prefix != null && prefix.length() > 0) {
-            return prefix + ":" + streamReader.getLocalName();
-        } else {
-            return streamReader.getLocalName();
-        }
-    }
-
-    protected Attributes getAttributes() {
-        AttributesImpl attrs = new AttributesImpl();
-
-        for (int i = 0; i < streamReader.getAttributeCount(); i++) {
-            String uri = streamReader.getAttributeNamespace(i);
-            String localName = streamReader.getAttributeLocalName(i);
-            String prefix = streamReader.getAttributePrefix(i);
-            String qName;
-            if (prefix != null && prefix.length() > 0) {
-                qName = prefix + ':' + localName;
-            } else {
-                qName = localName;
-            }
-            String type = streamReader.getAttributeType(i);
-            String value = streamReader.getAttributeValue(i);
-            if (value == null) {
-                value = "";
-            }
-
-            attrs.addAttribute(uri == null ? "" : uri, localName, qName, type, 
value);
-        }
-        return attrs;
-    }
-
-    public boolean getFeature(String name) throws SAXNotRecognizedException, 
SAXNotSupportedException {
-        return false;
-    }
-
-    public void setFeature(String name, boolean value)
-        throws SAXNotRecognizedException, SAXNotSupportedException {
-    }
-
-    public Object getProperty(String name) throws SAXNotRecognizedException, 
SAXNotSupportedException {
-        return null;
-    }
-
-    public void setProperty(String name, Object value)
-        throws SAXNotRecognizedException, SAXNotSupportedException {
-        if ("http://xml.org/sax/properties/lexical-handler".equals(name)) {
-            lexicalHandler = (LexicalHandler) value;
-        } else {
-            throw new SAXNotRecognizedException(name);
-        }
-    }
-
-    public void setEntityResolver(EntityResolver resolver) {
-    }
-
-    public EntityResolver getEntityResolver() {
-        return null;
-    }
-
-    public void setDTDHandler(DTDHandler handler) {
-    }
-
-    public DTDHandler getDTDHandler() {
-        return null;
-    }
-
-    public void setContentHandler(ContentHandler handler) {
-        this.contentHandler = handler;
-        if (handler instanceof LexicalHandler
-            && lexicalHandler == null) {
-            lexicalHandler = (LexicalHandler)handler;
-        }
-    }
-
-    public ContentHandler getContentHandler() {
-        return this.contentHandler;
-    }
-
-    public void setErrorHandler(ErrorHandler handler) {
-    }
-
-    public ErrorHandler getErrorHandler() {
-        return null;
-    }
-
-    public void parse(InputSource input) throws SAXException {
-        StaxSource.this.parse();
-    }
-
-    public void parse(String systemId) throws SAXException {
-        StaxSource.this.parse();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/fe0e85a9/camel-core/src/test/java/org/apache/camel/builder/xml/XsltTestErrorListenerTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/builder/xml/XsltTestErrorListenerTest.java
 
b/camel-core/src/test/java/org/apache/camel/builder/xml/XsltTestErrorListenerTest.java
index dbcce70..2741adc 100644
--- 
a/camel-core/src/test/java/org/apache/camel/builder/xml/XsltTestErrorListenerTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/builder/xml/XsltTestErrorListenerTest.java
@@ -35,7 +35,7 @@ public class XsltTestErrorListenerTest extends TestCase {
 
     public void testErrorListener() throws Exception {
         // Xalan transformer cannot work as expected, so we just skip the test
-        if 
(xsltBuilder.isXalanTransformer(xsltBuilder.getConverter().getTransformerFactory().newTransformer()))
 {
+        if 
(xsltBuilder.getConverter().getTransformerFactory().getClass().getName().startsWith("org.apache.xalan"))
 {
             return;
         }
         errorListener.error(EasyMock.<TransformerException>anyObject());

http://git-wip-us.apache.org/repos/asf/camel/blob/fe0e85a9/camel-core/src/test/java/org/apache/camel/converter/jaxp/StAX2SAXSourceTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/converter/jaxp/StAX2SAXSourceTest.java
 
b/camel-core/src/test/java/org/apache/camel/converter/jaxp/StAX2SAXSourceTest.java
new file mode 100644
index 0000000..c23b46f
--- /dev/null
+++ 
b/camel-core/src/test/java/org/apache/camel/converter/jaxp/StAX2SAXSourceTest.java
@@ -0,0 +1,63 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.converter.jaxp;
+
+import java.io.ByteArrayOutputStream;
+import java.io.StringReader;
+import java.nio.charset.Charset;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultExchange;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+public class StAX2SAXSourceTest extends ContextTestSupport {
+
+    private static final String TEST_XML = "<root 
xmlns=\"urn:org.apache.camel:test\">Text</root>";
+
+    private static final Charset UTF_8 = Charset.forName("UTF-8");
+
+    public void testDefaultPrefixInRootElementWithCopyTransformer() throws 
Exception {
+        TransformerFactory trf = TransformerFactory.newInstance();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        XMLStreamReader reader = 
context.getTypeConverter().mandatoryConvertTo(XMLStreamReader.class,
+            new StringReader(TEST_XML));
+        // ensure UTF-8 encoding
+        Exchange exchange = new DefaultExchange(context);
+        exchange.setProperty(Exchange.CHARSET_NAME, UTF_8.toString());
+        XMLStreamWriter writer = 
context.getTypeConverter().mandatoryConvertTo(XMLStreamWriter.class, exchange, 
baos);
+        StAX2SAXSource staxSource = new StAX2SAXSource(reader);
+        StreamSource templateSource = new 
StreamSource(getClass().getResourceAsStream("/xslt/common/copy.xsl"));
+        Transformer transformer = trf.newTransformer(templateSource);
+        log.info("Used transformer: {}", transformer.getClass().getName());
+        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+        transformer.transform(staxSource, new StreamResult(baos));
+        writer.flush();
+        baos.flush();
+        assertThat(new String(baos.toByteArray()), equalTo(TEST_XML));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/fe0e85a9/camel-core/src/test/java/org/apache/camel/converter/jaxp/StaxSourceTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/converter/jaxp/StaxSourceTest.java 
b/camel-core/src/test/java/org/apache/camel/converter/jaxp/StaxSourceTest.java
deleted file mode 100644
index 3a9d46c..0000000
--- 
a/camel-core/src/test/java/org/apache/camel/converter/jaxp/StaxSourceTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.converter.jaxp;
-
-import java.io.ByteArrayOutputStream;
-import java.io.StringReader;
-import java.nio.charset.Charset;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.stream.XMLStreamWriter;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
-import org.apache.camel.ContextTestSupport;
-import org.apache.camel.Exchange;
-import org.apache.camel.impl.DefaultExchange;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-
-public class StaxSourceTest extends ContextTestSupport {
-
-    private static final String TEST_XML = "<root 
xmlns=\"urn:org.apache.camel:test\">Text</root>";
-
-    private static final Charset UTF_8 = Charset.forName("UTF-8");
-
-    public void testDefaultPrefixInRootElementWithCopyTransformer() throws 
Exception {
-        TransformerFactory trf = TransformerFactory.newInstance();
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        XMLStreamReader reader = 
context.getTypeConverter().mandatoryConvertTo(XMLStreamReader.class,
-            new StringReader(TEST_XML));
-        // ensure UTF-8 encoding
-        Exchange exchange = new DefaultExchange(context);
-        exchange.setProperty(Exchange.CHARSET_NAME, UTF_8.toString());
-        XMLStreamWriter writer = 
context.getTypeConverter().mandatoryConvertTo(XMLStreamWriter.class, exchange, 
baos);
-        StaxSource staxSource = new StaxSource(reader);
-        StreamSource templateSource = new 
StreamSource(getClass().getResourceAsStream("/xslt/common/copy.xsl"));
-        Transformer transformer = trf.newTransformer(templateSource);
-        log.info("Used transformer: {}", transformer.getClass().getName());
-        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
-        transformer.transform(staxSource, new StreamResult(baos));
-        writer.flush();
-        baos.flush();
-        assertThat(new String(baos.toByteArray()), equalTo(TEST_XML));
-    }
-
-}

Reply via email to