home *** CD-ROM | disk | FTP | other *** search
- package lotus.domino.servlet;
-
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.util.Date;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import javax.servlet.http.HttpSession;
- import javax.servlet.http.HttpSessionContext;
-
- public class DominoSessionContext extends Thread implements HttpSessionContext {
- private Hashtable i_sessions;
- private int i_maxSessions;
- private long i_idleTimeout;
- private long i_sessGCinterval = 60000L;
- private boolean i_shutdown = false;
- private boolean i_persistentSessions = ServletManager.getBoolProp("server.session.persistence", false);
- private static final String SESSION_FILE = "sessdata.ser";
- private static final long DEF_IDLE_TIMEOUT = 1800000L;
- private static final int DEF_MAX_SESSIONS = 1000;
- private static final long DEF_GC_INTERVAL = 1000L;
-
- protected DominoSessionContext() {
- this.i_sessGCinterval = ServletManager.getLongProp("server.session.gcinterval", 1000L);
- this.i_maxSessions = ServletManager.getIntProp("server.session.maxsessions", 1000);
- this.i_idleTimeout = ServletManager.getLongProp("server.session.idletimeout", 1800000L);
- if (this.i_persistentSessions) {
- this.loadSessions();
- } else {
- this.i_sessions = new Hashtable();
- }
-
- try {
- ((Thread)this).start();
- } catch (Exception var2) {
- ((Throwable)var2).printStackTrace();
- }
- }
-
- public HttpSession getSession(String var1) {
- return (HttpSession)this.i_sessions.get(var1);
- }
-
- public Enumeration getIds() {
- return this.i_sessions.keys();
- }
-
- protected synchronized void registerSession(String var1) {
- if (this.i_sessions.size() >= this.i_maxSessions) {
- this.removeOldestSession();
- }
-
- DominoSession var2 = (DominoSession)this.i_sessions.get(var1);
- if (var2 == null) {
- var2 = new DominoSession(this, var1);
- this.i_sessions.put(var1, var2);
- } else {
- var2.updateLastAccessTime();
- }
- }
-
- protected synchronized void unregisterSession(Object var1) {
- DominoSession var2 = (DominoSession)this.i_sessions.remove(var1);
- if (var2 != null) {
- var2.removeAll();
- }
-
- }
-
- private synchronized void removeOldestSession() {
- long var1 = (new Date()).getTime();
- String var3 = null;
- Enumeration var4 = this.i_sessions.elements();
-
- while(var4.hasMoreElements()) {
- DominoSession var5 = (DominoSession)var4.nextElement();
- if (var5.getLastAccessedTime() < var1) {
- var3 = var5.getId();
- var1 = var5.getLastAccessedTime();
- break;
- }
- }
-
- if (var3 != null) {
- this.unregisterSession(var3);
- }
-
- }
-
- private synchronized void invalidateSessions() {
- Enumeration var1 = this.i_sessions.elements();
-
- while(var1.hasMoreElements()) {
- DominoSession var2 = (DominoSession)var1.nextElement();
- long var3 = var2.getLastAccessedTime();
- long var5 = (new Date()).getTime();
- if (var5 - this.i_idleTimeout > var3) {
- this.unregisterSession(var2.getId());
- }
- }
-
- }
-
- public void run() {
- while(!this.i_shutdown) {
- try {
- Thread.sleep(this.i_sessGCinterval);
- if (!this.i_shutdown) {
- this.invalidateSessions();
- }
- } catch (Exception var2) {
- ((Throwable)var2).printStackTrace();
- }
- }
-
- }
-
- private void loadSessions() {
- try {
- String var1 = ServletManager.getConfigPath() + "/" + "sessdata.ser";
- FileInputStream var2 = new FileInputStream(var1);
- ObjectInputStream var3 = new ObjectInputStream(var2);
- this.i_sessions = (Hashtable)var3.readObject();
- var2.close();
- Enumeration var5 = this.i_sessions.elements();
-
- while(var5.hasMoreElements()) {
- DominoSession var4 = (DominoSession)var5.nextElement();
- var4.setContext(this);
- var4.bindAll();
- }
-
- } catch (Exception var6) {
- this.i_sessions = new Hashtable();
- }
- }
-
- private void saveSessions() {
- Enumeration var2 = this.i_sessions.keys();
-
- while(var2.hasMoreElements()) {
- String var3 = (String)var2.nextElement();
- DominoSession var1 = (DominoSession)this.getSession(var3);
- var1.removeTransients();
- var1.unbindAll();
- }
-
- try {
- String var7 = ServletManager.getConfigPath() + "/" + "sessdata.ser";
- FileOutputStream var4 = new FileOutputStream(var7);
- ObjectOutputStream var5 = new ObjectOutputStream(var4);
- var5.writeObject(this.i_sessions);
- var5.flush();
- var4.close();
- } catch (Exception var6) {
- ((Throwable)var6).printStackTrace();
- }
- }
-
- public void terminate() {
- this.i_shutdown = true;
- if (this.i_persistentSessions) {
- this.saveSessions();
- }
-
- }
- }
-