package org.ovirt.engine.core.dao;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.common.utils.ResourceUtils;
public class DaoFactory {
private static LogCompat log = LogFactoryCompat.getLog(DaoFactory.class);
private static final String ENGINE_DAOS_CONFIGURATION_FILE = "engine-daos.properties";
private static ConcurrentMap<Class<? extends DAO>, DAO> daos = new ConcurrentHashMap<Class<? extends DAO>, DAO>();
public static <T extends DAO> T get(Class<T> daoType) {
if (!daos.containsKey(daoType)) {
daos.putIfAbsent(daoType, createDAO(daoType));
}
return daoType.cast(daos.get(daoType));
}
private static <T extends DAO> T createDAO(Class<T> daoType) {
try {
return newInstance(daoType,
ResourceUtils.loadProperties(DaoFactory.class, ENGINE_DAOS_CONFIGURATION_FILE));
} catch (Exception e) {
throw new DaoFactoryException(daoType, ENGINE_DAOS_CONFIGURATION_FILE, e);
}
}
private static <T extends DAO> T newInstance(Class<T> daoType, Properties props) throws Exception {
String className = props.getProperty(daoType.getSimpleName());
return daoType.cast(Class.forName(className).newInstance());
}
}