dnet-core/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/PersistentExistDatabase.java

208 lines
5.0 KiB
Java

package eu.dnetlib.xml.database.exist;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import eu.dnetlib.enabling.is.store.BulkResourceImporter;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
/**
* Persistent exist.
*
* TODO: this is copy&paste from TemporaryExistDatase. Refactor common stuff.
*
* @author marko
*
*/
public class PersistentExistDatabase extends ExistDatabase {
/**
* logger.
*/
private static final Log log = LogFactory.getLog(PersistentExistDatabase.class); // NOPMD by marko on 11/24/08 5:02 PM
/**
* db directory.
*/
private transient File dbDirectory;
/**
* this config file will be copied to a newly created temporary directory.
*/
private String configTemplate = "default-exist-conf.xml";
/**
* db root path.
*/
private String dbRootPath;
/**
* bulk importer.
*/
@Autowired
private BulkResourceImporter bulkImporter;
/**
* exist config file.
*/
private File existConfigFile;
/**
* true if the database permits execution of java code from xquery.
*/
private boolean XQueryJavaEnabled;
/**
* {@inheritDoc}
*
* @see eu.dnetlib.xml.database.exist.ExistDatabase#start()
*/
@Override
public void start() {
log.warn("STARTING PERSISTENT EXIST DATABASE");
dbDirectory = new File(dbRootPath);
if (dbDirectory.exists()) {
getBulkImporter().setEnabled(false);
existConfigFile = new File(dbDirectory, "conf.xml");
enableJava(existConfigFile, isXQueryJavaEnabled());
setConfigFile(existConfigFile.getAbsolutePath());
} else {
createPersistentDatabase();
}
super.start();
}
@Override
public void stop() {
log.info("shutting down xmldb");
super.stop();
log.info("xmldb closed");
}
protected void enableJava(final File conf, final boolean enabled) {
final StringWriter buffer = new StringWriter();
if (conf.exists()) {
try {
IOUtils.copy(new FileReader(conf), buffer);
final String newConf = patchConfigFileEnableJava(buffer.toString(), enabled);
if (!newConf.equals(buffer.toString())) {
FileWriter writer = new FileWriter(conf);
try {
IOUtils.copy(new StringReader(newConf), writer);
} finally {
writer.close();
}
}
} catch (final FileNotFoundException e) {
log.warn("cannot patch eXist conf file", e);
} catch (final IOException e) {
log.warn("cannot patch eXist conf file", e);
}
}
}
/**
* @param conf
* content of the configuration file
* @param enabled
* enabled or disabled
* @return new conf file
*/
protected String patchConfigFileEnableJava(final String conf, final boolean enabled) {
return conf.replaceAll("enable-java-binding=\"[^\"]*\"", "enable-java-binding=\"" + (enabled ? "yes" : "no") + "\"");
}
/**
* create a temporary directory and copy the default configuration file.
*/
protected void createPersistentDatabase() {
log.debug("creating persistent database");
try {
new File(dbDirectory, "data").mkdirs();
final InputStream defaultConf = getClass().getResourceAsStream(getConfigTemplate());
if (defaultConf == null)
throw new IOException("cannot find " + getConfigTemplate());
existConfigFile = new File(dbDirectory, "conf.xml");
final FileOutputStream confOutput = new FileOutputStream(existConfigFile);
try {
IOUtils.copy(defaultConf, confOutput);
} finally {
confOutput.close();
}
enableJava(existConfigFile, isXQueryJavaEnabled());
setConfigFile(existConfigFile.getAbsolutePath());
} catch (final IOException e) {
log.fatal("creating database dir", e);
throw new IllegalStateException(e);
}
log.debug("created temp database");
}
public File getDbDirectory() {
return dbDirectory;
}
public void setDbDirectory(final File dbDirectory) {
this.dbDirectory = dbDirectory;
}
public String getConfigTemplate() {
return configTemplate;
}
public void setConfigTemplate(final String configTemplate) {
this.configTemplate = configTemplate;
}
public BulkResourceImporter getBulkImporter() {
return bulkImporter;
}
public void setBulkImporter(final BulkResourceImporter bulkImporter) {
this.bulkImporter = bulkImporter;
}
public File getExistConfigFile() {
return existConfigFile;
}
public void setExistConfigFile(final File existConfigFile) {
this.existConfigFile = existConfigFile;
}
@Required
public String getDbRootPath() {
return dbRootPath;
}
public void setDbRootPath(final String dbRootPath) {
this.dbRootPath = dbRootPath;
}
public boolean isXQueryJavaEnabled() {
return XQueryJavaEnabled;
}
public void setXQueryJavaEnabled(final boolean xQueryJavaEnabled) {
XQueryJavaEnabled = xQueryJavaEnabled;
}
}