package org.exist.xmldb;
import java.io.File;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import junit.framework.TestCase;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.exist.storage.DBBroker;
import org.exist.util.XMLFilenameFilter;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xmldb.api.DatabaseManager;
import org.xmldb.api.base.Collection;
import org.xmldb.api.base.Database;
import org.xmldb.api.base.Resource;
import org.xmldb.api.base.ResourceIterator;
import org.xmldb.api.base.ResourceSet;
import org.xmldb.api.base.XMLDBException;
import org.xmldb.api.modules.CollectionManagementService;
import org.xmldb.api.modules.XMLResource;
import org.xmldb.api.modules.XPathQueryService;
public class ResourceTest extends TestCase {
private final static String URI = "xmldb:exist://" + DBBroker.ROOT_COLLECTION;
private final static String DRIVER = "org.exist.xmldb.DatabaseImpl";
/**
* Constructor for XMLDBTest.
* @param arg0
*/
public ResourceTest(String arg0) {
super(arg0);
}
public void testReadNonExistingResource() {
try {
Collection testCollection = DatabaseManager.getCollection(URI + "/test");
assertNotNull(testCollection);
Resource nonExistent = testCollection.getResource("12345.xml");
assertNull(nonExistent);
} catch(Exception e) {
System.out.println("testReadNonExistingResource(): Exception: " + e);
e.printStackTrace();
fail(e.getMessage());
}
}
public void testReadResource() {
try {
Collection testCollection = DatabaseManager.getCollection(URI + "/test");
assertNotNull(testCollection);
String[] resources = testCollection.listResources();
assertEquals(resources.length, testCollection.getResourceCount());
System.out.println("reading " + resources[0]);
XMLResource doc = (XMLResource) testCollection.getResource(resources[0]);
assertNotNull(doc);
System.out.println("testing XMLResource.getContentAsSAX()");
StringWriter sout = new StringWriter();
OutputFormat format = new OutputFormat("xml", "ISO-8859-1", true);
format.setLineWidth(60);
XMLSerializer xmlout = new XMLSerializer(sout, format);
doc.getContentAsSAX(xmlout);
System.out.println("----------------------------------------");
System.out.println(sout.toString());
System.out.println("----------------------------------------");
} catch (Exception e) {
System.out.println("testReadResource(): Exception: " + e);
e.printStackTrace();
fail(e.getMessage());
}
}
public void testReadDOM() {
try {
Collection testCollection = DatabaseManager.getCollection(URI + "/test");
assertNotNull(testCollection);
XMLResource doc = (XMLResource) testCollection.getResource("r_and_j.xml");
assertNotNull(doc);
Node n = doc.getContentAsDOM();
Element elem=null;
if ( n instanceof Element ) {
elem = (Element)n;
} else if ( n instanceof Document ) {
elem = ((Document)n).getDocumentElement();
}
assertNotNull(elem);
assertEquals(elem.getNodeName(), "PLAY");
System.out.println("Root element: " + elem.getNodeName());
NodeList children = elem.getChildNodes();
Node node;
for (int i = 0; i < children.getLength(); i++) {
node = children.item(i);
System.out.println("Child: " + node.getNodeName());
assertNotNull(node);
node = node.getFirstChild();
while(node != null) {
System.out.println("child: " + node.getNodeName());
node = node.getNextSibling();
}
}
} catch (XMLDBException e) {
System.out.println("testReadDOM(): Exception: " + e);
e.printStackTrace();
fail(e.getMessage());
}
}
public void testSetContentAsSAX() {
try {
Collection testCollection = DatabaseManager.getCollection(URI + "/test");
assertNotNull(testCollection);
XMLResource doc =
(XMLResource) testCollection.createResource("test.xml", "XMLResource");
String xml =
"<test><title>Title</title>"
+ "<para>Paragraph1</para>"
+ "<para>Paragraph2</para>"
+ "</test>";
ContentHandler handler = doc.setContentAsSAX();
SAXParserFactory saxFactory = SAXParserFactory.newInstance();
saxFactory.setNamespaceAware(true);
saxFactory.setValidating(false);
SAXParser sax = saxFactory.newSAXParser();
XMLReader reader = sax.getXMLReader();
reader.setContentHandler(handler);
reader.parse(new InputSource(new StringReader(xml)));
testCollection.storeResource(doc);
} catch (Exception e) {
fail(e.getMessage());
}
}
public void testSetContentAsDOM() {
try {
Collection testCollection = DatabaseManager.getCollection(URI + "/test");
assertNotNull(testCollection);
XMLResource doc = (XMLResource) testCollection.createResource("dom.xml", "XMLResource");
String xml =
"<test><title>Title</title>"
+ "<para>Paragraph1</para>"
+ "<para>Paragraph2</para>"
+ "</test>";
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = docFactory.newDocumentBuilder();
Document dom = builder.parse(new InputSource(new StringReader(xml)));
doc.setContentAsDOM(dom.getDocumentElement());
testCollection.storeResource(doc);
} catch (Exception e) {
fail(e.getMessage());
}
}
public void testQueryRemoveResource() {
Resource resource = null;
try {
Collection testCollection = DatabaseManager.getCollection(URI + "/test");
assertNotNull(testCollection);
String resourceName = "QueryTestPerson.xml";
String id = "test." + System.currentTimeMillis();
String content = "<?xml version='1.0'?><person id=\"" + id + "\"><name>Jason</name></person>";
resource = testCollection.createResource(resourceName, "XMLResource");
resource.setContent(content);
testCollection.storeResource(resource);
XPathQueryService service = (XPathQueryService) testCollection.getService("XPathQueryService", "1.0");
ResourceSet rs = service.query("/person[@id='" + id + "']");
for (ResourceIterator iterator = rs.getIterator(); iterator.hasMoreResources();) {
Resource r = iterator.nextResource();
System.err.println("Resource id=" + r.getId() + " xml=" + r.getContent());
testCollection.removeResource(r);
resource = null;
}
} catch (XMLDBException xe) {
System.err.println("Unexpected Exception occured: " + xe.getMessage());
xe.printStackTrace();
}
}
public void testAddRemove() {
try {
final String resourceID = "addremove.xml";
XMLResource created = addResource(resourceID, xmlForTest());
assertNotNull(created);
// need to test documents xml structure
XMLResource located = resourceForId(resourceID);
assertNotNull(located);
//assertEquals((String) created.getContent(), (String) located.getContent());
removeDocument(resourceID);
XMLResource locatedAfterRemove = resourceForId(resourceID);
assertNull(locatedAfterRemove);
} catch (Exception e) {
fail(e.getMessage());
}
}
public void testAddRemoveAddWithIds() {
try {
final String resourceID = "removeWithIds;1.xml";
addResource(resourceID, "<foo1 xml:id='f'/>");
removeDocument(resourceID);
addResource(resourceID, "<foo xml:id='f'/>");
} catch (Exception e) {
fail(e.getMessage());
}
}
private void removeDocument(String id) {
try {
XMLResource resource = resourceForId(id);
if (null != resource) {
Collection collection = null;
try {
collection = DatabaseManager.getCollection(URI + "/test");
collection.removeResource(resource);
} finally {
closeCollection(collection);
}
}
} catch (Exception e) {
fail(e.getMessage());
}
}
private XMLResource addResource(String id, String content) {
Collection collection = null;
XMLResource result = null;
try {
collection = DatabaseManager.getCollection(URI + "/test");
result = (XMLResource) collection.createResource(id, XMLResource.RESOURCE_TYPE);
result.setContent(content);
collection.storeResource(result);
} catch (Exception e) {
fail(e.getMessage());
} finally {
closeCollection(collection);
}
return result;
}
private XMLResource resourceForId(String id) {
Collection collection = null;
XMLResource result = null;
try {
collection = DatabaseManager.getCollection(URI + "/test");
result = (XMLResource) collection.getResource(id);
} catch (Exception e) {
fail(e.getMessage());
} finally {
closeCollection(collection);
}
return result;
}
private void closeCollection(Collection collection) {
try {
if (null != collection) {
collection.close();
}
} catch (Exception e) {
fail(e.getMessage());
}
}
private String xmlForTest() {
return "<test><title>Title</title>"
+ "<para>Paragraph1</para>"
+ "<para>Paragraph2</para>"
+ "</test>";
}
protected void setUp() {
try {
// initialize driver
Class cl = Class.forName(DRIVER);
Database database = (Database) cl.newInstance();
database.setProperty("create-database", "true");
DatabaseManager.registerDatabase(database);
Collection root = DatabaseManager.getCollection(URI);
CollectionManagementService service =
(CollectionManagementService) root.getService(
"CollectionManagementService",
"1.0");
assertNotNull(service);
Collection testCollection = service.createCollection("test");
assertNotNull(testCollection);
String directory = "samples/shakespeare";
String existHome = System.getProperty("exist.home");
File existDir = existHome==null ? new File(".") : new File(existHome);
File dir = new File(existDir,directory);
File files[] = dir.listFiles(new XMLFilenameFilter());
for (int i = 0; i < files.length; i++) {
XMLResource res = (XMLResource) testCollection.createResource(files[i].getName(), "XMLResource");
res.setContent(files[i]);
testCollection.storeResource(res);
}
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
public static void main(String[] args) {
junit.textui.TestRunner.run(ResourceTest.class);
}
}