1 10 package org.mmbase.applications.media.cache; 11 12 import org.mmbase.cache.Cache; 13 import org.mmbase.util.logging.Logger; 14 import org.mmbase.util.logging.Logging; 15 import org.mmbase.module.core.*; 16 17 import java.util.*; 18 19 26 public class URLCache extends Cache { 27 private static int cacheSize = 4 * 1024; private static URLCache cache; 29 private static Logger log = Logging.getLoggerInstance(URLCache.class); 30 31 private CacheExpire cacheExpire = new CacheExpire(); 32 private Observer observer = new Observer(); 33 34 public static URLCache getCache() { 35 return cache; 36 } 37 38 static { 39 cache = new URLCache(cacheSize); 40 putCache(cache); 41 } 42 43 49 static public String toKey(MMObjectNode mediaFragment, Map info) { 50 51 StringBuffer toKey = new StringBuffer ("MediaFragmentNumber=").append(mediaFragment.getNumber()); 52 Iterator infoItems = info.entrySet().iterator(); 53 while (infoItems.hasNext()) { 54 Map.Entry entry = (Map.Entry)infoItems.next(); 55 toKey.append(',').append(entry.getKey()).append('=').append(entry.getValue()); 56 } 57 if (log.isDebugEnabled()) { 58 log.debug("Generated key=" + toKey); 59 } 60 return toKey.toString(); 61 } 62 63 69 public synchronized void put(String key, String result, Set objects) { 70 cache.put(key, result); 71 log.debug("Adding to cache, key="+key); 72 if(objects!=null) { 73 cacheExpire.put(objects,key); 74 } else { 75 log.debug("No objects are specified to expire the cache entries"); 76 } 77 } 78 79 public void clear() { 80 super.clear(); 81 cacheExpire.clear(); 82 } 83 84 88 public synchronized void nodeChange(String nodeNumber) { 89 log.debug("Node changed, number="+nodeNumber); 90 cacheExpire.remove(nodeNumber); 91 } 92 93 public String getName() { 94 return "MediaURLS"; 95 } 96 public String getDescription() { 97 return "This cache contains the evaluated urls of media fragments (with user information)"; 98 } 99 100 103 private URLCache(int size) { 104 super(size); 105 } 106 107 111 class CacheExpire { 112 private Cache objectNumber2Keys = new Cache(10000) { 113 public String getName() { return "Media objectnumber-to-keys cache"; } 114 public String getDescription() { return "Contains information about which objects are used to create a certain cache entry."; } 115 }; 116 117 public CacheExpire() { 118 Cache.putCache(objectNumber2Keys); 119 } 120 121 public void clear() { 122 objectNumber2Keys.clear(); 123 } 124 125 130 private void put(Set obj, String key) { 131 for(Iterator objects = obj.iterator();objects.hasNext();) { 132 put((MMObjectNode)objects.next(), key); 133 } 134 } 135 136 141 private void put(MMObjectNode node, String key) { 142 if(node==null) { 143 return; 144 } 145 Vector keyList = null; 146 String objectNumber = ""+node.getNumber(); 147 if(objectNumber2Keys.containsKey(objectNumber)) { 148 keyList = (Vector)objectNumber2Keys.get(objectNumber); 149 } else { 150 keyList = new Vector(20); 151 objectNumber2Keys.put(objectNumber,keyList); 152 } 153 keyList.add(key); 154 observer.put(node); 155 } 156 157 160 private void remove(String nodeNumber) { 161 if(objectNumber2Keys.containsKey(nodeNumber)) { 162 Vector keyList = (Vector)objectNumber2Keys.get(nodeNumber); 163 for(Iterator items = keyList.iterator(); items.hasNext();) { 164 String key = (String )items.next(); 165 cache.remove(key); 166 log.debug("Flusing key from cache, key="+key); 167 } 168 } 169 } 170 } 171 172 177 private class Observer implements MMBaseObserver { 178 private Set observingBuilders = new HashSet(); 180 Observer() { 181 } 182 183 186 private void addToObservingBuilder(MMObjectBuilder builder) { 187 log.debug("Adding observer for builder = "+builder.getTableName()); 188 builder.addLocalObserver(this); 189 builder.addRemoteObserver(this); 190 observingBuilders.add(builder.getTableName()); 191 } 192 193 196 synchronized void put(MMObjectNode node) { 197 MMObjectBuilder bul = node.getBuilder(); 198 if (!observingBuilders.contains(bul.getTableName())) { 199 addToObservingBuilder(bul); 200 } 201 } 202 203 206 protected boolean nodeChanged(String machine, String number, String builder, String ctype) { 207 if (ctype.equals("d") || ctype.equals("c")) { 209 log.debug("Recieved a change, object number = "+number); 210 nodeChange(number); 211 } 212 return true; 213 } 214 215 public boolean nodeRemoteChanged(String machine, String number,String builder,String ctype) { 217 return nodeChanged(machine, number, builder, ctype); 218 } 219 220 public boolean nodeLocalChanged(String machine, String number, String builder, String ctype) { 222 return nodeChanged(machine, number, builder, ctype); 223 } 224 } 225 } 226 | Popular Tags |