//# 3 errors, 407 messages
//#
/*
    //#CacheManager.java:1:1: class: org.apache.roller.weblogger.util.cache.CacheManager
 * Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  The ASF licenses this file to You
 * under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.  For additional information regarding
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */

package org.apache.roller.weblogger.util.cache;

import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.roller.weblogger.WebloggerException;
import org.apache.roller.weblogger.business.runnable.ContinuousWorkerThread;
import org.apache.roller.weblogger.business.runnable.Job;
import org.apache.roller.weblogger.config.WebloggerConfig;
import org.apache.roller.weblogger.business.WebloggerFactory;
import org.apache.roller.weblogger.business.UserManager;
import org.apache.roller.weblogger.pojos.WeblogBookmark;
import org.apache.roller.weblogger.pojos.WeblogEntryComment;
import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder;
import org.apache.roller.weblogger.pojos.WeblogReferrer;
import org.apache.roller.weblogger.pojos.User;
import org.apache.roller.weblogger.pojos.WeblogCategory;
import org.apache.roller.weblogger.pojos.WeblogEntry;
import org.apache.roller.weblogger.pojos.WeblogTemplate;
import org.apache.roller.weblogger.pojos.Weblog;


/**
 * A governing class for Roller cache objects.
 *
 * The purpose of the CacheManager is to provide a level of abstraction between
 * classes that use a cache and the implementations of a cache.  This allows
 * us to create easily pluggable cache implementations.
 * 
 * The other purpose is to provide a single interface for interacting with all
 * Roller caches at the same time.  This is beneficial because as data
 * changes in the system we often need to notify all caches that some part of
 * their cached data needs to be invalidated, and the CacheManager makes that
 * process easier.
 */
public class CacheManager {
    
    private static Log log = LogFactory.getLog(CacheManager.class);
    //#CacheManager.java:61: method: org.apache.roller.weblogger.util.cache.CacheManager.org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#CacheManager.java:61: Warning: method not available
    //#    -- call on Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#    unanalyzed callee: Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#input(org.apache.roller.weblogger.util.cache.CacheManager__static_init): org/apache/roller/weblogger/util/cache/CacheFactory.__Descendant_Table[org/apache/roller/weblogger/util/cache/CacheFactory]
    //#input(org.apache.roller.weblogger.util.cache.CacheManager__static_init): org/apache/roller/weblogger/util/cache/CacheFactory.__Descendant_Table[org/apache/roller/weblogger/util/cache/ExpiringLRUCacheFactoryImpl]
    //#input(org.apache.roller.weblogger.util.cache.CacheManager__static_init): org/apache/roller/weblogger/util/cache/CacheFactory.__Descendant_Table[org/apache/roller/weblogger/util/cache/LRUCacheFactoryImpl]
    //#input(org.apache.roller.weblogger.util.cache.CacheManager__static_init): org/apache/roller/weblogger/util/cache/CacheFactory.__Descendant_Table[others]
    //#input(org.apache.roller.weblogger.util.cache.CacheManager__static_init): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[org/apache/roller/weblogger/util/cache/CacheHandler]
    //#input(org.apache.roller.weblogger.util.cache.CacheManager__static_init): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[others]
    //#output(org.apache.roller.weblogger.util.cache.CacheManager__static_init): " falling back on default"._tainted
    //#output(org.apache.roller.weblogger.util.cache.CacheManager__static_init): "Cache Factory = "._tainted
    //#output(org.apache.roller.weblogger.util.cache.CacheManager__static_init): "Unable to instantiate cache factory ["._tainted
    //#output(org.apache.roller.weblogger.util.cache.CacheManager__static_init): "Unable to instantiate cache handler ["._tainted
    //#output(org.apache.roller.weblogger.util.cache.CacheManager__static_init): "]"._tainted
    //#output(org.apache.roller.weblogger.util.cache.CacheManager__static_init): __Descendant_Table[org/apache/roller/weblogger/util/cache/CacheManager]
    //#output(org.apache.roller.weblogger.util.cache.CacheManager__static_init): cacheFactory
    //#output(org.apache.roller.weblogger.util.cache.CacheManager__static_init): cacheHandlers
    //#output(org.apache.roller.weblogger.util.cache.CacheManager__static_init): caches
    //#output(org.apache.roller.weblogger.util.cache.CacheManager__static_init): log
    //#output(org.apache.roller.weblogger.util.cache.CacheManager__static_init): new HashMap(CacheManager__static_init#2) num objects
    //#output(org.apache.roller.weblogger.util.cache.CacheManager__static_init): new HashSet(CacheManager__static_init#1) num objects
    //#new obj(org.apache.roller.weblogger.util.cache.CacheManager__static_init): new HashMap(CacheManager__static_init#2)
    //#new obj(org.apache.roller.weblogger.util.cache.CacheManager__static_init): new HashSet(CacheManager__static_init#1)
    //#presumption(org.apache.roller.weblogger.util.cache.CacheManager__static_init): java.lang.Class:forName(...)@82 != null
    //#presumption(org.apache.roller.weblogger.util.cache.CacheManager__static_init): java.lang.Class:forName(...)@95 != null
    //#presumption(org.apache.roller.weblogger.util.cache.CacheManager__static_init): java.lang.Class:newInstance(...).__Tag@83 in {org/apache/roller/weblogger/util/cache/CacheFactory, org/apache/roller/weblogger/util/cache/ExpiringLRUCacheFactoryImpl, org/apache/roller/weblogger/util/cache/LRUCacheFactoryImpl}
    //#presumption(org.apache.roller.weblogger.util.cache.CacheManager__static_init): java.lang.Class:newInstance(...).__Tag@96 in {org/apache/roller/weblogger/util/cache/CacheFactory, org/apache/roller/weblogger/util/cache/ExpiringLRUCacheFactoryImpl, org/apache/roller/weblogger/util/cache/LRUCacheFactoryImpl}
    //#presumption(org.apache.roller.weblogger.util.cache.CacheManager__static_init): java.lang.Object:getClass(...)@103 != null
    //#presumption(org.apache.roller.weblogger.util.cache.CacheManager__static_init): org.apache.commons.logging.LogFactory:getLog(...)@61 != null
    //#post(org.apache.roller.weblogger.util.cache.CacheManager__static_init): " falling back on default"._tainted == 0
    //#post(org.apache.roller.weblogger.util.cache.CacheManager__static_init): "Cache Factory = "._tainted == 0
    //#post(org.apache.roller.weblogger.util.cache.CacheManager__static_init): "Unable to instantiate cache factory ["._tainted == 0
    //#post(org.apache.roller.weblogger.util.cache.CacheManager__static_init): "Unable to instantiate cache handler ["._tainted == 0
    //#post(org.apache.roller.weblogger.util.cache.CacheManager__static_init): "]"._tainted == 0
    //#post(org.apache.roller.weblogger.util.cache.CacheManager__static_init): __Descendant_Table[org/apache/roller/weblogger/util/cache/CacheManager] == &__Dispatch_Table
    //#post(org.apache.roller.weblogger.util.cache.CacheManager__static_init): cacheFactory != null
    //#post(org.apache.roller.weblogger.util.cache.CacheManager__static_init): cacheHandlers == &new HashSet(CacheManager__static_init#1)
    //#post(org.apache.roller.weblogger.util.cache.CacheManager__static_init): caches == &new HashMap(CacheManager__static_init#2)
    //#post(org.apache.roller.weblogger.util.cache.CacheManager__static_init): (soft) log != null
    //#post(org.apache.roller.weblogger.util.cache.CacheManager__static_init): new HashMap(CacheManager__static_init#2) num objects == 1
    //#post(org.apache.roller.weblogger.util.cache.CacheManager__static_init): new HashSet(CacheManager__static_init#1) num objects == 1
    //#test_vector(org.apache.roller.weblogger.util.cache.CacheManager__static_init): java.lang.String:length(...)@108: {0}, {1..4_294_967_295}
    //#test_vector(org.apache.roller.weblogger.util.cache.CacheManager__static_init): org.apache.roller.weblogger.config.WebloggerConfig:getProperty(...)@107: Addr_Set{null}, Inverse{null}
    
    private static final String DEFAULT_FACTORY = 
            "org.apache.roller.weblogger.util.cache.ExpiringLRUCacheFactoryImpl";
    
    // a reference to the cache factory in use
    private static CacheFactory cacheFactory = null;
    
    // a set of all registered cache handlers
    private static Set cacheHandlers = new HashSet();
    
    // a map of all registered caches
    private static Map caches = new HashMap();
    
    
    static {
        // lookup what cache factory we want to use
        String classname = WebloggerConfig.getProperty("cache.defaultFactory");
    //#CacheManager.java:78: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.config.WebloggerConfig:getProperty(String)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#    unanalyzed callee: String org.apache.roller.weblogger.config.WebloggerConfig:getProperty(String)
        
        // use reflection to instantiate our factory class
        try {
            Class factoryClass = Class.forName(classname);
            cacheFactory = (CacheFactory) factoryClass.newInstance();
        } catch(ClassCastException cce) {
            log.error("It appears that your factory does not implement "+
    //#CacheManager.java:85: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:error(Object, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#    unanalyzed callee: void org.apache.commons.logging.Log:error(Object, Throwable)
                    "the CacheFactory interface",cce);
        } catch(Exception e) {
            log.error("Unable to instantiate cache factory ["+classname+"]"+
    //#CacheManager.java:88: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:error(Object, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#    unanalyzed callee: void org.apache.commons.logging.Log:error(Object, Throwable)
                    " falling back on default", e);
        }
        
        if(cacheFactory == null) try {
            // hmm ... failed to load the specified cache factory
            // lets try our default
            Class factoryClass = Class.forName(DEFAULT_FACTORY);
            cacheFactory = (CacheFactory) factoryClass.newInstance();
        } catch(Exception e) {
            log.fatal("Failed to instantiate a cache factory", e);
            throw new RuntimeException(e);
        }
        
        log.info("Cache Manager Initialized.");
    //#CacheManager.java:102: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:info(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#    unanalyzed callee: void org.apache.commons.logging.Log:info(Object)
        log.info("Cache Factory = "+cacheFactory.getClass().getName());
    //#CacheManager.java:103: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:info(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#    unanalyzed callee: void org.apache.commons.logging.Log:info(Object)
        
        
        // add custom handlers
        String customHandlers = WebloggerConfig.getProperty("cache.customHandlers");
    //#CacheManager.java:107: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.config.WebloggerConfig:getProperty(String)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#    unanalyzed callee: String org.apache.roller.weblogger.config.WebloggerConfig:getProperty(String)
        if(customHandlers != null && customHandlers.trim().length() > 0) {
            
            String[] cHandlers = customHandlers.split(",");
            for(int i=0; i < cHandlers.length; i++) {
    //#CacheManager.java:111: ?use of default init
    //#    init'ed(cHandlers.length)
    //#    severity: LOW
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#    basic block: bb_12
    //#    assertion: init'ed(cHandlers.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#CacheManager.java:111: Warning: test always goes same way
    //#    test predetermined because i == cHandlers.length
    //#    severity: LOW
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#    from bb: bb_12
    //#    live edge: bb_12-->bb_18
    //#    tested vn: i - undefined
    //#    tested vn values: {0}
    //#CacheManager.java:111: Warning: dead code continues
    //#    dead code continues
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#    dead bb: bb_17
                // use reflection to instantiate the handler class
                try {
                    Class handlerClass = Class.forName(cHandlers[i]);
    //#CacheManager.java:114: Warning: dead code
    //#    dead code here because i == cHandlers.length
    //#    severity: LOW
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#    dead bb: bb_13
    //#CacheManager.java:114: Warning: dead code continues
    //#    dead code continues
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#    dead bb: bb_14
                    CacheHandler customHandler = 
    //#CacheManager.java:115: Warning: dead code continues
    //#    dead code continues
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: org.apache.roller.weblogger.util.cache.CacheManager__static_init
    //#    dead bb: bb_21
                            (CacheHandler) handlerClass.newInstance();
                    
                    cacheHandlers.add(customHandler);
                } catch(ClassCastException cce) {
                    log.error("It appears that your handler does not implement "+
                            "the CacheHandler interface",cce);
                } catch(Exception e) {
                    log.error("Unable to instantiate cache handler ["+cHandlers[i]+"]", e);
                }
            }
        }
    }
    //#CacheManager.java:127: end of method: org.apache.roller.weblogger.util.cache.CacheManager.org.apache.roller.weblogger.util.cache.CacheManager__static_init
    
    
    // a non-instantiable class
    private CacheManager() {}
    //#CacheManager.java:131: method: void org.apache.roller.weblogger.util.cache.CacheManager.org.apache.roller.weblogger.util.cache.CacheManager()
    //#CacheManager.java:131: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.org.apache.roller.weblogger.util.cache.CacheManager()
    
    
    /**
     * Ask the CacheManager to construct a cache.
     *
     * Normally the CacheManager will use whatever CacheFactory has been
     * chosen for the system via the cache.defaultFactory property.
     * However, it is possible to override the use of the default factory by
     * supplying a "factory" property to this method.  The value should
     * be the full classname for the factory you want to use for constructing
     * the cache.
     *
     * example:
     *   factory -> org.apache.roller.weblogger.util.cache.LRUCacheFactoryImpl
     *
     * This allows Roller admins the ability to choose a caching strategy to
     * use for the whole system, but override it in certain places where they
     * see fit.  It also allows users to write their own caching modifications
     * and have them used only by specific caches.
     */
    public static Cache constructCache(CacheHandler handler, Map properties) {
        
        log.debug("Constructing new cache with props "+properties);
    //#CacheManager.java:154: method: Cache org.apache.roller.weblogger.util.cache.CacheManager.constructCache(CacheHandler, Map)
    //#CacheManager.java:154: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: Cache constructCache(CacheHandler, Map)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
    //#CacheManager.java:154: Warning: suspicious precondition
    //#    the precondition for cacheFactory.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: Cache constructCache(CacheHandler, Map)
    //#    suspicious precondition index: [2]
    //#    Attribs:  Soft
    //#input(Cache constructCache(CacheHandler, Map)): ", timeout="._tainted
    //#input(Cache constructCache(CacheHandler, Map)): "Constructing new cache with props "._tainted
    //#input(Cache constructCache(CacheHandler, Map)): "It appears that your factory ["._tainted
    //#input(Cache constructCache(CacheHandler, Map)): "Unable to instantiate cache factory ["._tainted
    //#input(Cache constructCache(CacheHandler, Map)): "] does not implement the CacheFactory interface"._tainted
    //#input(Cache constructCache(CacheHandler, Map)): "] falling back on default"._tainted
    //#input(Cache constructCache(CacheHandler, Map)): "new cache constructed. size="._tainted
    //#input(Cache constructCache(CacheHandler, Map)): cacheFactory
    //#input(Cache constructCache(CacheHandler, Map)): cacheFactory.__Tag
    //#input(Cache constructCache(CacheHandler, Map)): cacheHandlers
    //#input(Cache constructCache(CacheHandler, Map)): caches
    //#input(Cache constructCache(CacheHandler, Map)): handler
    //#input(Cache constructCache(CacheHandler, Map)): log
    //#input(Cache constructCache(CacheHandler, Map)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl]
    //#input(Cache constructCache(CacheHandler, Map)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/LRUCacheImpl]
    //#input(Cache constructCache(CacheHandler, Map)): org/apache/roller/weblogger/util/cache/CacheFactory.__Descendant_Table[org/apache/roller/weblogger/util/cache/CacheFactory]
    //#input(Cache constructCache(CacheHandler, Map)): org/apache/roller/weblogger/util/cache/CacheFactory.__Descendant_Table[org/apache/roller/weblogger/util/cache/ExpiringLRUCacheFactoryImpl]
    //#input(Cache constructCache(CacheHandler, Map)): org/apache/roller/weblogger/util/cache/CacheFactory.__Descendant_Table[org/apache/roller/weblogger/util/cache/LRUCacheFactoryImpl]
    //#input(Cache constructCache(CacheHandler, Map)): org/apache/roller/weblogger/util/cache/CacheFactory.__Descendant_Table[others]
    //#input(Cache constructCache(CacheHandler, Map)): org/apache/roller/weblogger/util/cache/CacheFactory.__Dispatch_Table.constructCache(Ljava/util/Map;)Lorg/apache/roller/weblogger/util/cache/Cache;
    //#input(Cache constructCache(CacheHandler, Map)): org/apache/roller/weblogger/util/cache/ExpiringLRUCacheFactoryImpl.__Dispatch_Table.constructCache(Ljava/util/Map;)Lorg/apache/roller/weblogger/util/cache/Cache;
    //#input(Cache constructCache(CacheHandler, Map)): org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(Cache constructCache(CacheHandler, Map)): org/apache/roller/weblogger/util/cache/LRUCacheFactoryImpl.__Dispatch_Table.constructCache(Ljava/util/Map;)Lorg/apache/roller/weblogger/util/cache/Cache;
    //#input(Cache constructCache(CacheHandler, Map)): org/apache/roller/weblogger/util/cache/LRUCacheImpl.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(Cache constructCache(CacheHandler, Map)): properties
    //#input(Cache constructCache(CacheHandler, Map)): properties._tainted
    //#output(Cache constructCache(CacheHandler, Map)): new Date(LRUCacheImpl#1) num objects
    //#output(Cache constructCache(CacheHandler, Map)): new ExpiringLRUCacheImpl(constructCache#1*) num objects
    //#output(Cache constructCache(CacheHandler, Map)): new ExpiringLRUCacheImpl(constructCache#1*).__Tag
    //#output(Cache constructCache(CacheHandler, Map)): new ExpiringLRUCacheImpl(constructCache#1*).cache
    //#output(Cache constructCache(CacheHandler, Map)): new ExpiringLRUCacheImpl(constructCache#1*).hits
    //#output(Cache constructCache(CacheHandler, Map)): new ExpiringLRUCacheImpl(constructCache#1*).id
    //#output(Cache constructCache(CacheHandler, Map)): new ExpiringLRUCacheImpl(constructCache#1*).misses
    //#output(Cache constructCache(CacheHandler, Map)): new ExpiringLRUCacheImpl(constructCache#1*).puts
    //#output(Cache constructCache(CacheHandler, Map)): new ExpiringLRUCacheImpl(constructCache#1*).removes
    //#output(Cache constructCache(CacheHandler, Map)): new ExpiringLRUCacheImpl(constructCache#1*).startTime
    //#output(Cache constructCache(CacheHandler, Map)): new ExpiringLRUCacheImpl(constructCache#1*).timeout
    //#output(Cache constructCache(CacheHandler, Map)): new LRUCacheImpl(constructCache#1*) num objects
    //#output(Cache constructCache(CacheHandler, Map)): new LRUCacheImpl(constructCache#1*).__Tag
    //#output(Cache constructCache(CacheHandler, Map)): new LRUCacheImpl(constructCache#1*).cache
    //#output(Cache constructCache(CacheHandler, Map)): new LRUCacheImpl(constructCache#1*).hits
    //#output(Cache constructCache(CacheHandler, Map)): new LRUCacheImpl(constructCache#1*).id
    //#output(Cache constructCache(CacheHandler, Map)): new LRUCacheImpl(constructCache#1*).misses
    //#output(Cache constructCache(CacheHandler, Map)): new LRUCacheImpl(constructCache#1*).puts
    //#output(Cache constructCache(CacheHandler, Map)): new LRUCacheImpl(constructCache#1*).removes
    //#output(Cache constructCache(CacheHandler, Map)): new LRUCacheImpl(constructCache#1*).startTime
    //#output(Cache constructCache(CacheHandler, Map)): return_value
    //#new obj(Cache constructCache(CacheHandler, Map)): new Date(LRUCacheImpl#1)
    //#new obj(Cache constructCache(CacheHandler, Map)): new ExpiringLRUCacheImpl(constructCache#1*)
    //#new obj(Cache constructCache(CacheHandler, Map)): new LRUCacheImpl(constructCache#1*)
    //#pre[4] (Cache constructCache(CacheHandler, Map)): caches != null
    //#pre[6] (Cache constructCache(CacheHandler, Map)): log != null
    //#pre[9] (Cache constructCache(CacheHandler, Map)): properties != null
    //#pre[1] (Cache constructCache(CacheHandler, Map)): (soft) cacheFactory != null
    //#pre[2] (Cache constructCache(CacheHandler, Map)): (soft) cacheFactory.__Tag in {org/apache/roller/weblogger/util/cache/CacheFactory, org/apache/roller/weblogger/util/cache/ExpiringLRUCacheFactoryImpl, org/apache/roller/weblogger/util/cache/LRUCacheFactoryImpl}
    //#pre[3] (Cache constructCache(CacheHandler, Map)): (soft) cacheHandlers != null
    //#presumption(Cache constructCache(CacheHandler, Map)): java.lang.Class:forName(...)@164 != null
    //#presumption(Cache constructCache(CacheHandler, Map)): java.lang.Class:newInstance(...).__Tag@165 in {org/apache/roller/weblogger/util/cache/CacheFactory, org/apache/roller/weblogger/util/cache/ExpiringLRUCacheFactoryImpl, org/apache/roller/weblogger/util/cache/LRUCacheFactoryImpl}
    //#post(Cache constructCache(CacheHandler, Map)): return_value != null
    //#post(Cache constructCache(CacheHandler, Map)): init'ed(new Date(LRUCacheImpl#1) num objects)
    //#post(Cache constructCache(CacheHandler, Map)): init'ed(new ExpiringLRUCacheImpl(constructCache#1*) num objects)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).__Tag)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).cache)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).hits)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).id)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).misses)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).puts)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).removes)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).startTime)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).timeout)
    //#post(Cache constructCache(CacheHandler, Map)): init'ed(new LRUCacheImpl(constructCache#1*) num objects)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new LRUCacheImpl(constructCache#1*).__Tag)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new LRUCacheImpl(constructCache#1*).cache)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new LRUCacheImpl(constructCache#1*).hits)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new LRUCacheImpl(constructCache#1*).id)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new LRUCacheImpl(constructCache#1*).misses)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new LRUCacheImpl(constructCache#1*).puts)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new LRUCacheImpl(constructCache#1*).removes)
    //#post(Cache constructCache(CacheHandler, Map)): possibly_updated(new LRUCacheImpl(constructCache#1*).startTime)
    //#unanalyzed(Cache constructCache(CacheHandler, Map)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(Cache constructCache(CacheHandler, Map)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(Cache constructCache(CacheHandler, Map)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(Cache constructCache(CacheHandler, Map)): Effects-of-calling:java.util.Date
    //#unanalyzed(Cache constructCache(CacheHandler, Map)): Effects-of-calling:java.util.LinkedHashMap
    //#unanalyzed(Cache constructCache(CacheHandler, Map)): Effects-of-calling:java.util.Collections:synchronizedMap
    //#unanalyzed(Cache constructCache(CacheHandler, Map)): Effects-of-calling:org.apache.roller.weblogger.util.cache.LRUCacheImpl
    //#unanalyzed(Cache constructCache(CacheHandler, Map)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(Cache constructCache(CacheHandler, Map)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(Cache constructCache(CacheHandler, Map)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(Cache constructCache(CacheHandler, Map)): Effects-of-calling:org.apache.commons.logging.Log:debug
    //#unanalyzed(Cache constructCache(CacheHandler, Map)): Effects-of-calling:java.lang.Long:parseLong
    //#test_vector(Cache constructCache(CacheHandler, Map)): handler: Addr_Set{null}, Inverse{null}
    //#test_vector(Cache constructCache(CacheHandler, Map)): java.util.Map:containsKey(...)@158: {0}, {1}
        
        Cache cache = null;
        
        if(properties != null && properties.containsKey("factory")) {
    //#CacheManager.java:158: Warning: test always goes same way
    //#    test predetermined because properties != null
    //#    severity: LOW
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: Cache constructCache(CacheHandler, Map)
    //#    from bb: Entry_BB_1
    //#    live edge: Entry_BB_1-->bb_2
    //#    tested vn: properties == null
    //#    tested vn values: {0}
            // someone wants a custom cache instance
            String classname = (String) properties.get("factory");
            
            try {
                // use reflection to instantiate the factory class
                Class factoryClass = Class.forName(classname);
                CacheFactory factory = (CacheFactory) factoryClass.newInstance();
                
                // now ask for a new cache
                cache = factory.constructCache(properties);
            } catch(ClassCastException cce) {
                log.error("It appears that your factory ["+classname+
    //#CacheManager.java:170: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:error(Object, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: Cache constructCache(CacheHandler, Map)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:error(Object, Throwable)
                        "] does not implement the CacheFactory interface",cce);
            } catch(Exception e) {
                log.error("Unable to instantiate cache factory ["+classname+
    //#CacheManager.java:173: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:error(Object, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: Cache constructCache(CacheHandler, Map)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:error(Object, Throwable)
                        "] falling back on default", e);
            }
        }
        
        if(cache == null) {
            // ask our default cache factory for a new cache instance
            cache = cacheFactory.constructCache(properties);
        }
        
        if(cache != null) {
    //#CacheManager.java:183: Warning: test always goes same way
    //#    test predetermined because cache != null
    //#    severity: LOW
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: Cache constructCache(CacheHandler, Map)
    //#    from bb: bb_9
    //#    live edge: bb_9-->bb_10
    //#    tested vn: 0
    //#    tested vn values: {0}
            caches.put(cache.getId(), cache);
    //#CacheManager.java:184: ?use of default init
    //#    init'ed(cache.__Tag)
    //#    severity: SUPPRESSED
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: Cache constructCache(CacheHandler, Map)
    //#    basic block: bb_10
    //#    assertion: init'ed(cache.__Tag)
    //#    VN: cache.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid  Uncertain
    //#CacheManager.java:184: ?precondition failure
    //#    org/apache/roller/weblogger/util/cache/LRUCacheImpl.getId: init'ed(this.id)
    //#    severity: SUPPRESSED
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: Cache constructCache(CacheHandler, Map)
    //#    basic block: bb_10
    //#    assertion: init'ed(cache.id)
    //#    callee: String org/apache/roller/weblogger/util/cache/LRUCacheImpl.getId()
    //#    callee assertion: init'ed(this.id)
    //#    callee file: LRUCacheImpl.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 63
    //#    VN: cache.id
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
            
            // register the handler for this new cache
            if(handler != null) {
                cacheHandlers.add(handler);
            }
        }

        return cache;
    //#CacheManager.java:192: end of method: Cache org.apache.roller.weblogger.util.cache.CacheManager.constructCache(CacheHandler, Map)
    }
    
    
    /**
     * Register a CacheHandler to listen for object invalidations.
     *
     * This is here so that it's possible to to add classes which would respond
     * to object invalidations without necessarily having to create a cache.
     *
     * An example would be a handler designed to notify other machines in a 
     * cluster when an object has been invalidated, or possibly the search
     * index management classes are interested in knowing when objects are
     * invalidated.
     */
    public static void registerHandler(CacheHandler handler) {
        
        log.debug("Registering handler "+handler);
    //#CacheManager.java:209: method: void org.apache.roller.weblogger.util.cache.CacheManager.registerHandler(CacheHandler)
    //#CacheManager.java:209: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void registerHandler(CacheHandler)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
    //#input(void registerHandler(CacheHandler)): "Registering handler "._tainted
    //#input(void registerHandler(CacheHandler)): cacheHandlers
    //#input(void registerHandler(CacheHandler)): handler
    //#input(void registerHandler(CacheHandler)): handler._tainted
    //#input(void registerHandler(CacheHandler)): log
    //#pre[4] (void registerHandler(CacheHandler)): log != null
    //#pre[1] (void registerHandler(CacheHandler)): (soft) cacheHandlers != null
    //#test_vector(void registerHandler(CacheHandler)): handler: Addr_Set{null}, Inverse{null}
        
        if(handler != null) {
            cacheHandlers.add(handler);
        }
    }
    //#CacheManager.java:214: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.registerHandler(CacheHandler)
    
    
    public static void invalidate(WeblogEntry entry) {
        
        log.debug("invalidating entry = "+entry.getAnchor());
    //#CacheManager.java:219: method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogEntry)
    //#CacheManager.java:219: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.pojos.WeblogEntry:getAnchor()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogEntry)
    //#    unanalyzed callee: String org.apache.roller.weblogger.pojos.WeblogEntry:getAnchor()
    //#CacheManager.java:219: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogEntry)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
    //#input(void invalidate(WeblogEntry)): "invalidating entry = "._tainted
    //#input(void invalidate(WeblogEntry)): cacheHandlers
    //#input(void invalidate(WeblogEntry)): entry
    //#input(void invalidate(WeblogEntry)): log
    //#input(void invalidate(WeblogEntry)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[org/apache/roller/weblogger/util/cache/CacheHandler]
    //#input(void invalidate(WeblogEntry)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[others]
    //#input(void invalidate(WeblogEntry)): org/apache/roller/weblogger/util/cache/CacheHandler.__Dispatch_Table.invalidate(Lorg/apache/roller/weblogger/pojos/WeblogEntry;)V
    //#pre[1] (void invalidate(WeblogEntry)): cacheHandlers != null
    //#pre[2] (void invalidate(WeblogEntry)): entry != null
    //#pre[3] (void invalidate(WeblogEntry)): log != null
    //#presumption(void invalidate(WeblogEntry)): java.util.Iterator:next(...).__Tag@223 == org/apache/roller/weblogger/util/cache/CacheHandler
    //#presumption(void invalidate(WeblogEntry)): java.util.Iterator:next(...)@223 != null
    //#test_vector(void invalidate(WeblogEntry)): java.util.Iterator:hasNext(...)@222: {0}, {1}
        
        Iterator handlers = cacheHandlers.iterator();
        while(handlers.hasNext()) {
            ((CacheHandler) handlers.next()).invalidate(entry);
    //#CacheManager.java:223: Warning: method not available
    //#    -- call on void invalidate(WeblogEntry)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogEntry)
    //#    unanalyzed callee: void invalidate(WeblogEntry)
        }
    }
    //#CacheManager.java:225: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogEntry)
    
    
    public static void invalidate(Weblog website) {
        
        log.debug("invalidating website = "+website.getHandle());
    //#CacheManager.java:230: method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(Weblog)
    //#CacheManager.java:230: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.pojos.Weblog:getHandle()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(Weblog)
    //#    unanalyzed callee: String org.apache.roller.weblogger.pojos.Weblog:getHandle()
    //#CacheManager.java:230: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(Weblog)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
    //#input(void invalidate(Weblog)): "invalidating website = "._tainted
    //#input(void invalidate(Weblog)): cacheHandlers
    //#input(void invalidate(Weblog)): log
    //#input(void invalidate(Weblog)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[org/apache/roller/weblogger/util/cache/CacheHandler]
    //#input(void invalidate(Weblog)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[others]
    //#input(void invalidate(Weblog)): org/apache/roller/weblogger/util/cache/CacheHandler.__Dispatch_Table.invalidate(Lorg/apache/roller/weblogger/pojos/Weblog;)V
    //#input(void invalidate(Weblog)): website
    //#pre[1] (void invalidate(Weblog)): cacheHandlers != null
    //#pre[2] (void invalidate(Weblog)): log != null
    //#pre[3] (void invalidate(Weblog)): website != null
    //#presumption(void invalidate(Weblog)): java.util.Iterator:next(...).__Tag@234 == org/apache/roller/weblogger/util/cache/CacheHandler
    //#presumption(void invalidate(Weblog)): java.util.Iterator:next(...)@234 != null
    //#test_vector(void invalidate(Weblog)): java.util.Iterator:hasNext(...)@233: {0}, {1}
        
        Iterator handlers = cacheHandlers.iterator();
        while(handlers.hasNext()) {
            ((CacheHandler) handlers.next()).invalidate(website);
    //#CacheManager.java:234: Warning: method not available
    //#    -- call on void invalidate(Weblog)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(Weblog)
    //#    unanalyzed callee: void invalidate(Weblog)
        }
    }
    //#CacheManager.java:236: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(Weblog)
    
    
    public static void invalidate(WeblogBookmark bookmark) {
        
        log.debug("invalidating bookmark = "+bookmark.getId());
    //#CacheManager.java:241: method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogBookmark)
    //#CacheManager.java:241: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.pojos.WeblogBookmark:getId()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogBookmark)
    //#    unanalyzed callee: String org.apache.roller.weblogger.pojos.WeblogBookmark:getId()
    //#CacheManager.java:241: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogBookmark)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
    //#input(void invalidate(WeblogBookmark)): "invalidating bookmark = "._tainted
    //#input(void invalidate(WeblogBookmark)): bookmark
    //#input(void invalidate(WeblogBookmark)): cacheHandlers
    //#input(void invalidate(WeblogBookmark)): log
    //#input(void invalidate(WeblogBookmark)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[org/apache/roller/weblogger/util/cache/CacheHandler]
    //#input(void invalidate(WeblogBookmark)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[others]
    //#input(void invalidate(WeblogBookmark)): org/apache/roller/weblogger/util/cache/CacheHandler.__Dispatch_Table.invalidate(Lorg/apache/roller/weblogger/pojos/WeblogBookmark;)V
    //#pre[1] (void invalidate(WeblogBookmark)): bookmark != null
    //#pre[2] (void invalidate(WeblogBookmark)): cacheHandlers != null
    //#pre[3] (void invalidate(WeblogBookmark)): log != null
    //#presumption(void invalidate(WeblogBookmark)): java.util.Iterator:next(...).__Tag@245 == org/apache/roller/weblogger/util/cache/CacheHandler
    //#presumption(void invalidate(WeblogBookmark)): java.util.Iterator:next(...)@245 != null
    //#test_vector(void invalidate(WeblogBookmark)): java.util.Iterator:hasNext(...)@244: {0}, {1}
        
        Iterator handlers = cacheHandlers.iterator();
        while(handlers.hasNext()) {
            ((CacheHandler) handlers.next()).invalidate(bookmark);
    //#CacheManager.java:245: Warning: method not available
    //#    -- call on void invalidate(WeblogBookmark)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogBookmark)
    //#    unanalyzed callee: void invalidate(WeblogBookmark)
        }
    }
    //#CacheManager.java:247: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogBookmark)
    
    
    public static void invalidate(WeblogBookmarkFolder folder) {
        
        log.debug("invalidating folder = "+folder.getId());
    //#CacheManager.java:252: method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogBookmarkFolder)
    //#CacheManager.java:252: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.pojos.WeblogBookmarkFolder:getId()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogBookmarkFolder)
    //#    unanalyzed callee: String org.apache.roller.weblogger.pojos.WeblogBookmarkFolder:getId()
    //#CacheManager.java:252: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogBookmarkFolder)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
    //#input(void invalidate(WeblogBookmarkFolder)): "invalidating folder = "._tainted
    //#input(void invalidate(WeblogBookmarkFolder)): cacheHandlers
    //#input(void invalidate(WeblogBookmarkFolder)): folder
    //#input(void invalidate(WeblogBookmarkFolder)): log
    //#input(void invalidate(WeblogBookmarkFolder)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[org/apache/roller/weblogger/util/cache/CacheHandler]
    //#input(void invalidate(WeblogBookmarkFolder)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[others]
    //#input(void invalidate(WeblogBookmarkFolder)): org/apache/roller/weblogger/util/cache/CacheHandler.__Dispatch_Table.invalidate(Lorg/apache/roller/weblogger/pojos/WeblogBookmarkFolder;)V
    //#pre[1] (void invalidate(WeblogBookmarkFolder)): cacheHandlers != null
    //#pre[2] (void invalidate(WeblogBookmarkFolder)): folder != null
    //#pre[3] (void invalidate(WeblogBookmarkFolder)): log != null
    //#presumption(void invalidate(WeblogBookmarkFolder)): java.util.Iterator:next(...).__Tag@256 == org/apache/roller/weblogger/util/cache/CacheHandler
    //#presumption(void invalidate(WeblogBookmarkFolder)): java.util.Iterator:next(...)@256 != null
    //#test_vector(void invalidate(WeblogBookmarkFolder)): java.util.Iterator:hasNext(...)@255: {0}, {1}
        
        Iterator handlers = cacheHandlers.iterator();
        while(handlers.hasNext()) {
            ((CacheHandler) handlers.next()).invalidate(folder);
    //#CacheManager.java:256: Warning: method not available
    //#    -- call on void invalidate(WeblogBookmarkFolder)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogBookmarkFolder)
    //#    unanalyzed callee: void invalidate(WeblogBookmarkFolder)
        }
    }
    //#CacheManager.java:258: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogBookmarkFolder)
    
    
    public static void invalidate(WeblogEntryComment comment) {
        
        log.debug("invalidating comment = "+comment.getId());
    //#CacheManager.java:263: method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogEntryComment)
    //#CacheManager.java:263: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.pojos.WeblogEntryComment:getId()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogEntryComment)
    //#    unanalyzed callee: String org.apache.roller.weblogger.pojos.WeblogEntryComment:getId()
    //#CacheManager.java:263: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogEntryComment)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
    //#input(void invalidate(WeblogEntryComment)): "invalidating comment = "._tainted
    //#input(void invalidate(WeblogEntryComment)): cacheHandlers
    //#input(void invalidate(WeblogEntryComment)): comment
    //#input(void invalidate(WeblogEntryComment)): log
    //#input(void invalidate(WeblogEntryComment)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[org/apache/roller/weblogger/util/cache/CacheHandler]
    //#input(void invalidate(WeblogEntryComment)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[others]
    //#input(void invalidate(WeblogEntryComment)): org/apache/roller/weblogger/util/cache/CacheHandler.__Dispatch_Table.invalidate(Lorg/apache/roller/weblogger/pojos/WeblogEntryComment;)V
    //#pre[1] (void invalidate(WeblogEntryComment)): cacheHandlers != null
    //#pre[2] (void invalidate(WeblogEntryComment)): comment != null
    //#pre[3] (void invalidate(WeblogEntryComment)): log != null
    //#presumption(void invalidate(WeblogEntryComment)): java.util.Iterator:next(...).__Tag@267 == org/apache/roller/weblogger/util/cache/CacheHandler
    //#presumption(void invalidate(WeblogEntryComment)): java.util.Iterator:next(...)@267 != null
    //#test_vector(void invalidate(WeblogEntryComment)): java.util.Iterator:hasNext(...)@266: {0}, {1}
        
        Iterator handlers = cacheHandlers.iterator();
        while(handlers.hasNext()) {
            ((CacheHandler) handlers.next()).invalidate(comment);
    //#CacheManager.java:267: Warning: method not available
    //#    -- call on void invalidate(WeblogEntryComment)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogEntryComment)
    //#    unanalyzed callee: void invalidate(WeblogEntryComment)
        }
    }
    //#CacheManager.java:269: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogEntryComment)
    
    
    public static void invalidate(WeblogReferrer referer) {
        
        log.debug("invalidating referer = "+referer.getId());
    //#CacheManager.java:274: method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogReferrer)
    //#CacheManager.java:274: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.pojos.WeblogReferrer:getId()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogReferrer)
    //#    unanalyzed callee: String org.apache.roller.weblogger.pojos.WeblogReferrer:getId()
    //#CacheManager.java:274: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogReferrer)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
    //#input(void invalidate(WeblogReferrer)): "invalidating referer = "._tainted
    //#input(void invalidate(WeblogReferrer)): cacheHandlers
    //#input(void invalidate(WeblogReferrer)): log
    //#input(void invalidate(WeblogReferrer)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[org/apache/roller/weblogger/util/cache/CacheHandler]
    //#input(void invalidate(WeblogReferrer)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[others]
    //#input(void invalidate(WeblogReferrer)): org/apache/roller/weblogger/util/cache/CacheHandler.__Dispatch_Table.invalidate(Lorg/apache/roller/weblogger/pojos/WeblogReferrer;)V
    //#input(void invalidate(WeblogReferrer)): referer
    //#pre[1] (void invalidate(WeblogReferrer)): cacheHandlers != null
    //#pre[2] (void invalidate(WeblogReferrer)): log != null
    //#pre[3] (void invalidate(WeblogReferrer)): referer != null
    //#presumption(void invalidate(WeblogReferrer)): java.util.Iterator:next(...).__Tag@282 == org/apache/roller/weblogger/util/cache/CacheHandler
    //#presumption(void invalidate(WeblogReferrer)): java.util.Iterator:next(...)@282 != null
    //#test_vector(void invalidate(WeblogReferrer)): java.util.Iterator:hasNext(...)@281: {0}, {1}
        
        // NOTE: Invalidating an entire website for each referer is not
        //       good for our caching.  This may need reevaluation later.
        //lastExpiredCache.put(referer.getWebsite().getHandle(), new Date());
        
        Iterator handlers = cacheHandlers.iterator();
        while(handlers.hasNext()) {
            ((CacheHandler) handlers.next()).invalidate(referer);
    //#CacheManager.java:282: Warning: method not available
    //#    -- call on void invalidate(WeblogReferrer)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogReferrer)
    //#    unanalyzed callee: void invalidate(WeblogReferrer)
        }
    }
    //#CacheManager.java:284: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogReferrer)
    
    
    public static void invalidate(User user) {
        
        log.debug("invalidating user = "+user.getUserName());
    //#CacheManager.java:289: method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(User)
    //#CacheManager.java:289: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.pojos.User:getUserName()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(User)
    //#    unanalyzed callee: String org.apache.roller.weblogger.pojos.User:getUserName()
    //#CacheManager.java:289: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(User)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
    //#input(void invalidate(User)): "invalidating user = "._tainted
    //#input(void invalidate(User)): cacheHandlers
    //#input(void invalidate(User)): log
    //#input(void invalidate(User)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[org/apache/roller/weblogger/util/cache/CacheHandler]
    //#input(void invalidate(User)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[others]
    //#input(void invalidate(User)): org/apache/roller/weblogger/util/cache/CacheHandler.__Dispatch_Table.invalidate(Lorg/apache/roller/weblogger/pojos/User;)V
    //#input(void invalidate(User)): user
    //#pre[1] (void invalidate(User)): cacheHandlers != null
    //#pre[2] (void invalidate(User)): log != null
    //#pre[3] (void invalidate(User)): user != null
    //#presumption(void invalidate(User)): java.util.Iterator:next(...).__Tag@293 == org/apache/roller/weblogger/util/cache/CacheHandler
    //#presumption(void invalidate(User)): java.util.Iterator:next(...)@293 != null
    //#test_vector(void invalidate(User)): java.util.Iterator:hasNext(...)@292: {0}, {1}
        
        Iterator handlers = cacheHandlers.iterator();
        while(handlers.hasNext()) {
            ((CacheHandler) handlers.next()).invalidate(user);
    //#CacheManager.java:293: Warning: method not available
    //#    -- call on void invalidate(User)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(User)
    //#    unanalyzed callee: void invalidate(User)
        }
    }
    //#CacheManager.java:295: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(User)
    
    
    public static void invalidate(WeblogCategory category) {
        
        log.debug("invalidating category = "+category.getId());
    //#CacheManager.java:300: method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogCategory)
    //#CacheManager.java:300: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.pojos.WeblogCategory:getId()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogCategory)
    //#    unanalyzed callee: String org.apache.roller.weblogger.pojos.WeblogCategory:getId()
    //#CacheManager.java:300: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogCategory)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
    //#input(void invalidate(WeblogCategory)): "invalidating category = "._tainted
    //#input(void invalidate(WeblogCategory)): cacheHandlers
    //#input(void invalidate(WeblogCategory)): category
    //#input(void invalidate(WeblogCategory)): log
    //#input(void invalidate(WeblogCategory)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[org/apache/roller/weblogger/util/cache/CacheHandler]
    //#input(void invalidate(WeblogCategory)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[others]
    //#input(void invalidate(WeblogCategory)): org/apache/roller/weblogger/util/cache/CacheHandler.__Dispatch_Table.invalidate(Lorg/apache/roller/weblogger/pojos/WeblogCategory;)V
    //#pre[1] (void invalidate(WeblogCategory)): cacheHandlers != null
    //#pre[2] (void invalidate(WeblogCategory)): category != null
    //#pre[3] (void invalidate(WeblogCategory)): log != null
    //#presumption(void invalidate(WeblogCategory)): java.util.Iterator:next(...).__Tag@304 == org/apache/roller/weblogger/util/cache/CacheHandler
    //#presumption(void invalidate(WeblogCategory)): java.util.Iterator:next(...)@304 != null
    //#test_vector(void invalidate(WeblogCategory)): java.util.Iterator:hasNext(...)@303: {0}, {1}
        
        Iterator handlers = cacheHandlers.iterator();
        while(handlers.hasNext()) {
            ((CacheHandler) handlers.next()).invalidate(category);
    //#CacheManager.java:304: Warning: method not available
    //#    -- call on void invalidate(WeblogCategory)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogCategory)
    //#    unanalyzed callee: void invalidate(WeblogCategory)
        }
    }
    //#CacheManager.java:306: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogCategory)
    
    
    public static void invalidate(WeblogTemplate template) {
        
        log.debug("invalidating template = "+template.getId());
    //#CacheManager.java:311: method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogTemplate)
    //#CacheManager.java:311: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.pojos.WeblogTemplate:getId()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogTemplate)
    //#    unanalyzed callee: String org.apache.roller.weblogger.pojos.WeblogTemplate:getId()
    //#CacheManager.java:311: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogTemplate)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
    //#input(void invalidate(WeblogTemplate)): "invalidating template = "._tainted
    //#input(void invalidate(WeblogTemplate)): cacheHandlers
    //#input(void invalidate(WeblogTemplate)): log
    //#input(void invalidate(WeblogTemplate)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[org/apache/roller/weblogger/util/cache/CacheHandler]
    //#input(void invalidate(WeblogTemplate)): org/apache/roller/weblogger/util/cache/CacheHandler.__Descendant_Table[others]
    //#input(void invalidate(WeblogTemplate)): org/apache/roller/weblogger/util/cache/CacheHandler.__Dispatch_Table.invalidate(Lorg/apache/roller/weblogger/pojos/WeblogTemplate;)V
    //#input(void invalidate(WeblogTemplate)): template
    //#pre[1] (void invalidate(WeblogTemplate)): cacheHandlers != null
    //#pre[2] (void invalidate(WeblogTemplate)): log != null
    //#pre[3] (void invalidate(WeblogTemplate)): template != null
    //#presumption(void invalidate(WeblogTemplate)): java.util.Iterator:next(...).__Tag@315 == org/apache/roller/weblogger/util/cache/CacheHandler
    //#presumption(void invalidate(WeblogTemplate)): java.util.Iterator:next(...)@315 != null
    //#test_vector(void invalidate(WeblogTemplate)): java.util.Iterator:hasNext(...)@314: {0}, {1}
        
        Iterator handlers = cacheHandlers.iterator();
        while(handlers.hasNext()) {
            ((CacheHandler) handlers.next()).invalidate(template);
    //#CacheManager.java:315: Warning: method not available
    //#    -- call on void invalidate(WeblogTemplate)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void invalidate(WeblogTemplate)
    //#    unanalyzed callee: void invalidate(WeblogTemplate)
        }
    }
    //#CacheManager.java:317: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.invalidate(WeblogTemplate)

    
    /**
     * Flush the entire cache system.
     */
    public static void clear() {
        
        // loop through all caches and trigger a clear
        Cache cache = null;
    //#CacheManager.java:326: method: void org.apache.roller.weblogger.util.cache.CacheManager.clear()
    //#CacheManager.java:326: Warning: unused assignment
    //#    unused assignment into cache
    //#    severity: SUPPRESSED
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: void clear()
    //#    Attribs:  Uncertain
    //#input(void clear()): caches
    //#input(void clear()): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/Cache]
    //#input(void clear()): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl]
    //#input(void clear()): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/LRUCacheImpl]
    //#input(void clear()): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[others]
    //#input(void clear()): org/apache/roller/weblogger/util/cache/Cache.__Dispatch_Table.clear()V
    //#input(void clear()): org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl.__Dispatch_Table.clear()V
    //#input(void clear()): org/apache/roller/weblogger/util/cache/LRUCacheImpl.__Dispatch_Table.clear()V
    //#output(void clear()): new Date(clear#1*) num objects
    //#new obj(void clear()): new Date(clear#1*)
    //#pre[1] (void clear()): caches != null
    //#presumption(void clear()): cache.cache@329 != null
    //#presumption(void clear()): java.util.Iterator:next(...).__Tag@329 in {org/apache/roller/weblogger/util/cache/Cache, org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl, org/apache/roller/weblogger/util/cache/LRUCacheImpl}
    //#presumption(void clear()): java.util.Iterator:next(...)@329 != null
    //#presumption(void clear()): java.util.Map:values(...)@327 != null
    //#post(void clear()): init'ed(new Date(clear#1*) num objects)
    //#unanalyzed(void clear()): Effects-of-calling:java.util.Date
    //#unanalyzed(void clear()): Effects-of-calling:java.util.Map:clear
    //#test_vector(void clear()): java.util.Iterator:hasNext(...)@328: {0}, {1}
        Iterator cachesIT = caches.values().iterator();
        while(cachesIT.hasNext()) {
            cache = (Cache) cachesIT.next();
            
            cache.clear();
        }
    }
    //#CacheManager.java:333: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.clear()
    
    
    /**
     * Flush a single cache.
     */
    public static void clear(String cacheId) {
        
        Cache cache = (Cache) caches.get(cacheId);
    //#CacheManager.java:341: method: void org.apache.roller.weblogger.util.cache.CacheManager.clear(String)
    //#input(void clear(String)): cacheId
    //#input(void clear(String)): caches
    //#input(void clear(String)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/Cache]
    //#input(void clear(String)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl]
    //#input(void clear(String)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/LRUCacheImpl]
    //#input(void clear(String)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[others]
    //#input(void clear(String)): org/apache/roller/weblogger/util/cache/Cache.__Dispatch_Table.clear()V
    //#input(void clear(String)): org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl.__Dispatch_Table.clear()V
    //#input(void clear(String)): org/apache/roller/weblogger/util/cache/LRUCacheImpl.__Dispatch_Table.clear()V
    //#output(void clear(String)): new Date(clear#1*) num objects
    //#new obj(void clear(String)): new Date(clear#1*)
    //#pre[2] (void clear(String)): caches != null
    //#presumption(void clear(String)): cache.cache@341 != null
    //#presumption(void clear(String)): java.util.Map:get(...).__Tag@341 in {org/apache/roller/weblogger/util/cache/Cache, org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl, org/apache/roller/weblogger/util/cache/LRUCacheImpl}
    //#post(void clear(String)): new Date(clear#1*) num objects <= 1
    //#unanalyzed(void clear(String)): Effects-of-calling:java.util.Date
    //#unanalyzed(void clear(String)): Effects-of-calling:java.util.Map:clear
    //#test_vector(void clear(String)): java.util.Map:get(...)@341: Addr_Set{null}, Inverse{null}
        if(cache != null) {
            cache.clear();
        }
    }
    //#CacheManager.java:345: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.clear(String)
    
    
    /**
     * Compile stats from all registered caches.
     *
     * This is basically a hacky version of instrumentation which is being
     * thrown in because we don't have a full instrumentation strategy yet.
     * This is here with the full expectation that it will be replaced by
     * something a bit more elaborate, like JMX.
     */
    public static Map getStats() {
        
        Map allStats = new HashMap();
    //#CacheManager.java:358: method: Map org.apache.roller.weblogger.util.cache.CacheManager.getStats()
    //#input(Map getStats()): caches
    //#input(Map getStats()): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/Cache]
    //#input(Map getStats()): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl]
    //#input(Map getStats()): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/LRUCacheImpl]
    //#input(Map getStats()): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[others]
    //#input(Map getStats()): org/apache/roller/weblogger/util/cache/Cache.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(Map getStats()): org/apache/roller/weblogger/util/cache/Cache.__Dispatch_Table.getStats()Ljava/util/Map;
    //#input(Map getStats()): org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(Map getStats()): org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl.__Dispatch_Table.getStats()Ljava/util/Map;
    //#input(Map getStats()): org/apache/roller/weblogger/util/cache/LRUCacheImpl.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(Map getStats()): org/apache/roller/weblogger/util/cache/LRUCacheImpl.__Dispatch_Table.getStats()Ljava/util/Map;
    //#output(Map getStats()): new HashMap(getStats#1) num objects
    //#output(Map getStats()): return_value
    //#new obj(Map getStats()): new HashMap(getStats#1)
    //#pre[1] (Map getStats()): caches != null
    //#presumption(Map getStats()): cache.hits@363 + cache.misses@363 != +0
    //#presumption(Map getStats()): java.util.Iterator:next(...).__Tag@363 in {org/apache/roller/weblogger/util/cache/Cache, org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl, org/apache/roller/weblogger/util/cache/LRUCacheImpl}
    //#presumption(Map getStats()): java.util.Iterator:next(...)@363 != null
    //#presumption(Map getStats()): java.util.Map:values(...)@361 != null
    //#post(Map getStats()): return_value == &new HashMap(getStats#1)
    //#post(Map getStats()): new HashMap(getStats#1) num objects == 1
    //#unanalyzed(Map getStats()): Effects-of-calling:java.util.Map:put
    //#unanalyzed(Map getStats()): Effects-of-calling:java.util.HashMap
    //#unanalyzed(Map getStats()): Effects-of-calling:java.lang.Double
    //#test_vector(Map getStats()): java.util.Iterator:hasNext(...)@362: {0}, {1}
        
        Cache cache = null;
    //#CacheManager.java:360: Warning: unused assignment
    //#    unused assignment into cache
    //#    severity: SUPPRESSED
    //#    class: org.apache.roller.weblogger.util.cache.CacheManager
    //#    method: Map getStats()
    //#    Attribs:  Uncertain
        Iterator cachesIT = caches.values().iterator();
        while(cachesIT.hasNext()) {
            cache = (Cache) cachesIT.next();
            
            allStats.put(cache.getId(), cache.getStats());
        }
        
        return allStats;
    //#CacheManager.java:368: end of method: Map org.apache.roller.weblogger.util.cache.CacheManager.getStats()
    }
    
    
    /**
     * Place to do any cleanup tasks for cache system.
     */
    public static void shutdown() {
        // no-op
    }
    //#CacheManager.java:377: method: void org.apache.roller.weblogger.util.cache.CacheManager.shutdown()
    //#CacheManager.java:377: end of method: void org.apache.roller.weblogger.util.cache.CacheManager.shutdown()
    
}
    //#CacheManager.java:: end of class: org.apache.roller.weblogger.util.cache.CacheManager
