FileDocCategorySizeDatePackage
FileStore.javaAPI DocGlassfish v2 API15252Fri May 04 22:32:18 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: 1.5 $ $Date: 2007/05/05 05:32:18 $

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.
protected Hashtable
sessions
Our write-through cache of session objects HERCULES: addition
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();

        // 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

            
        //HERCULES:addition
        // Check to see if it's in our cache first
        Session sess = (Session)sessions.get(id);
        if ( sess != null ) {
            return sess;
        }
        //HERCULES:addition            

        // 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 (debug >= 1) {
            log(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) {
                IOUtilsCaller caller =
                    ((ManagerBase) manager).getWebUtilsCaller();
                if (caller != null) {
                    try {
                        ois = caller.createObjectInputStream(bis, true, classLoader);
                    } catch (Exception ex) {}
                } else {
                    ois = new CustomObjectInputStream(bis, classLoader); 
                }
            }
            if (ois == null) {
                ois = new ObjectInputStream(bis); 
            }
            //end HERCULES:mod
        } catch (FileNotFoundException e) {
            if (debug >= 1)
                log("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.deserialize(ois, manager);
            session.setManager(manager);
            //HERCULES: addition
            // Put it in the cache
            sessions.put(session.getIdInternal(), session);     
            //HERCULES: addition            
            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 (debug >= 1) {
            log(sm.getString(getStoreName()+".removing",
                             id, file.getAbsolutePath()));
        }
        //HERCULES: addition
        // Take it out of the cache 
        sessions.remove(id);        
        //HERCULES: addition        
        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 (debug >= 1) {
            log(sm.getString(getStoreName()+".saving",
                             session.getIdInternal(), file.getAbsolutePath()));
        }
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        try {
            fos = new FileOutputStream(file.getAbsolutePath());
            IOUtilsCaller caller = ((ManagerBase) manager).getWebUtilsCaller();
            if (caller != null) {
                try {
                    oos = caller.createObjectOutputStream(
                            new BufferedOutputStream(fos), true);
                } catch (Exception ex) {}
            }
            // Use normal ObjectOutputStream if there is a failure during
            // stream creation
            if(oos == null) {
                oos = new ObjectOutputStream(new BufferedOutputStream(fos)); 
            }
            //end Hercules             
        } catch (IOException e) {
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException f) {
                    ;
                }
            }
            throw e;
        }

        try {
            oos.writeObject(session);
        } 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);