package hu.sztaki.ilab.longneck.util.database;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
/**
*
* @author Molnár Péter <molnarp@sztaki.mta.hu>
*/
public class DatabaseConnectionManager {
/** Map of configuration classes. */
private static final Map<String,Class> configurationClasses = new HashMap<String,Class>();
/** Database configurations. */
private Map<String,Configuration> configurations;
/** Runtime properties. */
private Properties runtimeProperties;
static {
configurationClasses.put("jdbc", JdbcConfiguration.class);
}
public static void registerConfigurationClass(String type, Class c) {
if (! Configuration.class.isAssignableFrom(c)) {
throw new DatabaseConfigurationException(String.format(
"Class defined for database type %1$s, %2$s does not implement %3$s.",
type, c.getName(), Configuration.class.getName()));
}
configurationClasses.put(type, c);
}
public DatabaseConnectionManager() {
this.configurations = new HashMap<String,Configuration>();
}
public void afterPropertiesSet() throws DatabaseConfigurationException {
// Search for entries
for (Map.Entry e : runtimeProperties.entrySet()) {
String key = (String) e.getKey();
String name;
// Process entries that define database configuration type
if (key.startsWith(("database.connection.")) && key.endsWith(".type")) {
name = key.substring("database.connection.".length(),
key.length() - ".type".length());
if (name != null && ! "".equals(name)) {
String value = (String) e.getValue();
// Instantiate appropriate configuration type based on value
if (configurationClasses.containsKey(value)) {
Configuration c;
try {
c = (Configuration) configurationClasses.get(value).newInstance();
c.setName(name);
c.readProperites(runtimeProperties);
configurations.put(name, c);
} catch (InstantiationException ex) {
throw new DatabaseConfigurationException(ex.getMessage(), ex);
} catch (IllegalAccessException ex) {
throw new DatabaseConfigurationException(ex.getMessage(), ex);
}
}
}
}
}
}
public Properties getRuntimeProperties() {
return runtimeProperties;
}
public void setRuntimeProperties(Properties runtimeProperties) {
this.runtimeProperties = runtimeProperties;
}
public Configuration getConfiguration(String name) {
if (configurations.containsKey(name)) {
return configurations.get(name);
}
throw new DatabaseConfigurationException(
String.format("Database connection \"%1$s\" is not configured.", name));
}
public void destroy() {
for (Configuration c : configurations.values()) {
c.destroy();
}
}
}