File Source: contentcache.java

         /* 
    P/P   *  Method: net.sourceforge.pebble.ContentCache__static_init
          * 
          *  Preconditions:
          *    net/sourceforge/pebble/domain/BlogManager.instance != null
          *    net/sourceforge/pebble/domain/BlogManager.instance.blogs != null
          * 
          *  Presumptions:
          *    net.sf.ehcache.CacheManager:getCache(...)@66 != null
          * 
          *  Postconditions:
          *    instance == &new ContentCache(ContentCache__static_init#1)
          *    init'ed(log)
          *    new ContentCache(ContentCache__static_init#1) num objects == 1
          *    instance.cache != null
          */
     1  /*
     2   * Copyright (c) 2003-2006, Simon Brown
     3   * All rights reserved.
     4   *
     5   * Redistribution and use in source and binary forms, with or without
     6   * modification, are permitted provided that the following conditions are met:
     7   *
     8   *   - Redistributions of source code must retain the above copyright
     9   *     notice, this list of conditions and the following disclaimer.
    10   *
    11   *   - Redistributions in binary form must reproduce the above copyright
    12   *     notice, this list of conditions and the following disclaimer in
    13   *     the documentation and/or other materials provided with the
    14   *     distribution.
    15   *
    16   *   - Neither the name of Pebble nor the names of its contributors may
    17   *     be used to endorse or promote products derived from this software
    18   *     without specific prior written permission.
    19   *
    20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    30   * POSSIBILITY OF SUCH DAMAGE.
    31   */
    32  package net.sourceforge.pebble;
    33  
    34  import org.apache.commons.logging.Log;
    35  import org.apache.commons.logging.LogFactory;
    36  
    37  import java.util.Date;
    38  import java.util.Properties;
    39  import java.io.InputStream;
    40  import java.io.IOException;
    41  import java.net.URL;
    42  
    43  import net.sourceforge.pebble.util.RelativeDate;
    44  import net.sourceforge.pebble.domain.*;
         /* 
    P/P   *  Method: void net.sourceforge.pebble.ContentCache()
          * 
          *  Preconditions:
          *    net/sourceforge/pebble/domain/BlogManager.instance != null
          *    net/sourceforge/pebble/domain/BlogManager.instance.blogs != null
          * 
          *  Presumptions:
          *    net.sf.ehcache.Cache:getCacheConfiguration(...)@72 != null
          *    net.sf.ehcache.CacheManager:getCache(...)@66 != null
          *    net.sf.ehcache.config.CacheConfiguration:getMaxElementsInMemory(...)@72*getNumberOfBlogs(...)@72 in range
          *    net.sf.ehcache.config.CacheConfiguration:getMaxElementsInMemory(...)@72*java.util.Map:size(...)@237 in -231..232-1
          * 
          *  Postconditions:
          *    (soft) this.cache != null
          */
    45  import net.sf.ehcache.Element;
    46  import net.sf.ehcache.Cache;
    47  import net.sf.ehcache.CacheManager;
    48  
    49  /**
    50   * A wrapper for a cache used to store blog entries and static pages.
    51   *
    52   * @author    Simon Brown
    53   */
    54  public class ContentCache {
    55  
    56    private static final ContentCache instance = new ContentCache();
    57  
    58    /** the log used by this class */
    59    private static Log log = LogFactory.getLog(ContentCache.class);
    60  
    61    private Cache cache;
    62  
    63    private ContentCache() {
    64      URL url = BlogService.class.getResource("/ehcache.xml");
    65      CacheManager cacheManager = new CacheManager(url);
    66      cache = cacheManager.getCache("contentCache");
    67  
    68      // size the cache (number of blogs * max elements in memory configured in the ehcache.xml file)
    69      // Fix: Previously the number of blogs was calculated through blogManager.getBlogs().getSize() which
    70      // caused the blog to load and access the Cache that is just now being initialized.
    71      // This lead to NPE because instance is not yet set to this instance.
    72      cache.getCacheConfiguration().setMaxElementsInMemory(cache.getCacheConfiguration().getMaxElementsInMemory() * BlogManager.getInstance().getNumberOfBlogs());
    73    }
    74  
           /* 
    P/P     *  Method: ContentCache getInstance()
            * 
            *  Postconditions:
            *    return_value == &new ContentCache(ContentCache__static_init#1)
            */
    75    public static ContentCache getInstance() {
    76      return instance;
    77    }
    78  
    79    public synchronized void putBlogEntry(BlogEntry blogEntry) {
             /* 
    P/P       *  Method: void putBlogEntry(BlogEntry)
              * 
              *  Preconditions:
              *    blogEntry != null
              *    blogEntry.blog != null
              *    init'ed(blogEntry.blog.id)
              *    init'ed(blogEntry.id)
              *    this.cache != null
              */
    80      Element element = new Element(getCompositeKeyForBlogEntry(blogEntry), blogEntry);
    81      cache.put(element);
    82    }
    83  
    84    public synchronized BlogEntry getBlogEntry(Blog blog, String blogEntryId) {
    85      BlogEntry blogEntry = null;
             /* 
    P/P       *  Method: BlogEntry getBlogEntry(Blog, String)
              * 
              *  Preconditions:
              *    blog != null
              *    init'ed(blog.id)
              *    this.cache != null
              * 
              *  Postconditions:
              *    init'ed(return_value)
              * 
              *  Test Vectors:
              *    net.sf.ehcache.Cache:get(...)@86: Addr_Set{null}, Inverse{null}
              */
    86      Element element = cache.get(getCompositeKeyForBlogEntry(blog, blogEntryId));
    87      if (element != null) {
    88        blogEntry = (BlogEntry)element.getValue(); 
    89      }
    90  
    91      return blogEntry;
    92    }
    93  
    94    public synchronized void removeBlogEntry(BlogEntry blogEntry) {
             /* 
    P/P       *  Method: void removeBlogEntry(BlogEntry)
              * 
              *  Preconditions:
              *    blogEntry != null
              *    blogEntry.blog != null
              *    init'ed(blogEntry.blog.id)
              *    init'ed(blogEntry.id)
              *    this.cache != null
              */
    95      cache.remove(getCompositeKeyForBlogEntry(blogEntry));
    96    }
    97  
           /* 
    P/P     *  Method: String getCompositeKeyForBlogEntry(BlogEntry)
            * 
            *  Preconditions:
            *    blogEntry != null
            *    blogEntry.blog != null
            *    init'ed(blogEntry.blog.id)
            *    init'ed(blogEntry.id)
            * 
            *  Postconditions:
            *    return_value != null
            */
    98    private String getCompositeKeyForBlogEntry(BlogEntry blogEntry) {
    99      return getCompositeKeyForBlogEntry(blogEntry.getBlog(), blogEntry.getId());
   100    }
   101  
           /* 
    P/P     *  Method: String getCompositeKeyForBlogEntry(Blog, String)
            * 
            *  Preconditions:
            *    blog != null
            *    init'ed(blog.id)
            * 
            *  Postconditions:
            *    return_value != null
            */
   102    private String getCompositeKeyForBlogEntry(Blog blog, String blogEntryId) {
   103      return blog.getId() + "/blogEntry/" + blogEntryId;
   104    }
   105  
   106    public synchronized void putStaticPage(StaticPage staticPage) {
             /* 
    P/P       *  Method: void putStaticPage(StaticPage)
              * 
              *  Preconditions:
              *    staticPage != null
              *    staticPage.blog != null
              *    init'ed(staticPage.blog.id)
              *    init'ed(staticPage.id)
              *    this.cache != null
              */
   107      Element element = new Element(getCompositeKeyForStaticPage(staticPage), staticPage);
   108      cache.put(element);
   109    }
   110  
   111    public synchronized StaticPage getStaticPage(Blog blog, String staticPageId) {
   112      StaticPage staticPage = null;
             /* 
    P/P       *  Method: StaticPage getStaticPage(Blog, String)
              * 
              *  Preconditions:
              *    blog != null
              *    init'ed(blog.id)
              *    this.cache != null
              * 
              *  Postconditions:
              *    init'ed(return_value)
              * 
              *  Test Vectors:
              *    net.sf.ehcache.Cache:get(...)@113: Addr_Set{null}, Inverse{null}
              */
   113      Element element = cache.get(getCompositeKeyForStaticPage(blog, staticPageId));
   114      if (element != null) {
   115        staticPage = (StaticPage)element.getValue();
   116      }
   117  
   118      return staticPage;
   119    }
   120  
   121    public synchronized void removeStaticPage(StaticPage staticPage) {
             /* 
    P/P       *  Method: void removeStaticPage(StaticPage)
              * 
              *  Preconditions:
              *    staticPage != null
              *    staticPage.blog != null
              *    init'ed(staticPage.blog.id)
              *    init'ed(staticPage.id)
              *    this.cache != null
              */
   122      cache.remove(getCompositeKeyForStaticPage(staticPage));
   123    }
   124  
           /* 
    P/P     *  Method: String getCompositeKeyForStaticPage(StaticPage)
            * 
            *  Preconditions:
            *    staticPage != null
            *    staticPage.blog != null
            *    init'ed(staticPage.blog.id)
            *    init'ed(staticPage.id)
            * 
            *  Postconditions:
            *    return_value != null
            */
   125    private String getCompositeKeyForStaticPage(StaticPage staticPage) {
   126      return getCompositeKeyForStaticPage(staticPage.getBlog(), staticPage.getId());
   127    }
   128  
           /* 
    P/P     *  Method: String getCompositeKeyForStaticPage(Blog, String)
            * 
            *  Preconditions:
            *    blog != null
            *    init'ed(blog.id)
            * 
            *  Postconditions:
            *    return_value != null
            */
   129    private String getCompositeKeyForStaticPage(Blog blog, String staticPageId) {
   130      return blog.getId() + "/staticPage/" + staticPageId;
   131    }
   132  
   133  }








SofCheck Inspector Build Version : 2.22510
contentcache.java 2010-Jun-25 19:40:34
contentcache.class 2010-Jul-19 20:23:40