Package org.exist.xquery

Source Code of org.exist.xquery.DocumentUpdateTest

package org.exist.xquery;

import junit.framework.TestCase;
import junit.textui.TestRunner;

import org.exist.xmldb.DatabaseInstanceManager;
import org.exist.xmldb.XmldbURI;
import org.xmldb.api.DatabaseManager;
import org.xmldb.api.base.Collection;
import org.xmldb.api.base.Database;
import org.xmldb.api.base.ResourceSet;
import org.xmldb.api.base.XMLDBException;
import org.xmldb.api.modules.CollectionManagementService;
import org.xmldb.api.modules.XQueryService;

public class DocumentUpdateTest extends TestCase {

  private static final String TEST_COLLECTION_NAME = "testup";
   
    private Database database;
    private Collection testCollection;
   
    /**
     * Test if the doc, collection and document functions are correctly
     * notified upon document updates. Call a function once on the empty collection,
     * then call it again after a document was added, and compare the results.
     */
    public void testUpdate() {
      String imports =
        "import module namespace xdb='http://exist-db.org/xquery/xmldb';\n" +
        "import module namespace util='http://exist-db.org/xquery/util';\n";
     
    try {
      System.out.println("-- TEST 1: doc() function --");
      String query = imports +
          "declare function local:get-doc($path as xs:string) {\n" +
          "    if (doc-available($path)) then doc($path) else ()\n" +
          "};\n" +
          "let $col := xdb:create-collection('/db', 'testup')\n" +
          "let $path := '/db/testup/test1.xml'\n" +
          "let $doc := xdb:store($col, 'test1.xml', <test><n>1</n></test>)\n" +
          "let $d1 := local:get-doc($path)\n" +
          "let $remove := xdb:remove('/db/testup', 'test1.xml')\n" +
          "return string-join((string(count(local:get-doc($path))), string(doc-available($path))), ' ')";
      String result = execQuery(query);
      assertEquals(result, "0 false");
     
      System.out.println("-- TEST 2: xmldb:document() function --");
      query = imports +
          "declare function local:get-doc($path as xs:string) {\n" +
          "    if (doc-available($path)) then xmldb:document($path) else ()\n" +
          "};\n" +
          "let $col := xdb:create-collection('/db', 'testup')\n" +
          "let $path := '/db/testup/test1.xml'\n" +
          "let $d1 := local:get-doc($path)\n" +
          "let $doc := xdb:store($col, 'test1.xml', <test><n>1</n></test>)\n" +
          "return string-join((string(count(local:get-doc($path))), string(doc-available($path))), ' ')";
      result = execQuery(query);
      assertEquals(result, "1 true");
     
      System.out.println("-- TEST 3: collection() function --");
      query = imports +
        "declare function local:xpath($collection as xs:string) {\n" +
          "    for $c in collection($collection) return $c//n\n" +
          "};\n" +
          "let $col := xdb:create-collection('/db', 'testup')\n" +
          "let $path := '/db/testup'\n" +
          "let $d1 := local:xpath($path)//n/text()\n" +
          "let $doc := xdb:store($col, 'test1.xml', <test><n>1</n></test>)\n" +
          "return local:xpath($path)/text()";
      result = execQuery(query);
      assertEquals(result, "1");
   
      System.out.println("-- TEST 4: 'update insert' statement --");
      query = imports +
        "declare function local:xpath($collection as xs:string) {\n" +
          "    collection($collection)\n" +
          "};\n" +
          "let $col := xdb:create-collection('/db', 'testup')\n" +
          "let $path := '/db/testup'\n" +
          "let $d1 := local:xpath($path)//n\n" +
          "let $doc := xdb:store($col, 'test1.xml', <test><n>1</n></test>)\n" +
          "return (\n" +
          "  update insert <n>2</n> into collection($path)/test,\n" +
          "  count(local:xpath($path)//n)\n" +
          ")";
      result = execQuery(query);
      assertEquals(result, "2");

      System.out.println("-- TEST 5: 'update replace' statement --");
      query = imports + "let $doc := xdb:store('/db', 'test1.xml', " +
        "<test> " +
          "<link href=\"features\"/> " +
          "(: it works with only 1 link :) " +
          "<link href=\"features/test\"/> " +
        "</test>) " +
        "let $links := doc($doc)/test/link/@href " +
        "return " +
        "for $link in $links "
        "return ( " +
          "update replace $link with \"123\", " +
          "(: without the output on the next line, it works :) " +
          "xs:string($link) " +
        ")";
        XQueryService service = (XQueryService) testCollection.getService("XQueryService", "1.0");
        ResourceSet r = service.query(query);
        assertEquals(r.getSize(), 2);       
      assertEquals(r.getResource(0).getContent().toString(), "123");
      assertEquals(r.getResource(1).getContent().toString(), "123");
    } catch (XMLDBException e) {
      e.printStackTrace();
      fail(e.getMessage());
    }
    }
   
    public void testUpdateAttribute(){
        String query1="let $content :="
                +"<A><B><C d=\"xxx\">ccc1</C><C d=\"yyy\" e=\"zzz\">ccc2</C></B></A> "
                +"let $uri := xmldb:store(\"/db/\", \"marktest7.xml\", $content) "
                +"let $doc := doc($uri) "
                +"let $xxx := update delete $doc//@*"
                +"return $doc";

        String query2="let $doc := doc(\"/db/marktest7.xml\") "
                +"return "
                +"( for $elem in $doc//* "
                +"return update insert attribute AAA {\"BBB\"} into $elem, $doc) ";

        try {
            @SuppressWarnings("unused")
      String result1 = execQuery(query1);
        } catch (XMLDBException ex) {
            ex.printStackTrace();
            fail(ex.getMessage());
        }
       
        try {  
            @SuppressWarnings("unused")
      String result2 = execQuery(query2);
        } catch (XMLDBException ex) {
            ex.printStackTrace();
            fail(ex.getMessage());
        }

    }
   
    private String execQuery(String query) throws XMLDBException {
      XQueryService service = (XQueryService) testCollection.getService("XQueryService", "1.0");
      ResourceSet result = service.query(query);
      assertEquals(result.getSize(), 1);
      return result.getResource(0).getContent().toString();
    }
   
    protected void setUp() {
        try {
            // initialize driver
            Class<?> cl = Class.forName("org.exist.xmldb.DatabaseImpl");
            database = (Database) cl.newInstance();
            database.setProperty("create-database", "true");
            DatabaseManager.registerDatabase(database);
           
            Collection root =
                DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", "");
            CollectionManagementService service =
                (CollectionManagementService) root.getService(
                    "CollectionManagementService",
                    "1.0");
            testCollection = service.createCollection(TEST_COLLECTION_NAME);
            assertNotNull(testCollection);
        } catch (ClassNotFoundException e) {
        } catch (InstantiationException e) {
        } catch (IllegalAccessException e) {
        } catch (XMLDBException e) {
            e.printStackTrace();
        }
    }

    /*
     * @see TestCase#tearDown()
     */
    protected void tearDown() {
      try {
          Collection root =
              DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", "");
          CollectionManagementService service =
              (CollectionManagementService) root.getService(
                  "CollectionManagementService",
                  "1.0");
          service.removeCollection(TEST_COLLECTION_NAME);
         
          DatabaseManager.deregisterDatabase(database);
          DatabaseInstanceManager dim =
              (DatabaseInstanceManager) testCollection.getService(
                  "DatabaseInstanceManager", "1.0");
          dim.shutdown();
            database = null;
            testCollection = null;
          System.out.println("tearDown PASSED");
    } catch (XMLDBException e) {
      fail(e.getMessage());
    }
    }
   
    public static void main(String[] args) {
    TestRunner.run(DocumentUpdateTest.class);
  }
}
TOP

Related Classes of org.exist.xquery.DocumentUpdateTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.