package edu.gatech.i3l.fhir.jpa.dao; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.Validate; import org.hl7.fhir.instance.model.api.IBaseResource; import org.springframework.beans.factory.annotation.Autowired; import ca.uhn.fhir.context.FhirContext; public abstract class AbstractBaseFhirDao implements IFhirDao { private Map<Class<? extends IBaseResource>, IFhirResourceDao<?>> myResourceTypeToDao; private List<IDaoListener> myListeners = new ArrayList<IDaoListener>(); @Autowired(required = true) private DaoConfig myConfig; private FhirContext myContext; @Autowired protected List<IFhirResourceDao<?>> myResourceDaos; public FhirContext getContext() { return myContext; } public void setContext(FhirContext theContext) { myContext = theContext; } public Map<Class<? extends IBaseResource>, IFhirResourceDao<?>> getMyResourceTypeToDao() { return myResourceTypeToDao; } public void setMyResourceTypeToDao(Map<Class<? extends IBaseResource>, IFhirResourceDao<?>> myResourceTypeToDao) { this.myResourceTypeToDao = myResourceTypeToDao; } public List<IFhirResourceDao<?>> getMyResourceDaos() { return myResourceDaos; } public void setMyResourceDaos(List<IFhirResourceDao<?>> myResourceDaos) { this.myResourceDaos = myResourceDaos; } @Override public DaoConfig getConfig() { return myConfig; } @Override public void notifyWriteCompleted() { for (IDaoListener next : myListeners) { next.writeCompleted(); } } @Override public void registerDaoListener(IDaoListener theListener) { Validate.notNull(theListener, "theListener"); myListeners.add(theListener); } @SuppressWarnings("unchecked") @Override public <T extends IBaseResource> IFhirResourceDao<T> getDao(Class<T> theType) { if (myResourceTypeToDao == null) { myResourceTypeToDao = new HashMap<Class<? extends IBaseResource>, IFhirResourceDao<?>>(); for (IFhirResourceDao<?> next : myResourceDaos) { myResourceTypeToDao.put(next.getResourceType(), next); } if (this instanceof IFhirResourceDao<?>) { IFhirResourceDao<?> thiz = (IFhirResourceDao<?>) this; myResourceTypeToDao.put(thiz.getResourceType(), thiz); } } return (IFhirResourceDao<T>) myResourceTypeToDao.get(theType); } }