package uk.ac.bbsrc.tgac.miso.sqlstore.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import uk.ac.bbsrc.tgac.miso.core.store.Store; import java.util.*; /** * uk.ac.bbsrc.tgac.miso.sqlstore.util * <p/> * Info * * @author Rob Davey * @date 04/01/13 * @since 0.1.9 */ public class DaoLookup { protected static final Logger log = LoggerFactory.getLogger(DaoLookup.class); private Map<Class<?>, Store<?>> daos = new HashMap<Class<?>, Store<?>>(); public void setDaos(Map<Class<?>, Store<?>> daos) { this.daos = daos; } public <T> Store<T> lookup(Class<? extends T> clz) { Class<?> type = getAssignableClassFromClass(clz); if (type != null) { return (Store<T>)daos.get(getAssignableClassFromClass(clz)); } return null; } public Set<Class<?>> getDaoKeys() { return daos.keySet(); } public Class<?> getAssignableClassFromClass(Class<?> clz) { for (Class<?> type : getDaoKeys()) { if (type.isAssignableFrom(clz)) { return type; } } return null; } /* public <T> Set<Store<? extends T>> lookup(Class<?> clz) { if (daos == null) { ServiceLoader<Store> consumerLoader = ServiceLoader.load(Store.class); Iterator<Store> consumerIterator = consumerLoader.iterator(); daos = new HashMap<Class<?>, Store<?>>(); while (consumerIterator.hasNext()) { Store p = consumerIterator.next(); if (!daos.containsKey(p.getClass())) { daos.put(p.getClass(), p); } else { if (daos.get(p.getClass()) != p) { String msg = "Multiple different Stores with the same persistable type " + "('" + p.getClass() + "') are present on the classpath. Store types must be unique."; log.error(msg); throw new ServiceConfigurationError(msg); } } } log.info("Loaded " + daos.values().size() + " known stores"); } Set<Store<? extends T>> found = new HashSet<Store<? extends T>>(); for (Class<?> type : daos.keySet()) { if (type.isAssignableFrom(clz)) { found.add(daos.get(type)); } } return found; } */ }