
package de.ivu.elect.jee.session;

import java.util.concurrent.atomic.AtomicLong;

import javax.inject.Inject;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.jee.concurrent.GleichzeitigBearbeitenStore;

import static de.ivu.elect.jee.session.SessionIdFilter.maskiere;

/**
 * ELECTMUC-205 http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/
 */
@WebListener
public class SessionCounterListener implements HttpSessionListener {

  private static final Logger LOG = LoggerFactory.getLogger(SessionCounterListener.class);

  private static final AtomicLong SESSION_COUNTER = new AtomicLong(0L);

  @Inject
  private transient GleichzeitigBearbeitenStore gleichzeitigBearbeitenStore;

  public SessionCounterListener() {
    super();
  }

  public static long getAnzahlSessions() {
    return SESSION_COUNTER.get();
  }

  @Override
  public void sessionCreated(HttpSessionEvent httpSessionEvent) {
    HttpSession session = httpSessionEvent.getSession();
    String sessionId = session.getId();

    long anzahlSessionsInsgesamt = SESSION_COUNTER.incrementAndGet();

    LOG.info("Session angelegt: " + maskiere(sessionId) + " - Sessions insgesamt: " + anzahlSessionsInsgesamt);
  }

  @Override
  public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
    HttpSession session = httpSessionEvent.getSession();
    String sessionId = session.getId();

    long anzahlSessionsInsgesamt = SESSION_COUNTER.decrementAndGet();

    LOG.info("Session zerstört: " + maskiere(sessionId) + " - Sessions insgesamt: " + anzahlSessionsInsgesamt);

    gleichzeitigBearbeitenStore.unregisterSession(sessionId);
  }
}
