001: /*
002: * File : $Source: /usr/local/cvs/opencms/src/org/opencms/main/CmsDefaultSessionStorageProvider.java,v $
003: * Date : $Date: 2008-02-27 12:05:39 $
004: * Version: $Revision: 1.5 $
005: *
006: * This library is part of OpenCms -
007: * the Open Source Content Management System
008: *
009: * Copyright (c) 2002 - 2008 Alkacon Software GmbH (http://www.alkacon.com)
010: *
011: * This library is free software; you can redistribute it and/or
012: * modify it under the terms of the GNU Lesser General Public
013: * License as published by the Free Software Foundation; either
014: * version 2.1 of the License, or (at your option) any later version.
015: *
016: * This library is distributed in the hope that it will be useful,
017: * but WITHOUT ANY WARRANTY; without even the implied warranty of
018: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019: * Lesser General Public License for more details.
020: *
021: * For further information about Alkacon Software GmbH, please see the
022: * company website: http://www.alkacon.com
023: *
024: * For further information about OpenCms, please see the
025: * project website: http://www.opencms.org
026: *
027: * You should have received a copy of the GNU Lesser General Public
028: * License along with this library; if not, write to the Free Software
029: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
030: */
031:
032: package org.opencms.main;
033:
034: import org.opencms.util.CmsUUID;
035:
036: import java.util.ArrayList;
037: import java.util.ConcurrentModificationException;
038: import java.util.Iterator;
039: import java.util.List;
040: import java.util.Map;
041: import java.util.Map.Entry;
042:
043: import org.apache.commons.collections.FastHashMap;
044:
045: /**
046: * The default session storage provider implementation.<p>
047: *
048: * Implementation based on a {@link FastHashMap}.<p>
049: *
050: * @author Michael Moossen
051: *
052: * @version $Revision: 1.5 $
053: *
054: * @since 6.5.5
055: */
056: public class CmsDefaultSessionStorageProvider implements
057: I_CmsSessionStorageProvider {
058:
059: /** Stores the session info objects mapped to the session id. */
060: private FastHashMap m_sessions;
061:
062: /**
063: * @see org.opencms.main.I_CmsSessionStorageProvider#get(org.opencms.util.CmsUUID)
064: */
065: public CmsSessionInfo get(CmsUUID sessionId) {
066:
067: return (CmsSessionInfo) m_sessions.get(sessionId);
068: }
069:
070: /**
071: * @see org.opencms.main.I_CmsSessionStorageProvider#getAll()
072: */
073: public List getAll() {
074:
075: List result = new ArrayList();
076: Iterator i = m_sessions.keySet().iterator();
077: while (i.hasNext()) {
078: CmsSessionInfo sessionInfo = (CmsSessionInfo) m_sessions
079: .get(i.next());
080: if (sessionInfo != null) {
081: // may be the case in case of concurrent modification
082: result.add(sessionInfo);
083: }
084: }
085: return result;
086: }
087:
088: /**
089: * @see org.opencms.main.I_CmsSessionStorageProvider#getAllOfUser(org.opencms.util.CmsUUID)
090: */
091: public List getAllOfUser(CmsUUID userId) {
092:
093: List userSessions = new ArrayList();
094: Iterator i = m_sessions.keySet().iterator();
095: while (i.hasNext()) {
096: CmsSessionInfo sessionInfo = (CmsSessionInfo) m_sessions
097: .get(i.next());
098: if (userId.equals(sessionInfo.getUserId())) {
099: userSessions.add(sessionInfo);
100: }
101: }
102: return userSessions;
103: }
104:
105: /**
106: * @see org.opencms.main.I_CmsSessionStorageProvider#getSize()
107: */
108: public int getSize() {
109:
110: return m_sessions.size();
111: }
112:
113: /**
114: * @see org.opencms.main.I_CmsSessionStorageProvider#initialize()
115: */
116: public void initialize() {
117:
118: // create a map for all sessions, these will be mapped using their session id
119: m_sessions = new FastHashMap();
120: // set to "fast" mode (will be reset for write access)
121: m_sessions.setFast(true);
122: }
123:
124: /**
125: * @see org.opencms.main.I_CmsSessionStorageProvider#put(org.opencms.main.CmsSessionInfo)
126: */
127: public CmsSessionInfo put(CmsSessionInfo sessionInfo) {
128:
129: return (CmsSessionInfo) m_sessions.put(sessionInfo
130: .getSessionId(), sessionInfo);
131: }
132:
133: /**
134: * @see org.opencms.main.I_CmsSessionStorageProvider#remove(org.opencms.util.CmsUUID)
135: */
136: public CmsSessionInfo remove(CmsUUID sessionId) {
137:
138: return (CmsSessionInfo) m_sessions.remove(sessionId);
139: }
140:
141: /**
142: * @see org.opencms.main.I_CmsSessionStorageProvider#shutdown()
143: */
144: public void shutdown() {
145:
146: m_sessions.clear();
147: m_sessions = null;
148: }
149:
150: /**
151: * @see org.opencms.main.I_CmsSessionStorageProvider#validate()
152: */
153: public void validate() {
154:
155: try {
156: // change session map to full synchronization or "slow" mode
157: m_sessions.setFast(false);
158: Iterator itSessions = m_sessions.entrySet().iterator();
159: while (itSessions.hasNext()) {
160: Map.Entry entry = (Entry) itSessions.next();
161: CmsUUID sessionId = (CmsUUID) entry.getKey();
162: CmsSessionInfo sessionInfo = (CmsSessionInfo) entry
163: .getValue();
164: if (sessionInfo != null
165: && m_sessions.get(sessionId) != null) {
166: // may be the case in case of concurrent modification
167: if (sessionInfo.isExpired()) {
168: // session is invalid, try to remove it
169: try {
170: itSessions.remove();
171: } catch (ConcurrentModificationException ex) {
172: // ignore, better luck next time...
173: }
174: }
175: }
176: }
177: } catch (ConcurrentModificationException ex) {
178: // CME can also be triggered from the Iterator#next() method.
179: // ignore, better luck next time...
180: } finally {
181: // it may be null during shutdown
182: if (m_sessions != null) {
183: // reset session map to "fast" mode
184: m_sessions.setFast(true);
185: }
186: }
187: }
188: }
|