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
128 }
129 }