KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > appfuse > webapp > listener > UserCounterListener


1 package org.appfuse.webapp.listener;
2
3 import java.util.HashSet JavaDoc;
4 import java.util.Set JavaDoc;
5
6 import javax.servlet.ServletContext JavaDoc;
7 import javax.servlet.ServletContextEvent JavaDoc;
8 import javax.servlet.ServletContextListener JavaDoc;
9 import javax.servlet.http.HttpSessionAttributeListener JavaDoc;
10 import javax.servlet.http.HttpSessionBindingEvent JavaDoc;
11
12 import org.acegisecurity.context.HttpSessionContextIntegrationFilter;
13 import org.acegisecurity.context.SecurityContext;
14 import org.acegisecurity.context.SecurityContextHolder;
15 import org.acegisecurity.Authentication;
16 import org.acegisecurity.AuthenticationTrustResolver;
17 import org.acegisecurity.AuthenticationTrustResolverImpl;
18 import org.apache.commons.logging.Log;
19 import org.apache.commons.logging.LogFactory;
20 import org.appfuse.model.User;
21
22
23 /**
24  * UserCounterListener class used to count the current number
25  * of active users for the applications. Does this by counting
26  * how many user objects are stuffed into the session. It Also grabs
27  * these users and exposes them in the servlet context.
28  *
29  * @author <a HREF="mailto:matt@raibledesigns.com">Matt Raible</a>
30  */

31 public class UserCounterListener implements ServletContextListener JavaDoc, HttpSessionAttributeListener JavaDoc {
32     public static final String JavaDoc COUNT_KEY = "userCounter";
33     public static final String JavaDoc USERS_KEY = "userNames";
34     public static final String JavaDoc EVENT_KEY = HttpSessionContextIntegrationFilter.ACEGI_SECURITY_CONTEXT_KEY;
35     private final transient Log log = LogFactory.getLog(UserCounterListener.class);
36     private transient ServletContext JavaDoc servletContext;
37     private int counter;
38     private Set JavaDoc users;
39
40     public synchronized void contextInitialized(ServletContextEvent JavaDoc sce) {
41         servletContext = sce.getServletContext();
42         servletContext.setAttribute((COUNT_KEY), Integer.toString(counter));
43     }
44
45     public synchronized void contextDestroyed(ServletContextEvent JavaDoc event) {
46         servletContext = null;
47         users = null;
48         counter = 0;
49     }
50
51     synchronized void incrementUserCounter() {
52         counter =
53             Integer.parseInt((String JavaDoc) servletContext.getAttribute(COUNT_KEY));
54         counter++;
55         servletContext.setAttribute(COUNT_KEY, Integer.toString(counter));
56
57         if (log.isDebugEnabled()) {
58             log.debug("User Count: " + counter);
59         }
60     }
61
62     synchronized void decrementUserCounter() {
63         int counter =
64             Integer.parseInt((String JavaDoc) servletContext.getAttribute(COUNT_KEY));
65         counter--;
66
67         if (counter < 0) {
68             counter = 0;
69         }
70
71         servletContext.setAttribute(COUNT_KEY, Integer.toString(counter));
72
73         if (log.isDebugEnabled()) {
74             log.debug("User Count: " + counter);
75         }
76     }
77
78     synchronized void addUsername(Object JavaDoc user) {
79         users = (Set JavaDoc) servletContext.getAttribute(USERS_KEY);
80
81         if (users == null) {
82             users = new HashSet JavaDoc();
83         }
84
85         if (log.isDebugEnabled()) {
86             if (users.contains(user)) {
87                 log.debug("User already logged in, adding anyway...");
88             }
89         }
90
91         users.add(user);
92         servletContext.setAttribute(USERS_KEY, users);
93         incrementUserCounter();
94     }
95
96     synchronized void removeUsername(Object JavaDoc user) {
97         users = (Set JavaDoc) servletContext.getAttribute(USERS_KEY);
98
99         if (users != null) {
100             users.remove(user);
101         }
102
103         servletContext.setAttribute(USERS_KEY, users);
104         decrementUserCounter();
105     }
106
107     /**
108      * This method is designed to catch when user's login and record their name
109      * @see javax.servlet.http.HttpSessionAttributeListener#attributeAdded(javax.servlet.http.HttpSessionBindingEvent)
110      */

111     public void attributeAdded(HttpSessionBindingEvent JavaDoc event) {
112         log.debug("event.name: " + event.getName());
113         if (event.getName().equals(EVENT_KEY) && !isAnonymous()) {
114             SecurityContext securityContext = (SecurityContext) event.getValue();
115             User user = (User) securityContext.getAuthentication().getPrincipal();
116             addUsername(user);
117         }
118     }
119
120     private boolean isAnonymous() {
121         AuthenticationTrustResolver resolver = new AuthenticationTrustResolverImpl();
122         SecurityContext ctx = SecurityContextHolder.getContext();
123         if (ctx != null) {
124             Authentication auth = ctx.getAuthentication();
125             return resolver.isAnonymous(auth);
126         }
127         return true;
128     }
129
130     /**
131      * When user's logout, remove their name from the hashMap
132      * @see javax.servlet.http.HttpSessionAttributeListener#attributeRemoved(javax.servlet.http.HttpSessionBindingEvent)
133      */

134     public void attributeRemoved(HttpSessionBindingEvent JavaDoc event) {
135         if (event.getName().equals(EVENT_KEY) && !isAnonymous()) {
136             SecurityContext securityContext = (SecurityContext) event.getValue();
137             Authentication auth = securityContext.getAuthentication();
138             if (auth != null && (auth.getPrincipal() instanceof User)) {
139                 User user = (User) auth.getPrincipal();
140                 removeUsername(user);
141             }
142         }
143     }
144
145     /**
146      * Needed for Acegi Security 1.0, as it adds an anonymous user to the session and
147      * then replaces it after authentication. http://forum.springframework.org/showthread.php?p=63593
148      * @see javax.servlet.http.HttpSessionAttributeListener#attributeReplaced(javax.servlet.http.HttpSessionBindingEvent)
149      */

150     public void attributeReplaced(HttpSessionBindingEvent JavaDoc event) {
151         if (event.getName().equals(EVENT_KEY) && !isAnonymous()) {
152             SecurityContext securityContext = (SecurityContext) event.getValue();
153             if (securityContext.getAuthentication() != null) {
154                 User user = (User) securityContext.getAuthentication().getPrincipal();
155                 addUsername(user);
156             }
157         }
158     }
159 }
160
Popular Tags