package net.methodyne.bellvue.core;

import net.methodyne.bellvue.system.User;
import net.methodyne.bellvue.store.DataLayer;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionBindingEvent;
import java.util.HashMap;
import java.util.Vector;

import com.jamonapi.Monitor;
import com.jamonapi.MonitorFactory;
/** The session data for each individual user session
 * <br>Used to hold the user object, the reference to the DataLayer and the servlet environment...
 *
 *@author Tao Tiastri
 *@version 1.0
 * <br>Date: 23.04.2003
 * <br>Time: 12:01:24
 * <br> copyright Methodyne GmbH, Zug - Switzerland.
 */

public class Sdata implements HttpSessionBindingListener {
    /**
     * parsed form data
     */
    public FormParser fp = null;
    /**
     * GUI purpose
     */
    public Object selectedObjectRef = null;
    /**
     * GUI purpose
     */
    public View view = null;
    /**
     * GUI purpose
     */
    public Vector clipVector = null;
    /**
     * GUI purpose
     */
    public HashMap errors = null;
    /**
     * The user
     */
    public User user = null;
    /**
     * GUI purpose
     */
    public Vector apps = null; // list of apps user is aut for
    /**
     * GUI purpose
     */
    public String currentApp = null; // current app to be listed
    /**
     * From the servlet API
     */
    public ServletContext sctx = null;
    /**
     * From the servlet API
     */
    public HttpServletRequest req = null;
    /**
     * From the servlet API
     */
    public HttpServletResponse res = null;
    /**
     * The ubiquitous datalayer for insert, update, delete, locking, etc....
     */
    public DataLayer dl = null;
    /**
     * The IP address of a DNS server configured in web.xml
     */
    public String dns = null;

    private Monitor userMon;
    private Monitor sessionMon;
    private static int sessionCount = 0;

    /**
     * Session counter
     * @return the number of users on this application context.
     */
    public static int getSessionCount(){
        return sessionCount;
    }

    /**
     * This gets automatically handled by the servlet container
     * @param event
     */
    public void valueBound(HttpSessionBindingEvent event) {
        //System.out.println("new session");
        sessionCount++;
        sessionMon = MonitorFactory.start("Bellvue.allSessions");
        if( user == null )
            userMon = MonitorFactory.start("Bellvue.session.none" );
        else
            userMon = MonitorFactory.start("Bellvue.session." + user.username );

    }

    /**
     * This gets automatically handled by the servlet container
     * Called when a sessin ends with an explicit invalidate() or its timeout period has been reached.
     * @param event
     */
    public void valueUnbound(HttpSessionBindingEvent event) {
        //System.out.println("End session for " + user.username);
        if(view != null) // there is no view in squash.jsp!!!
            view.removeAllElements(this); // unlocks them as well
        sessionCount--;
        userMon.stop();
        sessionMon.stop();
    }
}