package org.exist.dom;
import org.custommonkey.xmlunit.XMLTestCase;
import org.exist.collections.Collection;
import org.exist.collections.IndexInfo;
import org.exist.storage.BrokerPool;
import org.exist.storage.DBBroker;
import org.exist.storage.lock.Lock;
import org.exist.storage.txn.TransactionManager;
import org.exist.storage.txn.Txn;
import org.exist.util.Configuration;
import org.exist.xmldb.XmldbURI;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* Tests basic DOM methods like getChildNodes(), getAttribute() ...
*
* @author wolf
*
*/
public class NodeTest extends XMLTestCase {
public static void main(String[] args) {
junit.textui.TestRunner.run(NodeTest.class);
}
private static final String XML =
"<!-- doc starts here -->" +
"<test xmlns:ns=\"http://foo.org\">" +
" <a ns:a=\"1\" ns:b=\"m\">abc</a>" +
" <b ns:a=\"2\">def</b>" +
" <c>ghi</c>" +
" <d>jkl</d>" +
"</test>";
private BrokerPool pool = null;
private Collection root = null;
public void testDocument() {
DBBroker broker = null;
DocumentImpl doc = null;
try {
assertNotNull(pool);
broker = pool.get(pool.getSecurityManager().getSystemSubject());
assertNotNull(broker);
doc = root.getDocumentWithLock(broker, XmldbURI.create("test.xml"),Lock.READ_LOCK);
NodeList children = doc.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
StoredNode node = (StoredNode) children.item(i);
System.out.println(node.getNodeId() + ": " + node.getNodeName());
}
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
} finally {
if (doc != null) doc.getUpdateLock().release(Lock.READ_LOCK);
if (pool != null) pool.release(broker);
}
}
public void testChildAxis() {
DBBroker broker = null;
DocumentImpl doc = null;
try {
assertNotNull(pool);
broker = pool.get(pool.getSecurityManager().getSystemSubject());
assertNotNull(broker);
doc = root.getDocumentWithLock(broker, XmldbURI.create("test.xml"),Lock.READ_LOCK);
Element rootNode = doc.getDocumentElement();
System.out.println("Testing getChildNodes() ...");
NodeList cl = rootNode.getChildNodes();
assertEquals(((StoredNode)rootNode).getChildCount(), cl.getLength());
assertEquals(4, cl.getLength());
assertEquals(cl.item(0).getNodeName(), "a");
assertEquals(cl.item(1).getNodeName(), "b");
System.out.println("Testing getFirstChild() ...");
StoredNode node = (StoredNode) cl.item(1).getFirstChild();
assertEquals(node.getNodeValue(), "def");
System.out.println("Testing getChildNodes() ...");
node = (StoredNode) cl.item(0);
assertEquals(3, node.getChildCount());
assertEquals(2, node.getAttributesCount());
cl = node.getChildNodes();
assertEquals(3, cl.getLength());
assertEquals(cl.item(2).getNodeValue(), "abc");
System.out.println("Testing getParentNode() ...");
Node parent = cl.item(0).getParentNode();
assertNotNull(parent);
assertEquals(parent.getNodeName(), "a");
parent = parent.getParentNode();
assertNotNull(parent);
assertEquals(parent.getNodeName(), "test");
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
} finally {
if (doc != null) doc.getUpdateLock().release(Lock.READ_LOCK);
if (pool != null) pool.release(broker);
}
}
public void testSiblingAxis() {
DBBroker broker = null;
DocumentImpl doc = null;
try {
assertNotNull(pool);
broker = pool.get(pool.getSecurityManager().getSystemSubject());
assertNotNull(broker);
System.out.println("testSiblingAxis() ...");
doc = root.getDocumentWithLock(broker, XmldbURI.create("test.xml"),Lock.READ_LOCK);
Element rootNode = doc.getDocumentElement();
Element child = (Element) rootNode.getFirstChild();
assertNotNull(child);
assertEquals(child.getNodeName(), "a");
Node sibling = child.getNextSibling();
assertNotNull(sibling);
assertEquals(sibling.getNodeName(), "b");
while (sibling != null) {
System.out.println(sibling);
sibling = sibling.getNextSibling();
}
NodeList cl = rootNode.getChildNodes();
sibling = cl.item(2).getFirstChild();
System.out.println("Sibling = " + sibling);
sibling = sibling.getNextSibling();
// should be null - there's no following sibling
System.out.println("Sibling = " + sibling);
int count = 0;
sibling = cl.item(3);
while (sibling != null) {
System.out.println(sibling);
sibling = sibling.getPreviousSibling();
count++;
}
assertEquals(count, 4);
System.out.println("testSiblingAxis(): PASS");
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
} finally {
if (doc != null) doc.getUpdateLock().release(Lock.READ_LOCK);
if (pool != null) pool.release(broker);
}
}
public void testAttributeAxis() {
DBBroker broker = null;
DocumentImpl doc = null;
try {
assertNotNull(pool);
broker = pool.get(pool.getSecurityManager().getSystemSubject());
assertNotNull(broker);
doc = root.getDocumentWithLock(broker, XmldbURI.create("test.xml"),Lock.READ_LOCK);
Element rootNode = doc.getDocumentElement();
Element first = (Element) rootNode.getFirstChild();
assertEquals(first.getNodeName(), "a");
assertEquals(first.getAttribute("ns:a"), "1");
assertEquals(first.getAttributeNS("http://foo.org", "a"), "1");
Attr attr = first.getAttributeNode("ns:a");
assertNotNull(attr);
assertEquals(attr.getLocalName(), "a");
assertEquals(attr.getNamespaceURI(), "http://foo.org");
assertEquals(attr.getValue(), "1");
Node parent = attr.getOwnerElement();
assertNotNull(parent);
assertEquals(parent.getNodeName(), "a");
parent = attr.getParentNode();
assertNotNull(parent);
assertEquals(parent.getNodeName(), "a");
attr = first.getAttributeNodeNS("http://foo.org", "a");
assertNotNull(attr);
assertEquals(attr.getLocalName(), "a");
assertEquals(attr.getNamespaceURI(), "http://foo.org");
assertEquals(attr.getValue(), "1");
NamedNodeMap map = first.getAttributes();
assertEquals(2, map.getLength());
for (int i = 0; i < map.getLength(); i++)
System.out.println(map.item(i).getNodeName());
attr = (Attr) map.getNamedItemNS("http://foo.org", "b");
assertNotNull(attr);
assertEquals(attr.getLocalName(), "b");
assertEquals(attr.getNamespaceURI(), "http://foo.org");
assertEquals(attr.getValue(), "m");
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
} finally {
if (doc != null) doc.getUpdateLock().release(Lock.READ_LOCK);
if (pool != null) pool.release(broker);
}
}
@Deprecated
public void testVisitor() {
DBBroker broker = null;
DocumentImpl doc = null;
try {
assertNotNull(pool);
broker = pool.get(pool.getSecurityManager().getSystemSubject());
assertNotNull(broker);
System.out.println("testVisitor() ...");
doc = root.getDocumentWithLock(broker, XmldbURI.create("test.xml"));
StoredNode rootNode = (StoredNode) doc.getDocumentElement();
NodeVisitor visitor = new NodeVisitor() {
public boolean visit(StoredNode node) {
System.out.println(node.getNodeId() + "\t" + node.getNodeName());
return true;
};
};
rootNode.accept(visitor);
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
} finally {
if (doc != null) doc.getUpdateLock().release(Lock.READ_LOCK);
if (pool != null) pool.release(broker);
}
}
protected void setUp() throws Exception {
DBBroker broker = null;
TransactionManager transact = null;
Txn transaction = null;
try {
pool = startDB();
assertNotNull(pool);
broker = pool.get(pool.getSecurityManager().getSystemSubject());
assertNotNull(broker);
transact = pool.getTransactionManager();
assertNotNull(transact);
transaction = transact.beginTransaction();
assertNotNull(transaction);
System.out.println("NodeTest#setUp ...");
root = broker.getOrCreateCollection(transaction, XmldbURI.create(XmldbURI.ROOT_COLLECTION + "/test"));
assertNotNull(root);
broker.saveCollection(transaction, root);
IndexInfo info = root.validateXMLResource(transaction, broker, XmldbURI.create("test.xml"), XML);
//TODO : unlock the collection here ?
assertNotNull(info);
root.store(transaction, broker, info, XML, false);
transact.commit(transaction);
System.out.println("NodeTest#setUp finished.");
} catch (Exception e) {
transact.abort(transaction);
fail(e.getMessage());
} finally {
if (pool != null) pool.release(broker);
}
}
protected BrokerPool startDB() {
String home, file = "conf.xml";
home = System.getProperty("exist.home");
if (home == null)
home = System.getProperty("user.dir");
try {
Configuration config = new Configuration(file, home);
BrokerPool.configure(1, 5, config);
return BrokerPool.getInstance();
} catch (Exception e) {
fail(e.getMessage());
}
return null;
}
protected void tearDown() {
DBBroker broker = null;
TransactionManager transact = null;
Txn transaction = null;
try {
broker = pool.get(pool.getSecurityManager().getSystemSubject());
assertNotNull(broker);
transact = pool.getTransactionManager();
assertNotNull(transact);
transaction = transact.beginTransaction();
assertNotNull(transaction);
System.out.println("BasicNodeSetTest#tearDown >>>");
root = broker.getOrCreateCollection(transaction, XmldbURI.create(XmldbURI.ROOT_COLLECTION + "/test"));
assertNotNull(root);
broker.removeCollection(transaction, root);
transact.commit(transaction);
} catch (Exception e) {
transact.abort(transaction);
e.printStackTrace();
} finally {
if (pool != null) pool.release(broker);
}
BrokerPool.stopAll(false);
root = null;
pool = null;
}
}