Added logging to SessionRegistryImpl.

This commit is contained in:
Luke Taylor 2007-08-30 18:22:40 +00:00
parent 7fcdd4a6ff
commit aa4ee54f86

View File

@ -21,6 +21,8 @@ import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -38,17 +40,21 @@ import javax.servlet.http.HttpSession;
* Base implementation of {@link org.acegisecurity.concurrent.SessionRegistry} * Base implementation of {@link org.acegisecurity.concurrent.SessionRegistry}
* which also listens for {@link org.acegisecurity.ui.session.HttpSessionDestroyedEvent}s * which also listens for {@link org.acegisecurity.ui.session.HttpSessionDestroyedEvent}s
* published in the Spring application context. * published in the Spring application context.
* *
* <p> * <p>
* NB: It is important that you register the {@link org.acegisecurity.ui.session.HttpSessionEventPublisher} in * NB: It is important that you register the {@link org.acegisecurity.ui.session.HttpSessionEventPublisher} in
* <code>web.xml</code> so that this class is notified of sessions that expire. * <code>web.xml</code> so that this class is notified of sessions that expire.
* </p> * </p>
* *
* @author Ben Alex * @author Ben Alex
* @version $Id$ * @version $Id$
*/ */
public class SessionRegistryImpl implements SessionRegistry, ApplicationListener { public class SessionRegistryImpl implements SessionRegistry, ApplicationListener {
// ~ Instance fields =============================================================================================== //~ Static fields/initializers =====================================================================================
protected static final Log logger = LogFactory.getLog(SessionRegistryImpl.class);
// ~ Instance fields ===============================================================================================
private Map principals = Collections.synchronizedMap(new HashMap()); // <principal:Object,SessionIdSet> private Map principals = Collections.synchronizedMap(new HashMap()); // <principal:Object,SessionIdSet>
private Map sessionIds = Collections.synchronizedMap(new HashMap()); // <sessionId:Object,SessionInformation> private Map sessionIds = Collections.synchronizedMap(new HashMap()); // <sessionId:Object,SessionInformation>
@ -68,12 +74,12 @@ public class SessionRegistryImpl implements SessionRegistry, ApplicationListener
List list = new ArrayList(); List list = new ArrayList();
synchronized (sessionsUsedByPrincipal) { synchronized (sessionsUsedByPrincipal) {
for (Iterator iter = sessionsUsedByPrincipal.iterator(); iter.hasNext();) { for (Iterator iter = sessionsUsedByPrincipal.iterator(); iter.hasNext();) {
String sessionId = (String) iter.next(); String sessionId = (String) iter.next();
SessionInformation sessionInformation = getSessionInformation(sessionId); SessionInformation sessionInformation = getSessionInformation(sessionId);
if (includeExpiredSessions || !sessionInformation.isExpired()) { if (includeExpiredSessions || !sessionInformation.isExpired()) {
list.add(sessionInformation); list.add(sessionInformation);
} }
} }
@ -105,17 +111,21 @@ public class SessionRegistryImpl implements SessionRegistry, ApplicationListener
} }
} }
public synchronized void registerNewSession(String sessionId, Object principal) { public void registerNewSession(String sessionId, Object principal) {
Assert.hasText(sessionId, "SessionId required as per interface contract"); Assert.hasText(sessionId, "SessionId required as per interface contract");
Assert.notNull(principal, "Principal required as per interface contract"); Assert.notNull(principal, "Principal required as per interface contract");
if (getSessionInformation(sessionId) != null) { if (logger.isDebugEnabled()) {
logger.debug("Registering session " + sessionId +", for principal " + principal);
}
if (getSessionInformation(sessionId) != null) {
removeSessionInformation(sessionId); removeSessionInformation(sessionId);
} }
sessionIds.put(sessionId, new SessionInformation(principal, sessionId, new Date())); sessionIds.put(sessionId, new SessionInformation(principal, sessionId, new Date()));
Set sessionsUsedByPrincipal = (Set) principals.get(principal); Set sessionsUsedByPrincipal = (Set) principals.get(principal);
if (sessionsUsedByPrincipal == null) { if (sessionsUsedByPrincipal == null) {
sessionsUsedByPrincipal = Collections.synchronizedSet(new HashSet()); sessionsUsedByPrincipal = Collections.synchronizedSet(new HashSet());
@ -132,17 +142,27 @@ public class SessionRegistryImpl implements SessionRegistry, ApplicationListener
SessionInformation info = getSessionInformation(sessionId); SessionInformation info = getSessionInformation(sessionId);
if (info != null) { if (info != null) {
sessionIds.remove(sessionId); if (logger.isDebugEnabled()) {
logger.debug("Removing " + sessionId + " from set of registered sessions");
}
sessionIds.remove(sessionId);
Set sessionsUsedByPrincipal = (Set) principals.get(info.getPrincipal()); Set sessionsUsedByPrincipal = (Set) principals.get(info.getPrincipal());
if (sessionsUsedByPrincipal != null) { if (sessionsUsedByPrincipal != null) {
synchronized (sessionsUsedByPrincipal) { synchronized (sessionsUsedByPrincipal) {
if (logger.isDebugEnabled()) {
logger.debug("Removing " + sessionId + " from principal's set of registered sessions");
}
sessionsUsedByPrincipal.remove(sessionId); sessionsUsedByPrincipal.remove(sessionId);
if (sessionsUsedByPrincipal.size() == 0) { if (sessionsUsedByPrincipal.size() == 0) {
// No need to keep object in principals Map anymore // No need to keep object in principals Map anymore
principals.remove(info.getPrincipal()); if (logger.isDebugEnabled()) {
logger.debug("Removing principal " + info.getPrincipal() + " from registry");
}
principals.remove(info.getPrincipal());
} }
} }
} }