package org.exist.xmldb; import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.sax.SAXResult; import org.exist.storage.DBBroker; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Database; import org.xmldb.api.base.ResourceIterator; import org.xmldb.api.base.ResourceSet; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XPathQueryService; /** * @author jmv */ public class DOMTest { private static String driver = "org.exist.xmldb.DatabaseImpl"; private static String baseURI = "xmldb:exist://" + DBBroker.ROOT_COLLECTION; private static String username = "admin"; private static String password = ""; private static String name = "test.xml"; public static void main(String[] args) { System.setProperty("exist.initdb", "true"); DOMTest tester = new DOMTest(); tester.runTest1(); tester.runTest2(); tester.runTest3(); tester.runTest4(false); tester.runTest4(true); } /** * - Storing XML resource from XML string * - simple XQuery * - removing resource * - shutdown with the DatabaseInstanceManager */ public void runTest1() { try { System.out.println("Running test1 ..."); Class dbc = Class.forName(driver); Database database = (Database) dbc.newInstance(); DatabaseManager.registerDatabase(database); Collection rootColl = DatabaseManager.getCollection(baseURI, "admin", ""); CollectionManagementService cms = (CollectionManagementService) rootColl.getService( "CollectionManagementService", "1.0"); cms.createCollection("A"); // jmv cms.removeCollection("A"); cms.createCollection("A"); Collection coll = rootColl.getChildCollection("A"); XMLResource r = (XMLResource) coll.createResource( name, XMLResource.RESOURCE_TYPE); r.setContent( "<properties><property key=\"type\">Table</property></properties>"); coll.storeResource(r); XPathQueryService xpqs = (XPathQueryService) coll.getService("XPathQueryService", "1.0"); ResourceSet rs = xpqs.query( "//properties[property[@key='type' and text()='Table']]"); for (ResourceIterator i = rs.getIterator(); i.hasMoreResources(); ) { r = (XMLResource) i.nextResource(); String s = (String) r.getContent(); Node content = r.getContentAsDOM(); System.out.println("Resource: " + r.getId()); System.out.println("getContent: " + s); System.out.println("getContentAsDOM: " + content); coll.removeResource(r); } cms.removeCollection("A"); DatabaseManager.deregisterDatabase(database); DatabaseInstanceManager dim = (DatabaseInstanceManager) rootColl.getService( "DatabaseInstanceManager", "1.0"); dim.shutdown(); System.out.println("test 1: PASSED"); } catch (Exception e) { System.err.println("test 1: FAILED"); e.printStackTrace(); } } /** * - create and fill a simple document via DOM and JAXP * - store it with setContentAsDOM() * - simple access via getContentAsDOM() * */ public void runTest2() { try { System.out.println("Running test 2 ..."); for (int i = 0; i < 2; i++) { Class dbc = Class.forName(driver); Database database = (Database) dbc.newInstance(); DatabaseManager.registerDatabase(database); Collection coll = DatabaseManager.getCollection(baseURI, username, password); XMLResource resource = (XMLResource) coll.getResource(name); if (resource == null) { System.out.println("Creating resource!"); resource = (XMLResource) coll.createResource( name, XMLResource.RESOURCE_TYPE); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.newDocument(); Element rootElem = doc.createElement("element"); doc.appendChild(rootElem); resource.setContentAsDOM(doc); coll.storeResource(resource); coll = DatabaseManager.getCollection( baseURI, username, password); resource = (XMLResource) coll.getResource(name); } else { System.out.println("Found resource!"); } String s = (String) resource.getContent(); Node content = resource.getContentAsDOM(); System.out.println("Resource: " + resource); System.out.println("getContent: " + s); System.out.println("getContentAsDOM: " + content); DatabaseManager.deregisterDatabase(database); DatabaseInstanceManager dim = (DatabaseInstanceManager) coll.getService( "DatabaseInstanceManager", "1.0"); dim.shutdown(); } Class dbc = Class.forName(driver); Database database = (Database) dbc.newInstance(); DatabaseManager.registerDatabase(database); Collection coll = DatabaseManager.getCollection(baseURI, username, password); XMLResource resource = (XMLResource) coll.getResource(name); coll.removeResource(resource); DatabaseManager.deregisterDatabase(database); DatabaseInstanceManager dim = (DatabaseInstanceManager) coll.getService( "DatabaseInstanceManager", "1.0"); dim.shutdown(); System.out.println("test 2: PASSED"); } catch (Exception e) { System.out.println("test 2: FAILED"); e.printStackTrace(); } } /** like test 2 but add attribute and text as well */ public void runTest3() { try { System.out.println("Running test 3 ..."); Class dbc = Class.forName("org.exist.xmldb.DatabaseImpl"); Database database = (Database) dbc.newInstance(); DatabaseManager.registerDatabase(database); Collection coll = DatabaseManager.getCollection(baseURI, username, password); XMLResource resource = (XMLResource) coll.createResource( name, XMLResource.RESOURCE_TYPE); Document doc = DocumentBuilderFactory .newInstance() .newDocumentBuilder() .newDocument(); Element rootElem = doc.createElement("element"); Element propertyElem = doc.createElement("property"); propertyElem.setAttribute("key", "value"); propertyElem.appendChild(doc.createTextNode("text")); rootElem.appendChild(propertyElem); doc.appendChild(rootElem); resource.setContentAsDOM(doc); coll.storeResource(resource); coll.close(); coll = DatabaseManager.getCollection(baseURI, username, password); resource = (XMLResource) coll.getResource(name); String s = (String) resource.getContent(); Node n = resource.getContentAsDOM(); System.out.println("getContent: " + s); System.out.println("getContentAsDOM: " + n); coll.removeResource(resource); DatabaseManager.deregisterDatabase(database); DatabaseInstanceManager dim = (DatabaseInstanceManager) coll.getService( "DatabaseInstanceManager", "1.0"); dim.shutdown(); System.out.println("test 3 : PASSED"); } catch (Exception e) { System.out.println("test 3 : FAILED"); e.printStackTrace(); } } /** like test 3 but uses the DOM as input to an (identity) XSLT transform */ public void runTest4(boolean getContentAsDOM) { Database database = null; try { System.out.println("Running test 4 ..."); Class dbc = Class.forName("org.exist.xmldb.DatabaseImpl"); database = (Database) dbc.newInstance(); DatabaseManager.registerDatabase(database); Collection coll = DatabaseManager.getCollection(baseURI, username, password); XMLResource resource = (XMLResource) coll.createResource( name, XMLResource.RESOURCE_TYPE); Document doc = DocumentBuilderFactory .newInstance() .newDocumentBuilder() .newDocument(); Element rootElem = doc.createElement("element"); Element propertyElem = doc.createElement("property"); propertyElem.setAttribute("key", "value"); propertyElem.appendChild(doc.createTextNode("text")); rootElem.appendChild(propertyElem); doc.appendChild(rootElem); resource.setContentAsDOM(doc); coll.storeResource(resource); coll.close(); coll = DatabaseManager.getCollection(baseURI, username, password); resource = (XMLResource) coll.getResource(name); Node n; if (getContentAsDOM) { n = resource.getContentAsDOM(); } else { String s = (String) resource.getContent(); byte[] bytes; bytes = s.getBytes("UTF-8"); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); n = db.parse(bais); } System.out.println("getContentAsDOM: " + n.getNodeName()); Transformer t = TransformerFactory.newInstance().newTransformer(); DOMSource source = new DOMSource(n); SAXResult result = new SAXResult(new DOMTest.SAXHandler()); t.transform(source, result); coll.removeResource(resource); System.out.println("test 4 : PASSED"); } catch (Exception e) { System.out.println("test 4 : FAILED"); e.printStackTrace(); } finally { if (database != null) { try { Collection coll = DatabaseManager.getCollection( baseURI, username, password); DatabaseManager.deregisterDatabase(database); DatabaseInstanceManager dim = (DatabaseInstanceManager) coll.getService( "DatabaseInstanceManager", "1.0"); dim.shutdown(); } catch (Exception e) { } } } } public static class SAXHandler implements ContentHandler { SAXHandler() { } public void characters(char[] ch, int start, int length) { System.out.println( "SAXHandler.characters(" + new String(ch) + ", " + start + ", " + length + ")"); } public void endDocument() { System.out.println("SAXHandler.endDocument()"); } public void endElement( String namespaceURI, String localName, String qName) { System.out.println( "SAXHandler.endElement(" + namespaceURI + ", " + localName + ", " + qName + ")"); } public void endPrefixMapping(String prefix) { System.out.println("SAXHandler.endPrefixMapping(" + prefix + ")"); } public void ignorableWhitespace(char[] ch, int start, int length) { System.out.println( "SAXHandler.ignorableWhitespace(" + new String(ch) + ", " + start + ", " + length + ")"); } public void processingInstruction(String target, String data) { System.out.println( "SAXHandler.processingInstruction(" + target + ", " + data + ")"); } public void setDocumentLocator(Locator locator) { System.out.println( "SAXHandler.setDocumentLocator(" + locator + ")"); } public void skippedEntity(String name) { System.out.println("SAXHandler.skippedEntity(" + name + ")"); } public void startDocument() { System.out.println("SAXHandler.startDocument()"); } public void startElement( String namespaceURI, String localName, String qName, Attributes atts) { System.out.println( "SAXHandler.startElement(" + namespaceURI + ", " + localName + ", " + qName + "," + atts + ")"); } public void startPrefixMapping(String prefix, String xuri) { System.out.println( "SAXHandler.startPrefixMapping(" + prefix + ", " + xuri + ")"); } } }