package com.tandbergtv.util;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;


public class HibernateHelper
{
   private static HibernateHelper instance;

   private HibernateHelper() {
   }

   public static HibernateHelper getInstance() {
      if (instance == null) {
         synchronized(HibernateHelper.class) {
            instance = new HibernateHelper();
         }
      }
      return instance;
   }
   /**
    * It is a transactional save utility.
    * It save only hibernate mapped objects
    * @param liveObject
    */
   public void save(Object liveObject)
   {
      getSession().save(liveObject);
   }
   public void merge(Object liveObject)
   {
      getSession().merge(liveObject);
   }
   public void update(Object liveObject)
   {
      getSession().update(liveObject);
   }

   public void flush()
   {
      getSession().flush();
   }

   @SuppressWarnings("unchecked")
public List getQueryResult(String queryName, Map<String,Object> mapArgs) {
      Query query = getSession().getNamedQuery(queryName);
      for(String key : mapArgs.keySet()){
         Object value = mapArgs.get(key);
         query.setParameter(key, value);
      }
      List result = query.list();
      return result;
   }
   @SuppressWarnings("unchecked")
public Iterator getQueryIterator(String queryName, Map<String,Object> mapArgs) {
      Query query = getSession().getNamedQuery(queryName);
      for(String key : mapArgs.keySet()){
         Object value = mapArgs.get(key);
         query.setParameter(key, value);
      }
      Iterator result = query.iterate();
      return result;
   }

   /**
    * List all objects
    * @param clazz
    * @return
    */
   @SuppressWarnings("unchecked")
public List getAll(Class clazz) {
      List list = getSession().createCriteria(clazz).list();
      return list;
   }

   @SuppressWarnings("unchecked")
public List getPage(Class clazz,Order order, int start, int pageSize)
   {
      Criteria criteria = getSession().createCriteria(clazz);
      if(order != null){
         criteria.addOrder(order);
      }
      criteria.setFirstResult(start);
      criteria.setMaxResults(pageSize);
      List result = criteria.list();
      return result;
   }

   @SuppressWarnings("unchecked")
public List getPage(String queryName ,int start, int pageSize, Map<String,Object> mapArgs)
   {
      Query query = getSession().getNamedQuery(queryName);

      for(String key : mapArgs.keySet()){
         Object value = mapArgs.get(key);
         query.setParameter(key, value);
      }
      query.setFirstResult(start);
      query.setMaxResults(pageSize);
      List result = query.list();
      return result;
   }

   /**
    * Select an object by id
    */
   @SuppressWarnings("unchecked")
public Object getOne(Class clazz, int id) {
      Object obj = getSession().get(clazz,id);
      return obj;
   }
   /**
    * Select an object by id
    */
   @SuppressWarnings("unchecked")
public Object getOne(Class clazz, Serializable id) {
      Object obj = getSession().get(clazz,id);
      return obj;
   }

   public void closeSession()
   {
	   HibernateSessionFactory.closeSession() ;
   }

   public Session getSession()
   {
      return HibernateSessionFactory.getSession();
   }

   public SessionFactory getSessionFactory()
   {
      return HibernateSessionFactory.getSessionFactory();
   }
}
