package org.jboss.web.tomcat.service.session.distributedcache.impl.jbc; import org.jboss.cache.Fqn; import org.jboss.cache.notifications.annotation.NodeActivated; import org.jboss.cache.notifications.event.NodeActivatedEvent; import org.jboss.web.tomcat.service.session.ClusteredSipManager; import org.jboss.web.tomcat.service.session.distributedcache.spi.LocalDistributableSessionManager; /** * Listener for JBoss Cache activation events. Triggers updates of * the passivation counter. * * @author <a href="brian.stansberry@jboss.com">Brian Stansberry</a> * @version $Revision: 64678 $ */ @org.jboss.cache.notifications.annotation.CacheListener public class SipPassivationListener extends CacheListenerBase { private String sipApplicationName; SipPassivationListener(LocalDistributableSessionManager manager, String contextHostPath, String sipApplicationName) { super(manager, contextHostPath); this.sipApplicationName = sipApplicationName; } // NOTE: Don't track passivation from here -- we know in JBossCacheManager // when we trigger a passivation. Avoid spurious listener callbacks to // webapps that aren't interested. // @NodePassivated // public void nodePassivated(NodePassivatedEvent event) // { // Fqn fqn = event.getFqn(); // if (isFqnForOurWebapp(fqn, isBuddyFqn(fqn))) // { // manager_.sessionPassivated(); // } // } // We do want activation callbacks, as JBossCacheManager can't readily // track whether a cache read is going to result in an activation @NodeActivated public void nodeActivated(NodeActivatedEvent event) { @SuppressWarnings("unchecked") Fqn<String> fqn = event.getFqn(); boolean isBuddy = isBuddyFqn(fqn); if (isFqnForOurSipapp(fqn, isBuddy)) { String sessId = null; if (SipCacheListener.isFqnSessionRootSized(fqn.size(), isBuddy) && SipCacheListener.isFqnSipApplicationSessionRootSized(fqn.size(), isBuddy)) { sessId = SipCacheListener.getSipApplicationSessionIdFromFqn(fqn, isBuddy); ((ClusteredSipManager) manager_) .sipApplicationSessionActivated(); } else { sessId = SipCacheListener.getSipSessionIdFromFqn(fqn, isBuddy); ((ClusteredSipManager) manager_) .sipSessionActivated(); } manager_.sessionActivated(); } } protected boolean isFqnForOurSipapp(Fqn<String> fqn, boolean isBuddy) { try { if (sipApplicationName.equals(fqn.get(isBuddy ? SipCacheListener.BUDDY_BACKUP_ROOT_OWNER_SIZE + SipCacheListener.SIPAPPNAME_FQN_INDEX : SipCacheListener.SIPAPPNAME_FQN_INDEX)) && AbstractJBossCacheService.SESSION.equals(fqn.get(isBuddy ? SipCacheListener.BUDDY_BACKUP_ROOT_OWNER_SIZE + SipCacheListener.SIPSESSION_FQN_INDEX : SipCacheListener.SIPSESSION_FQN_INDEX))) return true; } catch (IndexOutOfBoundsException e) { // can't be ours; too small; just fall through } return false; } }