craigmcc 02/03/18 14:24:11 Modified: catalina/src/share/org/apache/catalina/session Tag: tomcat_40_branch FileStore.java Log: Port the FileStore fix for creating the working directory if it is not there (and the associated refactoring/cleanup) from the HEAD branch. PR: Bugzilla #7171 Submitted by: Peter Rossbach <pr at webapp.de> Revision Changes Path No revision No revision 1.6.2.1 +99 -80 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/FileStore.java Index: FileStore.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/FileStore.java,v retrieving revision 1.6 retrieving revision 1.6.2.1 diff -u -r1.6 -r1.6.2.1 --- FileStore.java 22 Jul 2001 20:25:12 -0000 1.6 +++ FileStore.java 18 Mar 2002 22:24:11 -0000 1.6.2.1 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/FileStore.java,v 1.6 2001/07/22 20:25:12 pier Exp $ - * $Revision: 1.6 $ - * $Date: 2001/07/22 20:25:12 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/FileStore.java,v 1.6.2.1 2002/03/18 22:24:11 craigmcc Exp $ + * $Revision: 1.6.2.1 $ + * $Date: 2002/03/18 22:24:11 $ * * ==================================================================== * @@ -77,9 +77,7 @@ import java.io.ObjectOutputStream; import java.io.ObjectStreamClass; import java.io.Serializable; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Vector; +import java.util.ArrayList; import javax.servlet.ServletContext; import org.apache.catalina.Context; import org.apache.catalina.Globals; @@ -96,7 +94,7 @@ * saved are still subject to being expired based on inactivity. * * @author Craig R. McClanahan - * @version $Revision: 1.6 $ $Date: 2001/07/22 20:25:12 $ + * @version $Revision: 1.6.2.1 $ $Date: 2002/03/18 22:24:11 $ */ public final class FileStore @@ -117,7 +115,8 @@ /** * The pathname of the directory in which Sessions are stored. - * Relative to the temp directory for the web application. + * This may be an absolute pathname, or a relative path that is + * resolved against the temporary work directory for this application. */ private String directory = "."; @@ -206,15 +205,20 @@ */ public int getSize() throws IOException { - String[] files = getDirectoryFile().list(); + // Acquire the list of files in our storage directory + File file = directory(); + if (file == null) { + return (0); + } + String files[] = file.list(); // Figure out which files are sessions int keycount = 0; for (int i = 0; i < files.length; i++) { - if (files[i].endsWith(FILE_EXT)) + if (files[i].endsWith(FILE_EXT)) { keycount++; + } } - return (keycount); } @@ -222,6 +226,23 @@ // --------------------------------------------------------- Public Methods + + /** + * Remove all of the Sessions in this Store. + * + * @exception IOException if an input/output error occurs + */ + public void clear() + throws IOException { + + String[] keys = keys(); + for (int i = 0; i < keys.length; i++) { + remove(keys[i]); + } + + } + + /** * Return an array containing the session identifiers of all Sessions * currently saved in this Store. If there are no such Sessions, a @@ -231,30 +252,22 @@ */ public String[] keys() throws IOException { - String[] files = getDirectoryFile().list(); - - // Figure out which files contain sessions - int keycount = 0; - for (int i = 0; i < files.length; i++) { - if (files[i].endsWith(FILE_EXT)) - keycount++; - else - files[i] = null; + // Acquire the list of files in our storage directory + File file = directory(); + if (file == null) { + return (new String[0]); } + String files[] = file.list(); - // Get keys from relevant filenames. - String[] keys = new String[keycount]; - if (keycount > 0) { - keycount = 0; - for (int i = 0; i < files.length; i++) { - if (files[i] != null) { - keys[keycount] = files[i].substring (0, files[i].lastIndexOf('.')); - keycount++; - } + // Build and return the list of session identifiers + ArrayList list = new ArrayList(); + int n = FILE_EXT.length(); + for (int i = 0; i < files.length; i++) { + if (files[i].endsWith(FILE_EXT)) { + list.add(files[i].substring(0, files[i].length() - n)); } } - - return (keys); + return ((String[]) list.toArray(new String[list.size()])); } @@ -274,11 +287,13 @@ // Open an input stream to the specified pathname, if any File file = file(id); - if (file == null) + if (file == null) { return (null); - if (debug >= 1) + } + if (debug >= 1) { log(sm.getString(getStoreName()+".loading", id, file.getAbsolutePath())); + } FileInputStream fis = null; ObjectInputStream ois = null; @@ -313,7 +328,8 @@ } try { - StandardSession session = (StandardSession) manager.createSession(); + StandardSession session = + (StandardSession) manager.createSession(); session.readObjectData(ois); session.setManager(manager); return (session); @@ -341,29 +357,15 @@ */ public void remove(String id) throws IOException { - // Open an input stream to the specified pathname, if any File file = file(id); - if (file == null) + if (file == null) { return; - if (debug >= 1) + } + if (debug >= 1) { log(sm.getString(getStoreName()+".removing", id, file.getAbsolutePath())); - file.delete(); - } - - - /** - * Remove all of the Sessions in this Store. - * - * @exception IOException if an input/output error occurs - */ - public void clear() - throws IOException { - - String[] keys = keys(); - for (int i = 0; i < keys.length; i++) { - remove(keys[i]); } + file.delete(); } @@ -380,11 +382,13 @@ // Open an output stream to the specified pathname, if any File file = file(session.getId()); - if (file == null) + if (file == null) { return; - if (debug >= 1) + } + if (debug >= 1) { log(sm.getString(getStoreName()+".saving", session.getId(), file.getAbsolutePath())); + } FileOutputStream fos = null; ObjectOutputStream oos = null; try { @@ -412,47 +416,62 @@ // -------------------------------------------------------- Private Methods + /** * Return a File object representing the pathname to our - * session persistence file, if any. - * - * @param id The ID of the Session to be retrieved. This is - * used in the file naming. + * session persistence directory, if any. The directory will be + * created if it does not already exist. */ - private File file(String id) { + private File directory() { - if (directory == null) + if (this.directory == null) { return (null); - - String pathname = directory + "/" + id + FILE_EXT; - File file = new File(pathname); - if (!file.isAbsolute()) { - File tempdir = getDirectoryFile(); - if (tempdir != null) - file = new File(tempdir, pathname); } - return (file); - - } - - /** - * Return a File object for the directory property. - */ - private File getDirectoryFile() { - - if (directoryFile == null) { + if (this.directoryFile != null) { + // NOTE: Race condition is harmless, so do not synchronize + return (this.directoryFile); + } + File file = new File(this.directory); + if (!file.isAbsolute()) { Container container = manager.getContainer(); if (container instanceof Context) { ServletContext servletContext = ((Context) container).getServletContext(); - directoryFile = (File) + File work = (File) servletContext.getAttribute(Globals.WORK_DIR_ATTR); + file = new File(work, this.directory); } else { - throw new IllegalArgumentException("directory not set, I can't work with this Container"); + throw new IllegalArgumentException + ("Parent Container is not a Context"); } } + if (!file.exists() || !file.isDirectory()) { + file.delete(); + file.mkdirs(); + } + this.directoryFile = file; + return (file); + + } - return directoryFile; + + /** + * Return a File object representing the pathname to our + * session persistence file, if any. + * + * @param id The ID of the Session to be retrieved. This is + * used in the file naming. + */ + private File file(String id) { + + if (this.directory == null) { + return (null); + } + String filename = id + FILE_EXT; + File file = new File(directory(), filename); + return (file); } + + }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>