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