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