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 }