package nl.ipo.cds.metadata; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import javax.xml.parsers.DocumentBuilderFactory; import nl.ipo.cds.metadata.XMLRewriter; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Node; public class XMLRewriterTest { private Document toDocument(String content) throws Exception { return toDocument(new ByteArrayInputStream(content.getBytes("utf-8"))); } private Document toDocument(InputStream inputStream) throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); return dbf.newDocumentBuilder().parse(inputStream); } private Node skipText(Node n) { while(n.getNodeType() == Node.TEXT_NODE) { n = n.getNextSibling(); } return n; } @Test public void testModify() throws Exception { XMLRewriter rewriter = new XMLRewriter(toDocument( "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<a xmlns=\"http://idgis.eu/myNamespace\"><b>Foo</b><c>Bar</c></a>")); rewriter.addNamespace("prefix", "http://idgis.eu/myNamespace"); rewriter.modify("/prefix:a/prefix:c", "Hello world!"); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); rewriter.write(outputStream); Document document = toDocument(new ByteArrayInputStream(outputStream.toByteArray())); assertNotNull(document); Node a = document.getFirstChild(); assertEquals("a", a.getLocalName()); Node b = skipText(a.getFirstChild()); assertEquals("b", b.getLocalName()); assertEquals("Foo", b.getTextContent()); Node c = skipText(b.getNextSibling()); assertEquals("c", c.getLocalName()); assertEquals("Hello world!", c.getTextContent()); } @Test(expected=IllegalArgumentException.class) public void testNonSingleNodeException() throws Exception { XMLRewriter rewriter = new XMLRewriter(toDocument( "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<a xmlns=\"http://idgis.eu/myNamespace\"><b>Foo</b><c>Bar</c></a>")); rewriter.modify("//*", "Hello world!"); } }