1 10 package org.mmbase.cache; 11 12 import java.util.*; 13 import java.util.ArrayList ; 14 import java.util.Iterator ; 15 import java.util.List ; 16 17 import org.mmbase.core.event.*; 18 import org.mmbase.storage.search.SearchQuery; 19 import org.mmbase.util.logging.Logger; 20 import org.mmbase.util.logging.Logging; 21 22 import edu.emory.mathcs.backport.java.util.concurrent.CopyOnWriteArrayList; 23 24 32 public class ChainedReleaseStrategy extends ReleaseStrategy { 33 private static final Logger log = Logging.getLoggerInstance(ChainedReleaseStrategy.class); 34 35 private final List releaseStrategies = new CopyOnWriteArrayList(); 36 37 private final Map childStrategyMemory = new HashMap(); 40 41 public ChainedReleaseStrategy() { 42 } 43 44 45 46 52 public void setEnabled(boolean newStatus) { 54 if(newStatus != isEnabled()){ 55 super.setEnabled(newStatus); 56 57 59 60 for(Iterator i = iterator(); i.hasNext();){ 61 ReleaseStrategy strategy = (ReleaseStrategy)i.next(); 62 63 if(newStatus == true){ 65 Boolean memory = (Boolean ) childStrategyMemory.get(strategy.getName()); 66 strategy.setEnabled( memory == null ? true : memory.booleanValue()); 67 } else { 68 childStrategyMemory.put(strategy.getName(), new Boolean (strategy.isEnabled())); 70 strategy.setEnabled(false); 71 strategy.clear(); 72 } 73 } 74 } 75 } 76 82 public void addReleaseStrategy(ReleaseStrategy strategy) { 83 if (! releaseStrategies.contains(strategy)){ 84 releaseStrategies.add(strategy); 85 } 86 } 87 88 public void removeStrategy(ReleaseStrategy strategy) { 89 releaseStrategies.remove(strategy); 90 } 91 92 95 public void removeAllStrategies(){ 96 for (Iterator i = iterator(); i.hasNext(); ){ 97 removeStrategy((ReleaseStrategy)i.next()); 98 } 99 } 100 101 106 public String getName() { 107 return "Multi Release Strategy"; 108 } 109 110 115 public String getDescription() { 116 return "This is a wrapper for any number of strategies you would like to " 117 + "combine. it is used as the base strategy for QueryResultCache subclasses."; 118 } 119 120 public Iterator iterator() { 121 return releaseStrategies.iterator(); 122 } 123 124 130 protected final boolean doEvaluate(NodeEvent event, SearchQuery query, List cachedResult) { 131 Iterator i = releaseStrategies.iterator(); 133 while (i.hasNext()) { 135 ReleaseStrategy strategy = (ReleaseStrategy) i.next(); 136 StrategyResult result = strategy.evaluate(event, query, cachedResult); 137 if (! result.shouldRelease()) return false; 138 } 139 return true; 140 } 141 protected final boolean doEvaluate(RelationEvent event, SearchQuery query, List cachedResult) { 142 Iterator i = releaseStrategies.iterator(); 144 while (i.hasNext()) { 146 ReleaseStrategy strategy = (ReleaseStrategy) i.next(); 147 StrategyResult result = strategy.evaluate(event, query, cachedResult); 148 if (! result.shouldRelease()) return false; 149 } 150 return true; 151 } 152 153 public void clear(){ 154 super.clear(); 155 for(Iterator i = iterator(); i.hasNext();){ 156 ReleaseStrategy rs = (ReleaseStrategy) i.next(); 157 rs.clear(); 158 } 159 } 160 163 public int size() { 164 return releaseStrategies.size(); 165 } 166 167 public String toString() { 168 return "" + releaseStrategies; 169 } 170 } 171 | Popular Tags |