001: package org.gridsphere.portletcontainer.impl;
002:
003: import org.apache.commons.logging.Log;
004: import org.apache.commons.logging.LogFactory;
005: import org.gridsphere.portletcontainer.PortletSessionListener;
006:
007: import javax.servlet.http.HttpSession;
008: import javax.servlet.http.HttpSessionEvent;
009: import javax.servlet.http.HttpSessionListener;
010: import java.util.*;
011:
012: /**
013: * @author <a href="mailto:novotny@gridsphere.org">Jason Novotny</a>
014: * @version $Id: PortletSessionManager.java 6425 2008-02-29 11:23:10Z wehrens $
015: */
016: public class PortletSessionManager implements HttpSessionListener {
017:
018: private static PortletSessionManager instance = new PortletSessionManager();
019: private Log log = LogFactory.getLog(PortletSessionManager.class);
020:
021: private Hashtable<String, HttpSession> sessions = new Hashtable<String, HttpSession>();
022: private Hashtable<String, List<PortletSessionListener>> sessionListeners = new Hashtable<String, List<PortletSessionListener>>();
023:
024: private PortletSessionManager() {
025:
026: }
027:
028: public static PortletSessionManager getInstance() {
029: return instance;
030: }
031:
032: public int getNumSessions() {
033: return sessions.size();
034: }
035:
036: public Collection<HttpSession> getSessions() {
037: return sessions.values();
038: }
039:
040: public Set<String> getSessionIds() {
041: return sessions.keySet();
042: }
043:
044: /**
045: * Record the fact that a session has been created.
046: *
047: * @param event The session event
048: */
049: public void sessionCreated(HttpSessionEvent event) {
050: log.debug("sessionCreated('" + event.getSession().getId()
051: + "')");
052: String id = event.getSession().getId();
053: sessions.put(id, event.getSession());
054: dumpSessions();
055: }
056:
057: /**
058: * Record the fact that a session has been destroyed.
059: *
060: * @param event The session event
061: */
062: public void sessionDestroyed(HttpSessionEvent event) {
063: log.debug("sessionDestroyed('" + event.getSession().getId()
064: + "')");
065: HttpSession httpSession = event.getSession();
066: if (httpSession != null) {
067: String id = event.getSession().getId();
068:
069: List<PortletSessionListener> listeners = sessionListeners
070: .get(id);
071: if (listeners != null) {
072: Iterator<PortletSessionListener> it = listeners
073: .iterator();
074: while (it.hasNext()) {
075: PortletSessionListener sessionListener = (PortletSessionListener) it
076: .next();
077:
078: log.info("logging a session listener out: "
079: + sessionListener.getClass());
080: sessionListener.logout(httpSession);
081:
082: }
083: log.info("Removing session: " + httpSession.getId());
084: sessions.remove(id);
085: sessionListeners.remove(id);
086: }
087: } else {
088: log
089: .info("Not sure why sessionDestroyed listener provides null session id!");
090: }
091: dumpSessions();
092: }
093:
094: public void addSessionListener(String sessionId,
095: PortletSessionListener sessionListener) {
096: log.debug("adding session listener for : " + sessionId + " "
097: + sessionListener.getClass());
098: HttpSession session = (HttpSession) sessions.get(sessionId);
099: if (session != null) {
100: List<PortletSessionListener> listeners = sessionListeners
101: .get(sessionId);
102: if (listeners == null)
103: listeners = new ArrayList<PortletSessionListener>();
104: listeners.add(sessionListener);
105: System.err.println("adding session listener for : "
106: + sessionId + " " + sessionListener.getClass());
107: sessionListeners.put(sessionId, listeners);
108: }
109: dumpSessions();
110: }
111:
112: public void dumpSessions() {
113: log.debug("PortletSessionManager Session information:");
114: log.debug("# current sessions: " + sessions.size());
115: Set<String> keySet = sessions.keySet();
116: Iterator<String> it = keySet.iterator();
117: while (it.hasNext()) {
118: log.debug("session #id: " + (String) it.next());
119: }
120: }
121:
122: }
|