package org.exist.xquery; import java.io.IOException; import junit.framework.TestCase; import junit.textui.TestRunner; import org.exist.EXistException; import org.exist.TestUtils; import org.exist.collections.Collection; import org.exist.collections.CollectionConfigurationException; import org.exist.collections.CollectionConfigurationManager; import org.exist.collections.IndexInfo; import org.exist.collections.triggers.TriggerException; import org.exist.dom.QName; import org.exist.memtree.DocBuilder; import org.exist.memtree.DocumentImpl; import org.exist.memtree.MemTreeBuilder; import org.exist.security.PermissionDeniedException; import org.exist.security.SecurityManager; import org.exist.security.xacml.AccessContext; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.serializers.Serializer; import org.exist.storage.txn.TransactionException; import org.exist.storage.txn.TransactionManager; import org.exist.storage.txn.Txn; import org.exist.util.Configuration; import org.exist.util.LockException; import org.exist.xmldb.IndexQueryService; import org.exist.xmldb.XmldbURI; import org.exist.xquery.update.Delete; import org.exist.xquery.update.Insert; import org.exist.xquery.update.Replace; import org.exist.xquery.update.Update; import org.exist.xquery.value.Item; import org.exist.xquery.value.NodeValue; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceIterator; import org.exist.xquery.value.StringValue; import org.junit.Assert; import org.w3c.dom.Element; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; import org.xmldb.api.modules.CollectionManagementService; public class XQueryUpdateTest extends TestCase { public static void main(String[] args) { TestRunner.run(XQueryUpdateTest.class); } private final static String COLLECTION_CONFIG = "<collection xmlns=\"http://exist-db.org/collection-config/1.0\">" + " <index xmlns:mods=\"http://www.loc.gov/mods/v3\">" + " <fulltext default=\"none\"/>" + " <create qname=\"description\" type=\"xs:string\"/>" + " <create qname=\"@name\" type=\"xs:string\"/>" + " </index>" + "</collection>"; protected static XmldbURI TEST_COLLECTION = XmldbURI.create(DBBroker.ROOT_COLLECTION + "/test"); protected static String TEST_XML = "<?xml version=\"1.0\"?>" + "<products/>"; protected static String UPDATE_XML = "<progress total=\"100\" done=\"0\" failed=\"0\" passed=\"0\"/>"; protected final static int ITEMS_TO_APPEND = 100; private BrokerPool pool; public void testAppend() { DBBroker broker = null; try { System.out.println("testAppend() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); String query = " declare variable $i external;\n" + " update insert\n" + " <product id='id{$i}' num='{$i}'>\n" + " <description>Description {$i}</description>\n" + " <price>{$i + 1.0}</price>\n" + " <stock>{$i * 10}</stock>\n" + " </product>\n" + " into /products"; XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, query); for (int i = 0; i < ITEMS_TO_APPEND; i++) { context.declareVariable("i", new Integer(i)); xquery.execute(compiled, null); } Sequence seq = xquery.execute("/products", null, AccessContext.TEST); assertEquals(seq.getItemCount(), 1); Serializer serializer = broker.getSerializer(); System.out.println(serializer.serialize((NodeValue) seq.itemAt(0))); seq = xquery.execute("//product", null, AccessContext.TEST); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); seq = xquery.execute("//product[price > 0.0]", null, AccessContext.TEST); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); System.out.println("testAppend: PASS"); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testAppendAttributes() { testAppend(); DBBroker broker = null; try { System.out.println("testAppendAttributes() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); String query = " declare variable $i external;\n" + " update insert\n" + " attribute name { concat('n', $i) }\n" + " into //product[@num = $i]"; XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, query); for (int i = 0; i < ITEMS_TO_APPEND; i++) { context.declareVariable("i", new Integer(i)); xquery.execute(compiled, null); } Sequence seq = xquery.execute("/products", null, AccessContext.TEST); assertEquals(seq.getItemCount(), 1); Serializer serializer = broker.getSerializer(); System.out.println(serializer.serialize((NodeValue) seq.itemAt(0))); seq = xquery.execute("//product", null, AccessContext.TEST); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); seq = xquery.execute("//product[@name = 'n20']", null, AccessContext.TEST); assertEquals(1, seq.getItemCount()); store(broker, "attribs.xml", "<test attr1='aaa' attr2='bbb'>ccc</test>"); query = "update insert attribute attr1 { 'eee' } into /test"; System.out.println("testing duplicate attribute ..."); xquery.execute(query, null, AccessContext.TEST); seq = xquery.execute("xmldb:document('" + TEST_COLLECTION + "/attribs.xml')/test[@attr1 = 'eee']", null, AccessContext.TEST); assertEquals(1, seq.getItemCount()); System.out.println(serializer.serialize((NodeValue) seq.itemAt(0))); System.out.println("testAppendAttributes: PASS"); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testInsertBefore() { DBBroker broker = null; try { System.out.println("testInsertBefore() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); String query = " update insert\n" + " <product id='original'>\n" + " <description>Description</description>\n" + " <price>0</price>\n" + " <stock>10</stock>\n" + " </product>\n" + " into /products"; XQuery xquery = broker.getXQueryService(); xquery.execute(query, null, AccessContext.TEST); query = " declare variable $i external;\n" + " update insert\n" + " <product id='id{$i}'>\n" + " <description>Description {$i}</description>\n" + " <price>{$i + 1.0}</price>\n" + " <stock>{$i * 10}</stock>\n" + " </product>\n" + " preceding /products/product[1]"; XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, query); for (int i = 0; i < ITEMS_TO_APPEND; i++) { context.declareVariable("i", new Integer(i)); xquery.execute(compiled, null); } Sequence seq = xquery.execute("/products", null, AccessContext.TEST); assertEquals(seq.getItemCount(), 1); Serializer serializer = broker.getSerializer(); System.out.println(serializer.serialize((NodeValue) seq.itemAt(0))); seq = xquery.execute("//product", null, AccessContext.TEST); assertEquals(ITEMS_TO_APPEND + 1, seq.getItemCount()); seq = xquery.execute("//product[price > 0.0]", null, AccessContext.TEST); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); System.out.println("testInsertBefore: PASS"); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testInsertAfter() { DBBroker broker = null; try { System.out.println("testInsertAfter() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); String query = " update insert\n" + " <product id='original'>\n" + " <description>Description</description>\n" + " <price>0</price>\n" + " <stock>10</stock>\n" + " </product>\n" + " into /products"; XQuery xquery = broker.getXQueryService(); xquery.execute(query, null, AccessContext.TEST); query = " declare variable $i external;\n" + " update insert\n" + " <product id='id{$i}'>\n" + " <description>Description {$i}</description>\n" + " <price>{$i + 1.0}</price>\n" + " <stock>{$i * 10}</stock>\n" + " </product>\n" + " following /products/product[1]"; XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, query); for (int i = 0; i < ITEMS_TO_APPEND; i++) { context.declareVariable("i", new Integer(i)); xquery.execute(compiled, null); } Sequence seq = xquery.execute("/products", null, AccessContext.TEST); assertEquals(seq.getItemCount(), 1); Serializer serializer = broker.getSerializer(); System.out.println(serializer.serialize((NodeValue) seq.itemAt(0))); seq = xquery.execute("//product", null, AccessContext.TEST); assertEquals(ITEMS_TO_APPEND + 1, seq.getItemCount()); seq = xquery.execute("//product[price > 0.0]", null, AccessContext.TEST); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); System.out.println("testInsertAfter: PASS"); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testUpdate() { testAppend(); DBBroker broker = null; try { System.out.println("testUpdate() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); String query = "declare option exist:output-size-limit '-1';\n" + "for $prod at $i in //product return\n" + " update value $prod/description\n" + " with concat('Updated Description', $i)"; Sequence seq = xquery.execute(query, null, AccessContext.TEST); seq = xquery.execute("//product[starts-with(description, 'Updated')]", null, AccessContext.TEST); assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); Serializer serializer = broker.getSerializer(); System.out.println(serializer.serialize((NodeValue) seq.itemAt(0))); for (int i = 1; i <= ITEMS_TO_APPEND; i++) { seq = xquery.execute("//product[description = 'Updated Description" + i + "']", null, AccessContext.TEST); assertEquals(1, seq.getItemCount()); System.out.println(serializer.serialize((NodeValue) seq.itemAt(0))); } seq = xquery.execute("//product[starts-with(description, 'Updated')]", null, AccessContext.TEST); assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); System.out.println(serializer.serialize((NodeValue) seq.itemAt(0))); query = "declare option exist:output-size-limit '-1';\n" + "for $prod at $count in //product return\n" + " update value $prod/stock/text()\n" + " with (400 + $count)"; seq = xquery.execute(query, null, AccessContext.TEST); seq = xquery.execute("//product[stock > 400]", null, AccessContext.TEST); assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); seq = xquery.execute("//product[stock = '401']", null, AccessContext.TEST); assertEquals(1, seq.getItemCount()); System.out.println(serializer.serialize((NodeValue) seq.itemAt(0))); query = "declare option exist:output-size-limit '-1';\n" + "for $prod in //product return\n" + " update value $prod/@num\n" + " with xs:int($prod/@num) * 3"; seq = xquery.execute(query, null, AccessContext.TEST); seq = xquery.execute("/products", null, AccessContext.TEST); assertEquals(seq.getItemCount(), 1); seq = xquery.execute("//product[@num = 3]", null, AccessContext.TEST); assertEquals(seq.getItemCount(), 1); System.out.println(serializer.serialize((NodeValue) seq.itemAt(0))); query = "declare option exist:output-size-limit '-1';\n" + "for $prod in //product return\n" + " update value $prod/stock\n" + " with (<local>10</local>,<external>1</external>)"; seq = xquery.execute(query, null, AccessContext.TEST); seq = xquery.execute("/products", null, AccessContext.TEST); assertEquals(seq.getItemCount(), 1); seq = xquery.execute("//product/stock/external[. = 1]", null, AccessContext.TEST); assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); System.out.println("testUpdate: PASS"); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testRemove() { testAppend(); DBBroker broker = null; try { broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); String query = "for $prod in //product return\n" + " update delete $prod\n"; Sequence seq = xquery.execute(query, null, AccessContext.TEST); seq = xquery.execute("//product", null, AccessContext.TEST); assertEquals(seq.getItemCount(), 0); System.out.println("testRemove: PASS"); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } /** * Currently fails with NPE due to indexing issue!!! */ public void bugTestRename() { testAppend(); DBBroker broker = null; try { System.out.println("testUpdate() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); String query = "for $prod in //product return\n" + " update rename $prod/description as 'desc'\n"; Sequence seq = xquery.execute(query, null, AccessContext.TEST); seq = xquery.execute("//product/desc", null, AccessContext.TEST); assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); query = "for $prod in //product return\n" + " update rename $prod/@num as 'count'\n"; seq = xquery.execute(query, null, AccessContext.TEST); seq = xquery.execute("//product/@count", null, AccessContext.TEST); assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); System.out.println("testUpdate: PASS"); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testReplace() { testAppend(); DBBroker broker = null; try { System.out.println("testReplace() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); String query = "for $prod in //product return\n" + " update replace $prod/description with <desc>An updated description.</desc>\n"; Sequence seq = xquery.execute(query, null, AccessContext.TEST); seq = xquery.execute("//product/desc", null, AccessContext.TEST); assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); query = "for $prod in //product return\n" + " update replace $prod/@num with '1'\n"; seq = xquery.execute(query, null, AccessContext.TEST); seq = xquery.execute("//product/@num", null, AccessContext.TEST); assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); query = "for $prod in //product return\n" + " update replace $prod/desc/text() with 'A new update'\n"; seq = xquery.execute(query, null, AccessContext.TEST); seq = xquery.execute("//product[starts-with(desc, 'A new')]", null, AccessContext.TEST); assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); System.out.println("testUpdate: PASS"); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testAttrUpdate() { DBBroker broker = null; try { System.out.println("testAttrUpdate() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); store(broker, "test.xml", UPDATE_XML); String query = "let $progress := /progress\n" + "for $i in 1 to 100\n" + "let $done := $progress/@done\n" + "return (\n" + " update value $done with xs:int($done + 1),\n" + " xs:int(/progress/@done)\n" + ")"; XQuery xquery = broker.getXQueryService(); Sequence result = xquery.execute(query, null, AccessContext.TEST); System.out.println("testAttrUpdate(): PASSED\n"); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testAppendCDATA() { DBBroker broker = null; try { System.out.println("testAppendCDATA() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); String query = " declare variable $i external;\n" + " update insert\n" + " <product>\n" + " <description><![CDATA[me & you <>]]></description>\n" + " </product>\n" + " into /products"; XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, query); for (int i = 0; i < ITEMS_TO_APPEND; i++) { xquery.execute(compiled, null); } Sequence seq = xquery.execute("/products", null, AccessContext.TEST); assertEquals(seq.getItemCount(), 1); Serializer serializer = broker.getSerializer(); System.out.println(serializer.serialize((NodeValue) seq.itemAt(0))); seq = xquery.execute("//product", null, AccessContext.TEST); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); System.out.println("testAppendCDATA: PASS"); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void bugtestInsertAttribDoc_1730726() { DBBroker broker = null; try { System.out.println(this.getName()+" ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); String query = "declare namespace xmldb = \"http://exist-db.org/xquery/xmldb\"; "+ "let $uri := xmldb:store(\"/db\", \"insertAttribDoc.xml\", <C/>) "+ "let $node := doc($uri)/element() "+ "let $attrib := <Value f=\"ATTRIB VALUE\"/>/@* "+ "return update insert $attrib into $node"; XQuery xquery = broker.getXQueryService(); Sequence result = xquery.execute(query, null, AccessContext.TEST); System.out.println(this.getName()+"(): PASSED\n"); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testJavaAppend() { DBBroker broker = null; try { System.out.println("testJavaAppend() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, "/products"); Sequence seq = xquery.execute(compiled, null); assertEquals(seq.getItemCount(), 1); for (int i = 0; i < ITEMS_TO_APPEND; i++) { final int num = i; NodeValue nv = context.createDocument(new DocBuilder() { public void build(MemTreeBuilder builder) { builder.startElement("", "product", "product", null); builder.addAttribute(new QName("id"), "id" + num); builder.addAttribute(new QName("num"), Integer.toString(num)); builder.startElement("", "name", "name", null); builder.characters("prod " + num); builder.endElement(); builder.endElement(); } }); Insert insert = new Insert(context, Insert.INSERT_APPEND); insert.update(seq, nv); } Sequence result = xquery.execute("//product", null, AccessContext.TEST); assertEquals(ITEMS_TO_APPEND, result.getItemCount()); printResults(broker, result); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testJavaAppendAttributes() { testJavaAppend(); DBBroker broker = null; try { System.out.println("testJavaAppendAttributes() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, "//product"); Sequence seq = xquery.execute(compiled, null); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); for (int i = 0; i < ITEMS_TO_APPEND; i++) { final int num = i; NodeValue nv = context.createDocument(new DocBuilder() { public void build(MemTreeBuilder builder) { builder.addAttribute(new QName("deliverable"), "0"); } }); Insert insert = new Insert(context, Insert.INSERT_APPEND); insert.update(seq, nv); } Sequence result = xquery.execute("//product/@deliverable", null, AccessContext.TEST); assertEquals(ITEMS_TO_APPEND, result.getItemCount()); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testJavaRemoveAttribute() { testJavaAppend(); DBBroker broker = null; try { System.out.println("testJavaRemoveAttribute() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, "//product/@id"); Sequence seq = xquery.execute(compiled, null); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); for (SequenceIterator i = seq.iterate(); i.hasNext(); ) { Item next = i.nextItem(); System.out.println("Deleting node " + next.getStringValue()); Delete delete = new Delete(context); delete.update(next.toSequence(), null); } Sequence result = xquery.execute("//product/@id", null, AccessContext.TEST); assertEquals(0, result.getItemCount()); printResults(broker, result); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testJavaRemoveElement() { testJavaAppend(); DBBroker broker = null; try { System.out.println("testJavaRemoveElement() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, "//product/name"); Sequence seq = xquery.execute(compiled, null); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); for (SequenceIterator i = seq.iterate(); i.hasNext(); ) { Item next = i.nextItem(); System.out.println("Deleting node " + next.getStringValue()); Delete delete = new Delete(context); delete.update(next.toSequence(), null); } Sequence result = xquery.execute("/product/name", null, AccessContext.TEST); assertEquals(0, result.getItemCount()); printResults(broker, result); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testJavaRemoveText() { testJavaAppend(); DBBroker broker = null; try { System.out.println("testJavaRemoveText() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, "//product/name/text()"); Sequence seq = xquery.execute(compiled, null); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); for (SequenceIterator i = seq.iterate(); i.hasNext(); ) { Item next = i.nextItem(); System.out.println("Deleting node " + next.getStringValue()); Delete delete = new Delete(context); delete.update(next.toSequence(), null); } Sequence result = xquery.execute("/product/name/text()", null, AccessContext.TEST); assertEquals(0, result.getItemCount()); printResults(broker, result); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testJavaUpdateAttribute() { testJavaAppend(); DBBroker broker = null; try { System.out.println("testJavaUpdateAttribute() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, "//product/@id"); Sequence seq = xquery.execute(compiled, null); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); for (SequenceIterator i = seq.iterate(); i.hasNext(); ) { Item next = i.nextItem(); Update update = new Update(context); update.update(next.toSequence(), new StringValue("xxx")); } Sequence result = xquery.execute("//product[@id = 'xxx']", null, AccessContext.TEST); assertEquals(ITEMS_TO_APPEND, result.getItemCount()); printResults(broker, result); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testJavaReplaceAttribute() { testJavaAppend(); DBBroker broker = null; try { System.out.println("testJavaReplaceAttribute() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, "//product/@id"); Sequence seq = xquery.execute(compiled, null); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); for (SequenceIterator i = seq.iterate(); i.hasNext(); ) { Item next = i.nextItem(); Replace update = new Replace(context); update.update(next.toSequence(), new StringValue("xxx")); } Sequence result = xquery.execute("//product[@id = 'xxx']", null, AccessContext.TEST); assertEquals(ITEMS_TO_APPEND, result.getItemCount()); printResults(broker, result); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } private void printResults(DBBroker broker, Sequence result) throws XPathException, SAXException { System.out.println("Found: " + result.getItemCount()); Serializer serializer = broker.getSerializer(); for (SequenceIterator i = result.iterate(); i.hasNext(); ) { System.out.println(serializer.serialize((NodeValue) i.nextItem())); } } public void testJavaUpdateText() { testJavaAppend(); DBBroker broker = null; try { System.out.println("testJavaUpdateText() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, "//product/name"); Sequence seq = xquery.execute(compiled, null); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); for (SequenceIterator i = seq.iterate(); i.hasNext(); ) { Item next = i.nextItem(); Update update = new Update(context); update.update(next.toSequence(), new StringValue("xxx")); } Sequence result = xquery.execute("//product[name = 'xxx']", null, AccessContext.TEST); assertEquals(ITEMS_TO_APPEND, result.getItemCount()); printResults(broker, result); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testJavaReplaceElement() { testJavaAppend(); DBBroker broker = null; try { System.out.println("testJavaReplace() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, "//product/name"); Sequence seq = xquery.execute(compiled, null); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); NodeValue replacement = context.createDocument(new DocBuilder() { public void build(MemTreeBuilder builder) { builder.startElement("", "r", "r", null); builder.characters("replaced"); builder.endElement(); } }); for (SequenceIterator i = seq.iterate(); i.hasNext(); ) { Item next = i.nextItem(); Replace update = new Replace(context); update.update(next.toSequence(), replacement); } Sequence result = xquery.execute("//product/r", null, AccessContext.TEST); printResults(broker, result); assertEquals(ITEMS_TO_APPEND, result.getItemCount()); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testJavaUpdateElement() { testJavaAppend(); DBBroker broker = null; try { System.out.println("testJavaReplace() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, "//product/name"); Sequence seq = xquery.execute(compiled, null); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); NodeValue replacement = context.createDocument(new DocBuilder() { public void build(MemTreeBuilder builder) { builder.startElement("", "r", "r", null); builder.characters("replaced"); builder.endElement(); } }); for (SequenceIterator i = seq.iterate(); i.hasNext(); ) { Item next = i.nextItem(); Update update = new Update(context); update.update(next.toSequence(), replacement); } Sequence result = xquery.execute("//product/name/r", null, AccessContext.TEST); printResults(broker, result); assertEquals(ITEMS_TO_APPEND, result.getItemCount()); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } public void testJavaInsertElement() { testJavaAppend(); DBBroker broker = null; try { System.out.println("testJavaInsertElement() ...\n"); broker = pool.get(SecurityManager.SYSTEM_USER); XQuery xquery = broker.getXQueryService(); XQueryContext context = xquery.newContext(AccessContext.TEST); CompiledXQuery compiled = xquery.compile(context, "//product/name"); Sequence seq = xquery.execute(compiled, null); assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); NodeValue replacement = context.createDocument(new DocBuilder() { public void build(MemTreeBuilder builder) { builder.startElement("", "price", "price", null); builder.characters("20.00"); builder.endElement(); } }); for (SequenceIterator i = seq.iterate(); i.hasNext(); ) { Item next = i.nextItem(); Insert update = new Insert(context, Insert.INSERT_AFTER); update.update(next.toSequence(), replacement); } Sequence result = xquery.execute("//product/price", null, AccessContext.TEST); printResults(broker, result); assertEquals(ITEMS_TO_APPEND, result.getItemCount()); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } protected void setUp() throws Exception { this.pool = startDB(); DBBroker broker = null; try { broker = pool.get(SecurityManager.SYSTEM_USER); store(broker, "test.xml", TEST_XML); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { pool.release(broker); } } private void store(DBBroker broker, String docName, String data) throws PermissionDeniedException, EXistException, TriggerException, SAXException, LockException, TransactionException { TransactionManager mgr = pool.getTransactionManager(); Txn transaction = mgr.beginTransaction(); System.out.println("Transaction started ..."); try { Collection root = broker.getOrCreateCollection(transaction, TEST_COLLECTION); broker.saveCollection(transaction, root); CollectionConfigurationManager colMgr = pool.getConfigurationManager(); colMgr.addConfiguration(transaction, broker, root, COLLECTION_CONFIG); IndexInfo info = root.validateXMLResource(transaction, broker, XmldbURI.create(docName), data); //TODO : unlock the collection here ? root.store(transaction, broker, info, data, false); mgr.commit(transaction); org.exist.dom.DocumentImpl doc = root.getDocument(broker, XmldbURI.create(docName)); broker.getSerializer().serialize(doc); } catch (IOException e) { mgr.abort(transaction); fail(); } catch (CollectionConfigurationException e) { mgr.abort(transaction); fail(e.getMessage()); } } 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() { pool = null; TestUtils.cleanupDB(); try { BrokerPool.stopAll(false); } catch (Exception e) { fail(e.getMessage()); } } }