package at.gv.egovernment.moa.id.commons.db; import java.util.Properties; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import org.hibernate.HibernateException; import org.hibernate.Session; import at.gv.egovernment.moa.id.commons.db.ex.MOADatabaseException; import at.gv.egovernment.moa.logging.Logger; public final class ConfigurationDBUtils { private static EntityManagerFactory entitymanagerfactory; @SuppressWarnings("rawtypes") private static final ThreadLocal THREAD_LOCAL_CONFIG = new ThreadLocal(); private static boolean automaticSessionHandling = false; protected ConfigurationDBUtils() { } public static void initHibernate(Properties props) throws MOADatabaseException { try { //add Hibernate annotations // Configuration hibernateConfig = new Configuration(); // hibernateConfig.addAnnotatedClass(AssertionStore.class); // hibernateConfig.addAnnotatedClass(AuthenticatedSessionStore.class); // hibernateConfig.addAnnotatedClass(OASessionStore.class); // hibernateConfig.addAnnotatedClass(OldSSOSessionIDStore.class); // hibernateConfig.addProperties(props); Logger.debug("Creating initial session factory..."); // entitymanagerfactory = // Persistence.createEntityManagerFactory("at.gv.egovernment.moa.id.commons.db.dao.config", // hibernateConfig.getProperties()); entitymanagerfactory = Persistence.createEntityManagerFactory("at.gv.egovernment.moa.id.commons.db.dao.config", props); Logger.debug("Initial ConfigDB session factory successfully created."); } catch (Throwable ex) { Logger.error("Initial session factory creation failed: " + ex.getMessage()); throw new MOADatabaseException("Initialization of Configuration Hibernate session factory failed.",ex); } } /** * Checks if a session factory is currently available. If necessary a new * session factory is created. * * @return current (or new) session factory * @throws HibernateException * thrown if a hibernate error occurs */ public static EntityManager getCurrentSession() { if (automaticSessionHandling) { return entitymanagerfactory.createEntityManager(); } EntityManager session = (EntityManager) THREAD_LOCAL_CONFIG.get(); if (session != null && session.isOpen()) { //maybe a hack, but sometimes we do not know if the session is closed (session already closed but isOpen()=true) try { javax.persistence.Query query = session.createQuery("select userdatabase from UserDatabase userdatabase"); query.getResultList(); } catch (Throwable e) { Logger.warn("JPA Session Handling Warning!!!! - This error should not occur."); session = getNewSession(); } } else session = getNewSession(); return session; } @SuppressWarnings("unchecked") public static EntityManager getNewSession() { if (automaticSessionHandling) { Logger.warn("Session is being automatically handled by hibernate. Therefore this session maybe not being newly created. Use HibernateUtil.getCurrentSession() instead."); //return sessionFactory.getCurrentSession(); return entitymanagerfactory.createEntityManager(); } EntityManager session = (EntityManager) THREAD_LOCAL_CONFIG.get(); if (session != null ) { Logger.warn("Previous session has not been closed; closing ConfigDB session now."); closeSession(); } Logger.debug("Opening new ConfigDB hibernate session..."); try { session = entitymanagerfactory.createEntityManager(); THREAD_LOCAL_CONFIG.set(session); } catch (HibernateException hex) { Logger.error(hex.getMessage()); } return session; } /** * Closes the current session. * * @throws HibernateException * thrown if session is already closed or a hibernate error * occurs. */ @SuppressWarnings("unchecked") public static void closeSession() { if (automaticSessionHandling) { Logger.warn("Session is being automatically handled by hibernate. Therefore the current session cannot be closed on demand."); return; } Logger.debug("Closing current ConfigDB hibernate session..."); EntityManager session = (EntityManager) THREAD_LOCAL_CONFIG.get(); THREAD_LOCAL_CONFIG.set(null); if (session != null) { try { session.close(); } catch (HibernateException hex) { Logger.error(hex.getMessage()); } } } public static boolean save(Object dbo) throws MOADatabaseException { EntityTransaction tx = null; try { EntityManager session = ConfigurationDBUtils.getCurrentSession(); tx = session.getTransaction(); synchronized (session) { tx.begin(); session.persist(dbo); tx.commit(); //session.clear(); } return true; } catch(HibernateException e) { Logger.warn("Error during Config database saveOrUpdate. Rollback.", e); tx.rollback(); throw new MOADatabaseException(e); } } public static boolean saveOrUpdate(Object dbo) throws MOADatabaseException { EntityTransaction tx = null; try { EntityManager session = ConfigurationDBUtils.getCurrentSession(); tx = session.getTransaction(); synchronized (session) { tx.begin(); session.merge(dbo); session.flush(); tx.commit(); //session.clear(); } return true; } catch(HibernateException e) { Logger.warn("Error during Config database saveOrUpdate. Rollback.", e); tx.rollback(); throw new MOADatabaseException(e); } } public static boolean delete(Object dbo) { EntityTransaction tx = null; try { EntityManager session = ConfigurationDBUtils.getCurrentSession(); tx = session.getTransaction(); synchronized (session) { tx.begin(); session.remove(session.contains(dbo) ? dbo : session.merge(dbo)); tx.commit(); //session.clear(); } return true; } catch(HibernateException e) { Logger.warn("Error during Config database delete. Rollback.", e); tx.rollback(); return false; } } }