Fields Summary |
---|
private static final String | FILE_EXTThe extension to use for serialized session filenames. |
private String | directoryThe 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 | directoryFileA File representing the directory in which Sessions are stored. |
private static final String | infoThe descriptive information about this implementation. |
private static final String | storeNameName to register for this Store, used for logging. |
private static final String | threadNameName to register for the background thread. |
protected Hashtable | sessionsOur write-through cache of session objects
HERCULES: addition |
Methods Summary |
---|
public void | clear()Remove all of the Sessions in this Store.
String[] keys = keys();
for (int i = 0; i < keys.length; i++) {
remove(keys[i]);
}
|
private java.io.File | directory()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.File | file(java.lang.String id)Return a File object representing the pathname to our
session persistence file, if any.
if (this.directory == null) {
return (null);
}
String filename = id + FILE_EXT;
File file = new File(directory(), filename);
return (file);
|
public java.lang.String | getDirectory()Return the directory path for this Store.
// ------------------------------------------------------------- Properties
return (directory);
|
public java.lang.String | getInfo()Return descriptive information about this Store implementation and
the corresponding version number, in the format
<description>/<version> .
return (info);
|
public int | getSize()Return the number of Sessions present in this Store.
// 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.String | getStoreName()Return the name for this Store, used for logging.
return(storeName);
|
public java.lang.String | getThreadName()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.
// 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.Session | load(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 .
//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 void | remove(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.
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 void | save(org.apache.catalina.Session session)Save the specified Session into this Store. Any previously saved
information for the associated session identifier is replaced.
// 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 void | setDirectory(java.lang.String path)Set the directory path for this Store.
String oldDirectory = this.directory;
this.directory = path;
this.directoryFile = null;
support.firePropertyChange("directory", oldDirectory,
this.directory);
|