001: /*
002: * JOSSO: Java Open Single Sign-On
003: *
004: * Copyright 2004-2008, Atricore, Inc.
005: *
006: * This is free software; you can redistribute it and/or modify it
007: * under the terms of the GNU Lesser General Public License as
008: * published by the Free Software Foundation; either version 2.1 of
009: * the License, or (at your option) any later version.
010: *
011: * This software is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this software; if not, write to the Free
018: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
019: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
020: */
021: package org.josso.gateway.session.service.store;
022:
023: import org.apache.commons.logging.Log;
024: import org.apache.commons.logging.LogFactory;
025: import org.josso.gateway.session.exceptions.SSOSessionException;
026: import org.josso.gateway.session.service.BaseSession;
027:
028: import java.util.*;
029:
030: /**
031: * This is a memory based store that uses a Map
032: * This implementation is thread safe.
033: *
034: * @author <a href="mailto:sgonzalez@josso.org">Sebastian Gonzalez Oyuela</a>
035: * @version $Id: MemorySessionStore.java 508 2008-02-18 13:32:29Z sgonzalez $
036: */
037:
038: public class MemorySessionStore extends AbstractSessionStore {
039:
040: private static final Log logger = LogFactory
041: .getLog(MemorySessionStore.class);
042:
043: private Map _sessions;
044: private Map _sessionsByUsername;
045:
046: public MemorySessionStore() {
047: _sessions = new HashMap();
048: _sessionsByUsername = new HashMap();
049: }
050:
051: public int getSize() throws SSOSessionException {
052: synchronized (_sessions) {
053: return _sessions.size();
054: }
055: }
056:
057: /**
058: * Return an array containing the session identifiers of all Sessions
059: * currently saved in this Store. If there are no such Sessions, a
060: * zero-length array is returned.
061: *
062: */
063: public String[] keys() throws SSOSessionException {
064: synchronized (_sessions) {
065: return (String[]) _sessions.keySet().toArray(
066: new String[_sessions.size()]);
067: }
068: }
069:
070: /**
071: * Return an array of all BaseSessions in this store. If there are not
072: * sessions, then return a zero-length array.
073: */
074: public BaseSession[] loadAll() throws SSOSessionException {
075: synchronized (_sessions) {
076: return (BaseSession[]) _sessions.values().toArray(
077: new BaseSession[_sessions.size()]);
078: }
079: }
080:
081: /**
082: * Load and return the BaseSession associated with the specified session
083: * identifier from this Store, without removing it. If there is no
084: * such stored BaseSession, return <code>null</code>.
085: *
086: * @param id BaseSession identifier of the session to load
087: *
088: */
089: public BaseSession load(String id) throws SSOSessionException {
090: BaseSession s = null;
091: synchronized (_sessions) {
092: s = (BaseSession) _sessions.get(id);
093: }
094:
095: if (logger.isDebugEnabled())
096: logger.debug("[load(" + id + ")] Session "
097: + (s == null ? " not" : "") + " found");
098:
099: return s;
100:
101: }
102:
103: /**
104: * Load and return the BaseSession associated with the specified username
105: * from this Store, without removing it. If there is no
106: * such stored BaseSession, return <code>null</code>.
107: *
108: * @param name username of the session to load
109: *
110: */
111: public BaseSession[] loadByUsername(String name)
112: throws SSOSessionException {
113: BaseSession result[];
114:
115: synchronized (_sessions) {
116: Set sessions = (Set) _sessionsByUsername.get(name);
117: if (sessions == null)
118: sessions = new HashSet();
119: result = (BaseSession[]) sessions
120: .toArray(new BaseSession[sessions.size()]);
121: }
122:
123: if (logger.isDebugEnabled())
124: logger.debug("[loadByUsername(" + name
125: + ")] Sessions found = " + result.length);
126:
127: return result;
128:
129: }
130:
131: /**
132: * Load and return the BaseSessions whose last access time is less than the received time
133: */
134: public BaseSession[] loadByLastAccessTime(Date time)
135: throws SSOSessionException {
136: List results = new ArrayList();
137: synchronized (_sessions) {
138: Collection sessions = _sessions.values();
139: for (Iterator iterator = sessions.iterator(); iterator
140: .hasNext();) {
141: BaseSession session = (BaseSession) iterator.next();
142: if (session.getLastAccessTime() < time.getTime()) {
143: results.add(session);
144: }
145: }
146: }
147:
148: return (BaseSession[]) results.toArray(new BaseSession[results
149: .size()]);
150:
151: }
152:
153: public BaseSession[] loadByValid(boolean valid)
154: throws SSOSessionException {
155: List results = new ArrayList();
156: synchronized (_sessions) {
157: Collection sessions = _sessions.values();
158: for (Iterator iterator = sessions.iterator(); iterator
159: .hasNext();) {
160: BaseSession session = (BaseSession) iterator.next();
161: if (session.isValid() == valid) {
162: results.add(session);
163: }
164: }
165: }
166:
167: return (BaseSession[]) results.toArray(new BaseSession[results
168: .size()]);
169: }
170:
171: /**
172: * Remove the BaseSession with the specified session identifier from
173: * this Store, if present. If no such BaseSession is present, this method
174: * takes no action.
175: *
176: * @param id BaseSession identifier of the BaseSession to be removed
177: */
178: public void remove(String id) throws SSOSessionException {
179: BaseSession session = null;
180: synchronized (_sessions) {
181: session = (BaseSession) _sessions.remove(id);
182: if (session != null && session.getUsername() != null) {
183: _sessionsByUsername.remove(session.getUsername());
184: }
185:
186: }
187:
188: if (logger.isDebugEnabled())
189: logger.debug("[remove(" + id + ")] Session "
190: + (session == null ? " not" : "") + " found");
191: }
192:
193: /**
194: * Remove all Sessions from this Store.
195: */
196: public void clear() throws SSOSessionException {
197: synchronized (_sessions) {
198: _sessions.clear();
199: _sessionsByUsername.clear();
200: }
201: }
202:
203: /**
204: * Save the specified BaseSession into this Store. Any previously saved
205: * information for the associated session identifier is replaced.
206: *
207: * @param session BaseSession to be saved
208: *
209: */
210: public void save(BaseSession session) throws SSOSessionException {
211: BaseSession oldSession = null;
212: synchronized (_sessions) {
213:
214: // Replace old session.
215: oldSession = (BaseSession) _sessions.put(session.getId(),
216: session);
217:
218: // Check if this is an update or an insert :
219: if (oldSession != null) {
220:
221: // Updating old session :
222: String oldUsername = oldSession.getUsername();
223:
224: if (oldUsername != null) {
225: // Remove old association
226: Set userSessions = (Set) _sessionsByUsername
227: .get(oldUsername);
228: if (userSessions != null) {
229: userSessions.remove(oldSession);
230: if (logger.isDebugEnabled())
231: logger
232: .debug("Removing old session from reverse map : "
233: + oldSession.getId()
234: + ". user=" + oldUsername);
235: }
236: }
237: }
238:
239: // Add new session to reverse map.
240: if (session.getUsername() != null) {
241: Set sessions = (Set) _sessionsByUsername.get(session
242: .getUsername());
243: if (sessions == null) {
244:
245: if (logger.isDebugEnabled())
246: logger.debug("Building new set for user "
247: + session.getUsername());
248:
249: sessions = new HashSet();
250: _sessionsByUsername.put(session.getUsername(),
251: sessions);
252: }
253:
254: if (logger.isDebugEnabled())
255: logger.debug("Adding session to reverse map : "
256: + session.getId() + ". user="
257: + session.getUsername());
258:
259: sessions.add(session);
260:
261: }
262: }
263:
264: if (logger.isDebugEnabled())
265: logger.debug("[save(BaseSession." + session.getId()
266: + ")] Session "
267: + (oldSession == null ? " inserted" : "")
268: + " updated");
269:
270: }
271:
272: }
|