AopLRUAlgorithm.java |
/* * JBoss, the OpenSource J2EE webOS * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.cache.eviction; import org.jboss.cache.Fqn; import org.jboss.cache.aop.AOPInstance; import org.jboss.cache.aop.TreeCacheAop; import java.util.Set; import java.util.Iterator; /** * LRUAlgorithm specific to TreeCacheAop. Overriding couple of hooks to customize * the algorithm such that it works correctly when using TreeCacheAop. * The basic strategy for the AOP-specific case are: * <ul> * <li>When a node is visited, it will check if it is an AOPInstance node. If it * is, then it is an AOP node. In that case, we will update all children nodes' * time stamp to synchronize with parent node.</li> * <li>When a node is to be evicted, it will check if it an AOP node. If it is, * we will traverse through the children nodes to see if their timestamp is younger. * If it is younger, then we must not evict the whol aop node (i.e., parent node is * not evicted either). Furthermore, we should synchronize the whole tree. * </ul> * * @author Ben Wang, Feb 17, 2004 */ public class AopLRUAlgorithm extends LRUAlgorithm { static final long TOLERANCE = 10; // millis /** * Hook for evict. * @param fqn * @return Set of associated node to evict as well in string */ protected Set getAssociatedEvictNode(Fqn fqn) { // That means even is child is touched, once the parent // node is evicted, it will evict the children as well regardless of // the time stamp. return getChildrenNames(fqn); } /** * Hook for processAddedNodes. */ protected boolean preAddedNodes(Fqn fqn) { // If this is a JBoss_Internal nodes. Don't evict. if(fqn.getFqnChild(0).equals(TreeCacheAop.JBOSS_INTERNAL)) return false; return true; } private boolean isAopNode(Fqn fqn) { EvictionPolicy policy = region_.getEvictionPolicy(); return (policy.getCacheData(fqn, AOPInstance.KEY) == null); } /** * * @param fqn * @return Set of Objects */ private Set getChildrenNames(Fqn fqn) { EvictionPolicy policy = region_.getEvictionPolicy(); return policy.getChildrenNames(fqn); } /** * Hook for processVisitedNodes * @param fqn * @return true if it is successful */ protected boolean preVisitedNodes(Fqn fqn, long stamp) { // If AOPInstance exists, update all the children's time stamp. if(isAopNode(fqn)) { Set set = getChildrenNames(fqn); Iterator it = set.iterator(); while(it.hasNext()) { Object child = it.next(); Fqn childFqn = new Fqn(child); if( !preVisitedNodes(childFqn, stamp) ) return false; try { updateChildTimeStamp(childFqn, stamp); } catch (EvictionException e) { e.printStackTrace(); return false; } } } return true; } private void updateChildTimeStamp(Fqn childFqn, long stamp) throws EvictionException { NodeEntry ne = (NodeEntry)nodeMap_.get(childFqn); ne.setModifiedTimeStamp(stamp); demote(childFqn); } }
AopLRUAlgorithm.java |