//# 0 errors, 318 messages
//#
/*
    //#GenericThrottle.java:1:1: class: org.apache.roller.weblogger.util.GenericThrottle$1
    //#GenericThrottle.java:1:1: method: org.apache.roller.weblogger.util.GenericThrottle$1.org.apache.roller.weblogger.util.GenericThrottle$1__static_init
    //#GenericThrottle.java:1:1: class: org.apache.roller.weblogger.util.GenericThrottle$ClientInfo
    //#GenericThrottle.java:1:1: method: org.apache.roller.weblogger.util.GenericThrottle$ClientInfo.org.apache.roller.weblogger.util.GenericThrottle$ClientInfo__static_init
    //#GenericThrottle.java:1:1: class: org.apache.roller.weblogger.util.GenericThrottle
 * Copyright 2004 Sun Microsystems, Inc.
 *
 * Licensed 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.
 *
 */

package org.apache.roller.weblogger.util;

import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.roller.weblogger.util.cache.Cache;
import org.apache.roller.weblogger.util.cache.CacheManager;
import org.apache.roller.weblogger.util.cache.ExpiringCacheEntry;


/**
 * A tool used to provide throttling support.
 *
 * The basic idea is that if the # of hits from a client within a certain
 * interval of time is greater than the threshold value then the client is
 * considered to be abusive.
 */
public class GenericThrottle {
    
    private static Log log = LogFactory.getLog(GenericThrottle.class);
    //#GenericThrottle.java:38: method: org.apache.roller.weblogger.util.GenericThrottle.org.apache.roller.weblogger.util.GenericThrottle__static_init
    //#GenericThrottle.java:38: Warning: method not available
    //#    -- call on Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.GenericThrottle
    //#    method: org.apache.roller.weblogger.util.GenericThrottle__static_init
    //#    unanalyzed callee: Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#output(org.apache.roller.weblogger.util.GenericThrottle__static_init): __Descendant_Table[org/apache/roller/weblogger/util/GenericThrottle]
    //#output(org.apache.roller.weblogger.util.GenericThrottle__static_init): __Dispatch_Table.isAbusive(Ljava/lang/String;)Z
    //#output(org.apache.roller.weblogger.util.GenericThrottle__static_init): __Dispatch_Table.processHit(Ljava/lang/String;)Z
    //#output(org.apache.roller.weblogger.util.GenericThrottle__static_init): log
    //#post(org.apache.roller.weblogger.util.GenericThrottle__static_init): __Descendant_Table[org/apache/roller/weblogger/util/GenericThrottle] == &__Dispatch_Table
    //#post(org.apache.roller.weblogger.util.GenericThrottle__static_init): __Dispatch_Table.isAbusive(Ljava/lang/String;)Z == &isAbusive
    //#post(org.apache.roller.weblogger.util.GenericThrottle__static_init): __Dispatch_Table.processHit(Ljava/lang/String;)Z == &processHit
    //#post(org.apache.roller.weblogger.util.GenericThrottle__static_init): init'ed(log)
    //#GenericThrottle.java:38: end of method: org.apache.roller.weblogger.util.GenericThrottle.org.apache.roller.weblogger.util.GenericThrottle__static_init
    
    // threshold and interval to determine who is abusive
    private int threshold = 1;
    private int interval = 0;
    
    // a cache to maintain the data
    Cache clientHistoryCache = null;
    
    
    public GenericThrottle(int thresh, int inter, int maxEntries) {
    //#GenericThrottle.java:48: method: void org.apache.roller.weblogger.util.GenericThrottle.org.apache.roller.weblogger.util.GenericThrottle(int, int, int)
    //#GenericThrottle.java:48: Warning: suspicious precondition
    //#    the precondition for org/apache/roller/weblogger/util/cache/CacheManager.cacheFactory.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: org.apache.roller.weblogger.util.GenericThrottle
    //#    method: void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)
    //#    suspicious precondition index: [4]
    //#    Attribs:  Soft
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): ""._tainted
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): ", timeout="._tainted
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): "Constructing new cache with props "._tainted
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): "It appears that your factory ["._tainted
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): "Unable to instantiate cache factory ["._tainted
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): "] does not implement the CacheFactory interface"._tainted
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): "] falling back on default"._tainted
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): "new cache constructed. size="._tainted
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): inter
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): maxEntries
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl]
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/LRUCacheImpl]
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/CacheFactory.__Descendant_Table[org/apache/roller/weblogger/util/cache/CacheFactory]
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/CacheFactory.__Descendant_Table[org/apache/roller/weblogger/util/cache/ExpiringLRUCacheFactoryImpl]
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/CacheFactory.__Descendant_Table[org/apache/roller/weblogger/util/cache/LRUCacheFactoryImpl]
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/CacheFactory.__Descendant_Table[others]
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/CacheFactory.__Dispatch_Table.constructCache(Ljava/util/Map;)Lorg/apache/roller/weblogger/util/cache/Cache;
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/CacheManager.cacheFactory
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/CacheManager.cacheFactory.__Tag
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/CacheManager.cacheHandlers
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/CacheManager.caches
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/CacheManager.log
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/ExpiringLRUCacheFactoryImpl.__Dispatch_Table.constructCache(Ljava/util/Map;)Lorg/apache/roller/weblogger/util/cache/Cache;
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/LRUCacheFactoryImpl.__Dispatch_Table.constructCache(Ljava/util/Map;)Lorg/apache/roller/weblogger/util/cache/Cache;
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/LRUCacheImpl.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): this
    //#input(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): thresh
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new Date(LRUCacheImpl#1) num objects
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new ExpiringLRUCacheImpl(constructCache#1*) num objects
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new ExpiringLRUCacheImpl(constructCache#1*).__Tag
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new ExpiringLRUCacheImpl(constructCache#1*).cache
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new ExpiringLRUCacheImpl(constructCache#1*).hits
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new ExpiringLRUCacheImpl(constructCache#1*).id
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new ExpiringLRUCacheImpl(constructCache#1*).misses
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new ExpiringLRUCacheImpl(constructCache#1*).puts
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new ExpiringLRUCacheImpl(constructCache#1*).removes
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new ExpiringLRUCacheImpl(constructCache#1*).startTime
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new ExpiringLRUCacheImpl(constructCache#1*).timeout
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new LRUCacheImpl(constructCache#1*) num objects
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new LRUCacheImpl(constructCache#1*).__Tag
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new LRUCacheImpl(constructCache#1*).cache
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new LRUCacheImpl(constructCache#1*).hits
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new LRUCacheImpl(constructCache#1*).id
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new LRUCacheImpl(constructCache#1*).misses
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new LRUCacheImpl(constructCache#1*).puts
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new LRUCacheImpl(constructCache#1*).removes
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new LRUCacheImpl(constructCache#1*).startTime
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): this.clientHistoryCache
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): this.interval
    //#output(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): this.threshold
    //#new obj(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new Date(LRUCacheImpl#1)
    //#new obj(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new ExpiringLRUCacheImpl(constructCache#1*)
    //#new obj(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): new LRUCacheImpl(constructCache#1*)
    //#pre[6] (void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/CacheManager.caches != null
    //#pre[7] (void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): org/apache/roller/weblogger/util/cache/CacheManager.log != null
    //#pre[3] (void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): (soft) org/apache/roller/weblogger/util/cache/CacheManager.cacheFactory != null
    //#pre[4] (void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): (soft) org/apache/roller/weblogger/util/cache/CacheManager.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[5] (void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): (soft) org/apache/roller/weblogger/util/cache/CacheManager.cacheHandlers != null
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): this.clientHistoryCache != null
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): this.interval == One-of{0, inter}
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): this.interval >= 0
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): this.threshold == One-of{1, thresh}
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): this.threshold >= 0
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): init'ed(new Date(LRUCacheImpl#1) num objects)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): init'ed(new ExpiringLRUCacheImpl(constructCache#1*) num objects)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).__Tag)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).cache)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).hits)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).id)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).misses)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).puts)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).removes)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).startTime)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new ExpiringLRUCacheImpl(constructCache#1*).timeout)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): init'ed(new LRUCacheImpl(constructCache#1*) num objects)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new LRUCacheImpl(constructCache#1*).__Tag)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new LRUCacheImpl(constructCache#1*).cache)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new LRUCacheImpl(constructCache#1*).hits)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new LRUCacheImpl(constructCache#1*).id)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new LRUCacheImpl(constructCache#1*).misses)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new LRUCacheImpl(constructCache#1*).puts)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new LRUCacheImpl(constructCache#1*).removes)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): possibly_updated(new LRUCacheImpl(constructCache#1*).startTime)
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.lang.Class:forName
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.lang.Class:newInstance
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:org.apache.commons.logging.Log:error
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.util.Set:add
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:org.apache.commons.logging.Log:debug
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.util.Date
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.util.LinkedHashMap
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.util.Collections:synchronizedMap
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:org.apache.roller.weblogger.util.cache.LRUCacheImpl
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.lang.Long:parseLong
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:constructCache
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): Effects-of-calling:java.util.Map:put
    //#test_vector(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): inter: {-2_147_483_648..0}, {1..4_294_967_295}
    //#test_vector(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): maxEntries: {0..4_294_967_295}, {-2_147_483_648..-1}
    //#test_vector(void org.apache.roller.weblogger.util.GenericThrottle(int, int, int)): thresh: {-2_147_483_648..-1}, {0..4_294_967_295}
        
        // threshold can't be negative, that would mean everyone is abusive
        if(thresh > -1) {
            this.threshold = thresh;
        }
        
        // interval must be a positive value
        if(inter > 0) {
            this.interval = inter;
        }
        
        // max entries must be a positive value
        if(maxEntries < 0) {
            maxEntries = 1;
        }
        
        // cache props
        Map cacheProps = new HashMap();
        cacheProps.put("id", "throttle");
        cacheProps.put("size", ""+maxEntries);
        cacheProps.put("timeout", ""+this.interval);
        
        // get cache instance.  handler is null cuz we don't want to register it
        this.clientHistoryCache = CacheManager.constructCache(null, cacheProps);
    }
    //#GenericThrottle.java:73: end of method: void org.apache.roller.weblogger.util.GenericThrottle.org.apache.roller.weblogger.util.GenericThrottle(int, int, int)
    
    
    /**
     * Process a new hit from the client.
     *
     * Each call to this method increments the hit count for the client and
     * then returns a boolean value indicating if the hit has pushed the client
     * over the threshold.
     *
     * @retuns true if client is abusive, false otherwise
     */
    public boolean processHit(String clientId) {
        
        if(clientId == null) {
    //#GenericThrottle.java:87: method: bool org.apache.roller.weblogger.util.GenericThrottle.processHit(String)
    //#GenericThrottle.java:87: Warning: suspicious precondition
    //#    the precondition for this.clientHistoryCache.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: org.apache.roller.weblogger.util.GenericThrottle
    //#    method: bool processHit(String)
    //#    suspicious precondition index: [11]
    //#    Attribs:  Soft
    //#input(bool processHit(String)): " - "._tainted
    //#input(bool processHit(String)): " hits since "._tainted
    //#input(bool processHit(String)): "EXPIRED "._tainted
    //#input(bool processHit(String)): "EXPIRED ["._tainted
    //#input(bool processHit(String)): "HIT "._tainted
    //#input(bool processHit(String)): "NEW "._tainted
    //#input(bool processHit(String)): "STATUS "._tainted
    //#input(bool processHit(String)): "]"._tainted
    //#input(bool processHit(String)): clientId
    //#input(bool processHit(String)): clientId._tainted
    //#input(bool processHit(String)): log
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/GenericThrottle$ClientInfo.__Descendant_Table[org/apache/roller/weblogger/util/GenericThrottle$ClientInfo]
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/GenericThrottle$ClientInfo.__Descendant_Table[others]
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/Cache]
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl]
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/LRUCacheImpl]
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[others]
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/Cache.__Dispatch_Table.get(Ljava/lang/String;)Ljava/lang/Object;
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/Cache.__Dispatch_Table.put(Ljava/lang/String;Ljava/lang/Object;)V
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/Cache.__Dispatch_Table.remove(Ljava/lang/String;)V
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/ExpiringCacheEntry.__Descendant_Table[org/apache/roller/weblogger/util/cache/ExpiringCacheEntry]
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/ExpiringCacheEntry.__Descendant_Table[others]
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/ExpiringCacheEntry.__Dispatch_Table.getValue()Ljava/lang/Object;
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/ExpiringCacheEntry.__Dispatch_Table.hasExpired()Z
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl.__Dispatch_Table.get(Ljava/lang/String;)Ljava/lang/Object;
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl.__Dispatch_Table.put(Ljava/lang/String;Ljava/lang/Object;)V
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl.__Dispatch_Table.remove(Ljava/lang/String;)V
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/LRUCacheImpl.__Dispatch_Table.get(Ljava/lang/String;)Ljava/lang/Object;
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/LRUCacheImpl.__Dispatch_Table.put(Ljava/lang/String;Ljava/lang/Object;)V
    //#input(bool processHit(String)): org/apache/roller/weblogger/util/cache/LRUCacheImpl.__Dispatch_Table.remove(Ljava/lang/String;)V
    //#input(bool processHit(String)): this
    //#input(bool processHit(String)): this.clientHistoryCache
    //#input(bool processHit(String)): this.clientHistoryCache.__Tag
    //#input(bool processHit(String)): this.clientHistoryCache.cache
    //#input(bool processHit(String)): this.clientHistoryCache.hits
    //#input(bool processHit(String)): this.clientHistoryCache.misses
    //#input(bool processHit(String)): this.clientHistoryCache.puts
    //#input(bool processHit(String)): this.interval
    //#input(bool processHit(String)): this.threshold
    //#output(bool processHit(String)): return_value
    //#output(bool processHit(String)): this.clientHistoryCache.hits
    //#output(bool processHit(String)): this.clientHistoryCache.misses
    //#output(bool processHit(String)): this.clientHistoryCache.puts
    //#output(bool processHit(String)): this.clientHistoryCache.removes
    //#pre[3] (bool processHit(String)): (soft) log != null
    //#pre[4] (bool processHit(String)): (soft) init'ed(this.clientHistoryCache.hits)
    //#pre[5] (bool processHit(String)): (soft) init'ed(this.clientHistoryCache.misses)
    //#pre[6] (bool processHit(String)): (soft) init'ed(this.clientHistoryCache.puts)
    //#pre[10] (bool processHit(String)): (soft) this.clientHistoryCache != null
    //#pre[11] (bool processHit(String)): (soft) this.clientHistoryCache.__Tag in {org/apache/roller/weblogger/util/cache/Cache, org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl, org/apache/roller/weblogger/util/cache/LRUCacheImpl}
    //#pre[12] (bool processHit(String)): (soft) this.clientHistoryCache.cache != null
    //#pre[14] (bool processHit(String)): (soft) init'ed(this.interval)
    //#pre[15] (bool processHit(String)): (soft) init'ed(this.threshold)
    //#presumption(bool processHit(String)): client.hits@93 <= 4_294_967_294
    //#presumption(bool processHit(String)): get(...).__Tag@93 == org/apache/roller/weblogger/util/cache/ExpiringCacheEntry
    //#presumption(bool processHit(String)): getValue(...).__Tag@96 == org/apache/roller/weblogger/util/GenericThrottle$ClientInfo
    //#post(bool processHit(String)): init'ed(return_value)
    //#post(bool processHit(String)): this.clientHistoryCache.hits == One-of{old this.clientHistoryCache.hits, old this.clientHistoryCache.hits + 1, One-of{old this.clientHistoryCache.hits, old this.clientHistoryCache.hits + 1} - 1}
    //#post(bool processHit(String)): (soft) init'ed(this.clientHistoryCache.hits)
    //#post(bool processHit(String)): this.clientHistoryCache.misses == One-of{old this.clientHistoryCache.misses, old this.clientHistoryCache.misses + 1}
    //#post(bool processHit(String)): (soft) init'ed(this.clientHistoryCache.misses)
    //#post(bool processHit(String)): this.clientHistoryCache.puts == One-of{old this.clientHistoryCache.puts, old this.clientHistoryCache.puts + 1}
    //#post(bool processHit(String)): (soft) init'ed(this.clientHistoryCache.puts)
    //#post(bool processHit(String)): this.clientHistoryCache.removes == One-of{old this.clientHistoryCache.removes, old this.clientHistoryCache.removes + 1, One-of{old this.clientHistoryCache.removes, old this.clientHistoryCache.removes + 1} + 1}
    //#unanalyzed(bool processHit(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool processHit(String)): Effects-of-calling:get
    //#unanalyzed(bool processHit(String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#unanalyzed(bool processHit(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool processHit(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool processHit(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool processHit(String)): Effects-of-calling:org.apache.commons.logging.Log:debug
    //#unanalyzed(bool processHit(String)): Effects-of-calling:remove
    //#unanalyzed(bool processHit(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(bool processHit(String)): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(bool processHit(String)): Effects-of-calling:java.util.Date
    //#unanalyzed(bool processHit(String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(bool processHit(String)): Effects-of-calling:put
    //#test_vector(bool processHit(String)): clientId: Inverse{null}, Addr_Set{null}
            return false;
        }
        
        // see if we have any info about this client yet
        ClientInfo client = null;
        ExpiringCacheEntry cacheEntry = (ExpiringCacheEntry) this.clientHistoryCache.get(clientId);
        if(cacheEntry != null) {
            log.debug("HIT "+clientId);
    //#GenericThrottle.java:95: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.GenericThrottle
    //#    method: bool processHit(String)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
            client = (ClientInfo) cacheEntry.getValue();
            
            // this means entry had expired
            if(client == null) {
                log.debug("EXPIRED "+clientId);
    //#GenericThrottle.java:100: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.GenericThrottle
    //#    method: bool processHit(String)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
                this.clientHistoryCache.remove(clientId);
            }
        }
        
        // if we already know this client then update their hit count and 
        // see if they have surpassed the threshold
        if(client != null) {
            client.hits++;
            
            log.debug("STATUS "+clientId+" - "+client.hits+" hits since "+client.start);
    //#GenericThrottle.java:110: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.GenericThrottle
    //#    method: bool processHit(String)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
            
            // abusive client
            if(client.hits > this.threshold) {
                return true;
            }
            
        } else {
            log.debug("NEW "+clientId);
    //#GenericThrottle.java:118: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.GenericThrottle
    //#    method: bool processHit(String)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
            
            // first timer
            ClientInfo newClient = new ClientInfo();
            newClient.hits = 1;
            newClient.id = clientId;
            
            ExpiringCacheEntry newEntry = new ExpiringCacheEntry(newClient, this.interval);
            this.clientHistoryCache.put(clientId, newEntry);
        }
        
        return false;
    //#GenericThrottle.java:129: end of method: bool org.apache.roller.weblogger.util.GenericThrottle.processHit(String)
    }
    
    
    /**
     * Check the current status of a client.
     *
     * A client is considered abusive if the number of hits from the client
     * within the configured interval is greater than the set threshold.
     *
     * @returns true if client is abusive, false otherwise.
     */
    public boolean isAbusive(String clientId) {
        
        if(clientId == null) {
    //#GenericThrottle.java:143: method: bool org.apache.roller.weblogger.util.GenericThrottle.isAbusive(String)
    //#GenericThrottle.java:143: Warning: suspicious precondition
    //#    the precondition for this.clientHistoryCache.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: org.apache.roller.weblogger.util.GenericThrottle
    //#    method: bool isAbusive(String)
    //#    suspicious precondition index: [10]
    //#    Attribs:  Soft
    //#input(bool isAbusive(String)): "EXPIRED "._tainted
    //#input(bool isAbusive(String)): "EXPIRED ["._tainted
    //#input(bool isAbusive(String)): "HIT "._tainted
    //#input(bool isAbusive(String)): "]"._tainted
    //#input(bool isAbusive(String)): clientId
    //#input(bool isAbusive(String)): clientId._tainted
    //#input(bool isAbusive(String)): log
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/GenericThrottle$ClientInfo.__Descendant_Table[org/apache/roller/weblogger/util/GenericThrottle$ClientInfo]
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/GenericThrottle$ClientInfo.__Descendant_Table[others]
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/Cache]
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl]
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[org/apache/roller/weblogger/util/cache/LRUCacheImpl]
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/Cache.__Descendant_Table[others]
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/Cache.__Dispatch_Table.get(Ljava/lang/String;)Ljava/lang/Object;
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/Cache.__Dispatch_Table.remove(Ljava/lang/String;)V
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/ExpiringCacheEntry.__Descendant_Table[org/apache/roller/weblogger/util/cache/ExpiringCacheEntry]
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/ExpiringCacheEntry.__Descendant_Table[others]
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/ExpiringCacheEntry.__Dispatch_Table.getValue()Ljava/lang/Object;
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/ExpiringCacheEntry.__Dispatch_Table.hasExpired()Z
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl.__Dispatch_Table.get(Ljava/lang/String;)Ljava/lang/Object;
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl.__Dispatch_Table.remove(Ljava/lang/String;)V
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/LRUCacheImpl.__Dispatch_Table.get(Ljava/lang/String;)Ljava/lang/Object;
    //#input(bool isAbusive(String)): org/apache/roller/weblogger/util/cache/LRUCacheImpl.__Dispatch_Table.remove(Ljava/lang/String;)V
    //#input(bool isAbusive(String)): this
    //#input(bool isAbusive(String)): this.clientHistoryCache
    //#input(bool isAbusive(String)): this.clientHistoryCache.__Tag
    //#input(bool isAbusive(String)): this.clientHistoryCache.cache
    //#input(bool isAbusive(String)): this.clientHistoryCache.hits
    //#input(bool isAbusive(String)): this.clientHistoryCache.misses
    //#input(bool isAbusive(String)): this.threshold
    //#output(bool isAbusive(String)): return_value
    //#output(bool isAbusive(String)): this.clientHistoryCache.hits
    //#output(bool isAbusive(String)): this.clientHistoryCache.misses
    //#output(bool isAbusive(String)): this.clientHistoryCache.removes
    //#pre[3] (bool isAbusive(String)): (soft) log != null
    //#pre[4] (bool isAbusive(String)): (soft) init'ed(this.clientHistoryCache.hits)
    //#pre[5] (bool isAbusive(String)): (soft) init'ed(this.clientHistoryCache.misses)
    //#pre[9] (bool isAbusive(String)): (soft) this.clientHistoryCache != null
    //#pre[10] (bool isAbusive(String)): (soft) this.clientHistoryCache.__Tag in {org/apache/roller/weblogger/util/cache/Cache, org/apache/roller/weblogger/util/cache/ExpiringLRUCacheImpl, org/apache/roller/weblogger/util/cache/LRUCacheImpl}
    //#pre[11] (bool isAbusive(String)): (soft) this.clientHistoryCache.cache != null
    //#pre[12] (bool isAbusive(String)): (soft) init'ed(this.threshold)
    //#presumption(bool isAbusive(String)): get(...).__Tag@149 == org/apache/roller/weblogger/util/cache/ExpiringCacheEntry
    //#presumption(bool isAbusive(String)): getValue(...).__Tag@152 == org/apache/roller/weblogger/util/GenericThrottle$ClientInfo
    //#presumption(bool isAbusive(String)): java.util.Map:get(...)@82.__Tag == org/apache/roller/weblogger/util/cache/ExpiringCacheEntry
    //#post(bool isAbusive(String)): init'ed(return_value)
    //#post(bool isAbusive(String)): this.clientHistoryCache.hits == One-of{old this.clientHistoryCache.hits, old this.clientHistoryCache.hits + 1, One-of{old this.clientHistoryCache.hits, old this.clientHistoryCache.hits + 1} - 1}
    //#post(bool isAbusive(String)): (soft) init'ed(this.clientHistoryCache.hits)
    //#post(bool isAbusive(String)): this.clientHistoryCache.misses == One-of{old this.clientHistoryCache.misses, old this.clientHistoryCache.misses + 1}
    //#post(bool isAbusive(String)): (soft) init'ed(this.clientHistoryCache.misses)
    //#post(bool isAbusive(String)): this.clientHistoryCache.removes == One-of{old this.clientHistoryCache.removes, old this.clientHistoryCache.removes + 1, One-of{old this.clientHistoryCache.removes, old this.clientHistoryCache.removes + 1} + 1}
    //#unanalyzed(bool isAbusive(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool isAbusive(String)): Effects-of-calling:get
    //#unanalyzed(bool isAbusive(String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#unanalyzed(bool isAbusive(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool isAbusive(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool isAbusive(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool isAbusive(String)): Effects-of-calling:org.apache.commons.logging.Log:debug
    //#unanalyzed(bool isAbusive(String)): Effects-of-calling:remove
    //#unanalyzed(bool isAbusive(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(bool isAbusive(String)): Effects-of-calling:java.util.Map:remove
    //#test_vector(bool isAbusive(String)): clientId: Inverse{null}, Addr_Set{null}
            return false;
        }
        
        // see if we have any info about this client
        ClientInfo client = null;
        ExpiringCacheEntry cacheEntry = (ExpiringCacheEntry) this.clientHistoryCache.get(clientId);
        if(cacheEntry != null) {
            log.debug("HIT "+clientId);
    //#GenericThrottle.java:151: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.GenericThrottle
    //#    method: bool isAbusive(String)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
            client = (ClientInfo) cacheEntry.getValue();
            
            // this means entry had expired
            if(client == null) {
                log.debug("EXPIRED "+clientId);
    //#GenericThrottle.java:156: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.util.GenericThrottle
    //#    method: bool isAbusive(String)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
                this.clientHistoryCache.remove(clientId);
            }
        }
        
        if(client != null) {
            return (client.hits > this.threshold);
        } else {
            return false;
    //#GenericThrottle.java:164: end of method: bool org.apache.roller.weblogger.util.GenericThrottle.isAbusive(String)
        }
    }
    
    
    // just something to keep a few properties in
    private class ClientInfo {
    //#GenericThrottle.java:170: method: void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo.org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)
    //#input(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): Param_1
    //#input(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): this
    //#output(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): new Date(GenericThrottle$ClientInfo#1) num objects
    //#output(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): this.hits
    //#output(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): this.id
    //#output(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): this.start
    //#output(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): this.this$0
    //#new obj(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): new Date(GenericThrottle$ClientInfo#1)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): this.hits == 0
    //#post(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): this.id == null
    //#post(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): this.start == &new Date(GenericThrottle$ClientInfo#1)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): this.this$0 == Param_1
    //#post(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): init'ed(this.this$0)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)): new Date(GenericThrottle$ClientInfo#1) num objects == 1
    //#GenericThrottle.java:170: method: void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo.org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)
    //#input(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): this
    //#input(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): x0
    //#output(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): new Date(GenericThrottle$ClientInfo#1) num objects
    //#output(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): this.hits
    //#output(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): this.id
    //#output(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): this.start
    //#output(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): this.this$0
    //#new obj(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): new Date(GenericThrottle$ClientInfo#1)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): this.hits == 0
    //#post(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): this.id == null
    //#post(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): this.start == &new Date(GenericThrottle$ClientInfo#1)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): this.this$0 == x0
    //#post(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): init'ed(this.this$0)
    //#post(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): new Date(GenericThrottle$ClientInfo#1) num objects == 1
    //#unanalyzed(void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)): Effects-of-calling:java.util.Date
    //#GenericThrottle.java:170: end of method: void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo.org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle, GenericThrottle$1)
        
        public String id = null;
        public int hits = 0;
        public java.util.Date start = new java.util.Date();
    //#GenericThrottle.java:174: end of method: void org.apache.roller.weblogger.util.GenericThrottle$ClientInfo.org.apache.roller.weblogger.util.GenericThrottle$ClientInfo(GenericThrottle)
        
    }
    
}
    //#output(org.apache.roller.weblogger.util.GenericThrottle$1__static_init): __Descendant_Table[org/apache/roller/weblogger/util/GenericThrottle$1]
    //#post(org.apache.roller.weblogger.util.GenericThrottle$1__static_init): __Descendant_Table[org/apache/roller/weblogger/util/GenericThrottle$1] == &__Dispatch_Table
    //#GenericThrottle.java:: end of method: org.apache.roller.weblogger.util.GenericThrottle$1.org.apache.roller.weblogger.util.GenericThrottle$1__static_init
    //#GenericThrottle.java:: end of class: org.apache.roller.weblogger.util.GenericThrottle$1
    //#output(org.apache.roller.weblogger.util.GenericThrottle$ClientInfo__static_init): __Descendant_Table[org/apache/roller/weblogger/util/GenericThrottle$ClientInfo]
    //#post(org.apache.roller.weblogger.util.GenericThrottle$ClientInfo__static_init): __Descendant_Table[org/apache/roller/weblogger/util/GenericThrottle$ClientInfo] == &__Dispatch_Table
    //#GenericThrottle.java:: end of method: org.apache.roller.weblogger.util.GenericThrottle$ClientInfo.org.apache.roller.weblogger.util.GenericThrottle$ClientInfo__static_init
    //#GenericThrottle.java:: end of class: org.apache.roller.weblogger.util.GenericThrottle$ClientInfo
    //#GenericThrottle.java:: end of class: org.apache.roller.weblogger.util.GenericThrottle
