/*
* eXist Open Source Native XML Database
* Copyright (C) 2001-07 The eXist Project
* http://exist-db.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* $Id$
*/
package org.exist.storage.lock;
import org.exist.TestDataGenerator;
import org.exist.storage.DBBroker;
import org.exist.xmldb.DatabaseInstanceManager;
import org.exist.xmldb.XPathQueryServiceImpl;
import org.exist.xmldb.IndexQueryService;
import org.junit.AfterClass;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import org.junit.BeforeClass;
import org.junit.Test;
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.XMLResource;
import java.io.File;
import java.util.Random;
public class ProtectedModeTest {
private final static String COLLECTION_CONFIG =
"<collection xmlns=\"http://exist-db.org/collection-config/1.0\">" +
" <index>" +
" <fulltext default=\"all\" attributes=\"false\"/>" +
" <create path=\"//section/@id\" type=\"xs:string\"/>" +
" </index>" +
"</collection>";
private final static int COLLECTION_COUNT = 20;
private final static int DOCUMENT_COUNT = 20;
private final static String generateXQ = "<book id=\"{$filename}\" n=\"{$count}\">"
+ " <chapter>"
+ " <title>{pt:random-text(7)}</title>"
+ " {"
+ " for $section in 1 to 8 return"
+ " <section id=\"sect{$section}\">"
+ " <title>{pt:random-text(7)}</title>"
+ " {"
+ " for $para in 1 to 10 return"
+ " <para>{pt:random-text(40)}</para>"
+ " }"
+ " </section>"
+ " }"
+ " </chapter>" + "</book>";
@Test
public void queryCollection() {
try {
Collection root = DatabaseManager.getCollection("xmldb:exist:///db/protected", "admin", null);
XPathQueryServiceImpl service = (XPathQueryServiceImpl) root.getService("XQueryService", "1.0");
try {
service.beginProtected();
ResourceSet result = service.query("collection('/db/protected/test5')//book");
assertEquals(result.getSize(), DOCUMENT_COUNT);
} finally {
service.endProtected();
}
} catch (XMLDBException e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@Test
public void queryRoot() {
try {
Collection root = DatabaseManager.getCollection("xmldb:exist:///db/protected", "admin", null);
XPathQueryServiceImpl service = (XPathQueryServiceImpl) root.getService("XQueryService", "1.0");
try {
service.beginProtected();
ResourceSet result = service.query("//book");
assertEquals(result.getSize(), COLLECTION_COUNT * DOCUMENT_COUNT);
} finally {
service.endProtected();
}
} catch (XMLDBException e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@Test
public void queryDocs() {
try {
Collection root = DatabaseManager.getCollection("xmldb:exist:///db/protected", "admin", null);
XPathQueryServiceImpl service = (XPathQueryServiceImpl) root.getService("XQueryService", "1.0");
Random random = new Random();
for (int i = 0; i < COLLECTION_COUNT; i++) {
String docURI = "doc('/db/protected/test" + i + "/xdb" + random.nextInt(DOCUMENT_COUNT) + ".xml')";
try {
service.beginProtected();
ResourceSet result = service.query(docURI + "//book");
assertEquals(result.getSize(), 1);
} finally {
service.endProtected();
}
}
} catch (XMLDBException e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@BeforeClass
public static void initDB() {
// initialize XML:DB driver
try {
Class cl = Class.forName("org.exist.xmldb.DatabaseImpl");
Database database = (Database) cl.newInstance();
database.setProperty("create-database", "true");
DatabaseManager.registerDatabase(database);
Collection root = DatabaseManager.getCollection("xmldb:exist://" + DBBroker.ROOT_COLLECTION, "admin", null);
CollectionManagementService mgmt = (CollectionManagementService) root.getService("CollectionManagementService", "1.0");
Collection collection = mgmt.createCollection("protected");
IndexQueryService idxConf = (IndexQueryService) collection.getService("IndexQueryService", "1.0");
idxConf.configureCollection(COLLECTION_CONFIG);
XMLResource hamlet = (XMLResource) collection.createResource("hamlet.xml", "XMLResource");
hamlet.setContent(new File("samples/shakespeare/hamlet.xml"));
collection.storeResource(hamlet);
mgmt = (CollectionManagementService) collection.getService("CollectionManagementService", "1.0");
TestDataGenerator generator = new TestDataGenerator("xdb", DOCUMENT_COUNT);
for (int i = 0; i < COLLECTION_COUNT; i++) {
Collection currentColl = mgmt.createCollection("test" + i);
System.out.println("Generating " + DOCUMENT_COUNT + " files...");
File[] files = generator.generate(currentColl, generateXQ);
for (int j = 0; j < files.length; j++) {
XMLResource resource = (XMLResource) currentColl.createResource("xdb" + j + ".xml", "XMLResource");
resource.setContent(files[j]);
currentColl.storeResource(resource);
}
}
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@AfterClass
public static void closeDB() {
try {
Collection root = DatabaseManager.getCollection("xmldb:exist://" + DBBroker.ROOT_COLLECTION, "admin", null);
CollectionManagementService cmgr = (CollectionManagementService) root.getService("CollectionManagementService", "1.0");
cmgr.removeCollection("protected");
DatabaseInstanceManager mgr = (DatabaseInstanceManager) root.getService("DatabaseInstanceManager", "1.0");
mgr.shutdown();
} catch (XMLDBException e) {
e.printStackTrace();
fail(e.getMessage());
}
}
}