//# 0 errors, 448 messages
//#
/*
    //#abstractlogger.java:1:1: class: net.sourceforge.pebble.logging.AbstractLogger
    //#abstractlogger.java:1:1: method: net.sourceforge.pebble.logging.AbstractLogger.net.sourceforge.pebble.logging.AbstractLogger__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 javax.servlet.http.HttpServletRequest;
import java.util.*;

/**
 * Interface that all loggers implement.
 *
 * @author    Simon Brown
 */
public abstract class AbstractLogger {

  /** the blog that this instance is associated with, and logging for */
  protected Blog blog;

  /**
   * Creates a new log associated with the given blog.
   *
   * @param blog    a Blog instance
   */
  public AbstractLogger(Blog blog) {
    //#abstractlogger.java:54: method: void net.sourceforge.pebble.logging.AbstractLogger.net.sourceforge.pebble.logging.AbstractLogger(Blog)
    //#input(void net.sourceforge.pebble.logging.AbstractLogger(Blog)): blog
    //#input(void net.sourceforge.pebble.logging.AbstractLogger(Blog)): this
    //#output(void net.sourceforge.pebble.logging.AbstractLogger(Blog)): this.blog
    //#post(void net.sourceforge.pebble.logging.AbstractLogger(Blog)): this.blog == blog
    //#post(void net.sourceforge.pebble.logging.AbstractLogger(Blog)): init'ed(this.blog)
    this.blog = blog;
  }
    //#abstractlogger.java:56: end of method: void net.sourceforge.pebble.logging.AbstractLogger.net.sourceforge.pebble.logging.AbstractLogger(Blog)

  /**
   * Logs a HTTP request.
   *
   * @param request   a HttpServletRequest
   */
  public abstract void log(HttpServletRequest request, int status);

  /**
   * Called to start this logger.
   */
  public abstract void start();

  /**
   * Called to stop this logger.
   */
  public abstract void stop();

  /**
   * Gets a copy of the log file for a given year, month and day.
   *
   * @param year    the year to get entries for
   * @param month   the month to get entries for
   * @param day     the day to get entries for
   * @return    a String containing the contents of the requested log file
   */
  public abstract String getLogFile(int year, int month, int day);

  /**
   * Gets a copy of the log file for today.
   *
   * @return    a String containing the contents of the requested log file
   */
  public String getLogFile() {
    Calendar cal = blog.getCalendar();
    //#abstractlogger.java:91: method: String net.sourceforge.pebble.logging.AbstractLogger.getLogFile()
    //#abstractlogger.java:91: Warning: method not available
    //#    -- call on Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: String getLogFile()
    //#    unanalyzed callee: Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    //#abstractlogger.java:91: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: String getLogFile()
    //#    suspicious precondition index: [2]
    //#input(String getLogFile()): __Descendant_Table[net/sourceforge/pebble/logging/AbstractLogger]
    //#input(String getLogFile()): __Descendant_Table[net/sourceforge/pebble/logging/CombinedLogFormatLogger]
    //#input(String getLogFile()): __Descendant_Table[net/sourceforge/pebble/logging/NullLogger]
    //#input(String getLogFile()): __Descendant_Table[others]
    //#input(String getLogFile()): __Dispatch_Table.getLogFile(III)Ljava/lang/String;
    //#input(String getLogFile()): net/sourceforge/pebble/logging/CombinedLogFormatLogger.__Dispatch_Table.getLogFile(III)Ljava/lang/String;
    //#input(String getLogFile()): net/sourceforge/pebble/logging/NullLogger.__Dispatch_Table.getLogFile(III)Ljava/lang/String;
    //#input(String getLogFile()): this
    //#input(String getLogFile()): this.__Tag
    //#input(String getLogFile()): this.blog
    //#output(String getLogFile()): return_value
    //#pre[2] (String getLogFile()): this.__Tag in {net/sourceforge/pebble/logging/AbstractLogger, net/sourceforge/pebble/logging/CombinedLogFormatLogger, net/sourceforge/pebble/logging/NullLogger}
    //#pre[3] (String getLogFile()): this.blog != null
    //#presumption(String getLogFile()): java.util.Calendar:get(...)@92 <= 4_294_967_294
    //#presumption(String getLogFile()): net.sourceforge.pebble.domain.Blog:getCalendar(...)@91 != null
    //#post(String getLogFile()): return_value != null
    //#unanalyzed(String getLogFile()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getCalendar
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.util.Calendar:set
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.util.Calendar:getTime
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.text.SimpleDateFormat:format
    //#unanalyzed(String getLogFile()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLogsDirectory
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.io.File
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.io.File:exists
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.io.FileReader
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.io.BufferedReader:readLine
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.io.BufferedReader:close
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.lang.Exception:printStackTrace
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(String getLogFile()): Effects-of-calling:java.lang.StringBuffer:toString
    return getLogFile(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH));
    //#abstractlogger.java:92: Warning: method not available
    //#    -- call on String getLogFile(int, int, int)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: String getLogFile()
    //#    unanalyzed callee: String getLogFile(int, int, int)
    //#abstractlogger.java:92: end of method: String net.sourceforge.pebble.logging.AbstractLogger.getLogFile()
  }

  /**
   * Gets a copy of the log file for a given year and month.
   *
   * @param year    the year to get entries for
   * @param month   the month to get entries for
   * @return    a String containing the contents of the requested log file
   */
  public String getLogFile(int year, int month) {
    StringBuffer buf = new StringBuffer();
    //#abstractlogger.java:103: method: String net.sourceforge.pebble.logging.AbstractLogger.getLogFile(int, int)
    //#abstractlogger.java:103: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: String getLogFile(int, int)
    //#    suspicious precondition index: [3]
    //#    Attribs:  Soft
    //#input(String getLogFile(int, int)): __Descendant_Table[net/sourceforge/pebble/logging/AbstractLogger]
    //#input(String getLogFile(int, int)): __Descendant_Table[net/sourceforge/pebble/logging/CombinedLogFormatLogger]
    //#input(String getLogFile(int, int)): __Descendant_Table[net/sourceforge/pebble/logging/NullLogger]
    //#input(String getLogFile(int, int)): __Descendant_Table[others]
    //#input(String getLogFile(int, int)): __Dispatch_Table.getLogFile(III)Ljava/lang/String;
    //#input(String getLogFile(int, int)): month
    //#input(String getLogFile(int, int)): net/sourceforge/pebble/logging/CombinedLogFormatLogger.__Dispatch_Table.getLogFile(III)Ljava/lang/String;
    //#input(String getLogFile(int, int)): net/sourceforge/pebble/logging/NullLogger.__Dispatch_Table.getLogFile(III)Ljava/lang/String;
    //#input(String getLogFile(int, int)): this
    //#input(String getLogFile(int, int)): this.__Tag
    //#input(String getLogFile(int, int)): this.blog
    //#input(String getLogFile(int, int)): year
    //#output(String getLogFile(int, int)): return_value
    //#pre[1] (String getLogFile(int, int)): month >= -2_147_483_647
    //#pre[4] (String getLogFile(int, int)): this.blog != null
    //#pre[3] (String getLogFile(int, int)): (soft) this.__Tag in {net/sourceforge/pebble/logging/AbstractLogger, net/sourceforge/pebble/logging/CombinedLogFormatLogger, net/sourceforge/pebble/logging/NullLogger}
    //#presumption(String getLogFile(int, int)): java.util.Calendar:getActualMaximum(...)@107 <= 4_294_967_294
    //#presumption(String getLogFile(int, int)): net.sourceforge.pebble.domain.Blog:getCalendar(...)@104 != null
    //#post(String getLogFile(int, int)): return_value != null
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getCalendar
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.util.Calendar:set
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.util.Calendar:getTime
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.text.SimpleDateFormat:format
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLogsDirectory
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.io.File
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.io.FileReader
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.io.BufferedReader:readLine
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.io.BufferedReader:close
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.lang.Exception:printStackTrace
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(String getLogFile(int, int)): Effects-of-calling:java.lang.StringBuffer:toString
    Calendar cal = blog.getCalendar();
    //#abstractlogger.java:104: Warning: method not available
    //#    -- call on Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: String getLogFile(int, int)
    //#    unanalyzed callee: Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.MONTH, month-1);
    for (int day = 1; day <= cal.getActualMaximum(Calendar.DAY_OF_MONTH); day++) {
      buf.append(getLogFile(year, month, day));
    //#abstractlogger.java:108: Warning: method not available
    //#    -- call on String getLogFile(int, int, int)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: String getLogFile(int, int)
    //#    unanalyzed callee: String getLogFile(int, int, int)
    }

    return buf.toString();
    //#abstractlogger.java:111: end of method: String net.sourceforge.pebble.logging.AbstractLogger.getLogFile(int, int)
  }

  /**
   * Gets the log for a given year, month and day.
   *
   * @param year    the year to get entries for
   * @param month   the month to get entries for
   * @param day     the day to get entries for
   * @return    a Log object
   */
  public abstract Log getLog(int year, int month, int day);

  /**
   * Gets the log for today.
   *
   * @return    a Log object
   */
  public Log getLog() {
    Calendar cal = blog.getCalendar();
    //#abstractlogger.java:130: method: Log net.sourceforge.pebble.logging.AbstractLogger.getLog()
    //#abstractlogger.java:130: Warning: method not available
    //#    -- call on Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: Log getLog()
    //#    unanalyzed callee: Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    //#abstractlogger.java:130: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: Log getLog()
    //#    suspicious precondition index: [2]
    //#input(Log getLog()): __Descendant_Table[net/sourceforge/pebble/logging/AbstractLogger]
    //#input(Log getLog()): __Descendant_Table[net/sourceforge/pebble/logging/CombinedLogFormatLogger]
    //#input(Log getLog()): __Descendant_Table[net/sourceforge/pebble/logging/NullLogger]
    //#input(Log getLog()): __Descendant_Table[others]
    //#input(Log getLog()): __Dispatch_Table.getLog(III)Lnet/sourceforge/pebble/logging/Log;
    //#input(Log getLog()): net/sourceforge/pebble/logging/CombinedFormatLogEntryFormat.__Descendant_Table[net/sourceforge/pebble/logging/CombinedFormatLogEntryFormat]
    //#input(Log getLog()): net/sourceforge/pebble/logging/CombinedFormatLogEntryFormat.__Dispatch_Table.parse(Ljava/lang/String;)Lnet/sourceforge/pebble/logging/LogEntry;
    //#input(Log getLog()): net/sourceforge/pebble/logging/CombinedLogFormatLogger.__Dispatch_Table.getLog(III)Lnet/sourceforge/pebble/logging/Log;
    //#input(Log getLog()): net/sourceforge/pebble/logging/LogEntry.__Descendant_Table[net/sourceforge/pebble/logging/LogEntry]
    //#input(Log getLog()): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setAgent(Ljava/lang/String;)V
    //#input(Log getLog()): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setBytes(J)V
    //#input(Log getLog()): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setDate(Ljava/util/Date;)V
    //#input(Log getLog()): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setHost(Ljava/lang/String;)V
    //#input(Log getLog()): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setReferer(Ljava/lang/String;)V
    //#input(Log getLog()): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setRequest(Ljava/lang/String;)V
    //#input(Log getLog()): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setStatusCode(I)V
    //#input(Log getLog()): net/sourceforge/pebble/logging/NullLogger.__Dispatch_Table.getLog(III)Lnet/sourceforge/pebble/logging/Log;
    //#input(Log getLog()): this
    //#input(Log getLog()): this.__Tag
    //#input(Log getLog()): this.blog
    //#output(Log getLog()): new ArrayList(Log#1) num objects
    //#output(Log getLog()): new ArrayList(getLog#1*) num objects
    //#output(Log getLog()): new ArrayList(getLog#2*) num objects
    //#output(Log getLog()): new Log(getLog#1*) num objects
    //#output(Log getLog()): new Log(getLog#1*).__Tag
    //#output(Log getLog()): new Log(getLog#1*).blog
    //#output(Log getLog()): new Log(getLog#1*).logEntries
    //#output(Log getLog()): new Log(getLog#6*) num objects
    //#output(Log getLog()): new Log(getLog#6*).__Tag
    //#output(Log getLog()): new Log(getLog#6*).blog
    //#output(Log getLog()): new Log(getLog#6*).logEntries
    //#output(Log getLog()): return_value
    //#new obj(Log getLog()): new ArrayList(Log#1)
    //#new obj(Log getLog()): new ArrayList(getLog#1*)
    //#new obj(Log getLog()): new ArrayList(getLog#2*)
    //#new obj(Log getLog()): new Log(getLog#1*)
    //#new obj(Log getLog()): new Log(getLog#6*)
    //#pre[2] (Log getLog()): this.__Tag in {net/sourceforge/pebble/logging/AbstractLogger, net/sourceforge/pebble/logging/CombinedLogFormatLogger, net/sourceforge/pebble/logging/NullLogger}
    //#pre[3] (Log getLog()): this.blog != null
    //#presumption(Log getLog()): java.util.Calendar:get(...)@131 <= 4_294_967_294
    //#presumption(Log getLog()): net.sourceforge.pebble.domain.Blog:getCalendar(...)@130 != null
    //#post(Log getLog()): return_value != null
    //#post(Log getLog()): new ArrayList(Log#1) num objects == 0
    //#post(Log getLog()): new ArrayList(getLog#1*) num objects <= 1
    //#post(Log getLog()): new ArrayList(getLog#2*) num objects <= 1
    //#post(Log getLog()): new Log(getLog#1*) num objects <= 1
    //#post(Log getLog()): new Log(getLog#1*).__Tag == net/sourceforge/pebble/logging/Log
    //#post(Log getLog()): new Log(getLog#1*).blog == this.blog
    //#post(Log getLog()): new Log(getLog#1*).blog != null
    //#post(Log getLog()): new Log(getLog#1*).logEntries != null
    //#post(Log getLog()): new Log(getLog#6*) num objects <= 1
    //#post(Log getLog()): new Log(getLog#6*).__Tag == net/sourceforge/pebble/logging/Log
    //#post(Log getLog()): new Log(getLog#6*).blog == this.blog
    //#post(Log getLog()): new Log(getLog#6*).blog != null
    //#post(Log getLog()): new Log(getLog#6*).logEntries != null
    //#unanalyzed(Log getLog()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(Log getLog()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getCalendar
    //#unanalyzed(Log getLog()): Effects-of-calling:java.util.Calendar:set
    //#unanalyzed(Log getLog()): Effects-of-calling:java.util.Calendar:getTime
    //#unanalyzed(Log getLog()): Effects-of-calling:java.text.SimpleDateFormat:format
    //#unanalyzed(Log getLog()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLogsDirectory
    //#unanalyzed(Log getLog()): Effects-of-calling:java.io.File
    //#unanalyzed(Log getLog()): Effects-of-calling:java.io.File:exists
    //#unanalyzed(Log getLog()): Effects-of-calling:java.io.FileReader
    //#unanalyzed(Log getLog()): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(Log getLog()): Effects-of-calling:java.io.BufferedReader:readLine
    //#unanalyzed(Log getLog()): Effects-of-calling:java.io.BufferedReader:close
    //#unanalyzed(Log getLog()): Effects-of-calling:java.lang.Exception:printStackTrace
    //#unanalyzed(Log getLog()): Effects-of-calling:java.text.SimpleDateFormat
    //#unanalyzed(Log getLog()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getTimeZone
    //#unanalyzed(Log getLog()): Effects-of-calling:java.text.SimpleDateFormat:setTimeZone
    //#unanalyzed(Log getLog()): Effects-of-calling:java.util.Date
    //#unanalyzed(Log getLog()): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(Log getLog()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(Log getLog()): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(Log getLog()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(Log getLog()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(Log getLog()): Effects-of-calling:java.text.SimpleDateFormat:parse
    //#unanalyzed(Log getLog()): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(Log getLog()): Effects-of-calling:java.lang.Long:parseLong
    //#unanalyzed(Log getLog()): Effects-of-calling:java.util.List:add
    return getLog(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH));
    //#abstractlogger.java:131: Warning: method not available
    //#    -- call on Log getLog(int, int, int)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: Log getLog()
    //#    unanalyzed callee: Log getLog(int, int, int)
    //#abstractlogger.java:131: end of method: Log net.sourceforge.pebble.logging.AbstractLogger.getLog()
  }

  /**
   * Gets the log for a given year and month.
   *
   * @param year    the year to get entries for
   * @param month   the month to get entries for
   * @return    a Log object
   */
  public Log getLog(int year, int month) {
    Collection logEntries = new HashSet();
    //#abstractlogger.java:142: method: Log net.sourceforge.pebble.logging.AbstractLogger.getLog(int, int)
    //#abstractlogger.java:142: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: Log getLog(int, int)
    //#    suspicious precondition index: [3]
    //#    Attribs:  Soft
    //#input(Log getLog(int, int)): __Descendant_Table[net/sourceforge/pebble/logging/AbstractLogger]
    //#input(Log getLog(int, int)): __Descendant_Table[net/sourceforge/pebble/logging/CombinedLogFormatLogger]
    //#input(Log getLog(int, int)): __Descendant_Table[net/sourceforge/pebble/logging/NullLogger]
    //#input(Log getLog(int, int)): __Descendant_Table[others]
    //#input(Log getLog(int, int)): __Dispatch_Table.getLog(III)Lnet/sourceforge/pebble/logging/Log;
    //#input(Log getLog(int, int)): month
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/CombinedFormatLogEntryFormat.__Descendant_Table[net/sourceforge/pebble/logging/CombinedFormatLogEntryFormat]
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/CombinedFormatLogEntryFormat.__Dispatch_Table.parse(Ljava/lang/String;)Lnet/sourceforge/pebble/logging/LogEntry;
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/CombinedLogFormatLogger.__Dispatch_Table.getLog(III)Lnet/sourceforge/pebble/logging/Log;
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/Log.__Descendant_Table[net/sourceforge/pebble/logging/Log]
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/Log.__Descendant_Table[others]
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/Log.__Dispatch_Table.getLogEntries()Ljava/util/Collection;
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/LogEntry.__Descendant_Table[net/sourceforge/pebble/logging/LogEntry]
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setAgent(Ljava/lang/String;)V
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setBytes(J)V
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setDate(Ljava/util/Date;)V
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setHost(Ljava/lang/String;)V
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setReferer(Ljava/lang/String;)V
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setRequest(Ljava/lang/String;)V
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/LogEntry.__Dispatch_Table.setStatusCode(I)V
    //#input(Log getLog(int, int)): net/sourceforge/pebble/logging/NullLogger.__Dispatch_Table.getLog(III)Lnet/sourceforge/pebble/logging/Log;
    //#input(Log getLog(int, int)): this
    //#input(Log getLog(int, int)): this.__Tag
    //#input(Log getLog(int, int)): this.blog
    //#input(Log getLog(int, int)): year
    //#output(Log getLog(int, int)): new ArrayList(Log#1) num objects
    //#output(Log getLog(int, int)): new HashSet(getLog#1) num objects
    //#output(Log getLog(int, int)): new Log(getLog#2) num objects
    //#output(Log getLog(int, int)): return_value.__Tag
    //#output(Log getLog(int, int)): return_value.blog
    //#output(Log getLog(int, int)): return_value.logEntries
    //#output(Log getLog(int, int)): return_value
    //#new obj(Log getLog(int, int)): new ArrayList(Log#1)
    //#new obj(Log getLog(int, int)): new HashSet(getLog#1)
    //#new obj(Log getLog(int, int)): new Log(getLog#2)
    //#pre[1] (Log getLog(int, int)): month >= -2_147_483_647
    //#pre[4] (Log getLog(int, int)): this.blog != null
    //#pre[3] (Log getLog(int, int)): (soft) this.__Tag in {net/sourceforge/pebble/logging/AbstractLogger, net/sourceforge/pebble/logging/CombinedLogFormatLogger, net/sourceforge/pebble/logging/NullLogger}
    //#presumption(Log getLog(int, int)): getLog(...).__Tag@147 == net/sourceforge/pebble/logging/Log
    //#presumption(Log getLog(int, int)): java.util.Calendar:getActualMaximum(...)@146 <= 4_294_967_294
    //#presumption(Log getLog(int, int)): net.sourceforge.pebble.domain.Blog:getCalendar(...)@143 != null
    //#post(Log getLog(int, int)): return_value == &new Log(getLog#2)
    //#post(Log getLog(int, int)): init'ed(new ArrayList(Log#1) num objects)
    //#post(Log getLog(int, int)): new HashSet(getLog#1) num objects == 1
    //#post(Log getLog(int, int)): new Log(getLog#2) num objects == 1
    //#post(Log getLog(int, int)): return_value.__Tag == net/sourceforge/pebble/logging/Log
    //#post(Log getLog(int, int)): return_value.blog == this.blog
    //#post(Log getLog(int, int)): return_value.blog != null
    //#post(Log getLog(int, int)): return_value.logEntries == &new HashSet(getLog#1)
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getCalendar
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.util.Calendar:set
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.util.Calendar:getTime
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.text.SimpleDateFormat:format
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLogsDirectory
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.io.File
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.io.FileReader
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.io.BufferedReader:readLine
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.io.BufferedReader:close
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.lang.Exception:printStackTrace
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.text.SimpleDateFormat
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getTimeZone
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.text.SimpleDateFormat:setTimeZone
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.util.Date
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.text.SimpleDateFormat:parse
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.lang.Long:parseLong
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.util.List:add
    //#unanalyzed(Log getLog(int, int)): Effects-of-calling:java.util.Collections:unmodifiableCollection
    Calendar cal = blog.getCalendar();
    //#abstractlogger.java:143: Warning: method not available
    //#    -- call on Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: Log getLog(int, int)
    //#    unanalyzed callee: Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.MONTH, month-1);
    for (int day = 1; day <= cal.getActualMaximum(Calendar.DAY_OF_MONTH); day++) {
      logEntries.addAll(getLog(year, month, day).getLogEntries());
    //#abstractlogger.java:147: Warning: method not available
    //#    -- call on Log getLog(int, int, int)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: Log getLog(int, int)
    //#    unanalyzed callee: Log getLog(int, int, int)
    }

    return new Log(blog, logEntries);
    //#abstractlogger.java:150: end of method: Log net.sourceforge.pebble.logging.AbstractLogger.getLog(int, int)
  }

  /**
   * Gets the log summary information for the given year, month and day.
   *
   * @param year    the year to get entries for
   * @param month   the month to get entries for
   * @param day     the day to get entries for
   * @return    a LogSummary object
   */
  public abstract LogSummary getLogSummary(int year, int month, int day);

  /**
   * Gets the log summary for today.
   *
   * @return    a LogSummary object
   */
  public LogSummary getLogSummary() {
    Calendar cal = blog.getCalendar();
    //#abstractlogger.java:169: method: LogSummary net.sourceforge.pebble.logging.AbstractLogger.getLogSummary()
    //#abstractlogger.java:169: Warning: method not available
    //#    -- call on Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: LogSummary getLogSummary()
    //#    unanalyzed callee: Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    //#abstractlogger.java:169: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: LogSummary getLogSummary()
    //#    suspicious precondition index: [2]
    //#input(LogSummary getLogSummary()): __Descendant_Table[net/sourceforge/pebble/logging/AbstractLogger]
    //#input(LogSummary getLogSummary()): __Descendant_Table[net/sourceforge/pebble/logging/CombinedLogFormatLogger]
    //#input(LogSummary getLogSummary()): __Descendant_Table[net/sourceforge/pebble/logging/NullLogger]
    //#input(LogSummary getLogSummary()): __Descendant_Table[others]
    //#input(LogSummary getLogSummary()): __Dispatch_Table.getLogSummary(III)Lnet/sourceforge/pebble/logging/LogSummary;
    //#input(LogSummary getLogSummary()): net/sourceforge/pebble/logging/CombinedLogFormatLogger.__Dispatch_Table.getLogSummary(III)Lnet/sourceforge/pebble/logging/LogSummary;
    //#input(LogSummary getLogSummary()): net/sourceforge/pebble/logging/NullLogger.__Dispatch_Table.getLogSummary(III)Lnet/sourceforge/pebble/logging/LogSummary;
    //#input(LogSummary getLogSummary()): this
    //#input(LogSummary getLogSummary()): this.__Tag
    //#input(LogSummary getLogSummary()): this.blog
    //#output(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#1*) num objects
    //#output(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#1*).__Tag
    //#output(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#1*).blog
    //#output(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#1*).date
    //#output(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#1*).totalRequests
    //#output(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#4*) num objects
    //#output(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#4*).__Tag
    //#output(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#4*).blog
    //#output(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#4*).date
    //#output(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#4*).totalRequests
    //#output(LogSummary getLogSummary()): return_value
    //#new obj(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#1*)
    //#new obj(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#4*)
    //#pre[2] (LogSummary getLogSummary()): this.__Tag in {net/sourceforge/pebble/logging/AbstractLogger, net/sourceforge/pebble/logging/CombinedLogFormatLogger, net/sourceforge/pebble/logging/NullLogger}
    //#pre[3] (LogSummary getLogSummary()): this.blog != null
    //#presumption(LogSummary getLogSummary()): java.util.Calendar:get(...)@170 <= 4_294_967_294
    //#presumption(LogSummary getLogSummary()): net.sourceforge.pebble.domain.Blog:getCalendar(...)@169 != null
    //#post(LogSummary getLogSummary()): return_value != null
    //#post(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#1*) num objects <= 1
    //#post(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#1*).__Tag == net/sourceforge/pebble/logging/LogSummaryItem
    //#post(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#1*).blog == this.blog
    //#post(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#1*).blog != null
    //#post(LogSummary getLogSummary()): init'ed(new LogSummaryItem(getLogSummary#1*).date)
    //#post(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#1*).totalRequests == 0
    //#post(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#4*) num objects <= 1
    //#post(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#4*).__Tag == net/sourceforge/pebble/logging/LogSummaryItem
    //#post(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#4*).blog == this.blog
    //#post(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#4*).blog != null
    //#post(LogSummary getLogSummary()): init'ed(new LogSummaryItem(getLogSummary#4*).date)
    //#post(LogSummary getLogSummary()): new LogSummaryItem(getLogSummary#4*).totalRequests >= 0
    //#unanalyzed(LogSummary getLogSummary()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getCalendar
    //#unanalyzed(LogSummary getLogSummary()): Effects-of-calling:java.util.Calendar:set
    //#unanalyzed(LogSummary getLogSummary()): Effects-of-calling:java.util.Calendar:getTime
    //#unanalyzed(LogSummary getLogSummary()): Effects-of-calling:java.text.SimpleDateFormat:format
    //#unanalyzed(LogSummary getLogSummary()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLogsDirectory
    //#unanalyzed(LogSummary getLogSummary()): Effects-of-calling:java.io.File
    //#unanalyzed(LogSummary getLogSummary()): Effects-of-calling:java.io.File:exists
    //#unanalyzed(LogSummary getLogSummary()): Effects-of-calling:java.io.FileReader
    //#unanalyzed(LogSummary getLogSummary()): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(LogSummary getLogSummary()): Effects-of-calling:java.io.BufferedReader:readLine
    //#unanalyzed(LogSummary getLogSummary()): Effects-of-calling:java.io.BufferedReader:close
    //#unanalyzed(LogSummary getLogSummary()): Effects-of-calling:java.lang.Exception:printStackTrace
    //#unanalyzed(LogSummary getLogSummary()): Effects-of-calling:net.sourceforge.pebble.logging.LogSummary
    return getLogSummary(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH));
    //#abstractlogger.java:170: Warning: method not available
    //#    -- call on LogSummary getLogSummary(int, int, int)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: LogSummary getLogSummary()
    //#    unanalyzed callee: LogSummary getLogSummary(int, int, int)
    //#abstractlogger.java:170: end of method: LogSummary net.sourceforge.pebble.logging.AbstractLogger.getLogSummary()
  }

  /**
   * Gets the log summary information for the given year and month.
   *
   * @param year  the year to get entries for
   * @param month the month to get entries for
   * @return a LogSummary object
   */
  public LogSummary getLogSummary(int year, int month) {
    Calendar cal = blog.getCalendar();
    //#abstractlogger.java:181: method: LogSummary net.sourceforge.pebble.logging.AbstractLogger.getLogSummary(int, int)
    //#abstractlogger.java:181: Warning: method not available
    //#    -- call on Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: LogSummary getLogSummary(int, int)
    //#    unanalyzed callee: Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    //#abstractlogger.java:181: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: LogSummary getLogSummary(int, int)
    //#    suspicious precondition index: [3]
    //#    Attribs:  Soft
    //#input(LogSummary getLogSummary(int, int)): __Descendant_Table[net/sourceforge/pebble/logging/AbstractLogger]
    //#input(LogSummary getLogSummary(int, int)): __Descendant_Table[net/sourceforge/pebble/logging/CombinedLogFormatLogger]
    //#input(LogSummary getLogSummary(int, int)): __Descendant_Table[net/sourceforge/pebble/logging/NullLogger]
    //#input(LogSummary getLogSummary(int, int)): __Descendant_Table[others]
    //#input(LogSummary getLogSummary(int, int)): __Dispatch_Table.getLogSummary(III)Lnet/sourceforge/pebble/logging/LogSummary;
    //#input(LogSummary getLogSummary(int, int)): month
    //#input(LogSummary getLogSummary(int, int)): net/sourceforge/pebble/logging/CombinedLogFormatLogger.__Dispatch_Table.getLogSummary(III)Lnet/sourceforge/pebble/logging/LogSummary;
    //#input(LogSummary getLogSummary(int, int)): net/sourceforge/pebble/logging/NullLogger.__Dispatch_Table.getLogSummary(III)Lnet/sourceforge/pebble/logging/LogSummary;
    //#input(LogSummary getLogSummary(int, int)): this
    //#input(LogSummary getLogSummary(int, int)): this.__Tag
    //#input(LogSummary getLogSummary(int, int)): this.blog
    //#input(LogSummary getLogSummary(int, int)): year
    //#output(LogSummary getLogSummary(int, int)): new ArrayList(getLogSummary#1) num objects
    //#output(LogSummary getLogSummary(int, int)): new LogSummaryContainer(getLogSummary#2) num objects
    //#output(LogSummary getLogSummary(int, int)): return_value.__Tag
    //#output(LogSummary getLogSummary(int, int)): return_value.blog
    //#output(LogSummary getLogSummary(int, int)): return_value.date
    //#output(LogSummary getLogSummary(int, int)): return_value.logSummaries
    //#output(LogSummary getLogSummary(int, int)): return_value
    //#new obj(LogSummary getLogSummary(int, int)): new ArrayList(getLogSummary#1)
    //#new obj(LogSummary getLogSummary(int, int)): new LogSummaryContainer(getLogSummary#2)
    //#pre[1] (LogSummary getLogSummary(int, int)): month >= -2_147_483_647
    //#pre[4] (LogSummary getLogSummary(int, int)): this.blog != null
    //#pre[3] (LogSummary getLogSummary(int, int)): (soft) this.__Tag in {net/sourceforge/pebble/logging/AbstractLogger, net/sourceforge/pebble/logging/CombinedLogFormatLogger, net/sourceforge/pebble/logging/NullLogger}
    //#presumption(LogSummary getLogSummary(int, int)): java.util.Calendar:getActualMaximum(...)@187 <= 4_294_967_294
    //#presumption(LogSummary getLogSummary(int, int)): net.sourceforge.pebble.domain.Blog:getCalendar(...)@181 != null
    //#post(LogSummary getLogSummary(int, int)): return_value == &new LogSummaryContainer(getLogSummary#2)
    //#post(LogSummary getLogSummary(int, int)): new ArrayList(getLogSummary#1) num objects == 1
    //#post(LogSummary getLogSummary(int, int)): new LogSummaryContainer(getLogSummary#2) num objects == 1
    //#post(LogSummary getLogSummary(int, int)): return_value.__Tag == net/sourceforge/pebble/logging/LogSummaryContainer
    //#post(LogSummary getLogSummary(int, int)): return_value.blog == this.blog
    //#post(LogSummary getLogSummary(int, int)): return_value.blog != null
    //#post(LogSummary getLogSummary(int, int)): init'ed(return_value.date)
    //#post(LogSummary getLogSummary(int, int)): return_value.logSummaries == &new ArrayList(getLogSummary#1)
    //#unanalyzed(LogSummary getLogSummary(int, int)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getCalendar
    //#unanalyzed(LogSummary getLogSummary(int, int)): Effects-of-calling:java.util.Calendar:set
    //#unanalyzed(LogSummary getLogSummary(int, int)): Effects-of-calling:java.util.Calendar:getTime
    //#unanalyzed(LogSummary getLogSummary(int, int)): Effects-of-calling:java.text.SimpleDateFormat:format
    //#unanalyzed(LogSummary getLogSummary(int, int)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLogsDirectory
    //#unanalyzed(LogSummary getLogSummary(int, int)): Effects-of-calling:java.io.File
    //#unanalyzed(LogSummary getLogSummary(int, int)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(LogSummary getLogSummary(int, int)): Effects-of-calling:java.io.FileReader
    //#unanalyzed(LogSummary getLogSummary(int, int)): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(LogSummary getLogSummary(int, int)): Effects-of-calling:java.io.BufferedReader:readLine
    //#unanalyzed(LogSummary getLogSummary(int, int)): Effects-of-calling:java.io.BufferedReader:close
    //#unanalyzed(LogSummary getLogSummary(int, int)): Effects-of-calling:java.lang.Exception:printStackTrace
    //#unanalyzed(LogSummary getLogSummary(int, int)): Effects-of-calling:net.sourceforge.pebble.logging.LogSummary
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.DAY_OF_MONTH, 1);
    cal.set(Calendar.MONTH, month-1);

    List logSummaries = new ArrayList();
    for (int day = 1; day <= cal.getActualMaximum(Calendar.DAY_OF_MONTH); day++) {
      logSummaries.add(getLogSummary(year, month, day));
    //#abstractlogger.java:188: Warning: method not available
    //#    -- call on LogSummary getLogSummary(int, int, int)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: LogSummary getLogSummary(int, int)
    //#    unanalyzed callee: LogSummary getLogSummary(int, int, int)
    }

    return new LogSummaryContainer(blog, cal.getTime(), logSummaries);
    //#abstractlogger.java:191: end of method: LogSummary net.sourceforge.pebble.logging.AbstractLogger.getLogSummary(int, int)
  }

  /**
   * Gets the log summary information for the given year.
   *
   * @param year  the year to get entries for
   * @return a LogSummary object
   */
  public LogSummary getLogSummary(int year) {
    Calendar cal = blog.getCalendar();
    //#abstractlogger.java:201: method: LogSummary net.sourceforge.pebble.logging.AbstractLogger.getLogSummary(int)
    //#abstractlogger.java:201: Warning: method not available
    //#    -- call on Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: LogSummary getLogSummary(int)
    //#    unanalyzed callee: Calendar net.sourceforge.pebble.domain.Blog:getCalendar()
    //#abstractlogger.java:201: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.logging.AbstractLogger
    //#    method: LogSummary getLogSummary(int)
    //#    suspicious precondition index: [2]
    //#    Attribs:  Soft
    //#input(LogSummary getLogSummary(int)): __Descendant_Table[net/sourceforge/pebble/logging/AbstractLogger]
    //#input(LogSummary getLogSummary(int)): __Descendant_Table[net/sourceforge/pebble/logging/CombinedLogFormatLogger]
    //#input(LogSummary getLogSummary(int)): __Descendant_Table[net/sourceforge/pebble/logging/NullLogger]
    //#input(LogSummary getLogSummary(int)): __Descendant_Table[others]
    //#input(LogSummary getLogSummary(int)): __Dispatch_Table.getLogSummary(II)Lnet/sourceforge/pebble/logging/LogSummary;
    //#input(LogSummary getLogSummary(int)): __Dispatch_Table.getLogSummary(III)Lnet/sourceforge/pebble/logging/LogSummary;
    //#input(LogSummary getLogSummary(int)): net/sourceforge/pebble/logging/CombinedLogFormatLogger.__Dispatch_Table.getLogSummary(II)Lnet/sourceforge/pebble/logging/LogSummary;
    //#input(LogSummary getLogSummary(int)): net/sourceforge/pebble/logging/CombinedLogFormatLogger.__Dispatch_Table.getLogSummary(III)Lnet/sourceforge/pebble/logging/LogSummary;
    //#input(LogSummary getLogSummary(int)): net/sourceforge/pebble/logging/NullLogger.__Dispatch_Table.getLogSummary(II)Lnet/sourceforge/pebble/logging/LogSummary;
    //#input(LogSummary getLogSummary(int)): net/sourceforge/pebble/logging/NullLogger.__Dispatch_Table.getLogSummary(III)Lnet/sourceforge/pebble/logging/LogSummary;
    //#input(LogSummary getLogSummary(int)): this
    //#input(LogSummary getLogSummary(int)): this.__Tag
    //#input(LogSummary getLogSummary(int)): this.blog
    //#input(LogSummary getLogSummary(int)): year
    //#output(LogSummary getLogSummary(int)): new ArrayList(getLogSummary#1) num objects
    //#output(LogSummary getLogSummary(int)): new LogSummaryContainer(getLogSummary#2) num objects
    //#output(LogSummary getLogSummary(int)): return_value.__Tag
    //#output(LogSummary getLogSummary(int)): return_value.blog
    //#output(LogSummary getLogSummary(int)): return_value.date
    //#output(LogSummary getLogSummary(int)): return_value.logSummaries
    //#output(LogSummary getLogSummary(int)): return_value
    //#new obj(LogSummary getLogSummary(int)): new ArrayList(getLogSummary#1)
    //#new obj(LogSummary getLogSummary(int)): new LogSummaryContainer(getLogSummary#2)
    //#pre[3] (LogSummary getLogSummary(int)): this.blog != null
    //#pre[2] (LogSummary getLogSummary(int)): (soft) this.__Tag in {net/sourceforge/pebble/logging/AbstractLogger, net/sourceforge/pebble/logging/CombinedLogFormatLogger, net/sourceforge/pebble/logging/NullLogger}
    //#presumption(LogSummary getLogSummary(int)): net.sourceforge.pebble.domain.Blog:getCalendar(...)@201 != null
    //#post(LogSummary getLogSummary(int)): return_value == &new LogSummaryContainer(getLogSummary#2)
    //#post(LogSummary getLogSummary(int)): new ArrayList(getLogSummary#1) num objects == 1
    //#post(LogSummary getLogSummary(int)): new LogSummaryContainer(getLogSummary#2) num objects == 1
    //#post(LogSummary getLogSummary(int)): return_value.__Tag == net/sourceforge/pebble/logging/LogSummaryContainer
    //#post(LogSummary getLogSummary(int)): return_value.blog == this.blog
    //#post(LogSummary getLogSummary(int)): return_value.blog != null
    //#post(LogSummary getLogSummary(int)): init'ed(return_value.date)
    //#post(LogSummary getLogSummary(int)): return_value.logSummaries == &new ArrayList(getLogSummary#1)
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getCalendar
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:java.util.Calendar:set
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:java.util.Calendar:getActualMaximum
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:java.util.Calendar:getTime
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:java.text.SimpleDateFormat:format
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLogsDirectory
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:java.io.File
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:java.io.FileReader
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:java.io.BufferedReader:readLine
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:java.io.BufferedReader:close
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:java.lang.Exception:printStackTrace
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:getLogSummary
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:net.sourceforge.pebble.logging.LogSummary
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(LogSummary getLogSummary(int)): Effects-of-calling:java.util.List:add
    cal.set(Calendar.YEAR, year);

    List logSummaries = new ArrayList();
    for (int month = 1; month <= 12; month++) {
      logSummaries.add(getLogSummary(year, month));
    }

    return new LogSummaryContainer(blog, cal.getTime(), logSummaries);
    //#abstractlogger.java:209: end of method: LogSummary net.sourceforge.pebble.logging.AbstractLogger.getLogSummary(int)
  }

}
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Descendant_Table[net/sourceforge/pebble/logging/AbstractLogger]
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLog()Lnet/sourceforge/pebble/logging/Log;
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLog(II)Lnet/sourceforge/pebble/logging/Log;
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLog(III)Lnet/sourceforge/pebble/logging/Log;
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogFile()Ljava/lang/String;
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogFile(II)Ljava/lang/String;
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogFile(III)Ljava/lang/String;
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogSummary()Lnet/sourceforge/pebble/logging/LogSummary;
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogSummary(I)Lnet/sourceforge/pebble/logging/LogSummary;
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogSummary(II)Lnet/sourceforge/pebble/logging/LogSummary;
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogSummary(III)Lnet/sourceforge/pebble/logging/LogSummary;
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.log(Ljavax/servlet/http/HttpServletRequest;I)V
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.start()V
    //#output(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.stop()V
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Descendant_Table[net/sourceforge/pebble/logging/AbstractLogger] == &__Dispatch_Table
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLog()Lnet/sourceforge/pebble/logging/Log; == &getLog
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLog(II)Lnet/sourceforge/pebble/logging/Log; == &getLog
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLog(III)Lnet/sourceforge/pebble/logging/Log; == &getLog
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogFile()Ljava/lang/String; == &getLogFile
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogFile(II)Ljava/lang/String; == &getLogFile
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogFile(III)Ljava/lang/String; == &getLogFile
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogSummary()Lnet/sourceforge/pebble/logging/LogSummary; == &getLogSummary
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogSummary(I)Lnet/sourceforge/pebble/logging/LogSummary; == &getLogSummary
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogSummary(II)Lnet/sourceforge/pebble/logging/LogSummary; == &getLogSummary
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.getLogSummary(III)Lnet/sourceforge/pebble/logging/LogSummary; == &getLogSummary
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.log(Ljavax/servlet/http/HttpServletRequest;I)V == &log
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.start()V == &start
    //#post(net.sourceforge.pebble.logging.AbstractLogger__static_init): __Dispatch_Table.stop()V == &stop
    //#abstractlogger.java:: end of method: net.sourceforge.pebble.logging.AbstractLogger.net.sourceforge.pebble.logging.AbstractLogger__static_init
    //#abstractlogger.java:: end of class: net.sourceforge.pebble.logging.AbstractLogger
