1 package org.controlhaus.hibernate; 2 3 import net.sf.hibernate.HibernateException; 4 import net.sf.hibernate.Session; 5 import net.sf.hibernate.SessionFactory; 6 import net.sf.hibernate.Transaction; 7 import net.sf.hibernate.cfg.Configuration; 8 9 import org.apache.beehive.controls.api.bean.ControlImplementation; 10 import org.apache.beehive.controls.api.context.Context; 11 import org.apache.beehive.controls.api.context.ControlBeanContext; 12 import org.apache.beehive.controls.api.events.EventHandler; 13 import org.apache.beehive.controls.api.context.ResourceContext; 14 15 import org.apache.log4j.Logger; 16 import org.controlhaus.hibernate.HibernateControl.ManagedTransactions; 17 18 /*** 19 * The HibernateControl Implementation. 20 * 21 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a> 22 * @since May 10, 2003 23 */ 24 @ControlImplementation 25 public class HibernateControlImpl 26 implements HibernateControl 27 { 28 private static Logger logger = Logger.getLogger(HibernateControlImpl.class.getName()); 29 30 private ThreadLocal<Session> session = new ThreadLocal<Session>(); 31 private ThreadLocal<Transaction> transactions = new ThreadLocal<Transaction>(); 32 33 private SessionFactory sessionFactory; 34 private Configuration hibConfig; 35 36 private boolean manageTXs = false; 37 38 @Context ControlBeanContext context; 39 @Context ResourceContext resourceContext; 40 41 public HibernateControlImpl() 42 { 43 } 44 45 /*** 46 * @see org.codehaus.plexus.hibernate.HibernateService#getSessionFactory() 47 */ 48 public SessionFactory getSessionFactory() 49 { 50 return sessionFactory; 51 } 52 53 public Configuration getConfiguration() 54 { 55 return hibConfig; 56 } 57 58 59 @EventHandler(field="context", 60 eventSet=ControlBeanContext.LifeCycle.class, 61 eventName="onCreate") 62 public void onCreate() 63 { 64 ManagedTransactions txProp = 65 (ManagedTransactions) context.getControlPropertySet(ManagedTransactions.class); 66 if (txProp != null) 67 { 68 manageTXs = txProp.value(); 69 } 70 71 sessionFactory = HibernateFactory.getInstance().getSessionFactory(this); 72 } 73 74 @EventHandler (field="resourceContext", 75 eventSet=ResourceContext.ResourceEvents.class, 76 eventName="onRelease") 77 public void onRelease() 78 { 79 try 80 { 81 logger.debug("Closing open hibernate session."); 82 if ( manageTXs ) 83 { 84 Transaction t = getTransaction(); 85 if ( t != null ) 86 { 87 try 88 { 89 t.commit(); 90 } 91 catch(HibernateException e) 92 { 93 t.rollback(); 94 } 95 finally 96 { 97 closeSession(); 98 } 99 } 100 } 101 else 102 { 103 closeSession(); 104 } 105 } 106 catch (HibernateException e) 107 { 108 logger.error("Couldn't close session!", e); 109 } 110 } 111 112 public Session getSession() 113 throws HibernateException 114 { 115 Session s = (Session) session.get(); 116 if (s == null) 117 { 118 s = sessionFactory.openSession(); 119 session.set(s); 120 121 if ( manageTXs ) 122 { 123 transactions.set( s.beginTransaction() ); 124 } 125 } 126 return s; 127 } 128 129 public Transaction getTransaction() 130 { 131 return (Transaction) transactions.get(); 132 } 133 134 public void closeSession() 135 throws HibernateException 136 { 137 logger.info("Closing session for thread."); 138 139 if ( manageTXs ) 140 { 141 transactions.remove(); 142 } 143 144 Session s = (Session) session.get(); 145 if ( s != null ) 146 { 147 session.remove(); 148 s.close(); 149 } 150 151 } 152 }