//# 1 errors, 247 messages
//#
/*
    //#log.java:1:1: class: net.sourceforge.pebble.logging.Log
    //#log.java:1:1: method: net.sourceforge.pebble.logging.Log.net.sourceforge.pebble.logging.Log__static_init
 * Copyright (c) 2003-2006, Simon Brown
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *
 *   - Neither the name of Pebble nor the names of its contributors may
 *     be used to endorse or promote products derived from this software
 *     without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
package net.sourceforge.pebble.logging;

import net.sourceforge.pebble.domain.Blog;

import java.util.*;

/**
 * Represents a log, containing log entries.
 *
 * @author    Simon Brown
 */
public class Log {

  /** the blog that this instance is associated with */
  protected Blog blog;

  /** the collection of log entries */
  private Collection<LogEntry> logEntries;

  /**
   * Creates a new log associated with the given blog.
   *
   * @param blog          a Blog instance
   * @param entries       a Collection of LogEntry objects
   */
  Log(Blog blog, Collection<LogEntry> entries) {
    //#log.java:57: method: void net.sourceforge.pebble.logging.Log.net.sourceforge.pebble.logging.Log(Blog, Collection)
    //#input(void net.sourceforge.pebble.logging.Log(Blog, Collection)): blog
    //#input(void net.sourceforge.pebble.logging.Log(Blog, Collection)): entries
    //#input(void net.sourceforge.pebble.logging.Log(Blog, Collection)): this
    //#output(void net.sourceforge.pebble.logging.Log(Blog, Collection)): new ArrayList(Log#1) num objects
    //#output(void net.sourceforge.pebble.logging.Log(Blog, Collection)): this.blog
    //#output(void net.sourceforge.pebble.logging.Log(Blog, Collection)): this.logEntries
    //#new obj(void net.sourceforge.pebble.logging.Log(Blog, Collection)): new ArrayList(Log#1)
    //#post(void net.sourceforge.pebble.logging.Log(Blog, Collection)): this.blog == blog
    //#post(void net.sourceforge.pebble.logging.Log(Blog, Collection)): init'ed(this.blog)
    //#post(void net.sourceforge.pebble.logging.Log(Blog, Collection)): this.logEntries == One-of{entries, &new ArrayList(Log#1)}
    //#post(void net.sourceforge.pebble.logging.Log(Blog, Collection)): this.logEntries != null
    //#post(void net.sourceforge.pebble.logging.Log(Blog, Collection)): new ArrayList(Log#1) num objects <= 1
    //#test_vector(void net.sourceforge.pebble.logging.Log(Blog, Collection)): entries: Inverse{null}, Addr_Set{null}
    this.blog = blog;
    this.logEntries = entries;

    if (logEntries == null) {
      logEntries = new ArrayList<LogEntry>();
    }
  }
    //#log.java:64: end of method: void net.sourceforge.pebble.logging.Log.net.sourceforge.pebble.logging.Log(Blog, Collection)

  /**
   * Gets all log entries..
   *
   * @return    a collection of LogEntry instances
   */
  public Collection<LogEntry> getLogEntries() {
    return Collections.unmodifiableCollection(logEntries);
    //#log.java:72: method: Collection net.sourceforge.pebble.logging.Log.getLogEntries()
    //#input(Collection getLogEntries()): this
    //#input(Collection getLogEntries()): this.logEntries
    //#output(Collection getLogEntries()): return_value
    //#pre[2] (Collection getLogEntries()): init'ed(this.logEntries)
    //#post(Collection getLogEntries()): init'ed(return_value)
    //#log.java:72: end of method: Collection net.sourceforge.pebble.logging.Log.getLogEntries()
  }

  /**
   * Gets a list of referers.
   *
   * @return    a Collection of Referer instances
   */
  public Collection<Referer> getReferers() {
    Map<String,Referer> refererMap = new HashMap<String,Referer>();
    //#log.java:81: method: Collection net.sourceforge.pebble.logging.Log.getReferers()
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/CountedUrl.__Descendant_Table[net/sourceforge/pebble/logging/CountedUrl]
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/CountedUrl.__Descendant_Table[net/sourceforge/pebble/logging/Referer]
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/CountedUrl.__Descendant_Table[net/sourceforge/pebble/logging/Request]
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/CountedUrl.__Descendant_Table[others]
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/CountedUrl.__Dispatch_Table.setUrl(Ljava/lang/String;)V
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/LogEntry.__Descendant_Table[net/sourceforge/pebble/logging/LogEntry]
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/LogEntry.__Descendant_Table[others]
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.getReferer()Ljava/lang/String;
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Referer.BING_QUERY_STRING_PATTERN
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Referer.GOOGLE_IMAGES_QUERY_STRING_PATTERN
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Referer.GOOGLE_QUERY_STRING_PATTERN
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Referer.JAVABLOGS_HOT_ENTRIES_PATTERN
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Referer.JAVABLOGS_WELCOME_PATTERN
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Referer.MSN_QUERY_STRING_PATTERN
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Referer.YAHOO_QUERY_STRING_PATTERN
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Referer.__Descendant_Table[net/sourceforge/pebble/logging/Referer]
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Referer.__Descendant_Table[others]
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Referer.__Dispatch_Table.addLogEntry(Lnet/sourceforge/pebble/logging/LogEntry;)V
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Referer.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Referer.__Dispatch_Table.setName(Ljava/lang/String;)V
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Referer.__Dispatch_Table.setUrl(Ljava/lang/String;)V
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Request.AUTHOR_FEED_REGEX
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Request.CATEGORY_FEED_REGEX
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Request.RESPONSES_FEED_REGEX
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Request.TAG_FEED_REGEX
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Request.__Descendant_Table[net/sourceforge/pebble/logging/Request]
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Request.__Descendant_Table[others]
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Request.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Request.__Dispatch_Table.setFileDownload(Z)V
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Request.__Dispatch_Table.setName(Ljava/lang/String;)V
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Request.__Dispatch_Table.setNewsFeed(Z)V
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Request.__Dispatch_Table.setPageView(Z)V
    //#input(Collection getReferers()): net/sourceforge/pebble/logging/Request.__Dispatch_Table.setUrl(Ljava/lang/String;)V
    //#input(Collection getReferers()): net/sourceforge/pebble/permalink/DefaultPermalinkProvider.__Descendant_Table[net/sourceforge/pebble/permalink/DefaultPermalinkProvider]
    //#input(Collection getReferers()): net/sourceforge/pebble/permalink/DefaultPermalinkProvider.__Dispatch_Table.setBlog(Lnet/sourceforge/pebble/domain/Blog;)V
    //#input(Collection getReferers()): this
    //#input(Collection getReferers()): this.logEntries
    //#output(Collection getReferers()): return_value
    //#pre[2] (Collection getReferers()): this.logEntries != null
    //#presumption(Collection getReferers()): java.util.Iterator:next(...).__Tag@82 == net/sourceforge/pebble/logging/LogEntry
    //#presumption(Collection getReferers()): java.util.Iterator:next(...)@82 != null
    //#presumption(Collection getReferers()): java.util.Map:get(...).__Tag@83 == net/sourceforge/pebble/logging/Referer
    //#presumption(Collection getReferers()): logEntry.__Tag@83 == net/sourceforge/pebble/logging/LogEntry
    //#presumption(Collection getReferers()): referer.__Tag@83 == net/sourceforge/pebble/logging/Referer
    //#presumption(Collection getReferers()): referer.logEntries@83 != null
    //#presumption(Collection getReferers()): referer.logEntries@86 != null
    //#post(Collection getReferers()): init'ed(return_value)
    //#unanalyzed(Collection getReferers()): Effects-of-calling:net.sourceforge.pebble.api.permalink.PermalinkProvider:isBlogEntryPermalink
    //#unanalyzed(Collection getReferers()): Effects-of-calling:net.sourceforge.pebble.api.permalink.PermalinkProvider:getBlogEntry
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(Collection getReferers()): Effects-of-calling:net.sourceforge.pebble.domain.BlogEntry:getTitle
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(Collection getReferers()): Effects-of-calling:setName
    //#unanalyzed(Collection getReferers()): Effects-of-calling:setPageView
    //#unanalyzed(Collection getReferers()): Effects-of-calling:net.sourceforge.pebble.api.permalink.PermalinkProvider:isMonthPermalink
    //#unanalyzed(Collection getReferers()): Effects-of-calling:net.sourceforge.pebble.api.permalink.PermalinkProvider:getMonth
    //#unanalyzed(Collection getReferers()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLocale
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.text.SimpleDateFormat
    //#unanalyzed(Collection getReferers()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getTimeZone
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.text.SimpleDateFormat:setTimeZone
    //#unanalyzed(Collection getReferers()): Effects-of-calling:net.sourceforge.pebble.domain.Month:getDate
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.text.SimpleDateFormat:format
    //#unanalyzed(Collection getReferers()): Effects-of-calling:net.sourceforge.pebble.api.permalink.PermalinkProvider:isDayPermalink
    //#unanalyzed(Collection getReferers()): Effects-of-calling:net.sourceforge.pebble.api.permalink.PermalinkProvider:getDay
    //#unanalyzed(Collection getReferers()): Effects-of-calling:net.sourceforge.pebble.domain.Day:getDate
    //#unanalyzed(Collection getReferers()): Effects-of-calling:setUrl
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.util.regex.Pattern:matcher
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.util.regex.Matcher:matches
    //#unanalyzed(Collection getReferers()): Effects-of-calling:setNewsFeed
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(Collection getReferers()): Effects-of-calling:setFileDownload
    //#unanalyzed(Collection getReferers()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getPermalinkProvider
    //#unanalyzed(Collection getReferers()): Effects-of-calling:getName
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.util.regex.Matcher:find
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.util.regex.Matcher:start
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.util.regex.Matcher:end
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.net.URLDecoder:decode
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(Collection getReferers()): Effects-of-calling:java.util.List:add
    //#test_vector(Collection getReferers()): java.util.Iterator:hasNext(...)@82: {1}, {0}
    //#test_vector(Collection getReferers()): java.util.Map:get(...)@83: Inverse{null}, Addr_Set{null}
    for (LogEntry logEntry : logEntries) {
      Referer referer = refererMap.get(logEntry.getReferer());
      if (referer == null) {
        referer = new Referer(logEntry.getReferer());
        refererMap.put(referer.getName(), referer);
    //#log.java:86: ?precondition failure
    //#    net/sourceforge/pebble/logging/CountedUrl.getName: init'ed(this.name)
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.logging.Log
    //#    method: Collection getReferers()
    //#    basic block: bb_3
    //#    assertion: init'ed(this.name)
    //#    callee: String net/sourceforge/pebble/logging/CountedUrl.getName()
    //#    callee assertion: init'ed(this.name)
    //#    callee file: countedurl.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 110
    //#    VN: this.name
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
      }

      referer.addLogEntry(logEntry);
    }
    return refererMap.values();
    //#log.java:91: end of method: Collection net.sourceforge.pebble.logging.Log.getReferers()
  }

  /**
   * Gets a list of referers.
   *
   * @return    a Collection of Request instances
   */
  public Collection<Request> getRequests() {
    Map<String,Request> requestMap = new HashMap<String,Request>();
    //#log.java:100: method: Collection net.sourceforge.pebble.logging.Log.getRequests()
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/CountedUrl.__Descendant_Table[net/sourceforge/pebble/logging/CountedUrl]
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/CountedUrl.__Descendant_Table[net/sourceforge/pebble/logging/Referer]
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/CountedUrl.__Descendant_Table[net/sourceforge/pebble/logging/Request]
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/CountedUrl.__Descendant_Table[others]
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/CountedUrl.__Dispatch_Table.setUrl(Ljava/lang/String;)V
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/LogEntry.__Descendant_Table[net/sourceforge/pebble/logging/LogEntry]
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/LogEntry.__Descendant_Table[others]
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.getRequestUri()Ljava/lang/String;
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Referer.BING_QUERY_STRING_PATTERN
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Referer.GOOGLE_IMAGES_QUERY_STRING_PATTERN
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Referer.GOOGLE_QUERY_STRING_PATTERN
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Referer.JAVABLOGS_HOT_ENTRIES_PATTERN
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Referer.JAVABLOGS_WELCOME_PATTERN
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Referer.MSN_QUERY_STRING_PATTERN
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Referer.YAHOO_QUERY_STRING_PATTERN
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Referer.__Descendant_Table[net/sourceforge/pebble/logging/Referer]
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Referer.__Descendant_Table[others]
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Referer.__Dispatch_Table.setName(Ljava/lang/String;)V
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Referer.__Dispatch_Table.setUrl(Ljava/lang/String;)V
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Request.AUTHOR_FEED_REGEX
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Request.CATEGORY_FEED_REGEX
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Request.RESPONSES_FEED_REGEX
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Request.TAG_FEED_REGEX
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Request.__Descendant_Table[net/sourceforge/pebble/logging/Request]
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Request.__Descendant_Table[others]
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Request.__Dispatch_Table.addLogEntry(Lnet/sourceforge/pebble/logging/LogEntry;)V
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Request.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Request.__Dispatch_Table.setFileDownload(Z)V
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Request.__Dispatch_Table.setName(Ljava/lang/String;)V
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Request.__Dispatch_Table.setNewsFeed(Z)V
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Request.__Dispatch_Table.setPageView(Z)V
    //#input(Collection getRequests()): net/sourceforge/pebble/logging/Request.__Dispatch_Table.setUrl(Ljava/lang/String;)V
    //#input(Collection getRequests()): net/sourceforge/pebble/permalink/DefaultPermalinkProvider.__Descendant_Table[net/sourceforge/pebble/permalink/DefaultPermalinkProvider]
    //#input(Collection getRequests()): net/sourceforge/pebble/permalink/DefaultPermalinkProvider.__Dispatch_Table.setBlog(Lnet/sourceforge/pebble/domain/Blog;)V
    //#input(Collection getRequests()): this
    //#input(Collection getRequests()): this.blog
    //#input(Collection getRequests()): this.logEntries
    //#output(Collection getRequests()): return_value
    //#pre[3] (Collection getRequests()): this.logEntries != null
    //#pre[2] (Collection getRequests()): (soft) init'ed(this.blog)
    //#presumption(Collection getRequests()): java.util.Iterator:next(...).__Tag@101 == net/sourceforge/pebble/logging/LogEntry
    //#presumption(Collection getRequests()): java.util.Iterator:next(...)@101 != null
    //#presumption(Collection getRequests()): java.util.Map:get(...).__Tag@102 == net/sourceforge/pebble/logging/Request
    //#presumption(Collection getRequests()): logEntry.__Tag@102 == net/sourceforge/pebble/logging/LogEntry
    //#presumption(Collection getRequests()): logEntry.request@101 != null
    //#presumption(Collection getRequests()): logEntry.request@102 != null
    //#presumption(Collection getRequests()): logEntry.request@104 != null
    //#presumption(Collection getRequests()): request.__Tag@102 == net/sourceforge/pebble/logging/Request
    //#presumption(Collection getRequests()): request.logEntries@102 != null
    //#presumption(Collection getRequests()): request.logEntries@105 != null
    //#post(Collection getRequests()): init'ed(return_value)
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(Collection getRequests()): Effects-of-calling:net.sourceforge.pebble.logging.CountedUrl
    //#unanalyzed(Collection getRequests()): Effects-of-calling:net.sourceforge.pebble.api.permalink.PermalinkProvider:isBlogEntryPermalink
    //#unanalyzed(Collection getRequests()): Effects-of-calling:net.sourceforge.pebble.api.permalink.PermalinkProvider:getBlogEntry
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(Collection getRequests()): Effects-of-calling:net.sourceforge.pebble.domain.BlogEntry:getTitle
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(Collection getRequests()): Effects-of-calling:setName
    //#unanalyzed(Collection getRequests()): Effects-of-calling:setPageView
    //#unanalyzed(Collection getRequests()): Effects-of-calling:net.sourceforge.pebble.api.permalink.PermalinkProvider:isMonthPermalink
    //#unanalyzed(Collection getRequests()): Effects-of-calling:net.sourceforge.pebble.api.permalink.PermalinkProvider:getMonth
    //#unanalyzed(Collection getRequests()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLocale
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.text.SimpleDateFormat
    //#unanalyzed(Collection getRequests()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getTimeZone
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.text.SimpleDateFormat:setTimeZone
    //#unanalyzed(Collection getRequests()): Effects-of-calling:net.sourceforge.pebble.domain.Month:getDate
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.text.SimpleDateFormat:format
    //#unanalyzed(Collection getRequests()): Effects-of-calling:net.sourceforge.pebble.api.permalink.PermalinkProvider:isDayPermalink
    //#unanalyzed(Collection getRequests()): Effects-of-calling:net.sourceforge.pebble.api.permalink.PermalinkProvider:getDay
    //#unanalyzed(Collection getRequests()): Effects-of-calling:net.sourceforge.pebble.domain.Day:getDate
    //#unanalyzed(Collection getRequests()): Effects-of-calling:setUrl
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.util.regex.Pattern:matcher
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.util.regex.Matcher:matches
    //#unanalyzed(Collection getRequests()): Effects-of-calling:setNewsFeed
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(Collection getRequests()): Effects-of-calling:setFileDownload
    //#unanalyzed(Collection getRequests()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getPermalinkProvider
    //#unanalyzed(Collection getRequests()): Effects-of-calling:getName
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.util.regex.Matcher:find
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.util.regex.Matcher:start
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.util.regex.Matcher:end
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.net.URLDecoder:decode
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(Collection getRequests()): Effects-of-calling:java.util.List:add
    //#test_vector(Collection getRequests()): java.util.Iterator:hasNext(...)@101: {1}, {0}
    //#test_vector(Collection getRequests()): java.util.Map:get(...)@102: Inverse{null}, Addr_Set{null}
    for (LogEntry logEntry : logEntries) {
      Request request = requestMap.get(logEntry.getRequestUri());
      if (request == null) {
        request = new Request(logEntry.getRequestUri(), blog);
        requestMap.put(logEntry.getRequestUri(), request);
      }
      request.addLogEntry(logEntry);
    }
    return requestMap.values();
    //#log.java:109: end of method: Collection net.sourceforge.pebble.logging.Log.getRequests()
  }

  /**
   * Gets the total number of entries.
   *
   * @return  the total number as an int
   */
  public int getTotalLogEntries() {
    return logEntries.size();
    //#log.java:118: method: int net.sourceforge.pebble.logging.Log.getTotalLogEntries()
    //#input(int getTotalLogEntries()): this
    //#input(int getTotalLogEntries()): this.logEntries
    //#output(int getTotalLogEntries()): return_value
    //#pre[2] (int getTotalLogEntries()): this.logEntries != null
    //#post(int getTotalLogEntries()): init'ed(return_value)
    //#log.java:118: end of method: int net.sourceforge.pebble.logging.Log.getTotalLogEntries()
  }

  /**
   * Adds an entry to this log.
   *
   * @param logEntry    a LogEntry instance
   */
  void addLogEntry(LogEntry logEntry) {
    logEntries.add(logEntry);
    //#log.java:127: method: void net.sourceforge.pebble.logging.Log.addLogEntry(LogEntry)
    //#input(void addLogEntry(LogEntry)): logEntry
    //#input(void addLogEntry(LogEntry)): this
    //#input(void addLogEntry(LogEntry)): this.logEntries
    //#pre[3] (void addLogEntry(LogEntry)): this.logEntries != null
  }
    //#log.java:128: end of method: void net.sourceforge.pebble.logging.Log.addLogEntry(LogEntry)

  /**
   * Adds a collection of entries to this log.
   *
   * @param entries   a Collection of LogEntry instances
   */
  void addLogEntries(Collection<LogEntry> entries) {
    logEntries.addAll(entries);
    //#log.java:136: method: void net.sourceforge.pebble.logging.Log.addLogEntries(Collection)
    //#input(void addLogEntries(Collection)): entries
    //#input(void addLogEntries(Collection)): this
    //#input(void addLogEntries(Collection)): this.logEntries
    //#pre[3] (void addLogEntries(Collection)): this.logEntries != null
  }
    //#log.java:137: end of method: void net.sourceforge.pebble.logging.Log.addLogEntries(Collection)

}    //#output(net.sourceforge.pebble.logging.Log__static_init): __Descendant_Table[net/sourceforge/pebble/logging/Log]
    //#output(net.sourceforge.pebble.logging.Log__static_init): __Dispatch_Table.addLogEntries(Ljava/util/Collection;)V
    //#output(net.sourceforge.pebble.logging.Log__static_init): __Dispatch_Table.addLogEntry(Lnet/sourceforge/pebble/logging/LogEntry;)V
    //#output(net.sourceforge.pebble.logging.Log__static_init): __Dispatch_Table.getLogEntries()Ljava/util/Collection;
    //#output(net.sourceforge.pebble.logging.Log__static_init): __Dispatch_Table.getReferers()Ljava/util/Collection;
    //#output(net.sourceforge.pebble.logging.Log__static_init): __Dispatch_Table.getRequests()Ljava/util/Collection;
    //#output(net.sourceforge.pebble.logging.Log__static_init): __Dispatch_Table.getTotalLogEntries()I
    //#post(net.sourceforge.pebble.logging.Log__static_init): __Descendant_Table[net/sourceforge/pebble/logging/Log] == &__Dispatch_Table
    //#post(net.sourceforge.pebble.logging.Log__static_init): __Dispatch_Table.addLogEntries(Ljava/util/Collection;)V == &addLogEntries
    //#post(net.sourceforge.pebble.logging.Log__static_init): __Dispatch_Table.addLogEntry(Lnet/sourceforge/pebble/logging/LogEntry;)V == &addLogEntry
    //#post(net.sourceforge.pebble.logging.Log__static_init): __Dispatch_Table.getLogEntries()Ljava/util/Collection; == &getLogEntries
    //#post(net.sourceforge.pebble.logging.Log__static_init): __Dispatch_Table.getReferers()Ljava/util/Collection; == &getReferers
    //#post(net.sourceforge.pebble.logging.Log__static_init): __Dispatch_Table.getRequests()Ljava/util/Collection; == &getRequests
    //#post(net.sourceforge.pebble.logging.Log__static_init): __Dispatch_Table.getTotalLogEntries()I == &getTotalLogEntries
    //#log.java:: end of method: net.sourceforge.pebble.logging.Log.net.sourceforge.pebble.logging.Log__static_init
    //#log.java:: end of class: net.sourceforge.pebble.logging.Log
