001: package org.apache.turbine.services.session;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: import java.util.ArrayList;
023: import java.util.Collection;
024: import java.util.Hashtable;
025: import java.util.Iterator;
026: import java.util.Map;
027: import javax.servlet.http.HttpSession;
028:
029: import org.apache.turbine.om.security.User;
030: import org.apache.turbine.services.TurbineBaseService;
031:
032: /**
033: * The SessionService allows thread-safe access to the current
034: * sessions of the current context. The session objects that are
035: * cached by this service are obtained through a listener, which must
036: * be configured via your web application's <code>web.xml</code>
037: * deployement descriptor as follows:
038: *
039: * <blockquote><code><pre>
040: * <listener>
041: * <listener-class>
042: * org.apache.turbine.session.SessionListener
043: * </listener-class>
044: * </listener>
045: * </pre></code></blockquote>
046: *
047: * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
048: * @author <a href="mailto:dlr@collab.net">Daniel Rall</a>
049: * @since 2.3
050: * @version $Id: TurbineSessionService.java 534527 2007-05-02 16:10:59Z tv $
051: * @see org.apache.turbine.services.session.TurbineSession
052: * @see org.apache.turbine.services.session.SessionListener
053: */
054: public class TurbineSessionService extends TurbineBaseService implements
055: SessionService {
056: /** Map of active sessions */
057: private Map activeSessions;
058:
059: /**
060: * Gets a list of the active sessions.
061: *
062: * @return A copy of the list of <code>HttpSession</code> objects.
063: */
064: public Collection getActiveSessions() {
065: // Sync externally to allow ArrayList's ctor to iterate
066: // activeSessions' values in a thread-safe fashion.
067: synchronized (activeSessions) {
068: return new ArrayList(activeSessions.values());
069: }
070: }
071:
072: /**
073: * Adds a session to the current list. This method should only be
074: * called by the listener.
075: *
076: * @param session Session to add
077: */
078: public void addSession(HttpSession session) {
079: activeSessions.put(session.getId(), session);
080: }
081:
082: /**
083: * Removes a session from the current list. This method should only be
084: * called by the listener.
085: *
086: * @param session Session to remove
087: */
088: public void removeSession(HttpSession session) {
089: activeSessions.remove(session.getId());
090: }
091:
092: /**
093: * Determines if a given user is currently logged in. The actual
094: * implementation of the User object must implement the equals()
095: * method. By default, Torque based objects (liek TurbineUser)
096: * have an implementation of equals() that will compare the
097: * result of getPrimaryKey().
098: *
099: * @param user User to check for
100: * @return true if the user is logged in on one of the
101: * active sessions.
102: */
103: public boolean isUserLoggedIn(User user) {
104: return getActiveUsers().contains(user);
105: }
106:
107: /**
108: * Gets a collection of all user objects representing the users currently
109: * logged in. This will exclude any instances of anonymous user that
110: * Turbine will use before the user actually logs on.
111: *
112: * @return A set of {@link org.apache.turbine.om.security.User} objects.
113: */
114: public Collection getActiveUsers() {
115: Collection users;
116: synchronized (activeSessions) {
117: // Pre-allocate a list which won't need expansion more
118: // than once.
119: users = new ArrayList((int) (activeSessions.size() * 0.7));
120: for (Iterator i = activeSessions.values().iterator(); i
121: .hasNext();) {
122: User u = getUserFromSession((HttpSession) i.next());
123: if (u != null && u.hasLoggedIn()) {
124: users.add(u);
125: }
126: }
127: }
128:
129: return users;
130: }
131:
132: /**
133: * Gets the User object of the the specified HttpSession.
134: *
135: * @param session The session from which to extract a user.
136: * @return The Turbine User object.
137: */
138: public User getUserFromSession(HttpSession session) {
139: // Not sure of other containers, but Tomcat 5.0.28 sometimes returns
140: // invalid sessions which will result in IllegalStateException when
141: // session.getAttribute() is invoked below.
142: try {
143: return (User) session.getAttribute(User.SESSION_KEY);
144: } catch (IllegalStateException e) {
145: return null;
146: }
147: }
148:
149: /**
150: * Gets the HttpSession by the session identifier
151: *
152: * @param sessionId The unique session identifier.
153: * @return The session keyed by the specified identifier.
154: */
155: public HttpSession getSession(String sessionId) {
156: return (HttpSession) this .activeSessions.get(sessionId);
157: }
158:
159: /**
160: * Get a collection of all session on which the given user
161: * is logged in.
162: *
163: * @param user the user
164: * @return Collection of HtttSession objects
165: */
166: public Collection getSessionsForUser(User user) {
167: Collection sessions = new ArrayList();
168: synchronized (activeSessions) {
169: for (Iterator i = activeSessions.values().iterator(); i
170: .hasNext();) {
171: HttpSession session = (HttpSession) i.next();
172: User u = this .getUserFromSession(session);
173: if (user.equals(u)) {
174: sessions.add(session);
175: }
176: }
177: }
178:
179: return sessions;
180: }
181:
182: // ---- Service initilization ------------------------------------------
183:
184: /**
185: * Initializes the service
186: */
187: public void init() {
188: this .activeSessions = new Hashtable();
189:
190: setInit(true);
191: }
192:
193: /**
194: * Returns to uninitialized state.
195: */
196: public void shutdown() {
197: this .activeSessions = null;
198:
199: setInit(false);
200: }
201:
202: }
|