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 :