Author: markt
Date: Fri Dec 19 14:54:08 2014
New Revision: 1646757

URL: http://svn.apache.org/r1646757
Log:
Refactor to replace reverse map with dedicated session listener that contains a 
reference to the SSO ID. This refactoring is in support of the fix for BZ 57338.

Added:
    
tomcat/tc8.0.x/trunk/java/org/apache/catalina/authenticator/SingleSignOnListener.java
   (props changed)
      - copied unchanged from r1646721, 
tomcat/trunk/java/org/apache/catalina/authenticator/SingleSignOnListener.java
Modified:
    tomcat/tc8.0.x/trunk/   (props changed)
    
tomcat/tc8.0.x/trunk/java/org/apache/catalina/authenticator/SingleSignOn.java
    
tomcat/tc8.0.x/trunk/java/org/apache/catalina/authenticator/SingleSignOnEntry.java
    
tomcat/tc8.0.x/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java

Propchange: tomcat/tc8.0.x/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Dec 19 14:54:08 2014
@@ -1 +1 @@
-/tomcat/trunk:1636524,1637156,1637176,1637188,1637331,1637684,1637695,1638720-1638725,1639653,1640010,1640083-1640084,1640088,1640275,1640322,1640347,1640361,1640365,1640403,1640410,1640652,1640655-1640658,1640688,1640700-1640883,1640903,1640976,1640978,1641000,1641026,1641038-1641039,1641051-1641052,1641058,1641064,1641300,1641369,1641374,1641380,1641486,1641634,1641656-1641692,1641704,1641707-1641718,1641720-1641722,1641735,1641981,1642233,1642280,1642554,1642564,1642595,1642606,1642668,1642679,1642697,1642699,1642766,1643002,1643045,1643054-1643055,1643066,1643121,1643128,1643206,1643209-1643210,1643216,1643249,1643270,1643283,1643309-1643310,1643323,1643365-1643366,1643370-1643371,1643465,1643474,1643536,1643570,1643634,1643649,1643651,1643654,1643675,1643731,1643733-1643734,1643761,1643766,1643814,1643937,1643963,1644017,1644169,1644201-1644203,1644321,1644323,1644516,1644523,1644529,1644535,1644730,1644768,1644784-1644785,1644790,1644793,1644815,1644884,1644886,1644890,1644892
 
,1644910,1644924,1644929-1644930,1644935,1644989,1645011,1645247,1645355,1645357-1645358,1645455,1645465,1645469,1645471,1645473,1645475,1645486-1645488,1645626,1645641,1645685,1645743,1645763,1645951-1645953,1645955,1646098-1646106,1646178,1646220,1646302,1646304,1646420,1646470-1646471,1646476,1646559,1646717-1646720
+/tomcat/trunk:1636524,1637156,1637176,1637188,1637331,1637684,1637695,1638720-1638725,1639653,1640010,1640083-1640084,1640088,1640275,1640322,1640347,1640361,1640365,1640403,1640410,1640652,1640655-1640658,1640688,1640700-1640883,1640903,1640976,1640978,1641000,1641026,1641038-1641039,1641051-1641052,1641058,1641064,1641300,1641369,1641374,1641380,1641486,1641634,1641656-1641692,1641704,1641707-1641718,1641720-1641722,1641735,1641981,1642233,1642280,1642554,1642564,1642595,1642606,1642668,1642679,1642697,1642699,1642766,1643002,1643045,1643054-1643055,1643066,1643121,1643128,1643206,1643209-1643210,1643216,1643249,1643270,1643283,1643309-1643310,1643323,1643365-1643366,1643370-1643371,1643465,1643474,1643536,1643570,1643634,1643649,1643651,1643654,1643675,1643731,1643733-1643734,1643761,1643766,1643814,1643937,1643963,1644017,1644169,1644201-1644203,1644321,1644323,1644516,1644523,1644529,1644535,1644730,1644768,1644784-1644785,1644790,1644793,1644815,1644884,1644886,1644890,1644892
 
,1644910,1644924,1644929-1644930,1644935,1644989,1645011,1645247,1645355,1645357-1645358,1645455,1645465,1645469,1645471,1645473,1645475,1645486-1645488,1645626,1645641,1645685,1645743,1645763,1645951-1645953,1645955,1646098-1646106,1646178,1646220,1646302,1646304,1646420,1646470-1646471,1646476,1646559,1646717-1646721

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/authenticator/SingleSignOn.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/authenticator/SingleSignOn.java?rev=1646757&r1=1646756&r2=1646757&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/authenticator/SingleSignOn.java 
(original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/authenticator/SingleSignOn.java 
Fri Dec 19 14:54:08 2014
@@ -31,7 +31,6 @@ import org.apache.catalina.LifecycleExce
 import org.apache.catalina.Manager;
 import org.apache.catalina.Realm;
 import org.apache.catalina.Session;
-import org.apache.catalina.SessionEvent;
 import org.apache.catalina.SessionListener;
 import org.apache.catalina.connector.Request;
 import org.apache.catalina.connector.Response;
@@ -57,7 +56,7 @@ import org.apache.tomcat.util.res.String
  *
  * @author Craig R. McClanahan
  */
-public class SingleSignOn extends ValveBase implements SessionListener {
+public class SingleSignOn extends ValveBase {
 
     private static final StringManager sm = 
StringManager.getManager(SingleSignOn.class);
 
@@ -90,13 +89,6 @@ public class SingleSignOn extends ValveB
     private boolean requireReauthentication = false;
 
     /**
-     * The cache of single sign on identifiers, keyed by the Session that is
-     * associated with them.
-     */
-    protected Map<SingleSignOnSessionKey,String> reverse = new 
ConcurrentHashMap<>();
-
-
-    /**
      * Optional SSO cookie domain.
      */
     private String cookieDomain;
@@ -196,55 +188,6 @@ public class SingleSignOn extends ValveB
     }
 
 
-    // ------------------------------------------------ SessionListener Methods
-
-    /**
-     * Acknowledge the occurrence of the specified event.
-     *
-     * @param event SessionEvent that has occurred
-     */
-    @Override
-    public void sessionEvent(SessionEvent event) {
-
-        if (!getState().isAvailable()) {
-            return;
-        }
-
-        // We only care about session destroyed events
-        if (!Session.SESSION_DESTROYED_EVENT.equals(event.getType())) {
-            return;
-        }
-
-        // Look up the single session id associated with this session (if any)
-        Session session = event.getSession();
-        if (containerLog.isDebugEnabled()) {
-            containerLog.debug("Process session destroyed on " + session);
-        }
-
-        String ssoId = null;
-        ssoId = reverse.get(new SingleSignOnSessionKey(session));
-        if (ssoId == null) {
-            return;
-        }
-
-        // Was the session destroyed as the result of a timeout or context 
stop?
-        // If so, we'll just remove the expired session from the SSO. If the
-        // session was logged out, we'll log out of all session associated with
-        // the SSO.
-        if (((session.getMaxInactiveInterval() > 0)
-            && (System.currentTimeMillis() - 
session.getThisAccessedTimeInternal() >=
-                session.getMaxInactiveInterval() * 1000))
-            || (!session.getManager().getContext().getState().isAvailable())) {
-            removeSession(ssoId, session);
-        } else {
-            // The session was logged out.
-            // Deregister this single session id, invalidating
-            // associated sessions
-            deregister(ssoId);
-        }
-    }
-
-
     // ---------------------------------------------------------- Valve Methods
 
     /**
@@ -349,6 +292,43 @@ public class SingleSignOn extends ValveB
     // ------------------------------------------------------ Protected Methods
 
     /**
+     * Process a session destroyed event by removing references to that session
+     * from the caches and - if the session destruction is the result of a
+     * logout - destroy the associated SSO session.
+     *
+     * @param ssoId   The ID of the SSO session which which the destroyed
+     *                session was associated
+     * @param session The session that has been destroyed
+     */
+    public void sessionDestroyed(String ssoId, Session session) {
+
+        if (!getState().isAvailable()) {
+            return;
+        }
+
+        if (containerLog.isDebugEnabled()) {
+            containerLog.debug("Process session destroyed on " + session);
+        }
+
+        // Was the session destroyed as the result of a timeout or context 
stop?
+        // If so, we'll just remove the expired session from the SSO. If the
+        // session was logged out, we'll log out of all session associated with
+        // the SSO.
+        if (((session.getMaxInactiveInterval() > 0)
+            && (System.currentTimeMillis() - 
session.getThisAccessedTimeInternal() >=
+                session.getMaxInactiveInterval() * 1000))
+            || (!session.getManager().getContext().getState().isAvailable())) {
+            removeSession(ssoId, session);
+        } else {
+            // The session was logged out.
+            // Deregister this single session id, invalidating
+            // associated sessions
+            deregister(ssoId);
+        }
+    }
+
+
+    /**
      * Associate the specified single sign on identifier with the
      * specified Session.
      *
@@ -368,8 +348,7 @@ public class SingleSignOn extends ValveB
         if (sso == null) {
             return false;
         } else {
-            sso.addSession(this, session);
-            reverse.put(new SingleSignOnSessionKey(session), ssoId);
+            sso.addSession(this, ssoId, session);
             return true;
         }
     }
@@ -399,8 +378,6 @@ public class SingleSignOn extends ValveB
             if (containerLog.isTraceEnabled()) {
                 containerLog.trace(" Invalidating session " + ssoKey);
             }
-            // Remove from reverse cache first to avoid recursion
-            reverse.remove(ssoKey);
             // Invalidate this session
             expire(ssoKey);
         }
@@ -586,9 +563,6 @@ public class SingleSignOn extends ValveB
         // Remove the inactive session from SingleSignOnEntry
         entry.removeSession(session);
 
-        // Remove the inactive session from the 'reverse' Map.
-        reverse.remove(new SingleSignOnSessionKey(session));
-
         // If there are not sessions left in the SingleSignOnEntry,
         // deregister the entry.
         if (entry.findSessions().size() == 0) {
@@ -597,6 +571,11 @@ public class SingleSignOn extends ValveB
     }
 
 
+    protected SessionListener getSessionListener(String ssoId) {
+        return new SingleSignOnListener(ssoId);
+    }
+
+
     @Override
     protected synchronized void startInternal() throws LifecycleException {
         Container c = getContainer();

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/authenticator/SingleSignOnEntry.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/authenticator/SingleSignOnEntry.java?rev=1646757&r1=1646756&r2=1646757&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/authenticator/SingleSignOnEntry.java
 (original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/authenticator/SingleSignOnEntry.java
 Fri Dec 19 14:54:08 2014
@@ -87,12 +87,12 @@ public class SingleSignOnEntry implement
      *                  the SSO session.
      * @param session   The <code>Session</code> being associated with the SSO.
      */
-    public void addSession(SingleSignOn sso, Session session) {
+    public void addSession(SingleSignOn sso, String ssoId, Session session) {
         SingleSignOnSessionKey key = new SingleSignOnSessionKey(session);
         SingleSignOnSessionKey currentKey = sessionKeys.putIfAbsent(key, key);
         if (currentKey == null) {
             // Session not previously added
-            session.addSessionListener(sso);
+            session.addSessionListener(sso.getSessionListener(ssoId));
         }
     }
 

Propchange: 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/authenticator/SingleSignOnListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java?rev=1646757&r1=1646756&r2=1646757&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java
 (original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java
 Fri Dec 19 14:54:08 2014
@@ -24,7 +24,6 @@ import org.apache.catalina.LifecycleExce
 import org.apache.catalina.Session;
 import org.apache.catalina.authenticator.SingleSignOn;
 import org.apache.catalina.authenticator.SingleSignOnEntry;
-import org.apache.catalina.authenticator.SingleSignOnSessionKey;
 import org.apache.catalina.ha.CatalinaCluster;
 import org.apache.catalina.ha.ClusterValve;
 import org.apache.catalina.tribes.Channel;
@@ -157,12 +156,6 @@ public class ClusterSingleSignOn extends
                     cls, terminateOnStartFailure);
             cache.setChannelSendOptions(mapSendOptions);
             this.cache = cache;
-
-            ReplicatedMap<SingleSignOnSessionKey,String> reverse = new 
ReplicatedMap<>(
-                    this, cluster.getChannel(), rpcTimeout, 
cluster.getClusterName() + "-SSO-reverse",
-                    cls, terminateOnStartFailure);
-            reverse.setChannelSendOptions(mapSendOptions);
-            this.reverse = reverse;
         } catch (Throwable t) {
             ExceptionUtils.handleThrowable(t);
             throw new LifecycleException(
@@ -187,7 +180,6 @@ public class ClusterSingleSignOn extends
 
         if (getCluster() != null) {
             ((ReplicatedMap<?,?>) cache).breakdown();
-            ((ReplicatedMap<?,?>) reverse).breakdown();
         }
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to