package org.exist.xmldb;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import junit.framework.TestCase;
import org.exist.TestUtils;
import org.exist.dom.XMLUtil;
import org.exist.storage.DBBroker;
import org.exist.util.XMLFilenameFilter;
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.Service;
import org.xmldb.api.modules.BinaryResource;
import org.xmldb.api.modules.CollectionManagementService;
import org.xmldb.api.modules.XMLResource;
public class CreateCollectionsTest extends TestCase {
private final static String URI = "xmldb:exist://" + DBBroker.ROOT_COLLECTION;
private final static String DRIVER = "org.exist.xmldb.DatabaseImpl";
public Collection root = null;
public CreateCollectionsTest(String arg0) {
super(arg0);
}
protected void setUp() {
try {
// initialize driver
Class cl = Class.forName(DRIVER);
Database database = (Database) cl.newInstance();
database.setProperty("create-database", "true");
DatabaseManager.registerDatabase(database);
// get root collection
root = DatabaseManager.getCollection(URI);
assertNotNull(root);
} catch (Exception e) {
fail(e.getMessage());
}
}
protected void tearDown() throws Exception {
TestUtils.cleanupDB();
root = null;
}
public void testCreateCollection() {
try {
System.out.println(
"Created Collection: "
+ root.getName()
+ "( "
+ root.getClass()
+ " )");
Service[] services = root.getServices();
System.out.println("services array: " + services);
assertTrue(
"Collection must provide at least one Service",
services != null && services.length > 0);
System.out.println(" number of services: " + services.length);
for (int i = 0; i < services.length; i++) {
System.out.println(
" Service: "
+ services[i].getName()
+ "( "
+ services[i].getClass()
+ " )");
}
Collection parentCollection = root.getParentCollection();
System.out.println("root parentCollection: " + parentCollection);
assertNull("root collection has no parent", parentCollection);
CollectionManagementService service =
(CollectionManagementService) root.getService(
"CollectionManagementService",
"1.0");
assertNotNull(service);
Collection testCollection = service.createCollection("test");
assertNotNull(testCollection);
int ccc = testCollection.getChildCollectionCount();
assertTrue(
"Collection just created: ChildCollectionCount==0",
ccc == 0);
assertTrue(
"Collection state should be Open after creation",
testCollection.isOpen());
String directory = "samples/shakespeare";
System.out.println("---------------------------------------");
System.out.println("storing all XML files in directory " +directory+"...");
System.out.println("---------------------------------------");
String existHome = System.getProperty("exist.home");
File existDir = existHome==null ? new File(".") : new File(existHome);
File f = new File(existDir,directory);
File files[] = f.listFiles(new XMLFilenameFilter());
for (int i = 0; i < files.length; i++) {
storeResourceFromFile(files[i], testCollection);
}
HashSet fileNamesJustStored = new HashSet();
for (int i = 0; i < files.length; i++) {
String file = files[i].toString();
int lastSeparator = file.lastIndexOf(File.separatorChar);
fileNamesJustStored.add(file.substring(lastSeparator + 1));
}
System.out.println("fileNames stored: " + fileNamesJustStored.toString());
String[] resourcesNames = testCollection.listResources();
int resourceCount = testCollection.getResourceCount();
System.out.println( "testCollection.getResourceCount()=" + resourceCount);
ArrayList fileNamesPresentInDatabase = new ArrayList();
for (int i = 0; i < resourcesNames.length; i++) {
fileNamesPresentInDatabase.add( resourcesNames[i]);
}
assertTrue( "resourcesNames must contain fileNames just stored",
fileNamesPresentInDatabase. containsAll( fileNamesJustStored) );
String fileToRemove = "macbeth.xml";
Resource resMacbeth = testCollection.getResource(fileToRemove);
assertNotNull("getResource(" + fileToRemove + "\")", resMacbeth);
testCollection.removeResource(resMacbeth);
assertTrue(
"After removal resource count must decrease",
testCollection.getResourceCount() == resourceCount - 1);
// restore the resource just removed :
storeResourceFromFile(
new File(existDir,
directory + File.separatorChar + fileToRemove),
testCollection);
byte[] data = storeBinaryResourceFromFile( new File( existDir,"webapp/logo.jpg"), testCollection);
Object content = testCollection.getResource("logo.jpg").getContent();
byte[] dataStored = (byte[])content;
assertTrue("After storing binary resource, data out==data in",
Arrays.equals(dataStored, data) );
} catch (Exception e) {
fail(e.getMessage());
}
}
private XMLResource storeResourceFromFile(File file, Collection testCollection) {
XMLResource res = null;
try {
System.out.println("storing " + file.getAbsolutePath());
String xml;
res = (XMLResource) testCollection.createResource(file.getName(), "XMLResource");
assertNotNull("storeResourceFromFile", res);
xml = XMLUtil.readFile(file, "UTF-8");
res.setContent(xml);
testCollection.storeResource(res);
System.out.println("stored " + file.getAbsolutePath());
} catch (Exception e) {
fail(e.getMessage());
}
return res;
}
private byte[] storeBinaryResourceFromFile(File file, Collection testCollection) {
byte[] data = null;
try {
System.out.println("storing " + file.getAbsolutePath());
Resource res = (BinaryResource)testCollection.createResource(file.getName(), "BinaryResource");
assertNotNull("store binary Resource From File", res);
// Get an array of bytes from the file:
FileInputStream istr = new FileInputStream(file);
BufferedInputStream bstr = new BufferedInputStream( istr ); // promote
int size = (int) file.length(); // get the file size (in bytes)
data = new byte[size]; // allocate byte array of right size
bstr.read( data, 0, size ); // read into byte array
bstr.close();
res.setContent(data);
testCollection.storeResource(res);
System.out.println("stored " + file.getAbsolutePath());
} catch (Exception e) {
fail(e.getMessage());
}
return data;
}
public void testMultipleCreates() {
try {
Collection rootColl = DatabaseManager.getCollection("xmldb:exist://" + DBBroker.ROOT_COLLECTION);
CollectionManagementService cms = (CollectionManagementService)
rootColl.getService("CollectionManagementService", "1.0");
assertNotNull(cms);
cms.createCollection("dummy1");
printChildren(rootColl);
Collection c1 = rootColl.getChildCollection("dummy1");
assertNotNull(c1);
cms.setCollection(c1);
cms.createCollection("dummy2");
Collection c2 = c1.getChildCollection("dummy2");
assertNotNull(c2);
cms.setCollection(c2);
cms.createCollection("dummy3");
Collection c3 = c2.getChildCollection("dummy3");
assertNotNull(c3);
cms.setCollection(rootColl);
cms.removeCollection("dummy1");
printChildren(rootColl);
c1 = rootColl.getChildCollection("dummy1");
assertNull(c1);
} catch(Exception e) {
fail(e.getMessage());
}
}
private static void printChildren(Collection c) {
try{
System.out.print("Children of " + c.getName() + ":");
String[] names = c.listChildCollections();
for (int i = 0; i < names.length; i++)
System.out.print(" " + names[i]);
System.out.println();
} catch(Exception e) {
fail(e.getMessage());
}
}
public static void main(String[] args) {
junit.textui.TestRunner.run(CreateCollectionsTest.class);
}
}