package org.ovirt.engine.core.dao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.hibernate.Criteria;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.ovirt.engine.core.compat.Guid;
/**
* <code>BaseDAOHibernateImpl</code> captures the common functions for DAOs.
*
*/
public abstract class BaseDAOHibernateImpl<T, PK extends Serializable> {
private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();
private Class<T> type;
public BaseDAOHibernateImpl(Class<T> type) {
this.type = type;
}
public void setSession(Session session) {
sessions.set(session);
}
protected Session getSession() {
return sessions.get();
}
@SuppressWarnings("unchecked")
public T get(PK id) {
Session session = getSession();
T result = (T) session.get(type, id);
return result;
}
public T getByName(final String name) {
return findOneByCriteria(Restrictions.eq("name", name));
}
public List<T> getAll() {
return findByCriteria();
}
/**
* Supports returning a single object based on specified criteria.
*
* @param criteria
* the search criteria
* @return the object
*/
@SuppressWarnings("unchecked")
protected T findOneByCriteria(Criterion... criteria) {
Criteria filter = getSession().createCriteria(type);
for (Criterion criterion : criteria) {
filter.add(criterion);
}
return (T) filter.uniqueResult();
}
/**
* Retrieves all instances with the specified query.
*
* @param query
* the query
* @return the list of results
*/
@SuppressWarnings("unchecked")
public List<T> findAllWithSQL(String sql) {
Session session = getSession();
SQLQuery query = session.createSQLQuery(sql);
return (List<T>) query.list();
}
/**
* Supports returning lists of objects based on specified criteria.
*
* @param criteria
* the search criteria
* @return the list of objects
*/
@SuppressWarnings("unchecked")
protected List<T> findByCriteria(Criterion... criteria) {
Session session = getSession();
Criteria filter = session.createCriteria(type);
for (Criterion criterion : criteria) {
filter.add(criterion);
}
List<T> result = filter.list();
return result;
}
public void save(T instance) {
Session session = getSession();
session.beginTransaction();
session.save(instance);
session.getTransaction().commit();
}
public void update(T instance) {
save(instance);
}
public void updateStatus(T instance) {
//TODO
}
public void remove(PK id) {
T instance = get(id);
if (instance != null) {
Session session = getSession();
session.beginTransaction();
session.delete(instance);
session.getTransaction().commit();
}
}
/**
* Takes as input a series of comma-delimited UUID values. It then converts them into a List containing Guid objects
* and returns that.
*
* @param ids
* the ids
* @return the list of Guids
*/
protected List<Guid> convertIdsToGuids(String ids) {
List<Guid> filter = new ArrayList<Guid>();
StringTokenizer tokens = new StringTokenizer(ids, ",", false);
while (tokens.hasMoreElements()) {
filter.add(new Guid(tokens.nextToken()));
}
return filter;
}
}