View Javadoc

1   package com.panogenesis.webapp.listener;
2   
3   import java.util.HashSet;
4   import java.util.Set;
5   
6   import javax.servlet.ServletContext;
7   import javax.servlet.ServletContextEvent;
8   import javax.servlet.ServletContextListener;
9   import javax.servlet.http.HttpSessionAttributeListener;
10  import javax.servlet.http.HttpSessionBindingEvent;
11  
12  import org.apache.commons.logging.Log;
13  import org.apache.commons.logging.LogFactory;
14  import com.panogenesis.Constants;
15  
16  
17  /***
18   * UserCounterListener class used to count the current number
19   * of active users for the applications.  Does this by counting
20   * how many user objects are stuffed into the session.  It Also grabs
21   * these users and exposes them in the servlet context.
22   *
23   * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
24   *
25   * @web.listener
26   */
27  public class UserCounterListener implements ServletContextListener,
28                                              HttpSessionAttributeListener {
29      public static final String COUNT_KEY = "userCounter";
30      public static final String USERS_KEY = "userNames";
31      private final transient Log log = LogFactory.getLog(UserCounterListener.class);
32      private transient ServletContext servletContext;
33      private int counter;
34      private Set users;
35  
36      public synchronized void contextInitialized(ServletContextEvent sce) {
37          servletContext = sce.getServletContext();
38          servletContext.setAttribute((COUNT_KEY), Integer.toString(counter));
39      }
40  
41      public synchronized void contextDestroyed(ServletContextEvent event) {
42          servletContext = null;
43          users = null;
44          counter = 0;
45      }
46  
47      synchronized void incrementUserCounter() {
48          counter =
49              Integer.parseInt((String) servletContext.getAttribute(COUNT_KEY));
50          counter++;
51          servletContext.setAttribute(COUNT_KEY, Integer.toString(counter));
52  
53          if (log.isDebugEnabled()) {
54              log.debug("User Count: " + counter);
55          }
56      }
57  
58      synchronized void decrementUserCounter() {
59          int counter =
60              Integer.parseInt((String) servletContext.getAttribute(COUNT_KEY));
61          counter--;
62  
63          if (counter < 0) {
64              counter = 0;
65          }
66  
67          servletContext.setAttribute(COUNT_KEY, Integer.toString(counter));
68  
69          if (log.isDebugEnabled()) {
70              log.debug("User Count: " + counter);
71          }
72      }
73  
74      synchronized void addUsername(Object user) {
75          users = (Set) servletContext.getAttribute(USERS_KEY);
76  
77          if (users == null) {
78              users = new HashSet();
79          }
80  
81          if (log.isDebugEnabled()) {
82              if (users.contains(user)) {
83                  log.debug("User already logged in, adding anyway...");
84              }
85          }
86  
87          users.add(user);
88          servletContext.setAttribute(USERS_KEY, users);
89          incrementUserCounter();
90      }
91  
92      synchronized void removeUsername(Object user) {
93          users = (Set) servletContext.getAttribute(USERS_KEY);
94  
95          if (users != null) {
96              users.remove(user);
97          }
98  
99          servletContext.setAttribute(USERS_KEY, users);
100         decrementUserCounter();
101     }
102 
103     /***
104     * This method is designed to catch when user's login and record their name
105      * @see javax.servlet.http.HttpSessionAttributeListener#attributeAdded(javax.servlet.http.HttpSessionBindingEvent)
106      */
107     public void attributeAdded(HttpSessionBindingEvent event) {
108         if (event.getName().equals(Constants.USER_KEY)) {
109             addUsername(event.getValue());
110         }
111     }
112 
113     /***
114     * When user's logout, remove their name from the hashMap
115      * @see javax.servlet.http.HttpSessionAttributeListener#attributeRemoved(javax.servlet.http.HttpSessionBindingEvent)
116      */
117     public void attributeRemoved(HttpSessionBindingEvent event) {
118         if (event.getName().equals(Constants.USER_KEY)) {
119             removeUsername(event.getValue());
120         }
121     }
122 
123     /***
124      * @see javax.servlet.http.HttpSessionAttributeListener#attributeReplaced(javax.servlet.http.HttpSessionBindingEvent)
125      */
126     public void attributeReplaced(HttpSessionBindingEvent event) {
127         // I don't really care if the user changes their information
128     }
129 }