package coreservlets.listeners;

import javax.servlet.*;
import javax.servlet.http.*;

/** Proces nasłuchujący zlicza sesje
 *  aktualnie używane w aplikacji internetowej
 *  oraz kiedykolwiek używane w cyklu życia aplikacji.
 *  <P>
 *  Taken from Core Servlets and JavaServer Pages Volume II
 *  from Prentice Hall and Sun Microsystems Press,
 *  http://volume2.coreservlets.com/.
 *  (C) 2007 Marty Hall, Larry Brown, and Yaakov Chaikin;
 *  may be freely used or adapted.
 */
public class SessionCounter implements HttpSessionListener {
  private int totalSessionCount = 0;
  private int currentSessionCount = 0;
  private int maxSessionCount = 0;
  private ServletContext context = null;
  
  public void sessionCreated(HttpSessionEvent event) {
    totalSessionCount++;
    currentSessionCount++;
    if (currentSessionCount > maxSessionCount) {
      maxSessionCount = currentSessionCount;
    }
    if (context == null) {
      storeInServletContext(event);
    }
  }

  public void sessionDestroyed(HttpSessionEvent event) {
    currentSessionCount--;
  }

  /** Całkowita liczba utworzonych sesji. */
  public int getTotalSessionCount() {
    return(totalSessionCount);
  }

  /** Liczba sesji aktualnie znajdujących się w pamięci. */
  public int getCurrentSessionCount() {
    return(currentSessionCount);
  }

  /** Największa liczba sesji kiedykolwiek znajdujących
   *  się w pamięci w jednym momencie.
   */
  public int getMaxSessionCount() {
    return(maxSessionCount);
  }

  /** Zarejestrowanie się w kontekście serwletu,
   *  aby serwlety i strony JSP miały dostęp do liczników sesji.
   */
  private void storeInServletContext(HttpSessionEvent event) {
    HttpSession session = event.getSession();
    context = session.getServletContext();
    context.setAttribute("sessionCounter", this);
  }
}
