craigmcc 02/01/18 17:58:24 Modified: catalina/src/share/org/apache/catalina/session StandardManager.java StandardSession.java tester/src/tester/org/apache/tester Session01.java Session04.java SessionListener01.java tester/web/WEB-INF web.xml Added: tester/src/tester/org/apache/tester SessionListener03.java Log: Correct the set of session related events fired at context startup and shutdown time by the StandardManager implementation, as follows: * At Tomcat shutdown (or in the shutdown portion of a context reload), ONLY fire sessionWillPassivate() events to session attributes that implement HttpSessionActivationListener. Previously, a spurious valueUnbound() event was being sent to session attributes that implemented HttpSessionBindingListener. * At Tomcat startup time (or in the reload portion of a context reload), ONLY fire sessionDidActivate() events to session attributes that implement HttpSessionActivationListener. Previously, a spurious sessionCreated() event was sent to registered HttpSessionListener listeners. None of this directly affects the behavior of PersistentManager, as reported in Bugzilla #5895, but that is the next thing to investigate. I consider this bugfix somewhat risky for the 4.0 branch, so I don't think we should necessarily port it. Revision Changes Path 1.18 +5 -5 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardManager.java Index: StandardManager.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardManager.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- StandardManager.java 3 Jan 2002 13:31:50 -0000 1.17 +++ StandardManager.java 19 Jan 2002 01:58:24 -0000 1.18 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardManager.java,v 1.17 2002/01/03 13:31:50 remm Exp $ - * $Revision: 1.17 $ - * $Date: 2002/01/03 13:31:50 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardManager.java,v 1.18 2002/01/19 01:58:24 craigmcc Exp $ + * $Revision: 1.18 $ + * $Date: 2002/01/19 01:58:24 $ * * ==================================================================== * @@ -106,7 +106,7 @@ * <code>stop()</code> methods of this class at the correct times. * * @author Craig R. McClanahan - * @version $Revision: 1.17 $ $Date: 2002/01/03 13:31:50 $ + * @version $Revision: 1.18 $ $Date: 2002/01/19 01:58:24 $ */ public class StandardManager @@ -544,7 +544,7 @@ while (expires.hasNext()) { StandardSession session = (StandardSession) expires.next(); try { - session.expire(); + session.expire(false); } catch (Throwable t) { ; } 1.27 +53 -8 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardSession.java Index: StandardSession.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardSession.java,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- StandardSession.java 18 Jan 2002 22:14:07 -0000 1.26 +++ StandardSession.java 19 Jan 2002 01:58:24 -0000 1.27 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardSession.java,v 1.26 2002/01/18 22:14:07 craigmcc Exp $ - * $Revision: 1.26 $ - * $Date: 2002/01/18 22:14:07 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardSession.java,v 1.27 2002/01/19 01:58:24 craigmcc Exp $ + * $Revision: 1.27 $ + * $Date: 2002/01/19 01:58:24 $ * * ==================================================================== * @@ -115,7 +115,7 @@ * @author Craig R. McClanahan * @author Sean Legassick * @author <a href="mailto:[EMAIL PROTECTED]">Jon S. Stevens</a> - * @version $Revision: 1.26 $ $Date: 2002/01/18 22:14:07 $ + * @version $Revision: 1.27 $ $Date: 2002/01/19 01:58:24 $ */ class StandardSession @@ -580,6 +580,20 @@ */ public void expire() { + expire(true); + + } + + + /** + * Perform the internal processing required to invalidate this session, + * without triggering an exception if the session has already expired. + * + * @param notify Should we notify listeners about the demise of + * this session? + */ + public void expire(boolean notify) { + // Mark this session as "being expired" if needed if (expiring) return; @@ -593,16 +607,18 @@ // Unbind any objects associated with this session String keys[] = keys(); for (int i = 0; i < keys.length; i++) - removeAttribute(keys[i]); + removeAttribute(keys[i], notify); // Notify interested session event listeners - fireSessionEvent(Session.SESSION_DESTROYED_EVENT, null); + if (notify) { + fireSessionEvent(Session.SESSION_DESTROYED_EVENT, null); + } // Notify interested application event listeners // FIXME - Assumes we call listeners in reverse order StandardContext context = (StandardContext) manager.getContainer(); Object listeners[] = context.getApplicationListeners(); - if (listeners != null) { + if (notify && (listeners != null)) { HttpSessionEvent event = new HttpSessionEvent(getSession()); for (int i = 0; i < listeners.length; i++) { @@ -1047,6 +1063,29 @@ */ public void removeAttribute(String name) { + removeAttribute(name, true); + + } + + + /** + * Remove the object bound with the specified name from this session. If + * the session does not have an object bound with this name, this method + * does nothing. + * <p> + * After this method executes, and if the object implements + * <code>HttpSessionBindingListener</code>, the container calls + * <code>valueUnbound()</code> on the object. + * + * @param name Name of the object to remove from this session. + * @param notify Should we notify interested listeners that this + * attribute is being removed? + * + * @exception IllegalStateException if this method is called on an + * invalidated session + */ + public void removeAttribute(String name, boolean notify) { + // Validate our current state if (!expiring && !isValid) throw new IllegalStateException @@ -1065,6 +1104,11 @@ } } + // Do we need to do valueUnbound() and attributeRemoved() notification? + if (!notify) { + return; + } + // Call the valueUnbound() method if necessary HttpSessionBindingEvent event = new HttpSessionBindingEvent((HttpSession) this, name, value); @@ -1253,7 +1297,8 @@ isValid = ((Boolean) stream.readObject()).booleanValue(); thisAccessedTime = ((Long) stream.readObject()).longValue(); principal = null; // Transient only - setId((String) stream.readObject()); + // setId((String) stream.readObject()); + id = (String) stream.readObject(); if (debug >= 2) log("readObject() loading session " + id); 1.5 +7 -1 jakarta-tomcat-4.0/tester/src/tester/org/apache/tester/Session01.java Index: Session01.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/tester/src/tester/org/apache/tester/Session01.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- Session01.java 15 Aug 2001 00:57:09 -0000 1.4 +++ Session01.java 19 Jan 2002 01:58:24 -0000 1.5 @@ -72,7 +72,7 @@ * calling setAttribute("name", null) acts like removeAttribute(). * * @author Craig R. McClanahan - * @version $Revision: 1.4 $ $Date: 2001/08/15 00:57:09 $ + * @version $Revision: 1.5 $ $Date: 2002/01/19 01:58:24 $ */ public class Session01 extends HttpServlet { @@ -99,6 +99,12 @@ writer.println("Session01 FAILED - No session created"); ok = false; } + } + + // Store an activation event listener in the session + if (ok) { + session.setAttribute("activationListener", + new SessionListener03()); } // Ensure that there is no existing attribute 1.3 +5 -1 jakarta-tomcat-4.0/tester/src/tester/org/apache/tester/Session04.java Index: Session04.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/tester/src/tester/org/apache/tester/Session04.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- Session04.java 11 Dec 2001 03:51:34 -0000 1.2 +++ Session04.java 19 Jan 2002 01:58:24 -0000 1.3 @@ -69,7 +69,7 @@ * identifier) while processing this request. * * @author Craig R. McClanahan - * @version $Revision: 1.2 $ $Date: 2001/12/11 03:51:34 $ + * @version $Revision: 1.3 $ $Date: 2002/01/19 01:58:24 $ */ public class Session04 extends HttpServlet { @@ -171,6 +171,10 @@ if (bean != null) results.append(" New session has attribute already/"); } + + // Store an activation event listener in the session + newSession.setAttribute("activationListener", + new SessionListener03()); // Report success if everything is still ok if (results.length() == 0) 1.3 +10 -1 jakarta-tomcat-4.0/tester/src/tester/org/apache/tester/SessionListener01.java Index: SessionListener01.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/tester/src/tester/org/apache/tester/SessionListener01.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- SessionListener01.java 11 Dec 2001 03:51:34 -0000 1.2 +++ SessionListener01.java 19 Jan 2002 01:58:24 -0000 1.3 @@ -68,7 +68,7 @@ * creation and destruction events are logged to the servlet context log. * * @author Craig R. McClanahan - * @version $Revision: 1.2 $ $Date: 2001/12/11 03:51:34 $ + * @version $Revision: 1.3 $ $Date: 2002/01/19 01:58:24 $ */ public class SessionListener01 @@ -78,16 +78,25 @@ public void attributeAdded(HttpSessionBindingEvent event) { StaticLogger.write("SessionListener01: attributeAdded(" + event.getName() + "," + event.getValue() + ")"); + event.getSession().getServletContext().log + ("SessionListener01: attributeAdded(" + event.getSession().getId() + + "," + event.getName() + ")"); } public void attributeRemoved(HttpSessionBindingEvent event) { StaticLogger.write("SessionListener01: attributeRemoved(" + event.getName() + "," + event.getValue() + ")"); + event.getSession().getServletContext().log + ("SessionListener01: attributeRemoved(" + + event.getSession().getId() + "," + event.getName() + ")"); } public void attributeReplaced(HttpSessionBindingEvent event) { StaticLogger.write("SessionListener01: attributeReplaced(" + event.getName() + "," + event.getValue() + ")"); + event.getSession().getServletContext().log + ("SessionListener01: attributeReplaced(" + + event.getSession().getId() + "," + event.getName() + ")"); } public void sessionCreated(HttpSessionEvent event) { 1.1 jakarta-tomcat-4.0/tester/src/tester/org/apache/tester/SessionListener03.java Index: SessionListener03.java =================================================================== /* ========================================================================= * * * * The Apache Software License, Version 1.1 * * * * Copyright (c) 1999, 2000, 2001, 2002 The Apache Software Foundation. * * All rights reserved. * * * * ========================================================================= * * * * Redistribution and use in source and binary forms, with or without modi- * * fication, are permitted provided that the following conditions are met: * * * * 1. Redistributions of source code must retain the above copyright notice * * notice, this list of conditions and the following disclaimer. * * * * 2. Redistributions in binary form must reproduce the above copyright * * notice, this list of conditions and the following disclaimer in the * * documentation and/or other materials provided with the distribution. * * * * 3. The end-user documentation included with the redistribution, if any, * * must include the following acknowlegement: * * * * "This product includes software developed by the Apache Software * * Foundation <http://www.apache.org/>." * * * * Alternately, this acknowlegement may appear in the software itself, if * * and wherever such third-party acknowlegements normally appear. * * * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * * Foundation" must not be used to endorse or promote products derived * * from this software without prior written permission. For written * * permission, please contact <[EMAIL PROTECTED]>. * * * * 5. Products derived from this software may not be called "Apache" nor may * * "Apache" appear in their names without prior written permission of the * * Apache Software Foundation. * * * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES * * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * * THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY * * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * * POSSIBILITY OF SUCH DAMAGE. * * * * ========================================================================= * * * * This software consists of voluntary contributions made by many indivi- * * duals on behalf of the Apache Software Foundation. For more information * * on the Apache Software Foundation, please see <http://www.apache.org/>. * * * * ========================================================================= */ package org.apache.tester; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; /** * Session attribute that listens to passivation and activation events. * All events that occur are logged to the servlet context log. * * @author Craig R. McClanahan * @version $Revision: 1.1 $ $Date: 2002/01/19 01:58:24 $ */ public class SessionListener03 implements HttpSessionActivationListener, HttpSessionBindingListener, Serializable { public void sessionDidActivate(HttpSessionEvent event) { event.getSession().getServletContext().log ("SessionListener03: sessionDidActivate(" + event.getSession().getId() + ")"); } public void sessionWillPassivate(HttpSessionEvent event) { event.getSession().getServletContext().log ("SessionListener03: sessionWillPassivate(" + event.getSession().getId() + ")"); } public void valueBound(HttpSessionBindingEvent event) { event.getSession().getServletContext().log ("SessionListener03: valueBound(" + event.getSession().getId() + "," + event.getName() + ")"); } public void valueUnbound(HttpSessionBindingEvent event) { event.getSession().getServletContext().log ("SessionListener03: valueUnbound(" + event.getSession().getId() + "," + event.getName() + ")"); } } 1.56 +0 -1 jakarta-tomcat-4.0/tester/web/WEB-INF/web.xml Index: web.xml =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/tester/web/WEB-INF/web.xml,v retrieving revision 1.55 retrieving revision 1.56 diff -u -r1.55 -r1.56 --- web.xml 12 Dec 2001 22:34:20 -0000 1.55 +++ web.xml 19 Jan 2002 01:58:24 -0000 1.56 @@ -436,7 +436,6 @@ <!-- ========== Listener Definitions ================================== --> - <listener> <listener-class>org.apache.tester.ContextListener01</listener-class> </listener>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>