package com.sleepycat.je.dbi;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Map;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.EnvironmentConfig;
import de.ovgu.cide.jakutil.*;
/**
* Singleton collection of database environments.
*/
public class DbEnvPool {
private static DbEnvPool pool=new DbEnvPool();
private Map envs;
/**
* Enforce singleton behavior.
*/
private DbEnvPool(){
envs=new Hashtable();
}
/**
* Access the singleton instance.
*/
public static DbEnvPool getInstance(){
return pool;
}
/**
* If the environment is not open, open it.
*/
public EnvironmentImplInfo getEnvironment( File envHome, EnvironmentConfig config) throws DatabaseException {
return getEnvironment(envHome,config,true);
}
public EnvironmentImplInfo getExistingEnvironment( File envHome) throws DatabaseException {
return getEnvironment(envHome,null,false);
}
/**
* Find a single environment, used by Environment handles and by command
* line utilities.
*/
private synchronized EnvironmentImplInfo getEnvironment( File envHome, EnvironmentConfig config, boolean openIfNeeded) throws DatabaseException {
boolean found;
boolean firstHandle=false;
EnvironmentImpl environmentImpl=null;
String environmentKey=getEnvironmentMapKey(envHome);
if (envs.containsKey(environmentKey)) {
environmentImpl=(EnvironmentImpl)envs.get(environmentKey);
if (!environmentImpl.isOpen()) {
if (openIfNeeded) {
environmentImpl.open();
found=true;
}
else {
found=false;
}
}
else {
found=true;
}
}
else {
if (openIfNeeded) {
environmentImpl=new EnvironmentImpl(envHome,config);
envs.put(environmentKey,environmentImpl);
firstHandle=true;
found=true;
}
else {
found=false;
}
}
if (found) {
return new EnvironmentImplInfo(environmentImpl,firstHandle);
}
else {
return new EnvironmentImplInfo(null,false);
}
}
/**
* Remove a EnvironmentImpl from the pool because it's been closed.
*/
void remove( File envHome) throws DatabaseException {
envs.remove(getEnvironmentMapKey(envHome));
}
public void clear(){
envs.clear();
}
public static class EnvironmentImplInfo {
public EnvironmentImpl envImpl;
public boolean firstHandle=false;
EnvironmentImplInfo( EnvironmentImpl envImpl, boolean firstHandle){
this.envImpl=envImpl;
this.firstHandle=firstHandle;
}
}
private String getEnvironmentMapKey( File file) throws DatabaseException {
try {
return file.getCanonicalPath();
}
catch ( IOException e) {
throw new DatabaseException(e);
}
}
}