/**
* 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.util.List;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.openmrs.Location;
import org.openmrs.LocationTag;
import org.openmrs.api.db.LocationDAO;
/**
* Hibernate location-related database functions
*/
public class HibernateLocationDAO implements LocationDAO {
private SessionFactory sessionFactory;
/**
* @see org.openmrs.api.db.LocationDAO#setSessionFactory(org.hibernate.SessionFactory)
*/
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
* @see org.openmrs.api.db.LocationDAO#saveLocation(org.openmrs.Location)
*/
public Location saveLocation(Location location) {
if (location.getChildLocations() != null && location.getLocationId() != null) {
// hibernate has a problem updating child collections
// if the parent object was already saved so we do it
// explicitly here
for (Location child : location.getChildLocations())
if (child.getLocationId() == null)
saveLocation(child);
}
sessionFactory.getCurrentSession().saveOrUpdate(location);
return location;
}
/**
* @see org.openmrs.api.db.LocationDAO#getLocation(java.lang.Integer)
*/
public Location getLocation(Integer locationId) {
return (Location) sessionFactory.getCurrentSession().get(Location.class, locationId);
}
/**
* @see org.openmrs.api.db.LocationDAO#getLocation(java.lang.String)
*/
@SuppressWarnings("unchecked")
public Location getLocation(String name) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Location.class).add(
Expression.eq("name", name));
List<Location> locations = criteria.list();
if (null == locations || locations.isEmpty()) {
return null;
}
return locations.get(0);
}
/**
* @see org.openmrs.api.db.LocationDAO#getAllLocations(boolean)
*/
@SuppressWarnings("unchecked")
public List<Location> getAllLocations(boolean includeRetired) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Location.class);
if (!includeRetired) {
criteria.add(Expression.like("retired", false));
}
criteria.addOrder(Order.asc("name"));
return criteria.list();
}
/**
* @see org.openmrs.api.db.LocationDAO#getLocations(java.lang.String)
*/
@SuppressWarnings("unchecked")
public List<Location> getLocations(String search) {
if (search == null || search.equals(""))
return getAllLocations(true);
return sessionFactory.getCurrentSession().createCriteria(Location.class)
// 'ilike' case insensitive search
.add(Expression.ilike("name", search, MatchMode.START)).addOrder(Order.asc("name")).list();
}
/**
* @see org.openmrs.api.db.LocationDAO#deleteLocation(org.openmrs.Location)
*/
public void deleteLocation(Location location) {
sessionFactory.getCurrentSession().delete(location);
}
/**
* @see org.openmrs.api.db.LocationDAO#saveLocation(org.openmrs.Location)
*/
public LocationTag saveLocationTag(LocationTag tag) {
sessionFactory.getCurrentSession().saveOrUpdate(tag);
return tag;
}
/**
* @see org.openmrs.api.db.LocationDAO#getLocationTag(java.lang.Integer)
*/
public LocationTag getLocationTag(Integer locationTagId) {
return (LocationTag) sessionFactory.getCurrentSession().get(LocationTag.class, locationTagId);
}
/**
* @see org.openmrs.api.db.LocationDAO#getLocationTagByName(java.lang.String)
*/
@SuppressWarnings("unchecked")
public LocationTag getLocationTagByName(String tag) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(LocationTag.class).add(
Expression.eq("tag", tag));
List<LocationTag> tags = criteria.list();
if (null == tags || tags.isEmpty()) {
return null;
}
return tags.get(0);
}
/**
* @see org.openmrs.api.db.LocationDAO#getAllLocationTags(boolean)
*/
@SuppressWarnings("unchecked")
public List<LocationTag> getAllLocationTags(boolean includeRetired) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(LocationTag.class);
if (!includeRetired) {
criteria.add(Expression.like("retired", false));
}
criteria.addOrder(Order.asc("tag"));
return criteria.list();
}
/**
* @see org.openmrs.api.db.LocationDAO#getLocations(java.lang.String)
*/
@SuppressWarnings("unchecked")
public List<LocationTag> getLocationTags(String search) {
return sessionFactory.getCurrentSession().createCriteria(LocationTag.class)
// 'ilike' case insensitive search
.add(Expression.ilike("tag", search, MatchMode.START)).addOrder(Order.asc("tag")).list();
}
/**
* @see org.openmrs.api.db.LocationDAO#deleteLocationTag(org.openmrs.LocationTag)
*/
public void deleteLocationTag(LocationTag tag) {
sessionFactory.getCurrentSession().delete(tag);
}
/**
* @see org.openmrs.api.db.LocationDAO#getLocationByUuid(java.lang.String)
*/
public Location getLocationByUuid(String uuid) {
return (Location) sessionFactory.getCurrentSession().createQuery("from Location l where l.uuid = :uuid").setString(
"uuid", uuid).uniqueResult();
}
}