/* * Created on 20 juil. 2004 $Id$ */ package org.exist.xmldb; import java.net.BindException; import java.util.ArrayList; import java.util.Iterator; import junit.textui.TestRunner; import org.exist.StandaloneServer; import org.exist.storage.DBBroker; import org.exist.validation.service.RemoteValidationService; import org.exist.xquery.util.URIUtils; import org.mortbay.util.MultiException; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; import org.xmldb.api.base.Service; import org.xmldb.api.base.XMLDBException; /** A test case for accessing collections remotely * @author jmv * @author Pierrick Brihaye <pierrick.brihaye@free.fr> */ public class RemoteCollectionTest extends RemoteDBTest { private static StandaloneServer server = null; private final static String XML_CONTENT = "<xml/>"; private final static String BINARY_CONTENT = "TEXT"; public RemoteCollectionTest(String name) { super(name); } protected void setUp() { try { //Don't worry about closing the server : the shutdown hook will do the job initServer(); setUpRemoteDatabase(); } catch (Exception e) { fail(e.getMessage()); } } protected void tearDown() { try { removeCollection(); } catch (Exception e) { fail(e.getMessage()); } } private void initServer() { try { if (server == null) { server = new StandaloneServer(); if (!server.isStarted()) { try { System.out.println("Starting standalone server..."); String[] args = {}; server.run(args); while (!server.isStarted()) { Thread.sleep(1000); } } catch (MultiException e) { boolean rethrow = true; Iterator i = e.getExceptions().iterator(); while (i.hasNext()) { Exception e0 = (Exception)i.next(); if (e0 instanceof BindException) { System.out.println("A server is running already !"); rethrow = false; break; } } if (rethrow) throw e; } } } } catch (Exception e) { fail(e.getMessage()); } } public void testIndexQueryService() { // TODO ............. } public void testGetServices() { try { Service[] services = getCollection().getServices(); assertEquals(7, services.length); assertEquals(RemoteXPathQueryService.class, services[0].getClass()); assertEquals(RemoteCollectionManagementService.class, services[1].getClass()); assertEquals(RemoteUserManagementService.class, services[2].getClass()); assertEquals(RemoteDatabaseInstanceManager.class, services[3].getClass()); assertEquals(RemoteIndexQueryService.class, services[4].getClass()); assertEquals(RemoteXUpdateQueryService.class, services[5].getClass()); assertEquals(RemoteValidationService.class, services[6].getClass()); } catch (Exception e) { fail(e.getMessage()); } } public void testIsRemoteCollection() { try { assertTrue(getCollection().isRemoteCollection()); } catch (Exception e) { fail(e.getMessage()); } } public void testGetPath() { try { assertEquals(DBBroker.ROOT_COLLECTION + "/" + getTestCollectionName(), URIUtils.urlDecodeUtf8(getCollection().getPath())); } catch (Exception e) { fail(e.getMessage()); } } public void testCreateResource() { try { Collection collection = getCollection(); { // XML resource: Resource resource = collection.createResource("testresource", "XMLResource"); assertNotNull(resource); assertEquals(collection, resource.getParentCollection()); resource.setContent("<?xml version='1.0'?><xml/>"); collection.storeResource(resource); } { // binary resource: Resource resource = collection.createResource("testresource", "BinaryResource"); assertNotNull(resource); assertEquals(collection, resource.getParentCollection()); resource.setContent("some random binary data here :-)"); collection.storeResource(resource); } } catch (Exception e) { fail(e.getMessage()); } } public void testGetNonExistentResource() { try { System.out.println("Retrieving non-existing resource"); Collection collection = getCollection(); Resource resource = collection.getResource("unknown.xml"); assertNull(resource); } catch (Exception e) { fail(e.getMessage()); } } public void testListResources() { try { ArrayList xmlNames = new ArrayList(); xmlNames.add("xml1"); xmlNames.add("xml2"); xmlNames.add("xml3"); createResources(xmlNames, "XMLResource"); ArrayList binaryNames = new ArrayList(); binaryNames.add("b1"); binaryNames.add("b2"); createResources(binaryNames, "BinaryResource"); String[] actualContents = getCollection().listResources(); System.out.println("Resources found: " + actualContents.length); for (int i = 0; i < actualContents.length; i++) { xmlNames.remove(actualContents[i]); binaryNames.remove(actualContents[i]); } assertEquals(0, xmlNames.size()); assertEquals(0, binaryNames.size()); } catch (Exception e) { fail(e.getMessage()); } } /** * Trying to access a collection where the parent collection does * not exist caused NullPointerException on DatabaseManager.getCollection() method. */ public void testParent() { try { Collection c = DatabaseManager.getCollection(URI + DBBroker.ROOT_COLLECTION, "admin", null); assertNull(c.getChildCollection("b")); System.err.println("col="+ c.getName()); String parentName = c.getName() + "/" + System.currentTimeMillis(); String colName = parentName + "/a"; c = DatabaseManager.getCollection(URI + parentName, "admin", null); assertNull(c); // following fails for XmlDb 20051203 c = DatabaseManager.getCollection(URI + colName, "admin", null); assertNull(c); } catch (XMLDBException xe) { System.err.println("Unexpected Exception occured: " + xe.getMessage()); xe.printStackTrace(); } } private void createResources(ArrayList names, String type) { try { for (Iterator i = names.iterator(); i.hasNext(); ) { Resource res = getCollection().createResource((String) i.next(), type); if(type.equals("XMLResource")) res.setContent(XML_CONTENT); else res.setContent(BINARY_CONTENT); getCollection().storeResource(res); } } catch (Exception e) { fail(e.getMessage()); } } public static void main(String[] args) { TestRunner.run(RemoteCollectionTest.class); //Explicit shutdown for the shutdown hook System.exit(0); } }