//package org.genedb.web.mvc.model;
//
//import org.apache.log4j.Logger;
//
//import java.io.File;
//
//import com.sleepycat.bind.EntryBinding;
//import com.sleepycat.bind.serial.SerialBinding;
//import com.sleepycat.bind.serial.StoredClassCatalog;
//import com.sleepycat.collections.StoredMap;
//import com.sleepycat.je.Database;
//import com.sleepycat.je.DatabaseConfig;
//import com.sleepycat.je.DatabaseException;
//import com.sleepycat.je.Environment;
//import com.sleepycat.je.EnvironmentConfig;
//import com.sleepycat.je.EnvironmentLockedException;
//
//
//public class BerkeleyMapFactory {
//
// private Environment env;
//
// private StoredClassCatalog javaCatalog;
// private Database dtoDb;
//
// private StoredMap<Integer, TranscriptDTO> dtoMap;
//
// public StoredMap<Integer, TranscriptDTO> getDtoMap() {
// openDb();
// return dtoMap;
// }
//
// private String rootDirectory;
//
// private boolean readOnly;
//
// public StoredMap<Integer, String> getContextMapMap() {
// openDb();
// return contextMapMap;
// }
//
// public StoredMap<String, byte[]> getImageMap() {
// openDb();
// return imageMap;
// }
//
// private StoredMap<String, byte[]> imageMap;
// private Database imageDb;
//
// private StoredMap<Integer, String> contextMapMap;
// private Database contextMapDb;
//
// private final static Logger logger = Logger.getLogger(BerkeleyMapFactory.class);
//
// private final String CLASS_CATALOG = "java_class_catalog";
//
// private final String DTO_STORE = "dtos";
// private String CONTEXT_MAP_STORE = "context";
// private String IMAGE_MAP_STORE = "images";
//
// // This field must only be accessed while holding a lock on this object
// private boolean databaseIsOpen = false;
//
// {
// logger.debug("Instantiating BerkeleyMapFactory");
// }
//
// private synchronized void openDb() {
// if (databaseIsOpen) {
// return;
// }
//
// Runtime.getRuntime().addShutdownHook( new Thread() {
// @Override
// public void run() {
// closeDb();
// }
// });
//
// logger.debug("Opening environment in: " + rootDirectory);
// File rootDirectoryFile = new File(rootDirectory);
// if (!rootDirectoryFile.exists()) {
// rootDirectoryFile.mkdirs();
// } else {
// File lock = new File(rootDirectoryFile, "je.lck");
// if (lock.exists()) {
// lock.delete();
// }
// }
// logger.debug("Read-only status: " + readOnly);
//
// EnvironmentConfig envConfig = new EnvironmentConfig();
// envConfig.setTransactional(true);
// envConfig.setAllowCreate(!readOnly);
// envConfig.setReadOnly(readOnly);
//
// try {
// env = new Environment(new File(rootDirectory), envConfig);
// } catch (EnvironmentLockedException e) {
// throw new RuntimeException("Unable to open Berkeley databases", e);
// } catch (DatabaseException e) {
// throw new RuntimeException("Unable to open Berkeley databases", e);
// }
//
// DatabaseConfig dbConfig = new DatabaseConfig();
// dbConfig.setTransactional(true);
// dbConfig.setAllowCreate(!readOnly);
// dbConfig.setReadOnly(readOnly);
//
// try {
// Database catalogDb = env.openDatabase(null, CLASS_CATALOG, dbConfig);
// javaCatalog = new StoredClassCatalog(catalogDb);
//
// dtoDb = env.openDatabase(null, DTO_STORE, dbConfig);
// contextMapDb = env.openDatabase(null, CONTEXT_MAP_STORE, dbConfig);
// imageDb = env.openDatabase(null, IMAGE_MAP_STORE, dbConfig);
// databaseIsOpen = true;
// }
// catch (DatabaseException exp) {
// throw new RuntimeException("Unable to open Berkeley databases", exp);
// }
//
// EntryBinding<String> stringBinding =
// new SerialBinding<String>(javaCatalog, String.class);
// EntryBinding<Integer> integerBinding =
// new SerialBinding<Integer>(javaCatalog, Integer.class);
// EntryBinding<TranscriptDTO> dtoValueBinding =
// new SerialBinding<TranscriptDTO>(javaCatalog, TranscriptDTO.class);
// EntryBinding<byte[]> byteArrayBinding =
// new SerialBinding<byte[]>(javaCatalog, byte[].class);
//
// dtoMap =
// new StoredMap<Integer, TranscriptDTO>(dtoDb, integerBinding, dtoValueBinding, true);
//
// contextMapMap =
// new StoredMap<Integer, String>(contextMapDb, integerBinding, stringBinding, true);
//
// imageMap =
// new StoredMap<String, byte[]>(imageDb, stringBinding, byteArrayBinding, true);
// }
//
//
// public synchronized void closeDb() {
// try {
// dtoDb.close();
// } catch (DatabaseException exp) {
// System.err.println("Unable to close DTO Berkeley DB");
// }
//
// try {
// contextMapDb.close();
// } catch (DatabaseException exp) {
// System.err.println("Unable to close context map Berkeley DB");
// }
//
// try {
// imageDb.close();
// } catch (DatabaseException exp) {
// System.err.println("Unable to close image Berkeley DB");
// }
//
// try {
// javaCatalog.close();
// } catch (DatabaseException exp) {
// System.err.println("Unable to close stored class catalog");
// }
//
// try {
// env.close();
// } catch (DatabaseException exp) {
// System.err.println("Unable to close environment");
// }
//
// databaseIsOpen = false;
// }
//
//
// public void setRootDirectory(String rootDirectory) {
// this.rootDirectory = rootDirectory;
// }
//
//
// public void setReadOnly(boolean readOnly) {
// this.readOnly = readOnly;
// }
//
// public String getRootDirectory() {
// return rootDirectory;
// }
//}