package org.exist.jboss;
import org.jboss.naming.NonSerializableFactory;
import org.jboss.system.ServiceMBeanSupport;
import org.xmldb.api.DatabaseManager;
import org.xmldb.api.base.Collection;
import org.xmldb.api.base.Database;
import org.xmldb.api.base.XMLDBException;
import org.xmldb.api.modules.CollectionManagementService;
import org.apache.log4j.Category;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Arrays;
/**
* This serice depends on eXists and exposes the XML:DB api
* We bind the service to JNDI for convenience reasons only
* we could just as well go through the jmx spine instead.
*
* @author Per Nyfelt
*/
public class XmlDbService extends ServiceMBeanSupport implements XmlDbServiceMBean {
private static Category LOG =
Category.getInstance( XmlDbService.class.getName() );
private String baseCollectionURI;
private String driver;
private Collection baseCollection;
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getBaseCollectionURI() {
return baseCollectionURI;
}
public void setBaseCollectionURI(String baseCollectionURI) {
this.baseCollectionURI = baseCollectionURI;
}
public Collection getBaseCollection() throws XMLDBException {
baseCollection = DatabaseManager.getCollection(baseCollectionURI);
return baseCollection;
}
protected void startService() throws Exception {
Context context = new InitialContext();
Class c = Class.forName(driver);
Database database = (Database) c.newInstance();
DatabaseManager.registerDatabase(database);
database.setProperty("create-database", "true");
baseCollection = getBaseCollection();
baseCollection.setProperty("encoding", "ISO-8859-1");
LOG.debug("Got base Collection");
NonSerializableFactory.rebind(context, this.getClass().getName(), this);
String[] collections = baseCollection.listChildCollections();
LOG.debug("ChildCollections " + Arrays.asList(collections));
}
protected void stopService() throws Exception {
NonSerializableFactory.unbind(this.getClass().getName());
if (baseCollection != null) {
baseCollection.close();
LOG.debug("Closed base (db) collection");
}
}
public static CollectionManagementService getCollectionManagementService(Collection parentCollection) throws XMLDBException {
CollectionManagementService service = (CollectionManagementService) parentCollection.getService("CollectionManagementService", "1.0");
return service;
}
}