001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package org.apache.geronimo.tomcat.cluster;
021
022 import java.io.IOException;
023
024 import org.apache.catalina.Session;
025 import org.apache.catalina.session.StandardManager;
026 import org.apache.catalina.session.StandardSession;
027 import org.apache.geronimo.clustering.SessionAlreadyExistException;
028 import org.apache.geronimo.clustering.SessionListener;
029 import org.apache.geronimo.clustering.SessionManager;
030
031 /**
032 *
033 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
034 */
035 public class ClusteredManager extends StandardManager {
036 private final SessionManager sessionManager;
037
038 public ClusteredManager(SessionManager sessionManager) {
039 if (null == sessionManager) {
040 throw new IllegalArgumentException("sessionManager is required");
041 }
042 this.sessionManager = sessionManager;
043
044 sessionManager.registerListener(new MigrationListener());
045 }
046
047 @Override
048 public Session createEmptySession() {
049 return new ClusteredSession();
050 }
051
052 @Override
053 protected void doLoad() throws ClassNotFoundException, IOException {
054 }
055
056 @Override
057 protected void doUnload() throws IOException {
058 }
059
060 @Override
061 public void backgroundProcess() {
062 }
063
064 private class MigrationListener implements SessionListener {
065
066 public void notifyInboundSessionMigration(org.apache.geronimo.clustering.Session session) {
067 add(new ClusteredSession(session));
068 }
069
070 public void notifyOutboundSessionMigration(org.apache.geronimo.clustering.Session session) {
071 ClusteredSession clusteredSession = getClusteredSession(session);
072 remove(clusteredSession);
073 }
074
075 public void notifySessionDestruction(org.apache.geronimo.clustering.Session session) {
076 ClusteredSession clusteredSession = getClusteredSession(session);
077 remove(clusteredSession);
078 }
079
080 protected ClusteredSession getClusteredSession(org.apache.geronimo.clustering.Session session) {
081 return (ClusteredSession) ClusteredManager.this.sessions.get(session.getSessionId());
082 }
083 }
084
085 public class ClusteredSession extends StandardSession {
086 private org.apache.geronimo.clustering.Session session;
087
088 protected ClusteredSession() {
089 super(ClusteredManager.this);
090 }
091
092 protected ClusteredSession(org.apache.geronimo.clustering.Session session) {
093 super(ClusteredManager.this);
094 this.session = session;
095
096 attributes = session.getState();
097
098 super.setId(session.getSessionId());
099 setValid(true);
100 setNew(false);
101 }
102
103 @Override
104 public void setId(String id) {
105 super.setId(id);
106 try {
107 session = sessionManager.createSession(id);
108 } catch (SessionAlreadyExistException e) {
109 throw (IllegalStateException) new IllegalStateException().initCause(e);
110 }
111
112 attributes = session.getState();
113 }
114
115 @Override
116 public void invalidate() throws IllegalStateException {
117 super.invalidate();
118 session.release();
119 }
120
121 @Override
122 public void endAccess() {
123 super.endAccess();
124 session.onEndAccess();
125 }
126 }
127
128 }