//# 0 errors, 164 messages
//#
/*
    //#HitCountQueue.java:1:1: class: org.apache.roller.weblogger.business.HitCountQueue
 * 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.business;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.roller.weblogger.business.runnable.ContinuousWorkerThread;
import org.apache.roller.weblogger.business.runnable.HitCountProcessingJob;
import org.apache.roller.weblogger.business.runnable.WorkerThread;
import org.apache.roller.weblogger.config.WebloggerConfig;
import org.apache.roller.weblogger.pojos.Weblog;


/**
 * Queue's up incoming hit counts so that they can be recorded to the db in
 * an asynchronous manner at give intervals.
 *
 * We also start up a single thread which runs continously to take the queued
 * hit counts, tally them, and record them into the db.
 *
 * TODO: we may want to make this an interface that is pluggable if there is
 *   some indication that users want to override this implementation.
 */
public class HitCountQueue {
    
    private static Log log = LogFactory.getLog(HitCountQueue.class);
    //#HitCountQueue.java:45: method: org.apache.roller.weblogger.business.HitCountQueue.org.apache.roller.weblogger.business.HitCountQueue__static_init
    //#HitCountQueue.java:45: Warning: method not available
    //#    -- call on Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.HitCountQueue
    //#    method: org.apache.roller.weblogger.business.HitCountQueue__static_init
    //#    unanalyzed callee: Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#input(org.apache.roller.weblogger.business.HitCountQueue__static_init): ",defaultValue="._tainted
    //#input(org.apache.roller.weblogger.business.HitCountQueue__static_init): "="._tainted
    //#input(org.apache.roller.weblogger.business.HitCountQueue__static_init): "Fetching property ["._tainted
    //#input(org.apache.roller.weblogger.business.HitCountQueue__static_init): "]"._tainted
    //#input(org.apache.roller.weblogger.business.HitCountQueue__static_init): org/apache/roller/weblogger/config/WebloggerConfig.config
    //#input(org.apache.roller.weblogger.business.HitCountQueue__static_init): org/apache/roller/weblogger/config/WebloggerConfig.log
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): __Descendant_Table[org/apache/roller/weblogger/business/HitCountQueue]
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): __Dispatch_Table.getHits()Ljava/util/List;
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): __Dispatch_Table.processHit(Lorg/apache/roller/weblogger/pojos/Weblog;Ljava/lang/String;Ljava/lang/String;)V
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): __Dispatch_Table.resetHits()V
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): __Dispatch_Table.shutdown()V
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): instance
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): log
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): new ContinuousWorkerThread(HitCountQueue#4) num objects
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): new ContinuousWorkerThread(HitCountQueue#4).__Tag
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): new ContinuousWorkerThread(HitCountQueue#4).id
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): new ContinuousWorkerThread(HitCountQueue#4).job
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): new ContinuousWorkerThread(HitCountQueue#4).sleepTime
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): new HitCountProcessingJob(HitCountQueue#3) num objects
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): new HitCountProcessingJob(HitCountQueue#3).__Tag
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): new HitCountQueue(HitCountQueue__static_init#1) num objects
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): instance.__Tag
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): instance.numWorkers
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): instance.queue
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): instance.sleepTime
    //#output(org.apache.roller.weblogger.business.HitCountQueue__static_init): instance.worker
    //#new obj(org.apache.roller.weblogger.business.HitCountQueue__static_init): new ContinuousWorkerThread(HitCountQueue#4)
    //#new obj(org.apache.roller.weblogger.business.HitCountQueue__static_init): new HitCountProcessingJob(HitCountQueue#3)
    //#new obj(org.apache.roller.weblogger.business.HitCountQueue__static_init): new HitCountQueue(HitCountQueue__static_init#1)
    //#pre[1] (org.apache.roller.weblogger.business.HitCountQueue__static_init): org/apache/roller/weblogger/config/WebloggerConfig.config != null
    //#pre[2] (org.apache.roller.weblogger.business.HitCountQueue__static_init): org/apache/roller/weblogger/config/WebloggerConfig.log != null
    //#presumption(org.apache.roller.weblogger.business.HitCountQueue__static_init): org.apache.commons.logging.LogFactory:getLog(...)@45 != null
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): __Descendant_Table[org/apache/roller/weblogger/business/HitCountQueue] == &__Dispatch_Table
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): __Dispatch_Table.getHits()Ljava/util/List; == &getHits
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): __Dispatch_Table.processHit(Lorg/apache/roller/weblogger/pojos/Weblog;Ljava/lang/String;Ljava/lang/String;)V == &processHit
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): __Dispatch_Table.resetHits()V == &resetHits
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): __Dispatch_Table.shutdown()V == &shutdown
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): instance == &new HitCountQueue(HitCountQueue__static_init#1)
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): (soft) log != null
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): new ContinuousWorkerThread(HitCountQueue#4) num objects == 1
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): new HitCountProcessingJob(HitCountQueue#3) num objects == 1
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): new HitCountQueue(HitCountQueue__static_init#1) num objects == 1
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): instance.numWorkers == 1
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): new ContinuousWorkerThread(HitCountQueue#4).__Tag == org/apache/roller/weblogger/business/runnable/ContinuousWorkerThread
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): new ContinuousWorkerThread(HitCountQueue#4).id == &"HitCountQueueProcessor"
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): new ContinuousWorkerThread(HitCountQueue#4).job == &new HitCountProcessingJob(HitCountQueue#3)
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): new ContinuousWorkerThread(HitCountQueue#4).sleepTime in -2_147_483_000..4_294_967_000
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): instance.sleepTime == new ContinuousWorkerThread(HitCountQueue#4).sleepTime
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): new HitCountProcessingJob(HitCountQueue#3).__Tag == org/apache/roller/weblogger/business/runnable/HitCountProcessingJob
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): instance.__Tag == org/apache/roller/weblogger/business/HitCountQueue
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): init'ed(instance.queue)
    //#post(org.apache.roller.weblogger.business.HitCountQueue__static_init): instance.worker == &new ContinuousWorkerThread(HitCountQueue#4)
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:java.lang.String:trim
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:org.apache.commons.logging.Log:debug
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:java.util.Properties:getProperty
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:org.apache.commons.logging.Log:warn
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:java.util.Collections:synchronizedList
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:org.apache.roller.weblogger.business.runnable.HitCountProcessingJob
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:java.lang.Thread
    //#unanalyzed(org.apache.roller.weblogger.business.HitCountQueue__static_init): Effects-of-calling:org.apache.roller.weblogger.business.runnable.WorkerThread:start
    
    private static HitCountQueue instance = null;
    
    private int numWorkers = 1;
    private int sleepTime = 180000;
    private WorkerThread worker = null;
    private List queue = null;
    
    
    static {
        instance = new HitCountQueue();
    }
    //#HitCountQueue.java:57: end of method: org.apache.roller.weblogger.business.HitCountQueue.org.apache.roller.weblogger.business.HitCountQueue__static_init
    
    
    // non-instantiable because we are a singleton
    private HitCountQueue() {
    //#HitCountQueue.java:61: method: void org.apache.roller.weblogger.business.HitCountQueue.org.apache.roller.weblogger.business.HitCountQueue()
    //#input(void org.apache.roller.weblogger.business.HitCountQueue()): ",defaultValue="._tainted
    //#input(void org.apache.roller.weblogger.business.HitCountQueue()): "180"._tainted
    //#input(void org.apache.roller.weblogger.business.HitCountQueue()): "="._tainted
    //#input(void org.apache.roller.weblogger.business.HitCountQueue()): "Fetching property ["._tainted
    //#input(void org.apache.roller.weblogger.business.HitCountQueue()): "Invalid sleep time ["._tainted
    //#input(void org.apache.roller.weblogger.business.HitCountQueue()): "]"._tainted
    //#input(void org.apache.roller.weblogger.business.HitCountQueue()): "], using default"._tainted
    //#input(void org.apache.roller.weblogger.business.HitCountQueue()): "hitcount.queue.sleepTime"._tainted
    //#input(void org.apache.roller.weblogger.business.HitCountQueue()): log
    //#input(void org.apache.roller.weblogger.business.HitCountQueue()): org/apache/roller/weblogger/config/WebloggerConfig.config
    //#input(void org.apache.roller.weblogger.business.HitCountQueue()): org/apache/roller/weblogger/config/WebloggerConfig.log
    //#input(void org.apache.roller.weblogger.business.HitCountQueue()): this
    //#output(void org.apache.roller.weblogger.business.HitCountQueue()): new ContinuousWorkerThread(HitCountQueue#4) num objects
    //#output(void org.apache.roller.weblogger.business.HitCountQueue()): this.worker.__Tag
    //#output(void org.apache.roller.weblogger.business.HitCountQueue()): this.worker.id
    //#output(void org.apache.roller.weblogger.business.HitCountQueue()): this.worker.job
    //#output(void org.apache.roller.weblogger.business.HitCountQueue()): this.worker.sleepTime
    //#output(void org.apache.roller.weblogger.business.HitCountQueue()): new HitCountProcessingJob(HitCountQueue#3) num objects
    //#output(void org.apache.roller.weblogger.business.HitCountQueue()): this.worker.job.__Tag
    //#output(void org.apache.roller.weblogger.business.HitCountQueue()): this.numWorkers
    //#output(void org.apache.roller.weblogger.business.HitCountQueue()): this.queue
    //#output(void org.apache.roller.weblogger.business.HitCountQueue()): this.sleepTime
    //#output(void org.apache.roller.weblogger.business.HitCountQueue()): this.worker
    //#new obj(void org.apache.roller.weblogger.business.HitCountQueue()): new ContinuousWorkerThread(HitCountQueue#4)
    //#new obj(void org.apache.roller.weblogger.business.HitCountQueue()): new HitCountProcessingJob(HitCountQueue#3)
    //#pre[2] (void org.apache.roller.weblogger.business.HitCountQueue()): org/apache/roller/weblogger/config/WebloggerConfig.config != null
    //#pre[3] (void org.apache.roller.weblogger.business.HitCountQueue()): org/apache/roller/weblogger/config/WebloggerConfig.log != null
    //#pre[1] (void org.apache.roller.weblogger.business.HitCountQueue()): (soft) log != null
    //#presumption(void org.apache.roller.weblogger.business.HitCountQueue()): java.lang.Integer:parseInt(...)@67 in -2_147_483..4_294_967
    //#post(void org.apache.roller.weblogger.business.HitCountQueue()): this.numWorkers == 1
    //#post(void org.apache.roller.weblogger.business.HitCountQueue()): new ContinuousWorkerThread(HitCountQueue#4) num objects == 1
    //#post(void org.apache.roller.weblogger.business.HitCountQueue()): new HitCountProcessingJob(HitCountQueue#3) num objects == 1
    //#post(void org.apache.roller.weblogger.business.HitCountQueue()): init'ed(this.queue)
    //#post(void org.apache.roller.weblogger.business.HitCountQueue()): this.sleepTime in -2_147_483_000..4_294_967_000
    //#post(void org.apache.roller.weblogger.business.HitCountQueue()): this.worker.sleepTime == this.sleepTime
    //#post(void org.apache.roller.weblogger.business.HitCountQueue()): this.worker == &new ContinuousWorkerThread(HitCountQueue#4)
    //#post(void org.apache.roller.weblogger.business.HitCountQueue()): this.worker.__Tag == org/apache/roller/weblogger/business/runnable/ContinuousWorkerThread
    //#post(void org.apache.roller.weblogger.business.HitCountQueue()): this.worker.id == &"HitCountQueueProcessor"
    //#post(void org.apache.roller.weblogger.business.HitCountQueue()): this.worker.job == &new HitCountProcessingJob(HitCountQueue#3)
    //#post(void org.apache.roller.weblogger.business.HitCountQueue()): this.worker.job.__Tag == org/apache/roller/weblogger/business/runnable/HitCountProcessingJob
    //#unanalyzed(void org.apache.roller.weblogger.business.HitCountQueue()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void org.apache.roller.weblogger.business.HitCountQueue()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void org.apache.roller.weblogger.business.HitCountQueue()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void org.apache.roller.weblogger.business.HitCountQueue()): Effects-of-calling:java.lang.String:trim
    //#unanalyzed(void org.apache.roller.weblogger.business.HitCountQueue()): Effects-of-calling:org.apache.commons.logging.Log:debug
    //#unanalyzed(void org.apache.roller.weblogger.business.HitCountQueue()): Effects-of-calling:java.util.Properties:getProperty
    //#unanalyzed(void org.apache.roller.weblogger.business.HitCountQueue()): Effects-of-calling:java.lang.Thread
        
        String sleep = WebloggerConfig.getProperty("hitcount.queue.sleepTime", "180");
        
        try {
            // multiply by 1000 because we expect input in seconds
            this.sleepTime = Integer.parseInt(sleep) * 1000;
        } catch(NumberFormatException nfe) {
            log.warn("Invalid sleep time ["+sleep+"], using default");
    //#HitCountQueue.java:69: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:warn(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.HitCountQueue
    //#    method: void org.apache.roller.weblogger.business.HitCountQueue()
    //#    unanalyzed callee: void org.apache.commons.logging.Log:warn(Object)
        }
        
        // create the hits queue
        this.queue = Collections.synchronizedList(new ArrayList());
        
        // start up a worker to process the hits at intervals
        HitCountProcessingJob job = new HitCountProcessingJob();
        worker = new ContinuousWorkerThread("HitCountQueueProcessor", job, this.sleepTime);
        worker.start();
    //#HitCountQueue.java:78: Warning: method not available
    //#    -- call on void org.apache.roller.weblogger.business.runnable.WorkerThread:start()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.HitCountQueue
    //#    method: void org.apache.roller.weblogger.business.HitCountQueue()
    //#    unanalyzed callee: void org.apache.roller.weblogger.business.runnable.WorkerThread:start()
    }
    //#HitCountQueue.java:79: end of method: void org.apache.roller.weblogger.business.HitCountQueue.org.apache.roller.weblogger.business.HitCountQueue()
    
    
    public static HitCountQueue getInstance() {
        return instance;
    //#HitCountQueue.java:83: method: HitCountQueue org.apache.roller.weblogger.business.HitCountQueue.getInstance()
    //#input(HitCountQueue getInstance()): instance
    //#output(HitCountQueue getInstance()): return_value
    //#pre[1] (HitCountQueue getInstance()): init'ed(instance)
    //#post(HitCountQueue getInstance()): return_value == instance
    //#post(HitCountQueue getInstance()): init'ed(return_value)
    //#HitCountQueue.java:83: end of method: HitCountQueue org.apache.roller.weblogger.business.HitCountQueue.getInstance()
    }
    
    
    public void processHit(Weblog weblog, String url, String referrer) {
        
        // if the weblog isn't null then just drop it's handle in the queue
        // each entry in the queue is a weblog handle and indicates a single hit
        if(weblog != null) {
    //#HitCountQueue.java:91: method: void org.apache.roller.weblogger.business.HitCountQueue.processHit(Weblog, String, String)
    //#input(void processHit(Weblog, String, String)): this
    //#input(void processHit(Weblog, String, String)): this.queue
    //#input(void processHit(Weblog, String, String)): weblog
    //#pre[2] (void processHit(Weblog, String, String)): (soft) this.queue != null
    //#test_vector(void processHit(Weblog, String, String)): weblog: Addr_Set{null}, Inverse{null}
            this.queue.add(weblog.getHandle());
    //#HitCountQueue.java:92: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.pojos.Weblog:getHandle()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.HitCountQueue
    //#    method: void processHit(Weblog, String, String)
    //#    unanalyzed callee: String org.apache.roller.weblogger.pojos.Weblog:getHandle()
        }
    }
    //#HitCountQueue.java:94: end of method: void org.apache.roller.weblogger.business.HitCountQueue.processHit(Weblog, String, String)
    
    
    public List getHits() {
        return new ArrayList(this.queue);
    //#HitCountQueue.java:98: method: List org.apache.roller.weblogger.business.HitCountQueue.getHits()
    //#input(List getHits()): this
    //#input(List getHits()): this.queue
    //#output(List getHits()): new ArrayList(getHits#1) num objects
    //#output(List getHits()): return_value
    //#new obj(List getHits()): new ArrayList(getHits#1)
    //#pre[2] (List getHits()): init'ed(this.queue)
    //#post(List getHits()): return_value == &new ArrayList(getHits#1)
    //#post(List getHits()): new ArrayList(getHits#1) num objects == 1
    //#HitCountQueue.java:98: end of method: List org.apache.roller.weblogger.business.HitCountQueue.getHits()
    }
    
    
    /**
     * Reset the queued hits.
     */
    public synchronized void resetHits() {
        this.queue = Collections.synchronizedList(new ArrayList());
    //#HitCountQueue.java:106: method: void org.apache.roller.weblogger.business.HitCountQueue.resetHits()
    //#input(void resetHits()): this
    //#output(void resetHits()): this.queue
    //#post(void resetHits()): init'ed(this.queue)
    }
    //#HitCountQueue.java:107: end of method: void org.apache.roller.weblogger.business.HitCountQueue.resetHits()
    
    
    /**
     * clean up.
     */
    public void shutdown() {
        
        if(this.worker != null) {
    //#HitCountQueue.java:115: method: void org.apache.roller.weblogger.business.HitCountQueue.shutdown()
    //#input(void shutdown()): "stopping worker "._tainted
    //#input(void shutdown()): log
    //#input(void shutdown()): this
    //#input(void shutdown()): this.worker
    //#pre[3] (void shutdown()): init'ed(this.worker)
    //#pre[1] (void shutdown()): (soft) log != null
    //#test_vector(void shutdown()): this.worker: Addr_Set{null}, Inverse{null}
            log.info("stopping worker "+this.worker.getName());
    //#HitCountQueue.java:116: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.business.runnable.WorkerThread:getName()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.HitCountQueue
    //#    method: void shutdown()
    //#    unanalyzed callee: String org.apache.roller.weblogger.business.runnable.WorkerThread:getName()
    //#HitCountQueue.java:116: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:info(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.HitCountQueue
    //#    method: void shutdown()
    //#    unanalyzed callee: void org.apache.commons.logging.Log:info(Object)
            worker.interrupt();
    //#HitCountQueue.java:117: Warning: method not available
    //#    -- call on void org.apache.roller.weblogger.business.runnable.WorkerThread:interrupt()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.HitCountQueue
    //#    method: void shutdown()
    //#    unanalyzed callee: void org.apache.roller.weblogger.business.runnable.WorkerThread:interrupt()
        }
        
    }
    //#HitCountQueue.java:120: end of method: void org.apache.roller.weblogger.business.HitCountQueue.shutdown()
    
}
    //#HitCountQueue.java:: end of class: org.apache.roller.weblogger.business.HitCountQueue
