/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.api.impl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.Cohort;
import org.openmrs.Patient;
import org.openmrs.api.APIException;
import org.openmrs.api.CohortService;
import org.openmrs.api.context.Context;
import org.openmrs.api.db.CohortDAO;
import org.openmrs.cohort.CohortDefinition;
import org.openmrs.cohort.CohortDefinitionItemHolder;
import org.openmrs.cohort.CohortDefinitionProvider;
import org.openmrs.report.EvaluationContext;
import org.openmrs.reporting.PatientCharacteristicFilter;
import org.openmrs.reporting.PatientSearch;
import org.openmrs.util.PrivilegeConstants;
import org.springframework.util.StringUtils;
/**
* API functions related to Cohorts
*/
public class CohortServiceImpl extends BaseOpenmrsService implements CohortService {
private Log log = LogFactory.getLog(this.getClass());
private CohortDAO dao;
private static Map<Class<? extends CohortDefinition>, CohortDefinitionProvider> cohortDefinitionProviders = null;
/**
* @see org.openmrs.api.CohortService#setCohortDAO(org.openmrs.api.db.CohortDAO)
*/
public void setCohortDAO(CohortDAO dao) {
this.dao = dao;
}
/**
* Clean up after this class. Set the static var to null so that the classloader can reclaim the
* space.
*
* @see org.openmrs.api.impl.BaseOpenmrsService#onShutdown()
*/
public void onShutdown() {
cohortDefinitionProviders = null;
}
/**
* @see org.openmrs.api.CohortService#saveCohort(org.openmrs.Cohort)
*/
public Cohort saveCohort(Cohort cohort) throws APIException {
if (cohort.getCohortId() == null) {
Context.requirePrivilege(PrivilegeConstants.ADD_COHORTS);
} else {
Context.requirePrivilege(PrivilegeConstants.EDIT_COHORTS);
}
if (cohort.getName() == null) {
throw new APIException("Cohort name is required");
}
if (log.isInfoEnabled())
log.info("Saving cohort " + cohort);
return dao.saveCohort(cohort);
}
/**
* @see org.openmrs.api.CohortService#createCohort(org.openmrs.Cohort)
* @deprecated
*/
public Cohort createCohort(Cohort cohort) {
return Context.getCohortService().saveCohort(cohort);
}
/**
* @see org.openmrs.api.CohortService#getCohort(java.lang.Integer)
*/
public Cohort getCohort(Integer id) {
return dao.getCohort(id);
}
/**
* @see org.openmrs.api.CohortService#getCohorts()
* @deprecated
*/
public List<Cohort> getCohorts() {
return getAllCohorts();
}
/**
* @see org.openmrs.api.CohortService#voidCohort(org.openmrs.Cohort, java.lang.String)
*/
public Cohort voidCohort(Cohort cohort, String reason) {
// other setters done by the save handlers
return saveCohort(cohort);
}
/**
* @see org.openmrs.api.CohortService#getCohortByUuid(java.lang.String)
*/
public Cohort getCohortByUuid(String uuid) {
return dao.getCohortByUuid(uuid);
}
/**
* @see org.openmrs.api.CohortService#addPatientToCohort(org.openmrs.Cohort,
* org.openmrs.Patient)
*/
public Cohort addPatientToCohort(Cohort cohort, Patient patient) {
if (!cohort.contains(patient)) {
cohort.getMemberIds().add(patient.getPatientId());
saveCohort(cohort);
}
return cohort;
}
/**
* @see org.openmrs.api.CohortService#removePatientFromCohort(org.openmrs.Cohort,
* org.openmrs.Patient)
*/
public Cohort removePatientFromCohort(Cohort cohort, Patient patient) {
if (cohort.contains(patient)) {
cohort.getMemberIds().remove(patient.getPatientId());
saveCohort(cohort);
}
return cohort;
}
/**
* @see org.openmrs.api.CohortService#updateCohort(org.openmrs.Cohort)
* @deprecated
*/
public Cohort updateCohort(Cohort cohort) {
return Context.getCohortService().saveCohort(cohort);
}
/**
* @see org.openmrs.api.CohortService#getCohortsContainingPatient(org.openmrs.Patient)
*/
public List<Cohort> getCohortsContainingPatient(Patient patient) {
return dao.getCohortsContainingPatientId(patient.getPatientId());
}
public List<Cohort> getCohortsContainingPatientId(Integer patientId) {
return dao.getCohortsContainingPatientId(patientId);
}
/**
* @see org.openmrs.api.CohortService#getCohorts(java.lang.String)
*/
public List<Cohort> getCohorts(String nameFragment) throws APIException {
return dao.getCohorts(nameFragment);
}
/**
* @see org.openmrs.api.CohortService#getAllCohorts()
*/
public List<Cohort> getAllCohorts() throws APIException {
return getAllCohorts(false);
}
/**
* @see org.openmrs.api.CohortService#getAllCohorts(boolean)
*/
public List<Cohort> getAllCohorts(boolean includeVoided) throws APIException {
return dao.getAllCohorts(includeVoided);
}
/**
* @see org.openmrs.api.CohortService#getCohort(java.lang.String)
*/
public Cohort getCohort(String name) throws APIException {
return dao.getCohort(name);
}
/**
* @see org.openmrs.api.CohortService#purgeCohort(org.openmrs.Cohort)
*/
public Cohort purgeCohort(Cohort cohort) throws APIException {
return dao.deleteCohort(cohort);
}
/**
* Auto generated method comment
*
* @param definitionClass
* @return
* @deprecated see reportingcompatibility module
* @throws APIException
*/
@Deprecated
private CohortDefinitionProvider getCohortDefinitionProvider(Class<? extends CohortDefinition> definitionClass)
throws APIException {
CohortDefinitionProvider ret = cohortDefinitionProviders.get(definitionClass);
if (ret == null)
throw new APIException("No CohortDefinitionProvider registered for " + definitionClass);
else
return ret;
}
/**
* @see org.openmrs.api.CohortService#evaluate(org.openmrs.cohort.CohortDefinition,
* org.openmrs.report.EvaluationContext)
* @deprecated see reportingcompatibility module
*/
@Deprecated
public Cohort evaluate(CohortDefinition definition, EvaluationContext evalContext) throws APIException {
CohortDefinitionProvider provider = getCohortDefinitionProvider(definition.getClass());
return provider.evaluate(definition, evalContext);
}
/**
* @see org.openmrs.api.CohortService#getAllPatientsCohortDefinition()
* @deprecated see reportingcompatibility module
*/
@Deprecated
public CohortDefinition getAllPatientsCohortDefinition() {
PatientSearch ps = new PatientSearch();
ps.setFilterClass(PatientCharacteristicFilter.class);
return ps;
}
/**
* @see org.openmrs.api.CohortService#getCohortDefinition(java.lang.Class, java.lang.Integer)
* @deprecated see reportingcompatibility module
*/
@Deprecated
public CohortDefinition getCohortDefinition(Class<CohortDefinition> clazz, Integer id) {
CohortDefinitionProvider provider = getCohortDefinitionProvider(clazz);
return provider.getCohortDefinition(id);
}
/**
* @see org.openmrs.api.CohortService#getCohortDefinition(java.lang.String)
* @deprecated see reportingcompatibility module
*/
@SuppressWarnings("unchecked")
@Deprecated
public CohortDefinition getCohortDefinition(String key) {
try {
String[] keyValues = key.split(":");
Integer id = Integer.parseInt((keyValues[0] != null) ? keyValues[0] : "0");
String className = (keyValues[1] != null) ? keyValues[1] : "";
Class clazz = Class.forName(className);
return getCohortDefinition(clazz, id);
}
catch (ClassNotFoundException e) {
throw new APIException(e);
}
}
/**
* @see org.openmrs.api.CohortService#getAllCohortDefinitions()
* @deprecated see reportingcompatibility module
*/
@Deprecated
public List<CohortDefinitionItemHolder> getAllCohortDefinitions() {
List<CohortDefinitionItemHolder> ret = new ArrayList<CohortDefinitionItemHolder>();
for (CohortDefinitionProvider provider : cohortDefinitionProviders.values()) {
log.info("Getting cohort definitions from " + provider.getClass());
ret.addAll(provider.getAllCohortDefinitions());
}
return ret;
}
/**
* @see org.openmrs.api.CohortService#purgeCohortDefinition(org.openmrs.cohort.CohortDefinition)
* @deprecated see reportingcompatibility module
*/
@Deprecated
public void purgeCohortDefinition(CohortDefinition definition) {
CohortDefinitionProvider provider = getCohortDefinitionProvider(definition.getClass());
provider.purgeCohortDefinition(definition);
}
/**
* @see org.openmrs.api.CohortService#setCohortDefinitionProviders(Map)
* @deprecated see reportingcompatibility module
*/
@Deprecated
public void setCohortDefinitionProviders(
Map<Class<? extends CohortDefinition>, CohortDefinitionProvider> providerClassMap) {
for (Map.Entry<Class<? extends CohortDefinition>, CohortDefinitionProvider> entry : providerClassMap.entrySet()) {
registerCohortDefinitionProvider(entry.getKey(), entry.getValue());
}
}
/**
* @see org.openmrs.api.CohortService#getCohortDefinitionProviders()
* @deprecated see reportingcompatibility module
*/
@Deprecated
public Map<Class<? extends CohortDefinition>, CohortDefinitionProvider> getCohortDefinitionProviders() {
if (cohortDefinitionProviders == null)
cohortDefinitionProviders = new LinkedHashMap<Class<? extends CohortDefinition>, CohortDefinitionProvider>();
return cohortDefinitionProviders;
}
/**
* @see org.openmrs.api.CohortService#registerCohortDefinitionProvider(Class,
* CohortDefinitionProvider)
* @deprecated see reportingcompatibility module
*/
@Deprecated
public void registerCohortDefinitionProvider(Class<? extends CohortDefinition> defClass,
CohortDefinitionProvider cohortDefProvider) throws APIException {
getCohortDefinitionProviders().put(defClass, cohortDefProvider);
}
/**
* @see org.openmrs.api.CohortService#removeCohortDefinitionProvider(java.lang.Class)
* @deprecated see reportingcompatibility module
*/
@Deprecated
public void removeCohortDefinitionProvider(Class<? extends CohortDefinitionProvider> providerClass) {
// TODO: should this be looking through the values or the keys?
for (Iterator<CohortDefinitionProvider> i = cohortDefinitionProviders.values().iterator(); i.hasNext();) {
if (i.next().getClass().equals(providerClass))
i.remove();
}
}
/**
* @see org.openmrs.api.CohortService#saveCohortDefinition(org.openmrs.cohort.CohortDefinition)
* @deprecated see reportingcompatibility module
*/
@Deprecated
public CohortDefinition saveCohortDefinition(CohortDefinition definition) throws APIException {
CohortDefinitionProvider provider = getCohortDefinitionProvider(definition.getClass());
return provider.saveCohortDefinition(definition);
}
/**
* @see org.openmrs.api.CohortService#getCohortDefinitions(java.lang.Class)
* @deprecated see reportingcompatibility module
*/
@SuppressWarnings("unchecked")
@Deprecated
public List<CohortDefinitionItemHolder> getCohortDefinitions(Class providerClass) {
CohortDefinitionProvider provider = getCohortDefinitionProvider(providerClass);
return provider.getAllCohortDefinitions();
}
}