/** * This Source Code Form is subject to the terms of the Mozilla Public License, * v. 2.0. If a copy of the MPL was not distributed with this file, You can * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. * * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS * graphic logo is a trademark of OpenMRS Inc. */ package org.openmrs.api.db.hibernate; import java.util.Collection; import java.util.Date; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.openmrs.Cohort; import org.openmrs.Concept; import org.openmrs.ConceptStateConversion; import org.openmrs.Patient; import org.openmrs.PatientProgram; import org.openmrs.PatientState; import org.openmrs.Program; import org.openmrs.ProgramWorkflow; import org.openmrs.ProgramWorkflowState; import org.openmrs.api.db.DAOException; import org.openmrs.api.db.ProgramWorkflowDAO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Hibernate specific ProgramWorkflow related functions.<br> * <br> * This class should not be used directly. All calls should go through the * {@link org.openmrs.api.ProgramWorkflowService} methods. * * @see org.openmrs.api.db.ProgramWorkflowDAO * @see org.openmrs.api.ProgramWorkflowService */ public class HibernateProgramWorkflowDAO implements ProgramWorkflowDAO { protected final Logger log = LoggerFactory.getLogger(getClass()); private SessionFactory sessionFactory; public HibernateProgramWorkflowDAO() { } /** * Hibernate Session Factory * * @param sessionFactory */ public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } // ************************** // PROGRAM // ************************** /** * @see org.openmrs.api.db.ProgramWorkflowDAO#saveProgram(org.openmrs.Program) */ @Override public Program saveProgram(Program program) throws DAOException { sessionFactory.getCurrentSession().saveOrUpdate(program); return program; } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getProgram(java.lang.Integer) */ @Override public Program getProgram(Integer programId) throws DAOException { return (Program) sessionFactory.getCurrentSession().get(Program.class, programId); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getAllPrograms(boolean) */ @Override @SuppressWarnings("unchecked") public List<Program> getAllPrograms(boolean includeRetired) throws DAOException { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Program.class); if (!includeRetired) { criteria.add(Restrictions.eq("retired", false)); } return criteria.list(); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getProgramsByName(String, boolean) */ @Override public List<Program> getProgramsByName(String programName, boolean includeRetired) { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Program.class); criteria.add(Restrictions.eq("name", programName)); if (!includeRetired) { criteria.add(Restrictions.eq("retired", false)); } @SuppressWarnings("unchecked") List<Program> list = criteria.list(); return list; } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#findPrograms(java.lang.String) */ @Override @SuppressWarnings("unchecked") public List<Program> findPrograms(String nameFragment) throws DAOException { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Program.class, "program"); criteria.add(Restrictions.ilike("name", nameFragment, MatchMode.ANYWHERE)); criteria.addOrder(Order.asc("name")); return criteria.list(); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#deleteProgram(org.openmrs.Program) */ @Override public void deleteProgram(Program program) throws DAOException { sessionFactory.getCurrentSession().delete(program); } // ************************** // PATIENT PROGRAM // ************************** /** * @see org.openmrs.api.db.ProgramWorkflowDAO#savePatientProgram(org.openmrs.PatientProgram) */ @Override public PatientProgram savePatientProgram(PatientProgram patientProgram) throws DAOException { if (patientProgram.getPatientProgramId() == null) { sessionFactory.getCurrentSession().save(patientProgram); } else { sessionFactory.getCurrentSession().merge(patientProgram); } return patientProgram; } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getPatientProgram(java.lang.Integer) */ @Override public PatientProgram getPatientProgram(Integer patientProgramId) throws DAOException { return (PatientProgram) sessionFactory.getCurrentSession().get(PatientProgram.class, patientProgramId); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getPatientPrograms(Patient, Program, Date, Date, * Date, Date, boolean) */ @Override @SuppressWarnings("unchecked") public List<PatientProgram> getPatientPrograms(Patient patient, Program program, Date minEnrollmentDate, Date maxEnrollmentDate, Date minCompletionDate, Date maxCompletionDate, boolean includeVoided) throws DAOException { Criteria crit = sessionFactory.getCurrentSession().createCriteria(PatientProgram.class); if (patient != null) { crit.add(Restrictions.eq("patient", patient)); } if (program != null) { crit.add(Restrictions.eq("program", program)); } if (minEnrollmentDate != null) { crit.add(Restrictions.ge("dateEnrolled", minEnrollmentDate)); } if (maxEnrollmentDate != null) { crit.add(Restrictions.le("dateEnrolled", maxEnrollmentDate)); } if (minCompletionDate != null) { crit.add(Restrictions.or(Restrictions.isNull("dateCompleted"), Restrictions.ge("dateCompleted", minCompletionDate))); } if (maxCompletionDate != null) { crit.add(Restrictions.le("dateCompleted", maxCompletionDate)); } if (!includeVoided) { crit.add(Restrictions.eq("voided", false)); } return crit.list(); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getPatientPrograms(org.openmrs.Cohort, * java.util.Collection) */ @Override @SuppressWarnings("unchecked") public List<PatientProgram> getPatientPrograms(Cohort cohort, Collection<Program> programs) { String hql = "from PatientProgram "; if (cohort != null || programs != null) { hql += "where "; } if (cohort != null) { hql += "patient.patientId in (:patientIds) "; } if (programs != null) { if (cohort != null) { hql += "and "; } hql += " program in (:programs)"; } hql += " order by patient.patientId, dateEnrolled"; Query query = sessionFactory.getCurrentSession().createQuery(hql); if (cohort != null) { query.setParameterList("patientIds", cohort.getMemberIds()); } if (programs != null) { query.setParameterList("programs", programs); } return query.list(); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#deletePatientProgram(org.openmrs.PatientProgram) */ @Override public void deletePatientProgram(PatientProgram patientProgram) throws DAOException { sessionFactory.getCurrentSession().delete(patientProgram); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#saveConceptStateConversion(org.openmrs.ConceptStateConversion) */ @Override public ConceptStateConversion saveConceptStateConversion(ConceptStateConversion csc) throws DAOException { if (csc.getConceptStateConversionId() == null) { sessionFactory.getCurrentSession().save(csc); } else { sessionFactory.getCurrentSession().merge(csc); } return csc; } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getAllConceptStateConversions() */ @Override @SuppressWarnings("unchecked") public List<ConceptStateConversion> getAllConceptStateConversions() throws DAOException { return sessionFactory.getCurrentSession().createCriteria(ConceptStateConversion.class).list(); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getConceptStateConversion(java.lang.Integer) */ @Override public ConceptStateConversion getConceptStateConversion(Integer conceptStateConversionId) { return (ConceptStateConversion) sessionFactory.getCurrentSession().get(ConceptStateConversion.class, conceptStateConversionId); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#deleteConceptStateConversion(org.openmrs.ConceptStateConversion) */ @Override public void deleteConceptStateConversion(ConceptStateConversion csc) { sessionFactory.getCurrentSession().delete(csc); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getConceptStateConversion(org.openmrs.ProgramWorkflow, * org.openmrs.Concept) */ @Override public ConceptStateConversion getConceptStateConversion(ProgramWorkflow workflow, Concept trigger) { ConceptStateConversion csc = null; if (workflow != null && trigger != null) { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(ConceptStateConversion.class, "csc"); criteria.add(Restrictions.eq("csc.programWorkflow", workflow)); criteria.add(Restrictions.eq("csc.concept", trigger)); csc = (ConceptStateConversion) criteria.uniqueResult(); } return csc; } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getConceptStateConversionByUuid(java.lang.String) */ @Override public ConceptStateConversion getConceptStateConversionByUuid(String uuid) { return (ConceptStateConversion) sessionFactory.getCurrentSession().createQuery( "from ConceptStateConversion csc where csc.uuid = :uuid").setString("uuid", uuid).uniqueResult(); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getPatientProgramByUuid(java.lang.String) */ @Override public PatientProgram getPatientProgramByUuid(String uuid) { return (PatientProgram) sessionFactory.getCurrentSession().createQuery( "from PatientProgram pp where pp.uuid = :uuid").setString("uuid", uuid).uniqueResult(); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getProgramByUuid(java.lang.String) */ @Override public Program getProgramByUuid(String uuid) { return (Program) sessionFactory.getCurrentSession().createQuery("from Program p where p.uuid = :uuid").setString( "uuid", uuid).uniqueResult(); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getState(Integer) */ @Override public ProgramWorkflowState getState(Integer stateId) { return (ProgramWorkflowState) sessionFactory.getCurrentSession().get(ProgramWorkflowState.class, stateId); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getStateByUuid(java.lang.String) */ @Override public ProgramWorkflowState getStateByUuid(String uuid) { return (ProgramWorkflowState) sessionFactory.getCurrentSession().createQuery( "from ProgramWorkflowState pws where pws.uuid = :uuid").setString("uuid", uuid).uniqueResult(); } @Override public PatientState getPatientStateByUuid(String uuid) { return (PatientState) sessionFactory.getCurrentSession().createQuery("from PatientState pws where pws.uuid = :uuid") .setString("uuid", uuid).uniqueResult(); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getWorkflow(Integer) */ @Override public ProgramWorkflow getWorkflow(Integer workflowId) { return (ProgramWorkflow) sessionFactory.getCurrentSession().get(ProgramWorkflow.class, workflowId); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getWorkflowByUuid(java.lang.String) */ @Override public ProgramWorkflow getWorkflowByUuid(String uuid) { return (ProgramWorkflow) sessionFactory.getCurrentSession().createQuery( "from ProgramWorkflow pw where pw.uuid = :uuid").setString("uuid", uuid).uniqueResult(); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getProgramsByConcept(org.openmrs.Concept) */ @Override public List<Program> getProgramsByConcept(Concept concept) { String pq = "select distinct p from Program p where p.concept = :concept"; Query pquery = sessionFactory.getCurrentSession().createQuery(pq); pquery.setEntity("concept", concept); return pquery.list(); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getProgramWorkflowsByConcept(org.openmrs.Concept) */ @Override public List<ProgramWorkflow> getProgramWorkflowsByConcept(Concept concept) { String wq = "select distinct w from ProgramWorkflow w where w.concept = :concept"; Query wquery = sessionFactory.getCurrentSession().createQuery(wq); wquery.setEntity("concept", concept); return wquery.list(); } /** * @see org.openmrs.api.db.ProgramWorkflowDAO#getProgramWorkflowStatesByConcept(org.openmrs.Concept) */ @Override public List<ProgramWorkflowState> getProgramWorkflowStatesByConcept(Concept concept) { String sq = "select distinct s from ProgramWorkflowState s where s.concept = :concept"; Query squery = sessionFactory.getCurrentSession().createQuery(sq); squery.setEntity("concept", concept); return squery.list(); } }