View Javadoc

1   /**
2    * 2007, Digitalis Informatica. All rights reserved. Distribuicao e Gestao de Informatica, Lda. Estrada de Paco de Arcos
3    * num.9 - Piso -1 2780-666 Paco de Arcos Telefone: (351) 21 4408990 Fax: (351) 21 4408999 http://www.digitalis.pt
4    */
5   package pt.digitalis.dif.controller.security.managers.impl;
6   
7   import java.util.ConcurrentModificationException;
8   import java.util.HashMap;
9   import java.util.Map;
10  
11  import pt.digitalis.dif.controller.interfaces.IPrivateDIFSession;
12  import pt.digitalis.dif.startup.DIFGeneralConfigurationParameters;
13  import pt.digitalis.dif.utils.logging.DIFLogger;
14  
15  /**
16   * Monitor thread that collects inactive sessions and discards them
17   * 
18   * @author Pedro Viegas <a href="mailto:pviegas@digitalis.pt">pviegas@digitalis.pt</a>
19   * @author Rodrigo Gonçalves <a href="mailto:rgoncalves@digitalis.pt">rgoncalves@digitalis.pt</a>
20   * @created Dec 11, 2007
21   */
22  public class SessionGarbageCollector extends Thread {
23  
24      /** The time interval in seconds for each inactive session cleanup */
25      private final int cleanUpInterval;
26  
27      /** The session manager to monitor */
28      private final SessionManagerImpl sessionManager;
29  
30      /**
31       * @param sessionManager
32       */
33      public SessionGarbageCollector(SessionManagerImpl sessionManager)
34      {
35          this.sessionManager = sessionManager;
36          this.cleanUpInterval = DIFGeneralConfigurationParameters.getInstance().getSecondsForSessionCleanup();
37      }
38  
39      /**
40       * @see java.lang.Thread#run()
41       */
42      @Override
43      public void run()
44      {
45  
46          while (true)
47          {
48              try
49              {
50                  synchronized (this)
51                  {
52                      wait(cleanUpInterval * 1000);
53                  }
54              }
55              catch (InterruptedException e)
56              {
57              }
58  
59              try
60              {
61                  Map<String, IPrivateDIFSession> loggedSessions = new HashMap<String, IPrivateDIFSession>();
62                  loggedSessions.putAll(sessionManager.getLoggedSessions());
63  
64                  synchronized (sessionManager)
65                  {
66  
67                      // Prevent NPE if there are no logged sessions
68                      if (loggedSessions != null && loggedSessions.values().size() > 0)
69                      {
70                          synchronized (loggedSessions)
71                          {
72                              for (IPrivateDIFSession session: loggedSessions.values())
73                                  if (session.isMarkedForRemoval() || session.hasExpiredAfterTimeOut())
74                                      sessionManager.removeSession(session.getSessionID());
75                          }
76                      }
77                  }
78              }
79              catch (ConcurrentModificationException e)
80              {
81                  DIFLogger.getLogger().error(
82                          "Could not purge DIF Sessions. Concurent access detected. Will purge on next cycle.");
83              }
84          }
85      }
86  }