/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.cache;
import java.io.File;
import org.fudgemsg.FudgeContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
/**
* An implementation of {@link ViewComputationCacheSource} which will use an injected
* {@link IdentifierMap} and construct {@link DefaultViewComputationCache}
* instances on demand to satisfy cache requests.
*/
public class BerkeleyDBViewComputationCacheSource extends DefaultViewComputationCacheSource {
private static final Logger s_logger = LoggerFactory.getLogger(BerkeleyDBViewComputationCacheSource.class);
private static Environment constructDatabaseEnvironmentImpl(final File dbDir, final boolean transactional) {
if (!dbDir.exists()) {
dbDir.mkdirs();
}
final EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setAllowCreate(true);
envConfig.setTransactional(transactional);
return new Environment(dbDir, envConfig);
}
private static void deleteFile(final File file) {
if (file.isDirectory()) {
for (final File subfile : file.listFiles()) {
deleteFile(subfile);
}
}
file.delete();
}
public static Environment constructDatabaseEnvironment(final File dbDir, final boolean transactional) {
try {
return constructDatabaseEnvironmentImpl(dbDir, transactional);
} catch (final RuntimeException e) {
s_logger.warn("Error creating DB environment, deleting {} and trying again", dbDir);
deleteFile(dbDir);
return constructDatabaseEnvironmentImpl(dbDir, transactional);
}
}
public BerkeleyDBViewComputationCacheSource(final IdentifierMap identifierMap, final Environment dbEnvironment, final FudgeContext fudgeContext) {
super(identifierMap, fudgeContext, new DefaultFudgeMessageStoreFactory(new BerkeleyDBBinaryDataStoreFactory(
dbEnvironment), fudgeContext));
}
}