jfclere 2002/12/09 07:57:43 Modified: catalina/src/share/org/apache/catalina Manager.java catalina/src/share/org/apache/catalina/session FileStore.java JDBCStore.java ManagerBase.java PersistentManagerBase.java Added: catalina/src/share/org/apache/catalina/valves PersistentValve.java Log: Port the change I made in the 4.1 (5.0 is the place for new things 4.1 is not). Revision Changes Path 1.3 +10 -4 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/Manager.java Index: Manager.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/Manager.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- Manager.java 20 Sep 2002 21:22:31 -0000 1.2 +++ Manager.java 9 Dec 2002 15:57:43 -0000 1.3 @@ -182,6 +182,12 @@ */ public void addPropertyChangeListener(PropertyChangeListener listener); + /** + * Get a session from the recycled ones or create a new empty one. + * The PersistentManager manager does not need to create session data + * because it reads it from the Store. + */ + public Session createEmptySession(); /** * Construct and return a new session object, based on the default 1.2 +9 -5 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/FileStore.java Index: FileStore.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/FileStore.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- FileStore.java 18 Jul 2002 16:47:51 -0000 1.1 +++ FileStore.java 9 Dec 2002 15:57:43 -0000 1.2 @@ -290,6 +290,10 @@ if (file == null) { return (null); } + + if (! file.exists()) { + return (null); + } if (debug >= 1) { log(sm.getString(getStoreName()+".loading", id, file.getAbsolutePath())); @@ -329,7 +333,7 @@ try { StandardSession session = - (StandardSession) manager.createSession(); + (StandardSession) manager.createEmptySession(); session.readObjectData(ois); session.setManager(manager); return (session); 1.3 +5 -5 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/JDBCStore.java Index: JDBCStore.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/JDBCStore.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- JDBCStore.java 8 Dec 2002 13:42:10 -0000 1.2 +++ JDBCStore.java 9 Dec 2002 15:57:43 -0000 1.3 @@ -538,7 +538,7 @@ if(ois != null) { try { - _session = (StandardSession) manager.createSession(); + _session = (StandardSession) manager.createEmptySession(); _session.readObjectData(ois); _session.setManager(manager); } finally { 1.5 +27 -17 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/ManagerBase.java Index: ManagerBase.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/ManagerBase.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- ManagerBase.java 5 Dec 2002 13:52:51 -0000 1.4 +++ ManagerBase.java 9 Dec 2002 15:57:43 -0000 1.5 @@ -600,18 +600,7 @@ public Session createSession() { // Recycle or create a Session instance - Session session = null; - synchronized (recycled) { - int size = recycled.size(); - if (size > 0) { - session = (Session) recycled.get(size - 1); - recycled.remove(size - 1); - } - } - if (session != null) - session.setManager(this); - else - session = new StandardSession(this); + Session session = createEmptySession(); // Initialize the properties of the new session and return it session.setNew(true); @@ -623,7 +612,6 @@ // @todo Move appending of jvmRoute generateSessionId()??? if (jvmRoute != null) { sessionId += '.' + jvmRoute; - session.setId(sessionId); } /* synchronized (sessions) { @@ -635,6 +623,28 @@ return (session); + } + + + /** + * Get a session from the recycled ones or create a new empty one. + * The PersistentManager manager does not need to create session data + * because it reads it from the Store. + */ + public Session createEmptySession() { + Session session = null; + synchronized (recycled) { + int size = recycled.size(); + if (size > 0) { + session = (Session) recycled.get(size - 1); + recycled.remove(size - 1); + } + } + if (session != null) + session.setManager(this); + else + session = new StandardSession(this); + return(session); } 1.5 +14 -4 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/PersistentManagerBase.java Index: PersistentManagerBase.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/PersistentManagerBase.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- PersistentManagerBase.java 25 Nov 2002 19:58:34 -0000 1.4 +++ PersistentManagerBase.java 9 Dec 2002 15:57:43 -0000 1.5 @@ -666,6 +666,15 @@ } + /** + * Remove this Session from the active Sessions for this Manager, + * but not from the Store. (Used by the PersistentValve) + * + * @param session Session to be removed + */ + public void removeSuper(Session session) { + super.remove (session); + } /** * Load all sessions found in the persistence mechanism, assuming @@ -844,6 +853,7 @@ log(sm.getString("persistentManager.swapIn", id)); session.setManager(this); + session.setId(id); // To make sure the listener knows about it. add(session); ((StandardSession)session).activate(); 1.1 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/valves/PersistentValve.java Index: PersistentValve.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/valves/PersistentValve.java,v 1.1 2002/12/09 15:57:43 jfclere Exp $ * $Revision: 1.1 $ * $Date: 2002/12/09 15:57:43 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * 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 Group. * * 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 * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.catalina.valves; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.catalina.Container; import org.apache.catalina.Context; import org.apache.catalina.Manager; import org.apache.catalina.Request; import org.apache.catalina.Response; import org.apache.catalina.Session; import org.apache.catalina.ValveContext; import org.apache.catalina.util.StringManager; import org.apache.catalina.valves.ValveBase; import org.apache.catalina.Logger; import org.apache.catalina.core.StandardHost; import org.apache.catalina.Store; import org.apache.catalina.session.PersistentManager; import org.apache.catalina.session.ManagerBase; /** * Valve that implements the default basic behavior for the * <code>StandardHost</code> container implementation. * <p> * <b>USAGE CONSTRAINT</b>: To work correctly it requires a PersistentManager. * * @author Jean-Frederic Clere * @version $Revision: 1.1 $ $Date: 2002/12/09 15:57:43 $ */ public class PersistentValve extends ValveBase { // ----------------------------------------------------- Instance Variables /** * The descriptive information related to this implementation. */ private static final String info = "org.apache.catalina.valves.PersistentValve/1.0"; /** * The string manager for this package. */ private static final StringManager sm = StringManager.getManager(Constants.Package); // ------------------------------------------------------------- Properties /** * Return descriptive information about this Valve implementation. */ public String getInfo() { return (info); } // --------------------------------------------------------- Public Methods /** * Select the appropriate child Context to process this request, * based on the specified request URI. If no matching Context can * be found, return an appropriate HTTP error. * * @param request Request to be processed * @param response Response to be produced * @param valveContext Valve context used to forward to the next Valve * * @exception IOException if an input/output error occurred * @exception ServletException if a servlet error occurred */ public void invoke(Request request, Response response, ValveContext valveContext) throws IOException, ServletException { // Validate the request and response object types if (!(request.getRequest() instanceof HttpServletRequest) || !(response.getResponse() instanceof HttpServletResponse)) { return; // NOTE - Not much else we can do generically } // Select the Context to be used for this Request StandardHost host = (StandardHost) getContainer(); Context context = (Context) host.map(request, true); if (context == null) { ((HttpServletResponse) response.getResponse()).sendError (HttpServletResponse.SC_INTERNAL_SERVER_ERROR, sm.getString("standardHost.noContext")); return; } // Bind the context CL to the current thread Thread.currentThread().setContextClassLoader (context.getLoader().getClassLoader()); // Update the session last access time for our session (if any) HttpServletRequest hreq = (HttpServletRequest) request.getRequest(); String sessionId = hreq.getRequestedSessionId(); Manager manager = context.getManager(); if (sessionId != null && manager != null) { if (manager instanceof PersistentManager) { Store store = ((PersistentManager) manager).getStore(); if (store != null) { Session session = null; try { session = store.load(sessionId); } catch (Exception e) { log("deserializeError"); } if (session != null) { if (!session.isValid() || isSessionStale(session, System.currentTimeMillis())) { log("session swapped in is invalid or expired"); session.expire(); store.remove(sessionId); } else { session.setManager(manager); // session.setId(sessionId); Only if new ??? manager.add(session); // ((StandardSession)session).activate(); session.access(); } } } } } log("sessionId: " + sessionId); // Ask this Context to process this request context.invoke(request, response); // ? valveContext.invokeNext(request, response); // Read the sessionid after the response. // HttpSession hsess = hreq.getSession(false); HttpSession hsess; try { hsess = hreq.getSession(); } catch (Exception ex) { hsess = null; } String newsessionId = null; if (hsess!=null) newsessionId = hsess.getId(); log("newsessionId: " + newsessionId); if (newsessionId!=null) { /* store the session in the store and remove it from the manager */ if (manager instanceof PersistentManager) { Session session = manager.findSession(newsessionId); Store store = ((PersistentManager) manager).getStore(); if (store != null && session!=null && session.isValid() && !isSessionStale(session, System.currentTimeMillis())) { // ((StandardSession)session).passivate(); store.save(session); ((PersistentManager) manager).removeSuper(session); session.recycle(); } else { log("newsessionId store: " + store + " session: " + session + " valid: " + session.isValid() + " Staled: " + isSessionStale(session, System.currentTimeMillis())); } } else { log("newsessionId Manager: " + manager); } } } /** * Log a message on the Logger associated with our Container (if any). * * @param message Message to be logged */ protected void log(String message) { Logger logger = container.getLogger(); if (logger != null) logger.log(this.toString() + ": " + message); else System.out.println(this.toString() + ": " + message); } /** * Indicate whether the session has been idle for longer * than its expiration date as of the supplied time. * * FIXME: Probably belongs in the Session class. */ protected boolean isSessionStale(Session session, long timeNow) { int maxInactiveInterval = session.getMaxInactiveInterval(); if (maxInactiveInterval >= 0) { int timeIdle = // Truncate, do not round up (int) ((timeNow - session.getLastAccessedTime()) / 1000L); if (timeIdle >= maxInactiveInterval) return true; } return false; } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>