/**
* 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.db.hibernate;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.openmrs.GlobalProperty;
import org.openmrs.User;
import org.openmrs.api.context.Context;
import org.openmrs.api.db.AdministrationDAO;
import org.openmrs.api.db.DAOException;
import org.openmrs.reporting.AbstractReportObject;
import org.openmrs.reporting.Report;
import org.openmrs.reporting.ReportObjectWrapper;
import org.openmrs.util.DatabaseUtil;
import org.openmrs.util.OpenmrsConstants;
/**
* Hibernate specific database methods for the AdministrationService
*
* @see org.openmrs.api.context.Context
* @see org.openmrs.api.db.AdministrationDAO
* @see org.openmrs.api.AdministrationService
*/
public class HibernateAdministrationDAO implements AdministrationDAO {
protected Log log = LogFactory.getLog(getClass());
/**
* Hibernate session factory
*/
private SessionFactory sessionFactory;
public HibernateAdministrationDAO() {
}
/**
* Set session factory
*
* @param sessionFactory
*/
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
* @see org.openmrs.api.AdministrationService#createReport(org.openmrs.reporting.Report)
* @deprecated see reportingcompatibility module
*/
@Deprecated
public void createReport(Report r) throws DAOException {
r.setCreator(Context.getAuthenticatedUser());
r.setDateCreated(new Date());
sessionFactory.getCurrentSession().save(r);
}
/**
* @see org.openmrs.api.AdministrationService#updateReport(org.openmrs.reporting.Report)
* @deprecated see reportingcompatibility module
*/
@Deprecated
public void updateReport(Report r) throws DAOException {
if (r.getReportId() == null)
createReport(r);
else {
sessionFactory.getCurrentSession().saveOrUpdate(r);
}
}
/**
* @see org.openmrs.api.AdministrationService#deleteReport(org.openmrs.reporting.Report)
* @deprecated see reportingcompatibility module
*/
@Deprecated
public void deleteReport(Report r) throws DAOException {
sessionFactory.getCurrentSession().delete(r);
}
/**
* @see org.openmrs.api.AdministrationService#mrnGeneratorLog(java.lang.String,java.lang.Integer,java.lang.Integer)
*/
public void mrnGeneratorLog(String site, Integer start, Integer count) {
PreparedStatement ps = null;
try {
String sql = "insert into `";
sql += OpenmrsConstants.DATABASE_BUSINESS_NAME + "`.ext_mrn_log ";
sql += "(date_generated, generated_by, site, mrn_first, mrn_count) values (?, ?, ?, ?, ?)";
ps = sessionFactory.getCurrentSession().connection().prepareStatement(sql);
ps.setTimestamp(1, new Timestamp(new Date().getTime()));
ps.setInt(2, Context.getAuthenticatedUser().getUserId());
ps.setString(3, site);
ps.setInt(4, start);
ps.setInt(5, count);
ps.execute();
}
catch (Exception e) {
throw new DAOException("Error generating mrn log", e);
}
finally {
if (ps != null) {
try {
ps.close();
}
catch (SQLException e) {
log.error("Error generated while closing statement", e);
}
}
}
}
/**
* @see org.openmrs.api.AdministrationService#getMRNGeneratorLog()
*/
public Collection getMRNGeneratorLog() {
Collection<Map<String, Object>> logs = new Vector<Map<String, Object>>();
PreparedStatement ps = null;
try {
Map<String, Object> row;
String sql = "select * from `";
sql += OpenmrsConstants.DATABASE_BUSINESS_NAME + "`.ext_mrn_log ";
sql += "order by mrn_log_id desc";
ps = sessionFactory.getCurrentSession().connection().prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
row = new HashMap<String, Object>();
row.put("date", rs.getTimestamp("date_generated"));
row.put("user", rs.getString("generated_by"));
row.put("site", rs.getString("site"));
row.put("first", rs.getInt("mrn_first"));
row.put("count", rs.getInt("mrn_count"));
logs.add(row);
}
}
catch (Exception e) {
throw new DAOException("Error getting mrn log", e);
}
finally {
if (ps != null) {
try {
ps.close();
}
catch (SQLException e) {
log.error("Error generated while closing statement", e);
}
}
}
return logs;
}
/**
* @deprecated see reportingcompatibility module
*/
@Deprecated
public void createReportObject(AbstractReportObject ro) throws DAOException {
ReportObjectWrapper wrappedReportObject = new ReportObjectWrapper(ro);
User user = Context.getAuthenticatedUser();
Date now = new Date();
wrappedReportObject.setCreator(user);
wrappedReportObject.setDateCreated(now);
wrappedReportObject.setVoided(false);
sessionFactory.getCurrentSession().save(wrappedReportObject);
}
/**
* @deprecated see reportingcompatibility module
*/
@Deprecated
public void updateReportObject(AbstractReportObject ro) throws DAOException {
if (ro.getReportObjectId() == null)
createReportObject(ro);
else {
sessionFactory.getCurrentSession().clear();
ReportObjectWrapper wrappedReportObject = new ReportObjectWrapper(ro);
User user = Context.getAuthenticatedUser();
Date now = new Date();
wrappedReportObject.setChangedBy(user);
wrappedReportObject.setDateChanged(now);
sessionFactory.getCurrentSession().saveOrUpdate(wrappedReportObject);
}
}
/**
* @deprecated see reportingcompatibility module
*/
@Deprecated
public void deleteReportObject(Integer reportObjectId) throws DAOException {
ReportObjectWrapper wrappedReportObject = new ReportObjectWrapper();
wrappedReportObject = (ReportObjectWrapper) sessionFactory.getCurrentSession().get(ReportObjectWrapper.class,
reportObjectId);
sessionFactory.getCurrentSession().delete(wrappedReportObject);
}
/**
* @see org.openmrs.api.db.AdministrationDAO#getGlobalProperty(java.lang.String)
*/
public String getGlobalProperty(String propertyName) throws DAOException {
GlobalProperty gp = getGlobalPropertyObject(propertyName);
// if no gp exists, return a null value
if (gp == null)
return null;
return gp.getPropertyValue();
}
/**
* @see org.openmrs.api.db.AdministrationDAO#getGlobalPropertyObject(java.lang.String)
*/
public GlobalProperty getGlobalPropertyObject(String propertyName) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(GlobalProperty.class);
GlobalProperty gp = (GlobalProperty) criteria.add(Restrictions.eq("property", propertyName)).uniqueResult();
// if no gp exists, hibernate returns a null value
return gp;
}
public GlobalProperty getGlobalPropertyByUuid(String uuid) throws DAOException {
GlobalProperty gp = (GlobalProperty) sessionFactory.getCurrentSession().createQuery(
"from GlobalProperty t where t.uuid = :uuid").setString("uuid", uuid).uniqueResult();
return gp;
}
/**
* @see org.openmrs.api.db.AdministrationDAO#getAllGlobalProperties()
*/
@SuppressWarnings("unchecked")
public List<GlobalProperty> getAllGlobalProperties() throws DAOException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(GlobalProperty.class);
return criteria.addOrder(Order.asc("property")).list();
}
/**
* @see org.openmrs.api.db.AdministrationDAO#getGlobalPropertiesByPrefix(java.lang.String)
*/
@SuppressWarnings("unchecked")
public List<GlobalProperty> getGlobalPropertiesByPrefix(String prefix) {
return sessionFactory.getCurrentSession().createCriteria(GlobalProperty.class).add(
Restrictions.like("property", prefix, MatchMode.START)).list();
}
/**
* @see org.openmrs.api.db.AdministrationDAO#getGlobalPropertiesBySuffix(java.lang.String)
*/
@SuppressWarnings("unchecked")
public List<GlobalProperty> getGlobalPropertiesBySuffix(String suffix) {
return sessionFactory.getCurrentSession().createCriteria(GlobalProperty.class).add(
Restrictions.like("property", suffix, MatchMode.END)).list();
}
/**
* @see org.openmrs.api.db.AdministrationDAO#deleteGlobalProperty(GlobalProperty)
*/
public void deleteGlobalProperty(GlobalProperty property) throws DAOException {
sessionFactory.getCurrentSession().delete(property);
}
/**
* @see org.openmrs.api.db.AdministrationDAO#saveGlobalProperty(org.openmrs.GlobalProperty)
*/
public GlobalProperty saveGlobalProperty(GlobalProperty gp) throws DAOException {
sessionFactory.getCurrentSession().saveOrUpdate(gp);
return gp;
}
/**
* @see org.openmrs.api.db.AdministrationDAO#executeSQL(java.lang.String, boolean)
*/
public List<List<Object>> executeSQL(String sql, boolean selectOnly) throws DAOException {
// (solution for junit tests that usually use hsql
// hsql does not like the backtick. Replace the backtick with the hsql
// escape character: the double quote (or nothing).
if (HibernateUtil.isHSQLDialect(sessionFactory)) {
sql = sql.replace("`", "");
}
return DatabaseUtil.executeSQL(sessionFactory.getCurrentSession().connection(), sql, selectOnly);
}
}