diff --git a/core/src/main/java/org/acegisecurity/concurrent/SessionRegistryImpl.java b/core/src/main/java/org/acegisecurity/concurrent/SessionRegistryImpl.java
index 628f81df9f..8c5c790eaf 100644
--- a/core/src/main/java/org/acegisecurity/concurrent/SessionRegistryImpl.java
+++ b/core/src/main/java/org/acegisecurity/concurrent/SessionRegistryImpl.java
@@ -21,6 +21,8 @@ import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.util.Assert;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import java.util.ArrayList;
import java.util.Collections;
@@ -38,17 +40,21 @@ import javax.servlet.http.HttpSession;
* Base implementation of {@link org.acegisecurity.concurrent.SessionRegistry}
* which also listens for {@link org.acegisecurity.ui.session.HttpSessionDestroyedEvent}s
* published in the Spring application context.
- *
+ *
*
* NB: It is important that you register the {@link org.acegisecurity.ui.session.HttpSessionEventPublisher} in
* web.xml so that this class is notified of sessions that expire.
*
- *
+ *
* @author Ben Alex
* @version $Id$
*/
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()); //
private Map sessionIds = Collections.synchronizedMap(new HashMap()); //
@@ -68,12 +74,12 @@ public class SessionRegistryImpl implements SessionRegistry, ApplicationListener
List list = new ArrayList();
- synchronized (sessionsUsedByPrincipal) {
+ synchronized (sessionsUsedByPrincipal) {
for (Iterator iter = sessionsUsedByPrincipal.iterator(); iter.hasNext();) {
String sessionId = (String) iter.next();
SessionInformation sessionInformation = getSessionInformation(sessionId);
- if (includeExpiredSessions || !sessionInformation.isExpired()) {
+ if (includeExpiredSessions || !sessionInformation.isExpired()) {
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.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);
}
- 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) {
sessionsUsedByPrincipal = Collections.synchronizedSet(new HashSet());
@@ -132,17 +142,27 @@ public class SessionRegistryImpl implements SessionRegistry, ApplicationListener
SessionInformation info = getSessionInformation(sessionId);
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) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Removing " + sessionId + " from principal's set of registered sessions");
+ }
+
sessionsUsedByPrincipal.remove(sessionId);
if (sessionsUsedByPrincipal.size() == 0) {
// 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());
}
}
}