FileDocCategorySizeDatePackage
FileStore.javaAPI DocApache Tomcat 6.0.1413240Fri Jul 20 04:20:32 BST 2007org.apache.catalina.session

FileStore

public final class FileStore extends StoreBase implements org.apache.catalina.Store
Concrete implementation of the Store interface that utilizes a file per saved Session in a configured directory. Sessions that are saved are still subject to being expired based on inactivity.
author
Craig R. McClanahan
version
$Revision: 467222 $ $Date: 2006-10-24 05:17:11 +0200 (mar., 24 oct. 2006) $

Fields Summary
private static final String
FILE_EXT
The extension to use for serialized session filenames.
private String
directory
The pathname of the directory in which Sessions are stored. This may be an absolute pathname, or a relative path that is resolved against the temporary work directory for this application.
private File
directoryFile
A File representing the directory in which Sessions are stored.
private static final String
info
The descriptive information about this implementation.
private static final String
storeName
Name to register for this Store, used for logging.
private static final String
threadName
Name to register for the background thread.
Constructors Summary
Methods Summary
public voidclear()
Remove all of the Sessions in this Store.

exception
IOException if an input/output error occurs


        String[] keys = keys();
        for (int i = 0; i < keys.length; i++) {
            remove(keys[i]);
        }

    
private java.io.Filedirectory()
Return a File object representing the pathname to our session persistence directory, if any. The directory will be created if it does not already exist.


        if (this.directory == null) {
            return (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();
                File work = (File)
                    servletContext.getAttribute(Globals.WORK_DIR_ATTR);
                file = new File(work, this.directory);
            } else {
                throw new IllegalArgumentException
                    ("Parent Container is not a Context");
            }
        }
        if (!file.exists() || !file.isDirectory()) {
            file.delete();
            file.mkdirs();
        }
        this.directoryFile = file;
        return (file);

    
private java.io.Filefile(java.lang.String id)
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.


        if (this.directory == null) {
            return (null);
        }
        String filename = id + FILE_EXT;
        File file = new File(directory(), filename);
        return (file);

    
public java.lang.StringgetDirectory()
Return the directory path for this Store.



    // ------------------------------------------------------------- Properties


                
       

        return (directory);

    
public java.lang.StringgetInfo()
Return descriptive information about this Store implementation and the corresponding version number, in the format <description>/<version>.


        return (info);

    
public intgetSize()
Return the number of Sessions present in this Store.

exception
IOException if an input/output error occurs


        // 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)) {
                keycount++;
            }
        }
        return (keycount);

    
public java.lang.StringgetStoreName()
Return the name for this Store, used for logging.

        return(storeName);
    
public java.lang.StringgetThreadName()
Return the thread name for this Store.

        return(threadName);
    
public java.lang.String[]keys()
Return an array containing the session identifiers of all Sessions currently saved in this Store. If there are no such Sessions, a zero-length array is returned.

exception
IOException if an input/output error occurred


        // Acquire the list of files in our storage directory
        File file = directory();
        if (file == null) {
            return (new String[0]);
        }

        String files[] = file.list();
        
        // Bugzilla 32130
        if((files == null) || (files.length < 1)) {
            return (new String[0]);
        }

        // 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 ((String[]) list.toArray(new String[list.size()]));

    
public org.apache.catalina.Sessionload(java.lang.String id)
Load and return the Session associated with the specified session identifier from this Store, without removing it. If there is no such stored Session, return null.

param
id Session identifier of the session to load
exception
ClassNotFoundException if a deserialization error occurs
exception
IOException if an input/output error occurs


        // Open an input stream to the specified pathname, if any
        File file = file(id);
        if (file == null) {
            return (null);
        }

        if (! file.exists()) {
            return (null);
        }
        if (manager.getContainer().getLogger().isDebugEnabled()) {
            manager.getContainer().getLogger().debug(sm.getString(getStoreName()+".loading",
                             id, file.getAbsolutePath()));
        }

        FileInputStream fis = null;
        ObjectInputStream ois = null;
        Loader loader = null;
        ClassLoader classLoader = null;
        try {
            fis = new FileInputStream(file.getAbsolutePath());
            BufferedInputStream bis = new BufferedInputStream(fis);
            Container container = manager.getContainer();
            if (container != null)
                loader = container.getLoader();
            if (loader != null)
                classLoader = loader.getClassLoader();
            if (classLoader != null)
                ois = new CustomObjectInputStream(bis, classLoader);
            else
                ois = new ObjectInputStream(bis);
        } catch (FileNotFoundException e) {
            if (manager.getContainer().getLogger().isDebugEnabled())
                manager.getContainer().getLogger().debug("No persisted data file found");
            return (null);
        } catch (IOException e) {
            if (ois != null) {
                try {
                    ois.close();
                } catch (IOException f) {
                    ;
                }
                ois = null;
            }
            throw e;
        }

        try {
            StandardSession session =
                (StandardSession) manager.createEmptySession();
            session.readObjectData(ois);
            session.setManager(manager);
            return (session);
        } finally {
            // Close the input stream
            if (ois != null) {
                try {
                    ois.close();
                } catch (IOException f) {
                    ;
                }
            }
        }
    
public voidremove(java.lang.String id)
Remove the Session with the specified session identifier from this Store, if present. If no such Session is present, this method takes no action.

param
id Session identifier of the Session to be removed
exception
IOException if an input/output error occurs


        File file = file(id);
        if (file == null) {
            return;
        }
        if (manager.getContainer().getLogger().isDebugEnabled()) {
            manager.getContainer().getLogger().debug(sm.getString(getStoreName()+".removing",
                             id, file.getAbsolutePath()));
        }
        file.delete();

    
public voidsave(org.apache.catalina.Session session)
Save the specified Session into this Store. Any previously saved information for the associated session identifier is replaced.

param
session Session to be saved
exception
IOException if an input/output error occurs


        // Open an output stream to the specified pathname, if any
        File file = file(session.getIdInternal());
        if (file == null) {
            return;
        }
        if (manager.getContainer().getLogger().isDebugEnabled()) {
            manager.getContainer().getLogger().debug(sm.getString(getStoreName()+".saving",
                             session.getIdInternal(), file.getAbsolutePath()));
        }
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        try {
            fos = new FileOutputStream(file.getAbsolutePath());
            oos = new ObjectOutputStream(new BufferedOutputStream(fos));
        } catch (IOException e) {
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException f) {
                    ;
                }
            }
            throw e;
        }

        try {
            ((StandardSession)session).writeObjectData(oos);
        } finally {
            oos.close();
        }

    
public voidsetDirectory(java.lang.String path)
Set the directory path for this Store.

param
path The new directory path


        String oldDirectory = this.directory;
        this.directory = path;
        this.directoryFile = null;
        support.firePropertyChange("directory", oldDirectory,
                                   this.directory);