blob: a6dfc0bb2a6685363935fe1feb90b0e26d4cf4a4 [file] [log] [blame]
/*
* 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.File;
import java.io.InputStream;
import java.io.Reader;
import java.nio.ByteBuffer;
import java.util.Properties;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.apache.camel.CamelContext;
import org.apache.camel.ContextTestSupport;
import org.apache.camel.Exchange;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.support.DefaultExchange;
import org.apache.camel.util.xml.BytesSource;
import org.junit.Before;
import org.junit.Test;
public class XmlConverterTest extends ContextTestSupport {
@Override
@Before
public void setUp() throws Exception {
deleteDirectory("target/data/xml");
super.setUp();
}
@Test
public void testToResultNoSource() throws Exception {
XmlConverter conv = new XmlConverter();
conv.toResult(null, null);
}
@Test
public void testToBytesSource() throws Exception {
XmlConverter conv = new XmlConverter();
BytesSource bs = conv.toBytesSource("<foo>bar</foo>".getBytes());
assertNotNull(bs);
assertEquals("<foo>bar</foo>", new String(bs.getData()));
}
@Test
public void testToStringFromSourceNoSource() throws Exception {
XmlConverter conv = new XmlConverter();
Source source = null;
String out = conv.toString(source, null);
assertEquals(null, out);
}
@Test
public void testToStringWithBytesSource() throws Exception {
XmlConverter conv = new XmlConverter();
Source source = conv.toBytesSource("<foo>bar</foo>".getBytes());
String out = conv.toString(source, null);
assertEquals("<foo>bar</foo>", out);
}
@Test
public void testToStringWithDocument() throws Exception {
XmlConverter conv = new XmlConverter();
Document document = conv.createDocument();
Element foo = document.createElement("foo");
foo.setTextContent("bar");
document.appendChild(foo);
String out = conv.toStringFromDocument(document, null);
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><foo>bar</foo>", out);
}
@Test
public void testToStringWithDocumentSourceOutputProperties() throws Exception {
XmlConverter conv = new XmlConverter();
Document document = conv.createDocument();
Element foo = document.createElement("foo");
foo.setTextContent("bar");
document.appendChild(foo);
Properties properties = new Properties();
properties.put(OutputKeys.ENCODING, "ISO-8859-1");
String out = conv.toStringFromDocument(document, properties);
assertEquals("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"no\"?><foo>bar</foo>", out);
}
@Test
public void testToSource() throws Exception {
XmlConverter conv = new XmlConverter();
Source source = conv.toSource("<foo>bar</foo>");
String out = conv.toString(source, null);
assertEquals("<foo>bar</foo>", out);
}
@Test
public void testToSourceUsingTypeConverter() throws Exception {
Source source = context.getTypeConverter().convertTo(Source.class, "<foo>bar</foo>");
String out = context.getTypeConverter().convertTo(String.class, source);
assertEquals("<foo>bar</foo>", out);
// try again to ensure it works the 2nd time
source = context.getTypeConverter().convertTo(Source.class, "<foo>baz</foo>");
out = context.getTypeConverter().convertTo(String.class, source);
assertEquals("<foo>baz</foo>", out);
}
@Test
public void testToByteArrayWithExchange() throws Exception {
Exchange exchange = new DefaultExchange(context);
XmlConverter conv = new XmlConverter();
Source source = conv.toBytesSource("<foo>bar</foo>".getBytes());
byte[] out = conv.toByteArray(source, exchange);
assertEquals("<foo>bar</foo>", new String(out));
}
@Test
public void testToByteArrayWithNoExchange() throws Exception {
XmlConverter conv = new XmlConverter();
Source source = conv.toBytesSource("<foo>bar</foo>".getBytes());
byte[] out = conv.toByteArray(source, null);
assertEquals("<foo>bar</foo>", new String(out));
}
@Test
public void testToDomSourceByDomSource() throws Exception {
XmlConverter conv = new XmlConverter();
DOMSource source = conv.toDOMSource("<foo>bar</foo>");
DOMSource out = conv.toDOMSource(source, null);
assertSame(source, out);
}
@Test
public void testToDomSourceByByteArray() throws Exception {
XmlConverter conv = new XmlConverter();
byte[] bytes = "<foo>bar</foo>".getBytes();
DOMSource source = conv.toDOMSource(bytes);
assertNotNull(source);
byte[] out = conv.toByteArray(source, null);
assertEquals(new String(bytes), new String(out));
}
@Test
public void testToDomSourceBySaxSource() throws Exception {
XmlConverter conv = new XmlConverter();
SAXSource source = conv.toSAXSource("<foo>bar</foo>", null);
DOMSource out = conv.toDOMSource(source, null);
assertNotSame(source, out);
assertEquals("<foo>bar</foo>", conv.toString(out, null));
}
@Test
public void testToDomSourceByStAXSource() throws Exception {
XmlConverter conv = new XmlConverter();
// because of https://bugs.openjdk.java.net/show_bug.cgi?id=100228, we
// have to set the XML version explicitly
StAXSource source = conv.toStAXSource("<?xml version=\"1.0\" encoding=\"UTF-8\"?><foo>bar</foo>", null);
DOMSource out = conv.toDOMSource(source, null);
assertNotSame(source, out);
assertEquals("<foo>bar</foo>", conv.toString(out, null));
}
@Test
public void testToDomSourceByCustomSource() throws Exception {
XmlConverter conv = new XmlConverter();
Source dummy = new Source() {
public String getSystemId() {
return null;
}
public void setSystemId(String s) {
}
};
DOMSource out = conv.toDOMSource(dummy, null);
assertNull(out);
}
@Test
public void testToSaxSourceByInputStream() throws Exception {
XmlConverter conv = new XmlConverter();
InputStream is = context.getTypeConverter().convertTo(InputStream.class, "<foo>bar</foo>");
SAXSource out = conv.toSAXSource(is, null);
assertNotNull(out);
assertEquals("<foo>bar</foo>", conv.toString(out, null));
}
@Test
public void testToStAXSourceByInputStream() throws Exception {
XmlConverter conv = new XmlConverter();
InputStream is = context.getTypeConverter().convertTo(InputStream.class, "<foo>bar</foo>");
StAXSource out = conv.toStAXSource(is, null);
assertNotNull(out);
assertEquals("<foo>bar</foo>", conv.toString(out, null));
}
@Test
public void testToSaxSourceFromFile() throws Exception {
XmlConverter conv = new XmlConverter();
template.sendBodyAndHeader("file:target/data/xml", "<foo>bar</foo>", Exchange.FILE_NAME, "myxml.xml");
File file = new File("target/data/xml/myxml.xml");
SAXSource out = conv.toSAXSource(file, null);
assertNotNull(out);
assertEquals("<foo>bar</foo>", context.getTypeConverter().convertTo(String.class, out));
}
@Test
public void testToStAXSourceFromFile() throws Exception {
XmlConverter conv = new XmlConverter();
template.sendBodyAndHeader("file:target/data/xml", "<foo>bar</foo>", Exchange.FILE_NAME, "myxml.xml");
File file = new File("target/data/xml/myxml.xml");
StAXSource out = conv.toStAXSource(file, null);
assertNotNull(out);
assertEquals("<foo>bar</foo>", context.getTypeConverter().convertTo(String.class, out));
}
@Test
public void testToSaxSourceByDomSource() throws Exception {
XmlConverter conv = new XmlConverter();
DOMSource source = conv.toDOMSource("<foo>bar</foo>");
SAXSource out = conv.toSAXSource(source, null);
assertNotSame(source, out);
assertEquals("<foo>bar</foo>", conv.toString(out, null));
}
@Test
public void testToSaxSourceBySaxSource() throws Exception {
XmlConverter conv = new XmlConverter();
SAXSource source = conv.toSAXSource("<foo>bar</foo>", null);
SAXSource out = conv.toSAXSource(source, null);
assertSame(source, out);
}
@Test
public void testToSaxSourceByCustomSource() throws Exception {
XmlConverter conv = new XmlConverter();
Source dummy = new Source() {
public String getSystemId() {
return null;
}
public void setSystemId(String s) {
}
};
SAXSource out = conv.toSAXSource(dummy, null);
assertNull(out);
}
@Test
public void testToStreamSourceByFile() throws Exception {
XmlConverter conv = new XmlConverter();
File file = new File("org/apache/camel/converter/stream/test.xml");
StreamSource source = conv.toStreamSource(file);
StreamSource out = conv.toStreamSource(source, null);
assertSame(source, out);
}
@Test
public void testToStreamSourceByStreamSource() throws Exception {
Exchange exchange = new DefaultExchange(context);
XmlConverter conv = new XmlConverter();
StreamSource source = conv.toStreamSource("<foo>bar</foo>".getBytes(), exchange);
StreamSource out = conv.toStreamSource(source, null);
assertSame(source, out);
}
@Test
public void testToStreamSourceByDomSource() throws Exception {
XmlConverter conv = new XmlConverter();
DOMSource source = conv.toDOMSource("<foo>bar</foo>");
StreamSource out = conv.toStreamSource(source, null);
assertNotSame(source, out);
assertEquals("<foo>bar</foo>", conv.toString(out, null));
}
@Test
public void testToStreamSourceBySaxSource() throws Exception {
XmlConverter conv = new XmlConverter();
SAXSource source = conv.toSAXSource("<foo>bar</foo>", null);
StreamSource out = conv.toStreamSource(source, null);
assertNotSame(source, out);
assertEquals("<foo>bar</foo>", conv.toString(out, null));
}
@Test
public void testToStreamSourceByStAXSource() throws Exception {
XmlConverter conv = new XmlConverter();
StAXSource source = conv.toStAXSource("<foo>bar</foo>", null);
StreamSource out = conv.toStreamSource(source, null);
assertNotSame(source, out);
assertEquals("<foo>bar</foo>", conv.toString(out, null));
}
@Test
public void testToStreamSourceByCustomSource() throws Exception {
XmlConverter conv = new XmlConverter();
Source dummy = new Source() {
public String getSystemId() {
return null;
}
public void setSystemId(String s) {
}
};
StreamSource out = conv.toStreamSource(dummy, null);
assertNull(out);
}
@Test
public void testToStreamSourceByInputStream() throws Exception {
XmlConverter conv = new XmlConverter();
InputStream is = context.getTypeConverter().convertTo(InputStream.class, "<foo>bar</foo>");
StreamSource out = conv.toStreamSource(is);
assertNotNull(out);
assertEquals("<foo>bar</foo>", conv.toString(out, null));
}
@Test
public void testToStreamSourceByReader() throws Exception {
XmlConverter conv = new XmlConverter();
Reader reader = context.getTypeConverter().convertTo(Reader.class, "<foo>bar</foo>");
StreamSource out = conv.toStreamSource(reader);
assertNotNull(out);
assertEquals("<foo>bar</foo>", conv.toString(out, null));
}
@Test
public void testToStreamSourceByByteArray() throws Exception {
Exchange exchange = new DefaultExchange(context);
XmlConverter conv = new XmlConverter();
byte[] bytes = context.getTypeConverter().convertTo(byte[].class, "<foo>bar</foo>");
StreamSource out = conv.toStreamSource(bytes, exchange);
assertNotNull(out);
assertEquals("<foo>bar</foo>", conv.toString(out, null));
}
@Test
public void testToStreamSourceByByteBuffer() throws Exception {
Exchange exchange = new DefaultExchange(context);
XmlConverter conv = new XmlConverter();
ByteBuffer bytes = context.getTypeConverter().convertTo(ByteBuffer.class, "<foo>bar</foo>");
StreamSource out = conv.toStreamSource(bytes, exchange);
assertNotNull(out);
assertEquals("<foo>bar</foo>", conv.toString(out, null));
}
@Test
public void testToReaderFromSource() throws Exception {
XmlConverter conv = new XmlConverter();
SAXSource source = conv.toSAXSource("<foo>bar</foo>", null);
Reader out = conv.toReaderFromSource(source, null);
assertNotNull(out);
assertEquals("<foo>bar</foo>", context.getTypeConverter().convertTo(String.class, out));
}
@Test
public void testToDomSourceFromInputStream() throws Exception {
XmlConverter conv = new XmlConverter();
InputStream is = context.getTypeConverter().convertTo(InputStream.class, "<foo>bar</foo>");
DOMSource out = conv.toDOMSource(is, null);
assertNotNull(out);
assertEquals("<foo>bar</foo>", context.getTypeConverter().convertTo(String.class, out));
}
@Test
public void testToDomSourceFromFile() throws Exception {
XmlConverter conv = new XmlConverter();
template.sendBodyAndHeader("file:target/data/xml", "<foo>bar</foo>", Exchange.FILE_NAME, "myxml.xml");
File file = new File("target/data/xml/myxml.xml");
DOMSource out = conv.toDOMSource(file, null);
assertNotNull(out);
assertEquals("<foo>bar</foo>", context.getTypeConverter().convertTo(String.class, out));
}
@Test
public void testToDomElement() throws Exception {
XmlConverter conv = new XmlConverter();
SAXSource source = conv.toSAXSource("<foo>bar</foo>", null);
Element out = conv.toDOMElement(source);
assertNotNull(out);
assertEquals("<foo>bar</foo>", context.getTypeConverter().convertTo(String.class, out));
}
@Test
public void testToDomElementFromDocumentNode() throws Exception {
XmlConverter conv = new XmlConverter();
Document doc = context.getTypeConverter().convertTo(Document.class, "<?xml version=\"1.0\" encoding=\"UTF-8\"?><foo>bar</foo>");
Element out = conv.toDOMElement(doc);
assertNotNull(out);
assertEquals("<foo>bar</foo>", context.getTypeConverter().convertTo(String.class, out));
}
@Test
public void testToDomElementFromElementNode() throws Exception {
XmlConverter conv = new XmlConverter();
Document doc = context.getTypeConverter().convertTo(Document.class, "<?xml version=\"1.0\" encoding=\"UTF-8\"?><foo>bar</foo>");
Element out = conv.toDOMElement(doc.getDocumentElement());
assertNotNull(out);
assertEquals("<foo>bar</foo>", context.getTypeConverter().convertTo(String.class, out));
}
@Test
public void testToDocumentFromBytes() throws Exception {
XmlConverter conv = new XmlConverter();
byte[] bytes = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><foo>bar</foo>".getBytes();
Document out = conv.toDOMDocument(bytes, null);
assertNotNull(out);
assertEquals("<foo>bar</foo>", context.getTypeConverter().convertTo(String.class, out));
}
@Test
public void testToDocumentFromInputStream() throws Exception {
XmlConverter conv = new XmlConverter();
InputStream is = context.getTypeConverter().convertTo(InputStream.class, "<?xml version=\"1.0\" encoding=\"UTF-8\"?><foo>bar</foo>");
Document out = conv.toDOMDocument(is, null);
assertNotNull(out);
assertEquals("<foo>bar</foo>", context.getTypeConverter().convertTo(String.class, out));
}
@Test
public void testToInputStreamFromDocument() throws Exception {
XmlConverter conv = new XmlConverter();
Document doc = context.getTypeConverter().convertTo(Document.class, "<?xml version=\"1.0\" encoding=\"UTF-8\"?><foo>bar</foo>");
InputStream is = conv.toInputStream(doc, null);
assertNotNull(is);
assertEquals("<foo>bar</foo>", context.getTypeConverter().convertTo(String.class, is));
}
@Test
public void testToInputStreamNonAsciiFromDocument() throws Exception {
XmlConverter conv = new XmlConverter();
Document doc = context.getTypeConverter().convertTo(Document.class, "<?xml version=\"1.0\" encoding=\"UTF-8\"?><foo>\u99f1\u99ddb\u00e4r</foo>");
InputStream is = conv.toInputStream(doc, null);
assertNotNull(is);
assertEquals("<foo>\u99f1\u99ddb\u00e4r</foo>", context.getTypeConverter().convertTo(String.class, is));
}
@Test
public void testToDocumentFromFile() throws Exception {
XmlConverter conv = new XmlConverter();
File file = new File("src/test/resources/org/apache/camel/converter/stream/test.xml");
Document out = conv.toDOMDocument(file, null);
assertNotNull(out);
String s = context.getTypeConverter().convertTo(String.class, out);
assertTrue(s.contains("<firstName>James</firstName>"));
}
@Test
public void testToInputStreamByDomSource() throws Exception {
XmlConverter conv = new XmlConverter();
DOMSource source = conv.toDOMSource("<foo>bar</foo>");
InputStream out = conv.toInputStream(source, null);
assertNotSame(source, out);
String s = context.getTypeConverter().convertTo(String.class, out);
assertEquals("<foo>bar</foo>", s);
}
@Test
public void testToInputStreamNonAsciiByDomSource() throws Exception {
XmlConverter conv = new XmlConverter();
DOMSource source = conv.toDOMSource("<foo>\u99f1\u99ddb\u00e4r</foo>");
InputStream out = conv.toInputStream(source, null);
assertNotSame(source, out);
String s = context.getTypeConverter().convertTo(String.class, out);
assertEquals("<foo>\u99f1\u99ddb\u00e4r</foo>", s);
}
@Test
public void testToInputSource() throws Exception {
XmlConverter conv = new XmlConverter();
InputStream is = context.getTypeConverter().convertTo(InputStream.class, "<foo>bar</foo>");
InputSource out = conv.toInputSource(is, null);
assertNotNull(out);
assertNotNull(out.getByteStream());
}
@Test
public void testToInputSourceFromFile() throws Exception {
XmlConverter conv = new XmlConverter();
File file = new File("src/test/resources/org/apache/camel/converter/stream/test.xml");
InputSource out = conv.toInputSource(file, null);
assertNotNull(out);
assertNotNull(out.getByteStream());
}
@Test
public void testOutOptionsFromCamelContext() throws Exception {
CamelContext context = new DefaultCamelContext();
Exchange exchange = new DefaultExchange(context);
// shows how to set the OutputOptions from camelContext
context.getGlobalOptions().put(XmlConverter.OUTPUT_PROPERTIES_PREFIX + OutputKeys.ENCODING, "UTF-8");
context.getGlobalOptions().put(XmlConverter.OUTPUT_PROPERTIES_PREFIX + OutputKeys.STANDALONE, "no");
XmlConverter conv = new XmlConverter();
SAXSource source = conv.toSAXSource("<foo>bar</foo>", exchange);
DOMSource out = conv.toDOMSource(source, exchange);
assertNotSame(source, out);
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><foo>bar</foo>", conv.toString(out, exchange));
}
@Test
public void testNodeListToNode() throws Exception {
Document document = context.getTypeConverter().convertTo(Document.class, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<foo><hello>Hello World</hello></foo>");
NodeList nl = document.getElementsByTagName("hello");
assertEquals(1, nl.getLength());
Node node = context.getTypeConverter().convertTo(Node.class, nl);
assertNotNull(node);
document = context.getTypeConverter().convertTo(Document.class,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<foo><hello>Hello World</hello><hello>Hello Camel</hello></foo>");
nl = document.getElementsByTagName("hello");
assertEquals(2, nl.getLength());
// not possible as we have 2 elements in the node list
node = context.getTypeConverter().convertTo(Node.class, nl);
assertNull(node);
// and we can convert with 1 again
document = context.getTypeConverter().convertTo(Document.class, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<foo><hello>Hello World</hello></foo>");
nl = document.getElementsByTagName("hello");
assertEquals(1, nl.getLength());
node = context.getTypeConverter().convertTo(Node.class, nl);
assertNotNull(node);
}
}