package com.cable.comcast.dmc.itd.cct.persistence;

import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.CommunicationException;

import com.cable.comcast.dmc.itd.cct.common.Constants;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import cirrus.hibernate.Datastore;
import cirrus.hibernate.Hibernate;
import cirrus.hibernate.HibernateException;
import cirrus.hibernate.Session;
import cirrus.hibernate.SessionFactory;


public class HibernateSession {
	
    public static final ThreadLocal session = new ThreadLocal();
	private static Log log = LogFactory.getLog(HibernateSession.class);
	
    public static Session currentSession()
                                  throws HibernateException, SQLException {
        Session s = (Session) session.get();

        if (s == null) {
        	SessionFactory sf = null;
        	// Try to lookup a JNDI Connection
        	try {
				sf = (SessionFactory) new InitialContext().lookup(Constants.SESSION_FACTORY);
        	} catch (NamingException ne) {
        		if (log.isDebugEnabled()) {
        			log.warn("error communicating with JNDI, assuming testcase");
        		}
        		
				Datastore datastore = Hibernate.createDatastore();
				
				datastore.storeClass(com.cable.comcast.dmc.itd.cct.persistence.ChangeRequest.class);
				datastore.storeClass(com.cable.comcast.dmc.itd.cct.persistence.Headend.class);
				datastore.storeClass(com.cable.comcast.dmc.itd.cct.persistence.MSO.class);
				datastore.storeClass(com.cable.comcast.dmc.itd.cct.persistence.Role.class);
				datastore.storeClass(com.cable.comcast.dmc.itd.cct.persistence.User.class);
				
				sf = datastore.buildSessionFactory();
        	}

			s = sf.openSession();
			session.set(s);
        }

        return s;
    }

    public static void closeSession() throws HibernateException, SQLException {
        Session s = (Session) session.get();
        session.set(null);

        if (s != null) {
            s.close();
        }
    }
}
