package org.exist.jboss.exist;
import org.exist.storage.BrokerPool;
import org.exist.util.Configuration;
import org.exist.EXistException;
import org.jboss.system.ServiceMBeanSupport;
import org.apache.log4j.Category;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
* This service handles the lifecycle of the eXist XML database
*
* @author Per Nyfelt
*/
public class EXistService extends ServiceMBeanSupport implements EXistServiceMBean {
private static Category LOG =
Category.getInstance( EXistService.class.getName() );
protected String confFile;
protected Configuration configuration;
protected String eXistHome;
private static final String DEFAULT_CONFIG = "<?xml version='1.0'?> " +
"<exist> " +
"<db-connection database='native' files='data' " +
"buffers='512' words_buffers='8192' " +
"elements_buffers='1024' free_mem_min='2000000' " +
"grow='32' compress='false'/> " +
"<indexer batchLoad='true' tmpDir='tmp' " +
"stemming='false' controls='ctl' caseSensitive='false' " +
"suppress-whitespace='both'> " +
"<stopwords file='stopword'/> " +
"</indexer> " +
"</exist>";
public String getEXistHome() {
return eXistHome;
}
public void setEXistHome(String existHome) {
this.eXistHome = existHome;
}
protected void startService() throws Exception {
// get path to the deploy target directory
String jbossServerDir = System.getProperty("jboss.server.home.dir");
LOG.debug("jbossServerDir is " + jbossServerDir + ", eXistHome is " + eXistHome);
File eXistHomeDir = new File(jbossServerDir, eXistHome);
LOG.debug("eXistHomeDir set to " + eXistHomeDir);
eXistHome = eXistHomeDir.getAbsolutePath();
LOG.debug("eXistHome set to " + eXistHome);
if (!eXistHomeDir.exists()) {
LOG.info("exist home directory not found at " + eXistHome + ", creating new directory");
eXistHomeDir.mkdirs();
}
System.setProperty("exist.home", eXistHome);
File dataDir = new File(eXistHomeDir, "data");
if (!dataDir.exists()) {
LOG.info("creating data dir in eXist home");
dataDir.mkdirs();
}
confFile = new File(eXistHome, "conf.xml").getAbsolutePath();
LOG.debug("confFile set to " + confFile);
File f = new File(confFile);
if (!f.exists()) {
LOG.info("Config file does not exist, creating default configuration...");
createDefaultConfigFile(f);
}
if (!f.canRead()) {
throw new IOException("configuration file " + confFile + " is not readable");
}
configuration = new Configuration(confFile, eXistHome);
if (configuration == null) {
throw new Exception("Failed to create configuration for database");
}
if (!BrokerPool.isConfigured()) {
LOG.debug("Configuring database");
BrokerPool.configure(1, 5, configuration);
}
}
private void createDefaultConfigFile(File file) throws IOException {
FileWriter writer = new FileWriter(file);
writer.write(DEFAULT_CONFIG);
writer.flush();
writer.close();
}
protected void stopService() throws Exception {
if (BrokerPool.isConfigured()) {
BrokerPool.stop();
}
}
/**
* This is for the JMX HTML adapter to display som status info about the server
* @return an HTML string containing the db stauts
*/
public String getStatus() {
String output = "";
try {
if (!BrokerPool.isConfigured())
output += "<p>Server is not running ...</p>";
else {
output += "<p>The database server is running ...</p>";
BrokerPool pool = BrokerPool.getInstance();
Configuration conf = pool.getConfiguration();
output += "<table width=\"80%\"><tr> <th colspan=\"2\" align=\"left\" bgcolor=\"#0086b2\"><b>Status</b></th></tr>";
output += "<tr><td>Configuration:</td><td>" + conf.getPath() + "</td></tr>";
output += "<tr><td>Data directory:</td><td>" + (String) conf.getProperty(BrokerPool.PROPERTY_DATA_DIR) + "</td></tr>";
output += "<tr><td>Active instances:</td><td>" + pool.active() + "</td></tr>";
output += "<tr><td>Available instances:</td><td>" + pool.available() + "</td></tr>";
output += "</table>";
}
} catch (EXistException e) {
output += e.toString();
}
return output;
}
}