You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by gd...@apache.org on 2007/01/05 22:39:36 UTC

svn commit: r493201 - in /geronimo/server/trunk/modules: geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/ geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/ geronimo-jetty6/src/main/java/org/apache/geronimo/...

Author: gdamour
Date: Fri Jan  5 13:39:34 2007
New Revision: 493201

URL: http://svn.apache.org/viewvc?view=rev&rev=493201
Log:
Fix build following recent Jetty6 AbstractSessionManager updates.

There are two core changes:
1. update ClusteredSessionHandler to leverage the new API provided
by AbstractSessionManager, which simplifies the implementation and
remove a hack around the initialization of the session attributes
following a session migration.
2. move pre-handle logic from ServletHandler to SessionHandler.

Also, fix a lame type in WADIClusteredPreHandlerFactory: the
expose interface is PreHandlerFactory and not SessionHandlerFactory.

This fixes GERONIMO-2677 - HttpSession Relocation - Sticky load-balancing via HTTP Cookie

Removed:
    geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyServletHandler.java
Modified:
    geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandlerFactory.java
    geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyWebAppContext.java
    geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/SessionHandlerFactory.java
    geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionHandler.java
    geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionHandlerFactory.java
    geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionManager.java
    geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/AbstractWebModuleTest.java
    geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/ApplicationTest.java

Modified: geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandlerFactory.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandlerFactory.java?view=diff&rev=493201&r1=493200&r2=493201
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandlerFactory.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandlerFactory.java Fri Jan  5 13:39:34 2007
@@ -23,7 +23,6 @@
 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
 import org.apache.geronimo.jetty6.PreHandler;
 import org.apache.geronimo.jetty6.PreHandlerFactory;
-import org.apache.geronimo.jetty6.SessionHandlerFactory;
 import org.codehaus.wadi.impl.ClusteredManager;
 
 
@@ -64,7 +63,7 @@
         infoFactory.addReference(GBEAN_REF_WADI_SESSION_MANAGER, WADISessionManager.class, 
                 NameFactory.GERONIMO_SERVICE);
 
-        infoFactory.addInterface(SessionHandlerFactory.class);
+        infoFactory.addInterface(PreHandlerFactory.class);
 
         infoFactory.setConstructor(new String[]{GBEAN_REF_WADI_SESSION_MANAGER});
 

Modified: geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyWebAppContext.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyWebAppContext.java?view=diff&rev=493201&r1=493200&r2=493201
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyWebAppContext.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/JettyWebAppContext.java Fri Jan  5 13:39:34 2007
@@ -155,7 +155,17 @@
         assert transactionManager != null;
         assert trackedConnectionAssociator != null;
         assert jettyContainer != null;
-        SessionHandler sessionHandler = handlerFactory == null ? new SessionHandler() : handlerFactory.createHandler();
+        
+        SessionHandler sessionHandler;
+        if (null != handlerFactory) {
+            if (null == preHandlerFactory) {
+                throw new IllegalStateException("A preHandlerFactory must be set if an handler factory is set.");
+            }
+            PreHandler preHandler = preHandlerFactory.createHandler();
+            sessionHandler = handlerFactory.createHandler(preHandler);
+        } else {
+            sessionHandler = new SessionHandler();
+        }
         //TODO construct an interceptor chain inside one of the Handlers.
         JettySecurityHandler securityHandler = null;
         if (securityRealmName != null) {
@@ -168,8 +178,7 @@
             securityHandler.init(policyContextID, defaultPrincipal, checkedPermissions, excludedPermissions, classLoader);
         }
 
-        PreHandler preHandler = null == preHandlerFactory ? null : preHandlerFactory.createHandler();
-        ServletHandler servletHandler = new JettyServletHandler(preHandler);
+        ServletHandler servletHandler = new ServletHandler();
 
         webAppContext = new WebAppContext(securityHandler, sessionHandler, servletHandler, null);
         AbstractHandler next = sessionHandler;

Modified: geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/SessionHandlerFactory.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/SessionHandlerFactory.java?view=diff&rev=493201&r1=493200&r2=493201
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/SessionHandlerFactory.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/SessionHandlerFactory.java Fri Jan  5 13:39:34 2007
@@ -23,5 +23,5 @@
  * @version $Rev$ $Date$
  */
 public interface SessionHandlerFactory {
-    SessionHandler createHandler();
+    SessionHandler createHandler(PreHandler preHandler);
 }

Modified: geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionHandler.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionHandler.java?view=diff&rev=493201&r1=493200&r2=493201
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionHandler.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionHandler.java Fri Jan  5 13:39:34 2007
@@ -16,6 +16,14 @@
  */
 package org.apache.geronimo.jetty6.cluster;
 
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.geronimo.jetty6.AbstractPreHandler;
+import org.apache.geronimo.jetty6.PreHandler;
 import org.mortbay.jetty.servlet.SessionHandler;
 
 /**
@@ -23,8 +31,40 @@
  * @version $Rev$ $Date$
  */
 public class ClusteredSessionHandler extends SessionHandler {
+    private final PreHandler chainedHandler;
+    
+    public ClusteredSessionHandler(ClusteredSessionManager sessionManager, PreHandler chainedHandler) {
+        if (null == chainedHandler) {
+            throw new IllegalArgumentException("chainedHandler is required");
+        }
+        this.chainedHandler = chainedHandler;
+        chainedHandler.setNextHandler(new ActualHandler());
 
-    public ClusteredSessionHandler(ClusteredSessionManager sessionManager) {
         setSessionManager(sessionManager);
     }
+    
+    @Override
+    public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)
+            throws IOException, ServletException {
+        setRequestedId(request, dispatch);
+        try {
+            chainedHandler.handle(target, request, response, dispatch);
+        } catch (ServletException e) {
+            throw (IOException) new IOException().initCause(e);
+        }
+    }
+    
+    protected void doHandle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)
+            throws IOException, ServletException {
+        super.handle(target, request, response, dispatch);
+    }
+
+    private class ActualHandler extends AbstractPreHandler {
+
+        public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)
+                throws IOException, ServletException {
+            doHandle(target, request, response, dispatch);
+        }
+    }
+
 }

Modified: geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionHandlerFactory.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionHandlerFactory.java?view=diff&rev=493201&r1=493200&r2=493201
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionHandlerFactory.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionHandlerFactory.java Fri Jan  5 13:39:34 2007
@@ -20,6 +20,7 @@
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
+import org.apache.geronimo.jetty6.PreHandler;
 import org.apache.geronimo.jetty6.SessionHandlerFactory;
 import org.mortbay.jetty.servlet.SessionHandler;
 
@@ -34,9 +35,9 @@
         this.sessionManager = sessionManager;
     }
 
-    public SessionHandler createHandler() {
+    public SessionHandler createHandler(PreHandler preHandler) {
         ClusteredSessionManager clusteredSessionManager = new ClusteredSessionManager(sessionManager);
-        return new ClusteredSessionHandler(clusteredSessionManager);
+        return new ClusteredSessionHandler(clusteredSessionManager, preHandler);
     }
 
     public static final GBeanInfo GBEAN_INFO;

Modified: geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionManager.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionManager.java?view=diff&rev=493201&r1=493200&r2=493201
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionManager.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionManager.java Fri Jan  5 13:39:34 2007
@@ -99,15 +99,15 @@
 
     @Override
     protected void invalidateSessions() {
-        synchronized (idToSession) {
-            idToSession.clear();
-        }
+        // We do not need to clear idToSession: when the SessionManager GBean is stopped, all the sessions
+        // it defines are migrated to other SessionManagers. These outbound session migrations will remove 
+        // them from idToSession.
     }
 
     private class MigrationListener implements SessionListener {
 
         public void notifyInboundSessionMigration(org.apache.geronimo.clustering.Session session) {
-            addSession(new MigratedClusteredSession(session), false);
+            addSession(new ClusteredSession(session), false);
         }
 
         public void notifyOutboundSessionMigration(org.apache.geronimo.clustering.Session session) {
@@ -132,16 +132,13 @@
             } catch (SessionAlreadyExistException e) {
                 throw (IllegalStateException) new IllegalStateException().initCause(e);
             }
-            synchronized (idToSession) {
-                idToSession.put(getClusterId(), this);
-            }
-            forceDefinitionOfSessionValues();
+            initValues();
         }
 
         protected ClusteredSession(org.apache.geronimo.clustering.Session session) {
             super(System.currentTimeMillis(), session.getSessionId());
             this.session = session;
-            forceDefinitionOfSessionValues();
+            initValues();
         }
 
         @Override
@@ -158,34 +155,6 @@
         public void invalidate() throws IllegalStateException {
             super.invalidate();
             session.release();
-        }
-
-        private void forceDefinitionOfSessionValues() {
-            String TOKEN = "GeronimoIntegration_forceDefinitionOfSessionValues";
-            setAttribute(TOKEN, TOKEN);
-            removeAttribute(TOKEN);
-        }
-    }
-
-    public class MigratedClusteredSession extends ClusteredSession {
-        private final String clusterId;
-
-        protected MigratedClusteredSession(org.apache.geronimo.clustering.Session session) {
-            super(session);
-            clusterId = session.getSessionId();
-            synchronized (idToSession) {
-                idToSession.put(clusterId, this);
-            }
-        }
-
-        /**
-         * Implementation note: we need to override this method as the constructor Session(String) has a bug:
-         * it should also set _clusterId. W/o this override, this Session is bound to the null key during inbound
-         * session migration.
-         */
-        @Override
-        protected String getClusterId() {
-            return clusterId;
         }
     }
 

Modified: geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/AbstractWebModuleTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/AbstractWebModuleTest.java?view=diff&rev=493201&r1=493200&r2=493201
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/AbstractWebModuleTest.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/AbstractWebModuleTest.java Fri Jan  5 13:39:34 2007
@@ -62,6 +62,7 @@
     private TransactionManager transactionManager;
     private ConnectionTrackingCoordinator connectionTrackingCoordinator;
     private URL configurationBaseURL;
+    protected PreHandlerFactory preHandlerFactory = null;
     protected SessionHandlerFactory sessionHandlerFactory = null;
 
     protected void setUpStaticContentServlet(JettyServletRegistration webModule) throws Exception {
@@ -107,7 +108,7 @@
                 null,
                 0,
                 sessionHandlerFactory,
-                null,
+                preHandlerFactory,
                 policyContextId,
                 securityRealmName,
                 defaultPrincipal,

Modified: geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/ApplicationTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/ApplicationTest.java?view=diff&rev=493201&r1=493200&r2=493201
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/ApplicationTest.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6/src/test/java/org/apache/geronimo/jetty6/ApplicationTest.java Fri Jan  5 13:39:34 2007
@@ -18,16 +18,21 @@
 package org.apache.geronimo.jetty6;
 
 import java.io.BufferedReader;
+import java.io.IOException;
 import java.io.InputStreamReader;
 import java.net.HttpURLConnection;
 import java.net.URL;
 
-import org.apache.geronimo.clustering.SessionManager;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.geronimo.clustering.BasicNode;
+import org.apache.geronimo.clustering.Node;
 import org.apache.geronimo.clustering.Session;
 import org.apache.geronimo.clustering.SessionAlreadyExistException;
 import org.apache.geronimo.clustering.SessionListener;
-import org.apache.geronimo.clustering.Node;
-import org.apache.geronimo.clustering.BasicNode;
+import org.apache.geronimo.clustering.SessionManager;
 import org.apache.geronimo.jetty6.cluster.ClusteredSessionHandlerFactory;
 
 /**
@@ -49,6 +54,7 @@
 
     public void testApplicationWithSessionHandler() throws Exception {
         SessionManager sessionManager = new MockSessionManager();
+        preHandlerFactory = new MockPreHandlerFactory();
         sessionHandlerFactory = new ClusteredSessionHandlerFactory(sessionManager);
         JettyWebAppContext app = setUpAppContext(null, null, null, null, null, null, null, "war1/");
 
@@ -79,5 +85,20 @@
             return node;
         }
     }
+
+    public class MockPreHandlerFactory implements PreHandlerFactory {
+        public PreHandler createHandler() {
+            return new AbstractPreHandler() {
+
+                public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)
+                        throws IOException, ServletException {
+                    next.handle(target, request, response, dispatch);
+                }
+                
+            };
+        }
+
+    }
+
 
 }