001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.web.tomcat.service.session;
023:
024: /**
025: * Common superclass of ClusteredSession types that use JBossCache
026: * as their distributed cache.
027: *
028: * @author Brian Stansberry
029: *
030: * @version $Revision$
031: */
032: public abstract class JBossCacheClusteredSession extends
033: ClusteredSession {
034: /**
035: * Our proxy to the cache.
036: */
037: protected transient JBossCacheService proxy_;
038:
039: /**
040: * Create a new JBossCacheClusteredSession.
041: *
042: * @param manager
043: * @param useJK
044: */
045: public JBossCacheClusteredSession(JBossCacheManager manager) {
046: super (manager, manager.getUseJK());
047: establishProxy();
048: }
049:
050: /**
051: * Initialize fields marked as transient after loading this session
052: * from the distributed store
053: *
054: * @param manager the manager for this session
055: */
056: public void initAfterLoad(AbstractJBossManager manager) {
057: // Our manager and proxy may have been lost if we were recycled,
058: // so reestablish them
059: setManager(manager);
060: establishProxy();
061:
062: // Since attribute map may be transient, we may need to populate it
063: // from the underlying store.
064: populateAttributes();
065:
066: // Notify all attributes of type HttpSessionActivationListener (SRV 7.7.2)
067: this .activate();
068:
069: // We are no longer outdated vis a vis distributed cache
070: clearOutdated();
071: }
072:
073: /**
074: * Gets a reference to the JBossCacheService.
075: */
076: protected void establishProxy() {
077: if (proxy_ == null) {
078: proxy_ = ((JBossCacheManager) manager).getCacheService();
079:
080: // still null???
081: if (proxy_ == null) {
082: throw new RuntimeException(
083: "JBossCacheClusteredSession: Cache service is null.");
084: }
085: }
086: }
087:
088: protected abstract void populateAttributes();
089:
090: /**
091: * Override the superclass to additionally reset this class' fields.
092: * <p>
093: * <strong>NOTE:</strong> It is not anticipated that this method will be
094: * called on a ClusteredSession, but we are overriding the method to be
095: * thorough.
096: * </p>
097: */
098: public void recycle() {
099: super .recycle();
100:
101: proxy_ = null;
102: }
103:
104: /**
105: * Increment our version and place ourself in the cache.
106: */
107: public synchronized void processSessionRepl() {
108: // Replicate the session.
109: if (log.isTraceEnabled()) {
110: log
111: .trace("processSessionRepl(): session is dirty. Will increment "
112: + "version from: "
113: + getVersion()
114: + " and replicate.");
115: }
116: this .incrementVersion();
117: proxy_.putSession(realId, this );
118:
119: sessionAttributesDirty = false;
120: sessionMetadataDirty = false;
121:
122: updateLastReplicated();
123: }
124:
125: /**
126: * Overrides the superclass impl by doing nothing if <code>localCall</code>
127: * is <code>false</code>. The JBossCacheManager will already be aware of
128: * a remote invalidation and will handle removal itself.
129: */
130: protected void removeFromManager(boolean localCall,
131: boolean localOnly) {
132: if (localCall) {
133: super .removeFromManager(localCall, localOnly);
134: }
135: }
136:
137: protected Object removeAttributeInternal(String name,
138: boolean localCall, boolean localOnly) {
139: return removeJBossInternalAttribute(name, localCall, localOnly);
140: }
141:
142: protected Object removeJBossInternalAttribute(String name) {
143: throw new UnsupportedOperationException(
144: "removeJBossInternalAttribute(String) "
145: + "is not supported by JBossCacheClusteredSession; use "
146: + "removeJBossInternalAttribute(String, boolean, boolean");
147: }
148:
149: protected abstract Object removeJBossInternalAttribute(String name,
150: boolean localCall, boolean localOnly);
151:
152: }
|