/**
* 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.hl7.db.hibernate;
import java.util.Calendar;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.openmrs.api.context.Context;
import org.openmrs.api.db.DAOException;
import org.openmrs.hl7.HL7Constants;
import org.openmrs.hl7.HL7InArchive;
import org.openmrs.hl7.HL7InError;
import org.openmrs.hl7.HL7InQueue;
import org.openmrs.hl7.HL7Source;
import org.openmrs.hl7.Hl7InArchivesMigrateThread;
import org.openmrs.hl7.db.HL7DAO;
/**
* OpenMRS HL7 API database default hibernate implementation This class shouldn't be instantiated by
* itself. Use the {@link org.openmrs.api.context.Context}
*
* @see org.openmrs.hl7.HL7Service
* @see org.openmrs.hl7.db.HL7DAO
*/
public class HibernateHL7DAO implements HL7DAO {
protected final Log log = LogFactory.getLog(getClass());
/**
* Hibernate session factory
*/
private SessionFactory sessionFactory;
public HibernateHL7DAO() {
}
/**
* Set session factory
*
* @param sessionFactory
*/
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
* @see org.openmrs.hl7.db.HL7DAO#saveHL7Source(org.openmrs.hl7.HL7Source)
*/
public HL7Source saveHL7Source(HL7Source hl7Source) throws DAOException {
sessionFactory.getCurrentSession().saveOrUpdate(hl7Source);
return hl7Source;
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getHL7Source(java.lang.Integer)
*/
public HL7Source getHL7Source(Integer hl7SourceId) throws DAOException {
return (HL7Source) sessionFactory.getCurrentSession().get(HL7Source.class, hl7SourceId);
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getHL7SourceByName(java.lang.String)
*/
public HL7Source getHL7SourceByName(String name) throws DAOException {
Criteria crit = sessionFactory.getCurrentSession().createCriteria(HL7Source.class);
crit.add(Restrictions.eq("name", name));
return (HL7Source) crit.uniqueResult();
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getAllHL7Sources()
*/
@SuppressWarnings("unchecked")
public List<HL7Source> getAllHL7Sources() throws DAOException {
return sessionFactory.getCurrentSession().createQuery("from HL7Source").list();
}
/**
* @see org.openmrs.hl7.db.HL7DAO#deleteHL7Source(org.openmrs.hl7.HL7Source)
*/
public void deleteHL7Source(HL7Source hl7Source) throws DAOException {
sessionFactory.getCurrentSession().delete(hl7Source);
}
/**
* @see org.openmrs.hl7.db.HL7DAO#saveHL7InQueue(org.openmrs.hl7.HL7InQueue)
*/
public HL7InQueue saveHL7InQueue(HL7InQueue hl7InQueue) throws DAOException {
sessionFactory.getCurrentSession().saveOrUpdate(hl7InQueue);
return hl7InQueue;
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getHL7InQueue(java.lang.Integer)
*/
public HL7InQueue getHL7InQueue(Integer hl7InQueueId) throws DAOException {
return (HL7InQueue) sessionFactory.getCurrentSession().get(HL7InQueue.class, hl7InQueueId);
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getAllHL7InQueues()
*/
@SuppressWarnings("unchecked")
public List<HL7InQueue> getAllHL7InQueues() throws DAOException {
return sessionFactory.getCurrentSession()
.createQuery("from HL7InQueue where messageState = ? order by HL7InQueueId").setParameter(0,
HL7Constants.HL7_STATUS_PENDING, Hibernate.INTEGER).list();
}
/**
* creates a Criteria object for use with counting and finding HL7InQueue objects
*
* @param messageState status of HL7InQueue object
* @param query string query to match against
* @return a Criteria object
*/
@SuppressWarnings("rawtypes")
private Criteria getHL7SearchCriteria(Class clazz, Integer messageState, String query) throws DAOException {
if (clazz == null)
throw new DAOException("no class defined for HL7 search");
Criteria crit = sessionFactory.getCurrentSession().createCriteria(clazz);
if (query != null && !query.isEmpty())
if (clazz == HL7InError.class)
crit.add(Restrictions.or(Restrictions.like("HL7Data", query, MatchMode.ANYWHERE), Restrictions.or(
Restrictions.like("errorDetails", query, MatchMode.ANYWHERE), Restrictions.like("error", query,
MatchMode.ANYWHERE))));
else
crit.add(Restrictions.like("HL7Data", query, MatchMode.ANYWHERE));
if (messageState != null)
crit.add(Restrictions.eq("messageState", messageState));
return crit;
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getHL7InQueueBatch(java.lang.Class, int, int,
* java.lang.Integer, java.lang.String)
*/
@SuppressWarnings( { "rawtypes", "unchecked" })
public <T> List<T> getHL7Batch(Class clazz, int start, int length, Integer messageState, String query)
throws DAOException {
Criteria crit = getHL7SearchCriteria(clazz, messageState, query);
crit.setFirstResult(start);
crit.setMaxResults(length);
crit.addOrder(Order.asc("dateCreated"));
return crit.list();
}
/**
* @see org.openmrs.hl7.db.HL7DAO#countHL7s(java.lang.Class, java.lang.Integer,
* java.lang.String)
*/
@SuppressWarnings("rawtypes")
public Integer countHL7s(Class clazz, Integer messageState, String query) {
Criteria crit = getHL7SearchCriteria(clazz, messageState, query);
crit.setProjection(Projections.rowCount());
return (Integer) crit.uniqueResult();
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getNextHL7InQueue()
*/
public HL7InQueue getNextHL7InQueue() throws DAOException {
Query query = sessionFactory.getCurrentSession().createQuery(
"from HL7InQueue as hiq where hiq.messageState = ? order by HL7InQueueId").setParameter(0,
HL7Constants.HL7_STATUS_PENDING, Hibernate.INTEGER).setMaxResults(1);
if (query == null)
return null;
return (HL7InQueue) query.uniqueResult();
}
/**
* @see org.openmrs.hl7.db.HL7DAO#deleteHL7InQueue(org.openmrs.hl7.HL7InQueue)
*/
public void deleteHL7InQueue(HL7InQueue hl7InQueue) throws DAOException {
sessionFactory.getCurrentSession().delete(hl7InQueue);
}
/**
* @see org.openmrs.hl7.db.HL7DAO#saveHL7InArchive(org.openmrs.hl7.HL7InArchive)
*/
public HL7InArchive saveHL7InArchive(HL7InArchive hl7InArchive) throws DAOException {
sessionFactory.getCurrentSession().save(hl7InArchive);
return hl7InArchive;
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getHL7InArchive(java.lang.Integer)
*/
public HL7InArchive getHL7InArchive(Integer hl7InArchiveId) throws DAOException {
return (HL7InArchive) sessionFactory.getCurrentSession().get(HL7InArchive.class, hl7InArchiveId);
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getHL7InArchiveByState(Integer state)
*/
public List<HL7InArchive> getHL7InArchiveByState(Integer state) throws DAOException {
return getHL7InArchiveByState(state, null);
}
/**
* limits results of getHL7InArchiveByState
*/
@SuppressWarnings("unchecked")
private List<HL7InArchive> getHL7InArchiveByState(Integer state, Integer maxResults) throws DAOException {
Query q = sessionFactory.getCurrentSession().createQuery("from HL7InArchive where messageState = ?").setParameter(0,
state, Hibernate.INTEGER);
if (maxResults != null)
q.setMaxResults(maxResults);
return q.list();
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getHL7InQueueByState(Integer stateId)
*/
@SuppressWarnings("unchecked")
public List<HL7InQueue> getHL7InQueueByState(Integer state) throws DAOException {
return sessionFactory.getCurrentSession().createQuery("from HL7InQueue where messageState = ?").setParameter(0,
state, Hibernate.INTEGER).list();
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getAllHL7InArchives()
*/
public List<HL7InArchive> getAllHL7InArchives() throws DAOException {
return getAllHL7InArchives(null);
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getAllHL7InArchives(Integer)
*/
@SuppressWarnings("unchecked")
public List<HL7InArchive> getAllHL7InArchives(Integer maxResults) {
Query q = sessionFactory.getCurrentSession().createQuery("from HL7InArchive order by HL7InArchiveId");
if (maxResults != null)
q.setMaxResults(maxResults);
return q.list();
}
/**
* @see org.openmrs.hl7.db.HL7DAO#deleteHL7InArchive(org.openmrs.hl7.HL7InArchive)
*/
public void deleteHL7InArchive(HL7InArchive hl7InArchive) throws DAOException {
sessionFactory.getCurrentSession().delete(hl7InArchive);
}
/**
* @see org.openmrs.hl7.db.HL7DAO#saveHL7InError(HL7InError)
*/
public HL7InError saveHL7InError(HL7InError hl7InError) throws DAOException {
sessionFactory.getCurrentSession().save(hl7InError);
return hl7InError;
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getHL7InError(Integer)
*/
public HL7InError getHL7InError(Integer hl7InErrorId) throws DAOException {
return (HL7InError) sessionFactory.getCurrentSession().get(HL7InError.class, hl7InErrorId);
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getAllHL7InErrors()
*/
@SuppressWarnings("unchecked")
public List<HL7InError> getAllHL7InErrors() throws DAOException {
return sessionFactory.getCurrentSession().createQuery("from HL7InError order by HL7InErrorId").list();
}
/**
* @see org.openmrs.hl7.db.HL7DAO#deleteHL7InError(HL7InError)
*/
public void deleteHL7InError(HL7InError hl7InError) throws DAOException {
sessionFactory.getCurrentSession().delete(hl7InError);
}
/**
* @see org.openmrs.hl7.db.HL7DAO#garbageCollect()
*/
public void garbageCollect() {
Context.clearSession();
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getHL7InArchiveByUuid(java.lang.String)
*/
public HL7InArchive getHL7InArchiveByUuid(String uuid) throws DAOException {
Query query = sessionFactory.getCurrentSession().createQuery("from HL7InArchive where uuid = ?").setParameter(0,
uuid, Hibernate.STRING);
Object record = query.uniqueResult();
if (record == null)
return null;
return (HL7InArchive) record;
}
/**
* @see org.openmrs.hl7.db.HL7DAO#getHL7InArchivesToMigrate()
*/
@Override
@SuppressWarnings("unchecked")
public List<HL7InArchive> getHL7InArchivesToMigrate() {
Integer daysToKeep = Hl7InArchivesMigrateThread.getDaysKept();
Criteria crit = getHL7SearchCriteria(HL7InArchive.class, HL7Constants.HL7_STATUS_PROCESSED, null);
crit.setMaxResults(HL7Constants.MIGRATION_MAX_BATCH_SIZE);
if (daysToKeep != null) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1 * daysToKeep);
crit.add(Restrictions.lt("dateCreated", cal.getTime()));
}
return crit.list();
}
}