// Copyright (c) 2005 Dustin Sallings <dustin@spy.net>
package net.spy.db;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import net.spy.SpyObject;
import net.spy.util.SpyConfig;
/**
* Get a connection source from a config.
*/
public class ConnectionSourceFactory extends SpyObject {
private static ConnectionSourceFactory instance=null;
private final ConcurrentMap<String, ConnectionSource> sources;
/**
* Get an instance of ConnectionSourceFactory.
*/
private ConnectionSourceFactory() {
super();
sources=new ConcurrentHashMap<String, ConnectionSource>();
}
/**
* Get the singleton ConnectionSourceFactory instance.
*/
public static synchronized ConnectionSourceFactory getInstance() {
if(instance == null) {
instance=new ConnectionSourceFactory();
}
return instance;
}
/**
* Set the singleton instance.
*/
public static synchronized void setInstance(ConnectionSourceFactory to) {
instance=to;
}
/**
* Get a connection source by name.
* @param conf configuration specifying how to get the source
* @return the connection source
* @exception RuntimeException if the specified connection source
* cannot be instantiated
*/
public ConnectionSource getConnectionSource(SpyConfig conf) {
String connectionClassName=conf.get("dbConnectionSource",
"net.spy.db.ObjectPoolConnectionSource");
ConnectionSource source=sources.get(connectionClassName);
// OK, we now know *how* we're going to get connections, let's get
// the source object.
if(source == null) {
try {
getLogger().debug("Instantiating %s", connectionClassName);
@SuppressWarnings("unchecked")
Class<? extends ConnectionSource> connectionSourceClass
=(Class<? extends ConnectionSource>)Class.forName(
connectionClassName);
ConnectionSource newSource=connectionSourceClass.newInstance();
ConnectionSource oldSource=sources.putIfAbsent(
connectionClassName, newSource);
source = oldSource == null ? newSource : oldSource;
} catch(Exception e) {
RuntimeException re=new RuntimeException(
"Cannot initialize connection source: "
+ connectionClassName);
re.initCause(e);
throw re;
}
}
return(source);
}
}