ingo@307: package de.intevation.flys.artifacts.context;
ingo@307:
ingo@307: import org.apache.log4j.Logger;
ingo@307:
ingo@307: import org.hibernate.Session;
ingo@307: import org.hibernate.SessionFactory;
ingo@307:
ingo@307: import de.intevation.flys.backend.SessionFactoryProvider;
ingo@307:
ingo@307: import de.intevation.artifacts.CallContext;
ingo@307: import de.intevation.artifacts.CallContext.Listener;
ingo@307:
ingo@307:
ingo@307: /**
ingo@307: * This CallContextListener is used to initialize a ThreadLocal variable in
ingo@307: * each CallContext (for each request) that holds Sessions.
ingo@307: *
ingo@307: * @author Ingo Weinzierl
ingo@307: */
ingo@307: public class SessionCallContextListener implements Listener {
ingo@307:
ingo@307: public static final String SESSION_HOLDER_KEY = "context.session.holder";
ingo@307:
ingo@307: /** The logger that is used in this class.*/
ingo@307: private static Logger logger =
ingo@307: Logger.getLogger(SessionCallContextListener.class);
ingo@307:
ingo@307:
ingo@307: public SessionCallContextListener() {
ingo@307: }
ingo@307:
ingo@307:
ingo@307: /**
ingo@307: * Initializes a ThreadLocal variable that is used to hold sessions.
ingo@307: *
ingo@307: * @param context The CallContext.
ingo@307: */
ingo@307: public void init(CallContext context) {
ingo@307: logger.debug("SessionCallContextListener.init");
ingo@307:
ingo@307: ThreadLocal sessionHolder = new ThreadLocal();
ingo@307:
ingo@307: SessionFactory sessionFactory =
ingo@307: SessionFactoryProvider.createSessionFactory();
ingo@307:
ingo@307: Session session = sessionFactory.openSession();
ingo@307:
ingo@307: sessionHolder.set(session);
ingo@307:
ingo@307: context.putContextValue(SESSION_HOLDER_KEY, sessionHolder);
ingo@307: }
ingo@307:
ingo@307:
ingo@307: /**
ingo@307: * Closes open sessions of the ThreadLocal variable opened in init().
ingo@307: *
ingo@307: * @param context The CallContext.
ingo@307: */
ingo@307: public void close(CallContext context) {
ingo@307: logger.debug("SessionCallContextListener.close");
ingo@307:
ingo@307: ThreadLocal sessionHolder = (ThreadLocal)
ingo@307: context.getContextValue(SESSION_HOLDER_KEY);
ingo@307:
ingo@307: Session session = sessionHolder.get();
ingo@307:
ingo@307: session.close();
ingo@307: sessionHolder.remove();
ingo@307: }
ingo@307: }
ingo@307: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :