home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / NotesProgramFilesJavaSupport / icsclass.jar / lotus / domino / servlet / DominoSessionContext.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-11-15  |  4.3 KB  |  170 lines

  1. package lotus.domino.servlet;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.ObjectInputStream;
  6. import java.io.ObjectOutputStream;
  7. import java.util.Date;
  8. import java.util.Enumeration;
  9. import java.util.Hashtable;
  10. import javax.servlet.http.HttpSession;
  11. import javax.servlet.http.HttpSessionContext;
  12.  
  13. public class DominoSessionContext extends Thread implements HttpSessionContext {
  14.    private Hashtable i_sessions;
  15.    private int i_maxSessions;
  16.    private long i_idleTimeout;
  17.    private long i_sessGCinterval = 60000L;
  18.    private boolean i_shutdown = false;
  19.    private boolean i_persistentSessions = ServletManager.getBoolProp("server.session.persistence", false);
  20.    private static final String SESSION_FILE = "sessdata.ser";
  21.    private static final long DEF_IDLE_TIMEOUT = 1800000L;
  22.    private static final int DEF_MAX_SESSIONS = 1000;
  23.    private static final long DEF_GC_INTERVAL = 1000L;
  24.  
  25.    protected DominoSessionContext() {
  26.       this.i_sessGCinterval = ServletManager.getLongProp("server.session.gcinterval", 1000L);
  27.       this.i_maxSessions = ServletManager.getIntProp("server.session.maxsessions", 1000);
  28.       this.i_idleTimeout = ServletManager.getLongProp("server.session.idletimeout", 1800000L);
  29.       if (this.i_persistentSessions) {
  30.          this.loadSessions();
  31.       } else {
  32.          this.i_sessions = new Hashtable();
  33.       }
  34.  
  35.       try {
  36.          ((Thread)this).start();
  37.       } catch (Exception var2) {
  38.          ((Throwable)var2).printStackTrace();
  39.       }
  40.    }
  41.  
  42.    public HttpSession getSession(String var1) {
  43.       return (HttpSession)this.i_sessions.get(var1);
  44.    }
  45.  
  46.    public Enumeration getIds() {
  47.       return this.i_sessions.keys();
  48.    }
  49.  
  50.    protected synchronized void registerSession(String var1) {
  51.       if (this.i_sessions.size() >= this.i_maxSessions) {
  52.          this.removeOldestSession();
  53.       }
  54.  
  55.       DominoSession var2 = (DominoSession)this.i_sessions.get(var1);
  56.       if (var2 == null) {
  57.          var2 = new DominoSession(this, var1);
  58.          this.i_sessions.put(var1, var2);
  59.       } else {
  60.          var2.updateLastAccessTime();
  61.       }
  62.    }
  63.  
  64.    protected synchronized void unregisterSession(Object var1) {
  65.       DominoSession var2 = (DominoSession)this.i_sessions.remove(var1);
  66.       if (var2 != null) {
  67.          var2.removeAll();
  68.       }
  69.  
  70.    }
  71.  
  72.    private synchronized void removeOldestSession() {
  73.       long var1 = (new Date()).getTime();
  74.       String var3 = null;
  75.       Enumeration var4 = this.i_sessions.elements();
  76.  
  77.       while(var4.hasMoreElements()) {
  78.          DominoSession var5 = (DominoSession)var4.nextElement();
  79.          if (var5.getLastAccessedTime() < var1) {
  80.             var3 = var5.getId();
  81.             var1 = var5.getLastAccessedTime();
  82.             break;
  83.          }
  84.       }
  85.  
  86.       if (var3 != null) {
  87.          this.unregisterSession(var3);
  88.       }
  89.  
  90.    }
  91.  
  92.    private synchronized void invalidateSessions() {
  93.       Enumeration var1 = this.i_sessions.elements();
  94.  
  95.       while(var1.hasMoreElements()) {
  96.          DominoSession var2 = (DominoSession)var1.nextElement();
  97.          long var3 = var2.getLastAccessedTime();
  98.          long var5 = (new Date()).getTime();
  99.          if (var5 - this.i_idleTimeout > var3) {
  100.             this.unregisterSession(var2.getId());
  101.          }
  102.       }
  103.  
  104.    }
  105.  
  106.    public void run() {
  107.       while(!this.i_shutdown) {
  108.          try {
  109.             Thread.sleep(this.i_sessGCinterval);
  110.             if (!this.i_shutdown) {
  111.                this.invalidateSessions();
  112.             }
  113.          } catch (Exception var2) {
  114.             ((Throwable)var2).printStackTrace();
  115.          }
  116.       }
  117.  
  118.    }
  119.  
  120.    private void loadSessions() {
  121.       try {
  122.          String var1 = ServletManager.getConfigPath() + "/" + "sessdata.ser";
  123.          FileInputStream var2 = new FileInputStream(var1);
  124.          ObjectInputStream var3 = new ObjectInputStream(var2);
  125.          this.i_sessions = (Hashtable)var3.readObject();
  126.          var2.close();
  127.          Enumeration var5 = this.i_sessions.elements();
  128.  
  129.          while(var5.hasMoreElements()) {
  130.             DominoSession var4 = (DominoSession)var5.nextElement();
  131.             var4.setContext(this);
  132.             var4.bindAll();
  133.          }
  134.  
  135.       } catch (Exception var6) {
  136.          this.i_sessions = new Hashtable();
  137.       }
  138.    }
  139.  
  140.    private void saveSessions() {
  141.       Enumeration var2 = this.i_sessions.keys();
  142.  
  143.       while(var2.hasMoreElements()) {
  144.          String var3 = (String)var2.nextElement();
  145.          DominoSession var1 = (DominoSession)this.getSession(var3);
  146.          var1.removeTransients();
  147.          var1.unbindAll();
  148.       }
  149.  
  150.       try {
  151.          String var7 = ServletManager.getConfigPath() + "/" + "sessdata.ser";
  152.          FileOutputStream var4 = new FileOutputStream(var7);
  153.          ObjectOutputStream var5 = new ObjectOutputStream(var4);
  154.          var5.writeObject(this.i_sessions);
  155.          var5.flush();
  156.          var4.close();
  157.       } catch (Exception var6) {
  158.          ((Throwable)var6).printStackTrace();
  159.       }
  160.    }
  161.  
  162.    public void terminate() {
  163.       this.i_shutdown = true;
  164.       if (this.i_persistentSessions) {
  165.          this.saveSessions();
  166.       }
  167.  
  168.    }
  169. }
  170.