1 22 package org.jboss.web.tomcat.tc6.session; 23 24 import java.util.Map ; 25 26 import org.jboss.cache.CacheSPI; 27 import org.jboss.cache.Fqn; 28 import org.jboss.cache.TreeCache; 29 import org.jboss.cache.AbstractCacheListener; 30 import org.jboss.cache.buddyreplication.BuddyManager; 31 import org.jboss.logging.Logger; 32 import org.jgroups.View; 33 34 35 public class CacheListener extends AbstractCacheListener 36 { 37 private static final int JSESSION_FQN_INDEX = 0; 39 private static final int HOSTNAME_FQN_INDEX = 1; 41 private static final int WEBAPP_FQN_INDEX = 2; 43 private static final int SESSION_ID_FQN_INDEX = 3; 45 private static final int SESSION_FQN_SIZE = SESSION_ID_FQN_INDEX + 1; 47 private static final int POJO_ATTRIBUTE_FQN_INDEX = SESSION_ID_FQN_INDEX + 1; 49 private static final int POJO_KEY_FQN_INDEX = POJO_ATTRIBUTE_FQN_INDEX + 1; 51 private static final int POJO_KEY_FQN_SIZE = POJO_KEY_FQN_INDEX + 1; 53 private static final int BUDDY_BACKUP_ROOT_OWNER_INDEX = BuddyManager.BUDDY_BACKUP_SUBTREE_FQN.size(); 55 private static final int BUDDY_BACKUP_ROOT_OWNER_SIZE = BUDDY_BACKUP_ROOT_OWNER_INDEX + 1; 57 58 private static Logger log_ = Logger.getLogger(CacheListener.class); 59 private JBossCacheWrapper cacheWrapper_; 60 private JBossCacheManager manager_; 61 private String webapp_; 62 private String hostname_; 63 private boolean fieldBased_; 64 private boolean disdainLocalActivity_; 66 67 CacheListener(JBossCacheWrapper wrapper, JBossCacheManager manager, String hostname, String webapp) 68 { 69 cacheWrapper_ = wrapper; 70 manager_ = manager; 71 hostname_ = hostname; 72 webapp_ = webapp; 73 ReplicationGranularity granularity = manager_.getReplicationGranularity(); 74 fieldBased_ = (granularity == ReplicationGranularity.FIELD); 75 disdainLocalActivity_ = (granularity == ReplicationGranularity.SESSION);; } 78 79 81 @Override 82 public void nodeRemoved(Fqn fqn, boolean pre, boolean isLocal, Map data) 83 { 84 if (pre || isLocal) 85 return; 86 87 boolean isBuddy = isBuddyFqn(fqn); 88 89 if (fieldBased_ 91 && isFqnPojoKeySized(fqn, isBuddy) 92 && isFqnForOurWebapp(fqn, isBuddy)) 93 { 94 String sessId = getIdFromFqn(fqn, isBuddy); 95 String attrKey = getPojoKeyFromFqn(fqn, isBuddy); 96 manager_.processRemoteAttributeRemoval(sessId, attrKey); 97 } 98 else if(isFqnSessionRootSized(fqn, isBuddy) 99 && isFqnForOurWebapp(fqn, isBuddy)) 100 { 101 String sessId = getIdFromFqn(fqn, isBuddy); 104 manager_.processRemoteInvalidation(sessId); 105 } 106 } 107 108 @Override 109 public void nodeModified(Fqn fqn, boolean pre, boolean isLocal, Map data) 110 { 111 if (pre || isLocal) 112 return; 113 114 123 boolean isBuddy = isBuddyFqn(fqn); 124 if (!isFqnSessionRootSized(fqn, isBuddy)) 126 return; 127 128 134 if (!isFqnForOurWebapp(fqn, isBuddy)) 136 return; 137 138 Integer version = (Integer )cacheWrapper_.get(fqn, JBossCacheService.VERSION_KEY); 142 if(version != null) 143 { 144 String realId = getIdFromFqn(fqn, isBuddy); 145 146 ClusteredSession session = manager_.findLocalSession(realId); 147 if (session == null) 148 { 149 String owner = isBuddy ? getBuddyOwner(fqn) : null; 150 manager_.unloadedSessionChanged(realId, owner); 152 } 153 else if (session.isNewData(version.intValue())) 154 { 155 session.setOutdatedVersion(version.intValue()); 157 if(log_.isTraceEnabled()) 158 { 159 log_.trace("nodeDirty(): session in-memory data is " + 160 "invalidated with id: " + realId + " and version: " + 161 version.intValue()); 162 } 163 } 164 else if (!isBuddy) 165 { 166 log_.warn("Possible concurrency problem: Replicated version id " + 167 version + " matches in-memory version for session " + realId); 168 } 169 176 } 177 else 178 { 179 log_.warn("No VERSION_KEY attribute found in " + fqn); 180 } 181 } 182 183 @Override 184 public void cacheStarted(CacheSPI cache) 185 { 186 } 188 189 @Override 190 public void cacheStopped(CacheSPI cache) 191 { 192 } 194 195 @Override 196 public void viewChange(View new_view) 197 { 198 } 200 201 @Override 202 public void nodeActivated(Fqn fqn, boolean pre) 203 { 204 } 208 209 @Override 211 public void nodePassivated(Fqn fqn, boolean pre) 212 { 213 if (!pre || SessionReplicationContext.isLocallyActive()) 214 return; 215 216 boolean isBuddy = isBuddyFqn(fqn); 217 218 if(isFqnSessionRootSized(fqn, isBuddy) 221 && isFqnForOurWebapp(fqn, isBuddy)) 222 { 223 String realId = getIdFromFqn(fqn, isBuddy); 226 String owner = isBuddy ? getBuddyOwner(fqn) : null; 227 manager_.processSessionPassivation(realId, owner); 228 } 229 230 } 231 232 private boolean isFqnForOurWebapp(Fqn fqn, boolean isBuddy) 233 { 234 try 235 { 236 if (webapp_.equals(fqn.get(isBuddy ? BUDDY_BACKUP_ROOT_OWNER_SIZE + WEBAPP_FQN_INDEX : WEBAPP_FQN_INDEX)) 237 && hostname_.equals(fqn.get(isBuddy ? BUDDY_BACKUP_ROOT_OWNER_SIZE + HOSTNAME_FQN_INDEX : HOSTNAME_FQN_INDEX)) 238 && JBossCacheService.SESSION.equals(fqn.get(isBuddy ? BUDDY_BACKUP_ROOT_OWNER_SIZE + JSESSION_FQN_INDEX : JSESSION_FQN_INDEX))) 239 return true; 240 } 241 catch (IndexOutOfBoundsException e) 242 { 243 } 245 246 return false; 247 } 248 249 private static boolean isFqnSessionRootSized(Fqn fqn, boolean isBuddy) 250 { 251 return fqn.size() == (isBuddy ? BUDDY_BACKUP_ROOT_OWNER_SIZE + SESSION_FQN_SIZE : SESSION_FQN_SIZE); 252 } 253 254 private static boolean isFqnPojoKeySized(Fqn fqn, boolean isBuddy) 255 { 256 return fqn.size() == (isBuddy ? BUDDY_BACKUP_ROOT_OWNER_SIZE + POJO_KEY_FQN_SIZE : POJO_KEY_FQN_SIZE); 257 } 258 259 private static String getIdFromFqn(Fqn fqn, boolean isBuddy) 260 { 261 return (String )fqn.get(isBuddy ? BUDDY_BACKUP_ROOT_OWNER_SIZE + SESSION_ID_FQN_INDEX : SESSION_ID_FQN_INDEX); 262 } 263 264 private static String getPojoKeyFromFqn(Fqn fqn, boolean isBuddy) 265 { 266 return (String ) fqn.get(isBuddy ? BUDDY_BACKUP_ROOT_OWNER_SIZE + POJO_KEY_FQN_INDEX: POJO_KEY_FQN_INDEX); 267 } 268 269 private static boolean isBuddyFqn(Fqn fqn) 270 { 271 try 272 { 273 return BuddyManager.BUDDY_BACKUP_SUBTREE.equals(fqn.get(0)); 274 } 275 catch (IndexOutOfBoundsException e) 276 { 277 return false; 281 } 282 } 283 284 289 private static String getBuddyOwner(Fqn fqn) 290 { 291 return (String ) fqn.get(BUDDY_BACKUP_ROOT_OWNER_INDEX); 292 } 293 } 294 | Popular Tags |