| 1 18 19 package org.apache.roller.ui.rendering.util; 20 21 import java.io.UnsupportedEncodingException ; 22 import java.net.URLEncoder ; 23 import java.util.Date ; 24 import java.util.Enumeration ; 25 import java.util.HashMap ; 26 import java.util.Iterator ; 27 import java.util.Map ; 28 import org.apache.commons.logging.Log; 29 import org.apache.commons.logging.LogFactory; 30 import org.apache.roller.config.RollerConfig; 31 import org.apache.roller.config.RollerRuntimeConfig; 32 import org.apache.roller.pojos.BookmarkData; 33 import org.apache.roller.pojos.CommentData; 34 import org.apache.roller.pojos.FolderData; 35 import org.apache.roller.pojos.RefererData; 36 import org.apache.roller.pojos.UserData; 37 import org.apache.roller.pojos.WeblogCategoryData; 38 import org.apache.roller.pojos.WeblogEntryData; 39 import org.apache.roller.pojos.WeblogTemplate; 40 import org.apache.roller.pojos.WebsiteData; 41 import org.apache.roller.util.Utilities; 42 import org.apache.roller.util.cache.Cache; 43 import org.apache.roller.util.cache.CacheHandler; 44 import org.apache.roller.util.cache.CacheManager; 45 import org.apache.roller.util.cache.ExpiringCacheEntry; 46 47 48 51 public class SiteWideCache implements CacheHandler { 52 53 private static Log log = LogFactory.getLog(SiteWideCache.class); 54 55 public static final String CACHE_ID = "cache.sitewide"; 58 59 private boolean cacheEnabled = true; 61 private Cache contentCache = null; 62 63 private ExpiringCacheEntry lastUpdateTime = null; 65 private long timeout = 15 * 60 * 1000; 66 67 private static SiteWideCache singletonInstance = new SiteWideCache(); 69 70 71 private SiteWideCache() { 72 73 cacheEnabled = RollerConfig.getBooleanProperty(CACHE_ID+".enabled"); 74 75 Map cacheProps = new HashMap (); 76 cacheProps.put("id", CACHE_ID); 77 Enumeration allProps = RollerConfig.keys(); 78 String prop = null; 79 while(allProps.hasMoreElements()) { 80 prop = (String ) allProps.nextElement(); 81 82 if(prop.startsWith(CACHE_ID+".")) { 84 cacheProps.put(prop.substring(CACHE_ID.length()+1), 85 RollerConfig.getProperty(prop)); 86 } 87 } 88 89 log.info(cacheProps); 90 91 if(cacheEnabled) { 92 contentCache = CacheManager.constructCache(this, cacheProps); 93 } else { 94 log.warn("Caching has been DISABLED"); 95 } 96 } 97 98 99 public static SiteWideCache getInstance() { 100 return singletonInstance; 101 } 102 103 104 public Object get(String key) { 105 106 if(!cacheEnabled) 107 return null; 108 109 Object entry = contentCache.get(key); 110 111 if(entry == null) { 112 log.debug("MISS "+key); 113 } else { 114 log.debug("HIT "+key); 115 } 116 117 return entry; 118 } 119 120 121 public void put(String key, Object value) { 122 123 if(!cacheEnabled) 124 return; 125 126 contentCache.put(key, value); 127 log.debug("PUT "+key); 128 } 129 130 131 public void remove(String key) { 132 133 if(!cacheEnabled) 134 return; 135 136 contentCache.remove(key); 137 log.debug("REMOVE "+key); 138 } 139 140 141 public void clear() { 142 143 if(!cacheEnabled) 144 return; 145 146 contentCache.clear(); 147 this.lastUpdateTime = null; 148 log.debug("CLEAR"); 149 } 150 151 152 public Date getLastModified() { 153 154 Date lastModified = null; 155 156 if(this.lastUpdateTime != null) { 158 lastModified = (Date ) this.lastUpdateTime.getValue(); 159 } 160 161 if(lastModified == null) { 163 lastModified = new Date (); 164 this.lastUpdateTime = new ExpiringCacheEntry(lastModified, this.timeout); 165 } 166 167 return lastModified; 168 } 169 170 171 188 public String generateKey(WeblogPageRequest pageRequest) { 189 190 StringBuffer key = new StringBuffer (); 191 192 key.append(this.CACHE_ID).append(":"); 193 key.append("page/"); 194 key.append(pageRequest.getWeblogHandle()); 195 196 if(pageRequest.getWeblogAnchor() != null) { 197 String anchor = null; 198 try { 199 anchor = URLEncoder.encode(pageRequest.getWeblogAnchor(), "UTF-8"); 201 } catch(UnsupportedEncodingException ex) { 202 } 204 205 key.append("/entry/").append(anchor); 206 } else { 207 208 if(pageRequest.getWeblogPageName() != null) { 209 key.append("/page/").append(pageRequest.getWeblogPageName()); 210 } 211 212 if(pageRequest.getWeblogDate() != null) { 213 key.append("/").append(pageRequest.getWeblogDate()); 214 } 215 216 if(pageRequest.getWeblogCategoryName() != null) { 217 String cat = null; 218 try { 219 cat = URLEncoder.encode(pageRequest.getWeblogCategoryName(), "UTF-8"); 221 } catch(UnsupportedEncodingException ex) { 222 } 224 225 key.append("/").append(cat); 226 } 227 } 228 229 if(pageRequest.getLocale() != null) { 230 key.append("/").append(pageRequest.getLocale()); 231 } 232 233 if(pageRequest.getWeblogAnchor() == null) { 235 key.append("/page=").append(pageRequest.getPageNum()); 236 } 237 238 if(pageRequest.getAuthenticUser() != null) { 240 key.append("/user=").append(pageRequest.getAuthenticUser()); 241 } 242 243 if(pageRequest.getCustomParams().size() > 0) { 245 String queryString = paramsToString(pageRequest.getCustomParams()); 246 247 key.append("/qp=").append(queryString); 248 } 249 250 return key.toString(); 251 } 252 253 254 267 public String generateKey(WeblogFeedRequest feedRequest) { 268 269 StringBuffer key = new StringBuffer (); 270 271 key.append(this.CACHE_ID).append(":"); 272 key.append("feed/"); 273 key.append(feedRequest.getWeblogHandle()); 274 275 key.append("/").append(feedRequest.getType()); 276 key.append("/").append(feedRequest.getFormat()); 277 278 if(feedRequest.getWeblogCategoryName() != null) { 279 String cat = feedRequest.getWeblogCategoryName(); 280 try { 281 cat = URLEncoder.encode(cat, "UTF-8"); 282 } catch (UnsupportedEncodingException ex) { 283 } 285 286 key.append("/").append(cat); 287 } 288 289 if(feedRequest.getLocale() != null) { 290 key.append("/").append(feedRequest.getLocale()); 291 } 292 293 if(feedRequest.isExcerpts()) { 294 key.append("/excerpts"); 295 } 296 297 return key.toString(); 298 } 299 300 301 304 public void invalidate(WeblogEntryData entry) { 305 306 if(!cacheEnabled) 307 return; 308 309 this.contentCache.clear(); 310 this.lastUpdateTime = null; 311 } 312 313 314 317 public void invalidate(WebsiteData website) { 318 319 if(!cacheEnabled) 320 return; 321 322 this.contentCache.clear(); 323 this.lastUpdateTime = null; 324 } 325 326 327 330 public void invalidate(BookmarkData bookmark) { 331 if(RollerRuntimeConfig.isSiteWideWeblog(bookmark.getWebsite().getHandle())) { 332 invalidate(bookmark.getWebsite()); 333 } 334 } 335 336 337 340 public void invalidate(FolderData folder) { 341 if(RollerRuntimeConfig.isSiteWideWeblog(folder.getWebsite().getHandle())) { 342 invalidate(folder.getWebsite()); 343 } 344 } 345 346 347 350 public void invalidate(CommentData comment) { 351 if(RollerRuntimeConfig.isSiteWideWeblog(comment.getWeblogEntry().getWebsite().getHandle())) { 352 invalidate(comment.getWeblogEntry().getWebsite()); 353 } 354 } 355 356 357 360 public void invalidate(RefererData referer) { 361 } 363 364 365 368 public void invalidate(UserData user) { 369 } 371 372 373 376 public void invalidate(WeblogCategoryData category) { 377 if(RollerRuntimeConfig.isSiteWideWeblog(category.getWebsite().getHandle())) { 378 invalidate(category.getWebsite()); 379 } 380 } 381 382 383 386 public void invalidate(WeblogTemplate template) { 387 if(RollerRuntimeConfig.isSiteWideWeblog(template.getWebsite().getHandle())) { 388 invalidate(template.getWebsite()); 389 } 390 } 391 392 393 private String paramsToString(Map map) { 394 395 if(map == null) { 396 return null; 397 } 398 399 StringBuffer string = new StringBuffer (); 400 401 String key = null; 402 String [] value = null; 403 Iterator keys = map.keySet().iterator(); 404 while(keys.hasNext()) { 405 key = (String ) keys.next(); 406 value = (String []) map.get(key); 407 408 if(value != null) { 409 string.append(",").append(key).append("=").append(value[0]); 410 } 411 } 412 413 return Utilities.toBase64(string.toString().substring(1).getBytes()); 414 } 415 416 } 417 | Popular Tags |