/*
* Copyright (C) 2006 Erik Swenson - erik@oreports.com
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have reserved a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
package org.efs.openreports.providers;
import java.io.Serializable;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.JDBCException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.exception.ConstraintViolationException;
import org.apache.log4j.Logger;
import org.efs.openreports.util.ConstraintException;
import org.efs.openreports.util.LocalStrings;
import org.springframework.beans.factory.DisposableBean;
public class HibernateProvider implements DisposableBean
{
protected static Logger log = Logger.getLogger(HibernateProvider.class.getName());
private static SessionFactory sessionFactory;
public HibernateProvider() throws ProviderException
{
log.info("SessionFactory Created.");
}
public Session openSession() throws ProviderException
{
try
{
return sessionFactory.openSession();
}
catch (HibernateException he)
{
throw new ProviderException(he);
}
}
public void closeSession(Session session) throws ProviderException
{
try
{
if (session != null)
session.close();
}
catch (HibernateException he)
{
throw new ProviderException(he);
}
}
public void rollbackTransaction(Transaction tx)
throws ProviderException
{
try
{
if (tx != null)
tx.rollback();
}
catch (HibernateException he)
{
throw new ProviderException(he);
}
}
public Object save(Object object) throws ProviderException
{
Session session = openSession();
Transaction tx = null;
try
{
tx = session.beginTransaction();
session.save(object);
tx.commit();
}
catch (HibernateException he)
{
rollbackTransaction(tx);
if (he instanceof JDBCException)
{
throw new ProviderException(((JDBCException)he).getSQLException());
}
throw new ProviderException(he);
}
finally
{
closeSession(session);
}
return object;
}
public void update(Object object) throws ProviderException
{
Session session = openSession();
Transaction tx = null;
try
{
tx = session.beginTransaction();
session.update(object);
tx.commit();
}
catch (HibernateException he)
{
rollbackTransaction(tx);
if (he instanceof ConstraintViolationException)
{
throw new ProviderException(LocalStrings.ERROR_UNIQUE_CONSTRAINT);
}
throw new ProviderException(he);
}
finally
{
closeSession(session);
}
}
public void delete(Object object)
throws ProviderException, ConstraintException
{
Session session = openSession();
Transaction tx = null;
try
{
tx = session.beginTransaction();
session.delete(object);
tx.commit();
}
catch (HibernateException he)
{
rollbackTransaction(tx);
if (he instanceof ConstraintViolationException)
{
throw new ConstraintException(he.getMessage());
}
throw new ProviderException(he);
}
finally
{
closeSession(session);
}
}
public Object load(Class<?> classType, Serializable id)
throws ProviderException
{
Session session = openSession();
try
{
Object object = session.load(classType, id);
return object;
}
catch (HibernateException he)
{
throw new ProviderException(he);
}
finally
{
closeSession(session);
}
}
public List<?> query(String fromClause) throws ProviderException
{
Session session = openSession();
try
{
Query query = session.createQuery(fromClause);
query.setCacheable(true);
List<?> list = query.list();
return list;
}
catch (HibernateException he)
{
throw new ProviderException(he);
}
finally
{
closeSession(session);
}
}
public void destroy()
{
try
{
sessionFactory.close();
log.info("SessionFactory closed.");
}
catch(HibernateException he)
{
log.warn(he.toString());
}
}
public void setSessionFactory(SessionFactory sessionFactory)
{
HibernateProvider.sessionFactory = sessionFactory;
}
}