1 10 package org.mmbase.cache; 11 12 import java.util.*; 13 14 import org.mmbase.storage.search.*; 15 16 26 27 public class RelatedNodesCache extends QueryResultCache { 28 29 private static RelatedNodesCache relatedNodesCache; 31 32 public static RelatedNodesCache getCache() { 33 return relatedNodesCache; 34 } 35 36 static { 37 relatedNodesCache = new RelatedNodesCache(300); 38 relatedNodesCache.putCache(); 39 } 40 41 public String getName() { 42 return "RelatedNodesCache"; 43 } 44 public String getDescription() { 45 return "Caches related nodes of a certain node"; 46 } 47 48 52 private Map numberToKeys = new HashMap(); 53 54 55 public synchronized Object put(SearchQuery query, List queryResult) { 56 if (!checkCachePolicy(query)) return null; 58 Integer number = (Integer ) ((Step) query.getSteps().get(0)).getNodes().first(); 59 Set keys = (Set) numberToKeys.get(number); 60 if (keys == null) { 61 keys = new HashSet(); 62 numberToKeys.put(number, keys); 63 } 64 keys.add(query); 65 return super.put(query, queryResult); 66 } 67 68 69 public synchronized Object remove(Object key) { 70 SearchQuery query = (SearchQuery) key; 71 Integer number = (Integer ) ((Step) query.getSteps().get(0)).getNodes().first(); 72 Set keys = (Set) numberToKeys.get(number); 73 if (keys != null) { 74 keys.remove(query); 75 if (keys.size() == 0) numberToKeys.remove(number); 76 } 77 return super.remove(key); 78 } 79 80 synchronized void removeNode(Integer number) { 81 Set keys = (Set) numberToKeys.get(number); 82 if (keys != null) { 83 Iterator i = keys.iterator(); 84 while (i.hasNext()) { 85 super.remove(i.next()); 86 } 87 numberToKeys.remove(number); 88 } 89 } 90 91 94 private RelatedNodesCache(int size) { 95 super(size); 96 } 97 98 public void clear(){ 99 super.clear(); 100 numberToKeys.clear(); 101 } 102 } 103 | Popular Tags |