View Javadoc

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 }