//# 0 errors, 768 messages
//#
/*
    //#abstractblog.java:1:1: class: net.sourceforge.pebble.domain.AbstractBlog
 * 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.domain;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;

import net.sourceforge.pebble.PebbleContext;

import javax.servlet.http.HttpServletRequest;

public abstract class AbstractBlog extends TimePeriod {

  /** the name of the file containing blog properties */
  public static final String BLOG_PROPERTIES_FILE = "blog.properties";

  private static final int MAXIMUM_MESSAGES = 20;

  /** the log used by this class */
  private static Log log = LogFactory.getLog(AbstractBlog.class);
    //#abstractblog.java:55: method: net.sourceforge.pebble.domain.AbstractBlog.net.sourceforge.pebble.domain.AbstractBlog__static_init
    //#abstractblog.java:55: Warning: method not available
    //#    -- call on Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: net.sourceforge.pebble.domain.AbstractBlog__static_init
    //#    unanalyzed callee: Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.clearMessages()V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.error(Ljava/lang/String;)V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getAuthor()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getBlog()Lnet/sourceforge/pebble/domain/Blog;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getCalendar()Ljava/util/Calendar;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getCharacterEncoding()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getContext()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getCountry()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getDate()Ljava/util/Date;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getDefaultProperties()Ljava/util/Properties;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getDescription()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getDomainName()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getId()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getImage()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getImagesDirectory()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getIndexesDirectory()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getLanguage()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getLastModified()Ljava/util/Date;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getLocale()Ljava/util/Locale;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getLogsDirectory()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getMessages()Ljava/util/List;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getName()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getNumberOfMessages()I
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getProperties()Ljava/util/Properties;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getProperty(Ljava/lang/String;)Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getProtocol()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getRecentBlogEntries()Ljava/util/List;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getRecentBlogEntries(I)Ljava/util/List;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getRecentBlogEntriesOnHomePage()I
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getRecentResponsesOnHomePage()I
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getRelativeUrl()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getRoot()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getSearchIndexDirectory()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getTheme()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getTimeZone()Ljava/util/TimeZone;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getTimeZoneId()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getUrl()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.info(Ljava/lang/String;)V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.init()V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.isConfigured()Z
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.loadProperties()V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.log(Ljavax/servlet/http/HttpServletRequest;I)V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.removeProperty(Ljava/lang/String;)V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.setDate(Ljava/util/Date;)V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.setProperty(Ljava/lang/String;Ljava/lang/String;)V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.setRecentBlogEntries(Ljava/util/List;)V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.setRoot(Ljava/lang/String;)V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.storeProperties()V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.toString()Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.truncateMessages()V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.warn(Ljava/lang/String;)V
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): log
    //#output(net.sourceforge.pebble.domain.AbstractBlog__static_init): net/sourceforge/pebble/domain/TimePeriod.__Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog] == &__Dispatch_Table
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): net/sourceforge/pebble/domain/TimePeriod.__Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog] == &__Dispatch_Table
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.clearMessages()V == &clearMessages
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.error(Ljava/lang/String;)V == &error
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getAuthor()Ljava/lang/String; == &getAuthor
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getBlog()Lnet/sourceforge/pebble/domain/Blog; == &net/sourceforge/pebble/domain/TimePeriod.getBlog
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getCalendar()Ljava/util/Calendar; == &getCalendar
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getCharacterEncoding()Ljava/lang/String; == &getCharacterEncoding
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getContext()Ljava/lang/String; == &getContext
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getCountry()Ljava/lang/String; == &getCountry
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getDate()Ljava/util/Date; == &net/sourceforge/pebble/domain/TimePeriod.getDate
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getDefaultProperties()Ljava/util/Properties; == &getDefaultProperties
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getDescription()Ljava/lang/String; == &getDescription
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getDomainName()Ljava/lang/String; == &getDomainName
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getId()Ljava/lang/String; == &getId
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getImage()Ljava/lang/String; == &getImage
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getImagesDirectory()Ljava/lang/String; == &getImagesDirectory
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getIndexesDirectory()Ljava/lang/String; == &getIndexesDirectory
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getLanguage()Ljava/lang/String; == &getLanguage
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getLastModified()Ljava/util/Date; == &getLastModified
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getLocale()Ljava/util/Locale; == &getLocale
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getLogsDirectory()Ljava/lang/String; == &getLogsDirectory
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getMessages()Ljava/util/List; == &getMessages
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getName()Ljava/lang/String; == &getName
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getNumberOfMessages()I == &getNumberOfMessages
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getProperties()Ljava/util/Properties; == &getProperties
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getProperty(Ljava/lang/String;)Ljava/lang/String; == &getProperty
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getProtocol()Ljava/lang/String; == &getProtocol
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getRecentBlogEntries()Ljava/util/List; == &getRecentBlogEntries
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getRecentBlogEntries(I)Ljava/util/List; == &getRecentBlogEntries
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getRecentBlogEntriesOnHomePage()I == &getRecentBlogEntriesOnHomePage
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getRecentResponsesOnHomePage()I == &getRecentResponsesOnHomePage
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getRelativeUrl()Ljava/lang/String; == &getRelativeUrl
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getRoot()Ljava/lang/String; == &getRoot
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getSearchIndexDirectory()Ljava/lang/String; == &getSearchIndexDirectory
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getTheme()Ljava/lang/String; == &getTheme
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getTimeZone()Ljava/util/TimeZone; == &getTimeZone
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getTimeZoneId()Ljava/lang/String; == &getTimeZoneId
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.getUrl()Ljava/lang/String; == &getUrl
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.info(Ljava/lang/String;)V == &info
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.init()V == &init
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.isConfigured()Z == &isConfigured
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.loadProperties()V == &loadProperties
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.log(Ljavax/servlet/http/HttpServletRequest;I)V == &log
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.removeProperty(Ljava/lang/String;)V == &removeProperty
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.setDate(Ljava/util/Date;)V == &net/sourceforge/pebble/domain/TimePeriod.setDate
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.setProperty(Ljava/lang/String;Ljava/lang/String;)V == &setProperty
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.setRecentBlogEntries(Ljava/util/List;)V == &setRecentBlogEntries
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.setRoot(Ljava/lang/String;)V == &setRoot
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.storeProperties()V == &storeProperties
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.toString()Ljava/lang/String; == &toString
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.truncateMessages()V == &truncateMessages
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): __Dispatch_Table.warn(Ljava/lang/String;)V == &warn
    //#post(net.sourceforge.pebble.domain.AbstractBlog__static_init): init'ed(log)
    //#abstractblog.java:55: end of method: net.sourceforge.pebble.domain.AbstractBlog.net.sourceforge.pebble.domain.AbstractBlog__static_init

  /** the filesystem root of this blog */
  private String root;

  protected static final String FALSE = "false";
  protected static final String TRUE = "true";

  public static final String NAME_KEY = "name";
  public static final String AUTHOR_KEY = "author";
  public static final String DESCRIPTION_KEY = "description";
  public static final String IMAGE_KEY = "image";
  public static final String TIMEZONE_KEY = "timeZone";
  public static final String RECENT_BLOG_ENTRIES_ON_HOME_PAGE_KEY = "recentBlogEntriesOnHomePage";
  public static final String RECENT_RESPONSES_ON_HOME_PAGE_KEY = "recentResponsesOnHomePage";
  public static final String LANGUAGE_KEY = "language";
  public static final String COUNTRY_KEY = "country";
  public static final String CHARACTER_ENCODING_KEY = "characterEncoding";
  public static final String THEME_KEY = "theme";

  private List<Message> messages = new LinkedList<Message>();

  /** the properties for this blog */
  protected Properties properties;

  /**
   * Creates a new Blog instance, based at the specified location.
   * Note: You must call init() before being able to use this object -
   * 
   * @param root    an absolute path pointing to the root directory of the blog
   */
  public AbstractBlog(String root) {
    super(null);
    //#abstractblog.java:87: method: void net.sourceforge.pebble.domain.AbstractBlog.net.sourceforge.pebble.domain.AbstractBlog(String)
    //#input(void net.sourceforge.pebble.domain.AbstractBlog(String)): root
    //#input(void net.sourceforge.pebble.domain.AbstractBlog(String)): this
    //#output(void net.sourceforge.pebble.domain.AbstractBlog(String)): new LinkedList(AbstractBlog#1) num objects
    //#output(void net.sourceforge.pebble.domain.AbstractBlog(String)): this.blog
    //#output(void net.sourceforge.pebble.domain.AbstractBlog(String)): this.messages
    //#output(void net.sourceforge.pebble.domain.AbstractBlog(String)): this.root
    //#new obj(void net.sourceforge.pebble.domain.AbstractBlog(String)): new LinkedList(AbstractBlog#1)
    //#post(void net.sourceforge.pebble.domain.AbstractBlog(String)): this.blog == null
    //#post(void net.sourceforge.pebble.domain.AbstractBlog(String)): this.messages == &new LinkedList(AbstractBlog#1)
    //#post(void net.sourceforge.pebble.domain.AbstractBlog(String)): this.root == root
    //#post(void net.sourceforge.pebble.domain.AbstractBlog(String)): init'ed(this.root)
    //#post(void net.sourceforge.pebble.domain.AbstractBlog(String)): new LinkedList(AbstractBlog#1) num objects == 1
    this.root = root;
// see javadoc comment about why init cannot be called here.
//    init();
  }
    //#abstractblog.java:91: end of method: void net.sourceforge.pebble.domain.AbstractBlog.net.sourceforge.pebble.domain.AbstractBlog(String)

  /**
   * Call this method to initialize this object before using it. As this method
   * may call some abstract methods, it should be called either last from the 
   * topmost constructor or from the outside just after construction. 
   */
  protected void init() {
    loadProperties();
    //#abstractblog.java:99: method: void net.sourceforge.pebble.domain.AbstractBlog.init()
    //#abstractblog.java:99: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: void init()
    //#    suspicious precondition index: [4]
    //#input(void init()): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(void init()): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void init()): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(void init()): __Descendant_Table[others]
    //#input(void init()): __Dispatch_Table.getDefaultProperties()Ljava/util/Properties;
    //#input(void init()): __Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(void init()): __Dispatch_Table.loadProperties()V
    //#input(void init()): log
    //#input(void init()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getDefaultProperties()Ljava/util/Properties;
    //#input(void init()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(void init()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.loadProperties()V
    //#input(void init()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getDefaultProperties()Ljava/util/Properties;
    //#input(void init()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(void init()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.loadProperties()V
    //#input(void init()): this
    //#input(void init()): this.__Tag
    //#input(void init()): this.root
    //#output(void init()): new Properties(loadProperties#1) num objects
    //#output(void init()): this.properties
    //#new obj(void init()): new Properties(loadProperties#1)
    //#pre[4] (void init()): this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[5] (void init()): init'ed(this.root)
    //#pre[1] (void init()): (soft) log != null
    //#post(void init()): this.properties == &new Properties(loadProperties#1)
    //#post(void init()): new Properties(loadProperties#1) num objects == 1
    //#unanalyzed(void init()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void init()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void init()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void init()): Effects-of-calling:java.io.File
    //#unanalyzed(void init()): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void init()): Effects-of-calling:getDefaultProperties
    //#unanalyzed(void init()): Effects-of-calling:java.util.Properties
    //#unanalyzed(void init()): Effects-of-calling:java.util.Properties:setProperty
    //#unanalyzed(void init()): Effects-of-calling:java.io.FileInputStream
    //#unanalyzed(void init()): Effects-of-calling:java.util.Properties:load
    //#unanalyzed(void init()): Effects-of-calling:java.io.FileInputStream:close
    //#unanalyzed(void init()): Effects-of-calling:org.apache.commons.logging.Log:error
  }
    //#abstractblog.java:100: end of method: void net.sourceforge.pebble.domain.AbstractBlog.init()

  /**
   * Loads the properties for this blog, from the blog.properties file
   * in the root directory.
   */
  protected void loadProperties() {
    try {
      this.properties = new Properties(getDefaultProperties());
    //#abstractblog.java:108: method: void net.sourceforge.pebble.domain.AbstractBlog.loadProperties()
    //#abstractblog.java:108: Warning: method not available
    //#    -- call on Properties getDefaultProperties()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: void loadProperties()
    //#    unanalyzed callee: Properties getDefaultProperties()
    //#abstractblog.java:108: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: void loadProperties()
    //#    suspicious precondition index: [4]
    //#input(void loadProperties()): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(void loadProperties()): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void loadProperties()): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(void loadProperties()): __Descendant_Table[others]
    //#input(void loadProperties()): __Dispatch_Table.getDefaultProperties()Ljava/util/Properties;
    //#input(void loadProperties()): __Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(void loadProperties()): log
    //#input(void loadProperties()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getDefaultProperties()Ljava/util/Properties;
    //#input(void loadProperties()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(void loadProperties()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getDefaultProperties()Ljava/util/Properties;
    //#input(void loadProperties()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(void loadProperties()): this
    //#input(void loadProperties()): this.__Tag
    //#input(void loadProperties()): this.root
    //#output(void loadProperties()): new Properties(loadProperties#1) num objects
    //#output(void loadProperties()): this.properties
    //#new obj(void loadProperties()): new Properties(loadProperties#1)
    //#pre[4] (void loadProperties()): this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[5] (void loadProperties()): init'ed(this.root)
    //#pre[1] (void loadProperties()): (soft) log != null
    //#post(void loadProperties()): this.properties == One-of{&new Properties(loadProperties#1), old this.properties}
    //#post(void loadProperties()): new Properties(loadProperties#1) num objects <= 1
    //#unanalyzed(void loadProperties()): Effects-of-calling:java.util.Properties
    //#unanalyzed(void loadProperties()): Effects-of-calling:java.util.Properties:setProperty
    //#test_vector(void loadProperties()): java.io.File:exists(...)@111: {1}, {0}

      File blogPropertiesFile = new File(getRoot(), BLOG_PROPERTIES_FILE);
      if (!blogPropertiesFile.exists()) {
        return;
      }

      FileInputStream fin = new FileInputStream(blogPropertiesFile);
      properties.load(fin);
      fin.close();
    } catch (IOException ioe) {
      log.error("A blog.properties file at " + getRoot() + " cannot be loaded", ioe);
    //#abstractblog.java:119: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:error(Object, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: void loadProperties()
    //#    unanalyzed callee: void org.apache.commons.logging.Log:error(Object, Throwable)
    }
  }
    //#abstractblog.java:121: end of method: void net.sourceforge.pebble.domain.AbstractBlog.loadProperties()

  public boolean isConfigured() {
    File blogPropertiesFile = new File(getRoot(), BLOG_PROPERTIES_FILE);
    //#abstractblog.java:124: method: bool net.sourceforge.pebble.domain.AbstractBlog.isConfigured()
    //#abstractblog.java:124: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: bool isConfigured()
    //#    suspicious precondition index: [2]
    //#input(bool isConfigured()): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(bool isConfigured()): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(bool isConfigured()): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(bool isConfigured()): __Descendant_Table[others]
    //#input(bool isConfigured()): __Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(bool isConfigured()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(bool isConfigured()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(bool isConfigured()): this
    //#input(bool isConfigured()): this.__Tag
    //#input(bool isConfigured()): this.root
    //#output(bool isConfigured()): return_value
    //#pre[2] (bool isConfigured()): this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[3] (bool isConfigured()): init'ed(this.root)
    //#post(bool isConfigured()): init'ed(return_value)
    return blogPropertiesFile.exists();
    //#abstractblog.java:125: end of method: bool net.sourceforge.pebble.domain.AbstractBlog.isConfigured()
  }

  /**
   * Gets the default properties for a blog.
   *
   * @return    a Properties instance
   */
  protected abstract Properties getDefaultProperties();

  /**
   * Gets the ID of this blog.
   *
   * @return  the ID as a String
   */
  public abstract String getId();

  /**
   * Gets the filesystem root for this blog.
   *
   * @return  a String representing an absolute path
   */
  public String getRoot() {
    return root;
    //#abstractblog.java:148: method: String net.sourceforge.pebble.domain.AbstractBlog.getRoot()
    //#input(String getRoot()): this
    //#input(String getRoot()): this.root
    //#output(String getRoot()): return_value
    //#pre[2] (String getRoot()): init'ed(this.root)
    //#post(String getRoot()): return_value == this.root
    //#post(String getRoot()): init'ed(return_value)
    //#abstractblog.java:148: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getRoot()
  }

  /**
   * Sets the filesystem root for this blog.
   *
   * @param root    a String representing the absolute path
   */
  protected void setRoot(String root) {
    this.root = root;
    //#abstractblog.java:157: method: void net.sourceforge.pebble.domain.AbstractBlog.setRoot(String)
    //#input(void setRoot(String)): root
    //#input(void setRoot(String)): this
    //#output(void setRoot(String)): this.root
    //#post(void setRoot(String)): this.root == root
    //#post(void setRoot(String)): init'ed(this.root)
  }
    //#abstractblog.java:158: end of method: void net.sourceforge.pebble.domain.AbstractBlog.setRoot(String)

  /**
   * Gets the properties associated with this blog.
   *
   * @return  a java.util.Properties object
   */
  public Properties getProperties() {
    return (Properties)properties.clone();
    //#abstractblog.java:166: method: Properties net.sourceforge.pebble.domain.AbstractBlog.getProperties()
    //#input(Properties getProperties()): this
    //#input(Properties getProperties()): this.properties
    //#output(Properties getProperties()): return_value
    //#pre[2] (Properties getProperties()): this.properties != null
    //#post(Properties getProperties()): return_value != null
    //#abstractblog.java:166: end of method: Properties net.sourceforge.pebble.domain.AbstractBlog.getProperties()
  }

  /**
   * Gets a named property for this blog.
   *
   * @param key     the property name/key
   */
  public String getProperty(String key) {
    return properties.getProperty(key);
    //#abstractblog.java:175: method: String net.sourceforge.pebble.domain.AbstractBlog.getProperty(String)
    //#input(String getProperty(String)): key
    //#input(String getProperty(String)): this
    //#input(String getProperty(String)): this.properties
    //#output(String getProperty(String)): return_value
    //#pre[3] (String getProperty(String)): this.properties != null
    //#post(String getProperty(String)): init'ed(return_value)
    //#abstractblog.java:175: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getProperty(String)
  }

  /**
   * Sets a named property for this blog.
   *
   * @param key     the property name/key
   * @param value   the property value
   */
  public void setProperty(String key, String value) {
    if (key != null) {
    //#abstractblog.java:185: method: void net.sourceforge.pebble.domain.AbstractBlog.setProperty(String, String)
    //#abstractblog.java:185: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: void setProperty(String, String)
    //#    suspicious precondition index: [7]
    //#    Attribs:  Soft
    //#input(void setProperty(String, String)): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(void setProperty(String, String)): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void setProperty(String, String)): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(void setProperty(String, String)): __Descendant_Table[others]
    //#input(void setProperty(String, String)): __Dispatch_Table.removeProperty(Ljava/lang/String;)V
    //#input(void setProperty(String, String)): key
    //#input(void setProperty(String, String)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.removeProperty(Ljava/lang/String;)V
    //#input(void setProperty(String, String)): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.removeProperty(Ljava/lang/String;)V
    //#input(void setProperty(String, String)): this
    //#input(void setProperty(String, String)): this.__Tag
    //#input(void setProperty(String, String)): this.properties
    //#input(void setProperty(String, String)): value
    //#pre[7] (void setProperty(String, String)): (soft) this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[8] (void setProperty(String, String)): (soft) this.properties != null
    //#unanalyzed(void setProperty(String, String)): Effects-of-calling:java.util.Properties:remove
    //#test_vector(void setProperty(String, String)): key: Addr_Set{null}, Inverse{null}
    //#test_vector(void setProperty(String, String)): value: Addr_Set{null}, Inverse{null}
      if (value != null) {
        properties.setProperty(key, value);
      } else {
        removeProperty(key);
      }
    }
  }
    //#abstractblog.java:192: end of method: void net.sourceforge.pebble.domain.AbstractBlog.setProperty(String, String)

  /**
   * Removes a named property for this blog.
   *
   * @param key     the property name/key
   */
  public void removeProperty(String key) {
    properties.remove(key);
    //#abstractblog.java:200: method: void net.sourceforge.pebble.domain.AbstractBlog.removeProperty(String)
    //#input(void removeProperty(String)): key
    //#input(void removeProperty(String)): this
    //#input(void removeProperty(String)): this.properties
    //#pre[3] (void removeProperty(String)): this.properties != null
  }
    //#abstractblog.java:201: end of method: void net.sourceforge.pebble.domain.AbstractBlog.removeProperty(String)

  /**
   * Stores the properties associated with this blog.
   *
   * @throws BlogServiceException    if the properties can't be stored
   */
  public void storeProperties() throws BlogServiceException {
    try {
      FileOutputStream fout = new FileOutputStream(new File(getRoot(), BLOG_PROPERTIES_FILE));
    //#abstractblog.java:210: method: void net.sourceforge.pebble.domain.AbstractBlog.storeProperties()
    //#abstractblog.java:210: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: void storeProperties()
    //#    suspicious precondition index: [3]
    //#    Attribs:  Soft
    //#input(void storeProperties()): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(void storeProperties()): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void storeProperties()): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(void storeProperties()): __Descendant_Table[others]
    //#input(void storeProperties()): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void storeProperties()): __Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(void storeProperties()): log
    //#input(void storeProperties()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void storeProperties()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(void storeProperties()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void storeProperties()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(void storeProperties()): this
    //#input(void storeProperties()): this.__Tag
    //#input(void storeProperties()): this.properties
    //#input(void storeProperties()): this.root
    //#pre[1] (void storeProperties()): (soft) log != null
    //#pre[3] (void storeProperties()): (soft) this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[4] (void storeProperties()): (soft) this.properties != null
    //#pre[5] (void storeProperties()): (soft) init'ed(this.root)
    //#unanalyzed(void storeProperties()): Effects-of-calling:java.util.Properties:getProperty
      properties.store(fout, "Properties for " + getName());
      fout.flush();
      fout.close();
    } catch (IOException ioe) {
      log.error(ioe);
    //#abstractblog.java:215: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:error(Object)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: void storeProperties()
    //#    unanalyzed callee: void org.apache.commons.logging.Log:error(Object)
    }
  }
    //#abstractblog.java:217: end of method: void net.sourceforge.pebble.domain.AbstractBlog.storeProperties()

  /**
   * Gets the name of this blog.
   *
   * @return    the name
   */
  public String getName() {
    return properties.getProperty(NAME_KEY);
    //#abstractblog.java:225: method: String net.sourceforge.pebble.domain.AbstractBlog.getName()
    //#input(String getName()): this
    //#input(String getName()): this.properties
    //#output(String getName()): return_value
    //#pre[2] (String getName()): this.properties != null
    //#post(String getName()): init'ed(return_value)
    //#abstractblog.java:225: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getName()
  }

  /**
   * Gets the author of this blog.
   *
   * @return    the author
   */
  public String getAuthor() {
    return properties.getProperty(AUTHOR_KEY);
    //#abstractblog.java:234: method: String net.sourceforge.pebble.domain.AbstractBlog.getAuthor()
    //#input(String getAuthor()): this
    //#input(String getAuthor()): this.properties
    //#output(String getAuthor()): return_value
    //#pre[2] (String getAuthor()): this.properties != null
    //#post(String getAuthor()): init'ed(return_value)
    //#abstractblog.java:234: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getAuthor()
  }

  /**
   * Gets the description of this blog.
   *
   * @return    the description
   */
  public String getDescription() {
    return properties.getProperty(DESCRIPTION_KEY);
    //#abstractblog.java:243: method: String net.sourceforge.pebble.domain.AbstractBlog.getDescription()
    //#input(String getDescription()): this
    //#input(String getDescription()): this.properties
    //#output(String getDescription()): return_value
    //#pre[2] (String getDescription()): this.properties != null
    //#post(String getDescription()): init'ed(return_value)
    //#abstractblog.java:243: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getDescription()
  }

  /**
   * Gets the image for this blog.
   *
   * @return    a URL pointing to an image
   */
  public String getImage() {
    return properties.getProperty(IMAGE_KEY);
    //#abstractblog.java:252: method: String net.sourceforge.pebble.domain.AbstractBlog.getImage()
    //#input(String getImage()): this
    //#input(String getImage()): this.properties
    //#output(String getImage()): return_value
    //#pre[2] (String getImage()): this.properties != null
    //#post(String getImage()): init'ed(return_value)
    //#abstractblog.java:252: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getImage()
  }

  /**
   * Gets the URL where this blog is deployed.
   *
   * @return  a URL as a String
   */
  public abstract String getUrl();

  /**
   * Gets the relative URL where this blog is deployed.
   *
   * @return  a URL as a String
   */
  public abstract String getRelativeUrl();

  /**
   * Gets the domain name where this blog is deployed.
   *
   * @return  a domain name as a String
   */
  public String getDomainName() {
    return PebbleContext.getInstance().getConfiguration().getDomainName();
    //#abstractblog.java:275: method: String net.sourceforge.pebble.domain.AbstractBlog.getDomainName()
    //#abstractblog.java:275: Warning: method not available
    //#    -- call on PebbleContext net.sourceforge.pebble.PebbleContext:getInstance()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: String getDomainName()
    //#    unanalyzed callee: PebbleContext net.sourceforge.pebble.PebbleContext:getInstance()
    //#abstractblog.java:275: Warning: method not available
    //#    -- call on Configuration net.sourceforge.pebble.PebbleContext:getConfiguration()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: String getDomainName()
    //#    unanalyzed callee: Configuration net.sourceforge.pebble.PebbleContext:getConfiguration()
    //#input(String getDomainName()): net/sourceforge/pebble/Configuration.__Descendant_Table[net/sourceforge/pebble/Configuration]
    //#input(String getDomainName()): net/sourceforge/pebble/Configuration.__Descendant_Table[others]
    //#input(String getDomainName()): net/sourceforge/pebble/Configuration.__Dispatch_Table.getDomainName()Ljava/lang/String;
    //#input(String getDomainName()): net/sourceforge/pebble/Configuration.__Dispatch_Table.getUrl()Ljava/lang/String;
    //#output(String getDomainName()): return_value
    //#presumption(String getDomainName()): net.sourceforge.pebble.PebbleContext:getConfiguration(...).__Tag@275 == net/sourceforge/pebble/Configuration
    //#presumption(String getDomainName()): net.sourceforge.pebble.PebbleContext:getConfiguration(...)@275 != null
    //#presumption(String getDomainName()): net.sourceforge.pebble.PebbleContext:getInstance(...)@275 != null
    //#post(String getDomainName()): return_value != null
    //#unanalyzed(String getDomainName()): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(String getDomainName()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(String getDomainName()): Effects-of-calling:net.sourceforge.pebble.PebbleContext:getInstance
    //#unanalyzed(String getDomainName()): Effects-of-calling:net.sourceforge.pebble.PebbleContext:getConfiguration
    //#abstractblog.java:275: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getDomainName()
  }

  /**
   * Gets the protocol where this blog is deployed.
   *
   * @return  a protocol as a String
   */
  public String getProtocol() {
    String url = PebbleContext.getInstance().getConfiguration().getUrl();
    //#abstractblog.java:284: method: String net.sourceforge.pebble.domain.AbstractBlog.getProtocol()
    //#abstractblog.java:284: Warning: method not available
    //#    -- call on PebbleContext net.sourceforge.pebble.PebbleContext:getInstance()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: String getProtocol()
    //#    unanalyzed callee: PebbleContext net.sourceforge.pebble.PebbleContext:getInstance()
    //#abstractblog.java:284: Warning: method not available
    //#    -- call on Configuration net.sourceforge.pebble.PebbleContext:getConfiguration()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: String getProtocol()
    //#    unanalyzed callee: Configuration net.sourceforge.pebble.PebbleContext:getConfiguration()
    //#input(String getProtocol()): net/sourceforge/pebble/Configuration.__Descendant_Table[net/sourceforge/pebble/Configuration]
    //#input(String getProtocol()): net/sourceforge/pebble/Configuration.__Descendant_Table[others]
    //#input(String getProtocol()): net/sourceforge/pebble/Configuration.__Dispatch_Table.getUrl()Ljava/lang/String;
    //#output(String getProtocol()): return_value
    //#presumption(String getProtocol()): java.lang.String:indexOf(...)@285 <= 4_294_967_292
    //#presumption(String getProtocol()): net.sourceforge.pebble.PebbleContext:getConfiguration(...).__Tag@284 == net/sourceforge/pebble/Configuration
    //#presumption(String getProtocol()): net.sourceforge.pebble.PebbleContext:getConfiguration(...).url@284 != null
    //#presumption(String getProtocol()): net.sourceforge.pebble.PebbleContext:getConfiguration(...)@284 != null
    //#presumption(String getProtocol()): net.sourceforge.pebble.PebbleContext:getInstance(...)@284 != null
    //#post(String getProtocol()): return_value != null
    return url.substring(0, url.indexOf("://")+3);
    //#abstractblog.java:285: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getProtocol()
  }

  /**
   * Gets the context where Pebble is deployed.
   *
   * @return    the webapp context
   */
  public String getContext() {
    String url = PebbleContext.getInstance().getConfiguration().getUrl();
    //#abstractblog.java:294: method: String net.sourceforge.pebble.domain.AbstractBlog.getContext()
    //#abstractblog.java:294: Warning: method not available
    //#    -- call on PebbleContext net.sourceforge.pebble.PebbleContext:getInstance()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: String getContext()
    //#    unanalyzed callee: PebbleContext net.sourceforge.pebble.PebbleContext:getInstance()
    //#abstractblog.java:294: Warning: method not available
    //#    -- call on Configuration net.sourceforge.pebble.PebbleContext:getConfiguration()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: String getContext()
    //#    unanalyzed callee: Configuration net.sourceforge.pebble.PebbleContext:getConfiguration()
    //#input(String getContext()): net/sourceforge/pebble/Configuration.__Descendant_Table[net/sourceforge/pebble/Configuration]
    //#input(String getContext()): net/sourceforge/pebble/Configuration.__Descendant_Table[others]
    //#input(String getContext()): net/sourceforge/pebble/Configuration.__Dispatch_Table.getUrl()Ljava/lang/String;
    //#output(String getContext()): return_value
    //#presumption(String getContext()): java.lang.String:indexOf(...)@295 <= 4_294_967_292
    //#presumption(String getContext()): net.sourceforge.pebble.PebbleContext:getConfiguration(...).__Tag@294 == net/sourceforge/pebble/Configuration
    //#presumption(String getContext()): net.sourceforge.pebble.PebbleContext:getConfiguration(...).url@294 != null
    //#presumption(String getContext()): net.sourceforge.pebble.PebbleContext:getConfiguration(...)@294 != null
    //#presumption(String getContext()): net.sourceforge.pebble.PebbleContext:getInstance(...)@294 != null
    //#post(String getContext()): return_value != null
    //#test_vector(String getContext()): java.lang.String:indexOf(...)@295: {-2_147_483_648..-2, 0..4_294_967_295}, {-1}
    int index = url.indexOf("/", url.indexOf("://")+3);
    if (index == -1) {
      return "/";
    } else {
      return url.substring(index);
    //#abstractblog.java:299: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getContext()
    }
  }

  /**
   * Gets the ID of the time zone for the blog.
   *
   * @return    a String (Europe/London by default)
   */
  public String getTimeZoneId() {
    return properties.getProperty(TIMEZONE_KEY);
    //#abstractblog.java:309: method: String net.sourceforge.pebble.domain.AbstractBlog.getTimeZoneId()
    //#input(String getTimeZoneId()): this
    //#input(String getTimeZoneId()): this.properties
    //#output(String getTimeZoneId()): return_value
    //#pre[2] (String getTimeZoneId()): this.properties != null
    //#post(String getTimeZoneId()): init'ed(return_value)
    //#abstractblog.java:309: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getTimeZoneId()
  }

  /**
   * Gets the TimeZone instance representing the timezone for the blog.
   *
   * @return    a TimeZone instance
   */
  public TimeZone getTimeZone() {
    return TimeZone.getTimeZone(getTimeZoneId());
    //#abstractblog.java:318: method: TimeZone net.sourceforge.pebble.domain.AbstractBlog.getTimeZone()
    //#abstractblog.java:318: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: TimeZone getTimeZone()
    //#    suspicious precondition index: [2]
    //#input(TimeZone getTimeZone()): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(TimeZone getTimeZone()): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(TimeZone getTimeZone()): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(TimeZone getTimeZone()): __Descendant_Table[others]
    //#input(TimeZone getTimeZone()): __Dispatch_Table.getTimeZoneId()Ljava/lang/String;
    //#input(TimeZone getTimeZone()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getTimeZoneId()Ljava/lang/String;
    //#input(TimeZone getTimeZone()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getTimeZoneId()Ljava/lang/String;
    //#input(TimeZone getTimeZone()): this
    //#input(TimeZone getTimeZone()): this.__Tag
    //#input(TimeZone getTimeZone()): this.properties
    //#output(TimeZone getTimeZone()): return_value
    //#pre[2] (TimeZone getTimeZone()): this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[3] (TimeZone getTimeZone()): this.properties != null
    //#post(TimeZone getTimeZone()): init'ed(return_value)
    //#unanalyzed(TimeZone getTimeZone()): Effects-of-calling:java.util.Properties:getProperty
    //#abstractblog.java:318: end of method: TimeZone net.sourceforge.pebble.domain.AbstractBlog.getTimeZone()
  }

  /**
   * Gets a Calendar instance representing the current moment in time,
   * with the timezone and locale set to be the same as that specified
   * for this blog.
   *
   * @return    a Calendar instance
   */
  public Calendar getCalendar() {
    return Calendar.getInstance(getTimeZone(), getLocale());
    //#abstractblog.java:329: method: Calendar net.sourceforge.pebble.domain.AbstractBlog.getCalendar()
    //#abstractblog.java:329: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: Calendar getCalendar()
    //#    suspicious precondition index: [2]
    //#input(Calendar getCalendar()): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(Calendar getCalendar()): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(Calendar getCalendar()): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(Calendar getCalendar()): __Descendant_Table[others]
    //#input(Calendar getCalendar()): __Dispatch_Table.getCountry()Ljava/lang/String;
    //#input(Calendar getCalendar()): __Dispatch_Table.getLanguage()Ljava/lang/String;
    //#input(Calendar getCalendar()): __Dispatch_Table.getLocale()Ljava/util/Locale;
    //#input(Calendar getCalendar()): __Dispatch_Table.getTimeZone()Ljava/util/TimeZone;
    //#input(Calendar getCalendar()): __Dispatch_Table.getTimeZoneId()Ljava/lang/String;
    //#input(Calendar getCalendar()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getCountry()Ljava/lang/String;
    //#input(Calendar getCalendar()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getLanguage()Ljava/lang/String;
    //#input(Calendar getCalendar()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getLocale()Ljava/util/Locale;
    //#input(Calendar getCalendar()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getTimeZone()Ljava/util/TimeZone;
    //#input(Calendar getCalendar()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getTimeZoneId()Ljava/lang/String;
    //#input(Calendar getCalendar()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getCountry()Ljava/lang/String;
    //#input(Calendar getCalendar()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getLanguage()Ljava/lang/String;
    //#input(Calendar getCalendar()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getLocale()Ljava/util/Locale;
    //#input(Calendar getCalendar()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getTimeZone()Ljava/util/TimeZone;
    //#input(Calendar getCalendar()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getTimeZoneId()Ljava/lang/String;
    //#input(Calendar getCalendar()): this
    //#input(Calendar getCalendar()): this.__Tag
    //#input(Calendar getCalendar()): this.properties
    //#output(Calendar getCalendar()): return_value
    //#pre[2] (Calendar getCalendar()): this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[3] (Calendar getCalendar()): this.properties != null
    //#post(Calendar getCalendar()): init'ed(return_value)
    //#unanalyzed(Calendar getCalendar()): Effects-of-calling:java.util.Properties:getProperty
    //#unanalyzed(Calendar getCalendar()): Effects-of-calling:java.util.Locale
    //#unanalyzed(Calendar getCalendar()): Effects-of-calling:java.util.TimeZone:getTimeZone
    //#abstractblog.java:329: end of method: Calendar net.sourceforge.pebble.domain.AbstractBlog.getCalendar()
  }

  /**
   * Gets the number of recent blog entries that are displayed on the home page.
   *
   * @return  an int (3 by default)
   */
  public int getRecentBlogEntriesOnHomePage() {
    return Integer.parseInt(properties.getProperty(RECENT_BLOG_ENTRIES_ON_HOME_PAGE_KEY));
    //#abstractblog.java:338: method: int net.sourceforge.pebble.domain.AbstractBlog.getRecentBlogEntriesOnHomePage()
    //#input(int getRecentBlogEntriesOnHomePage()): this
    //#input(int getRecentBlogEntriesOnHomePage()): this.properties
    //#output(int getRecentBlogEntriesOnHomePage()): return_value
    //#pre[2] (int getRecentBlogEntriesOnHomePage()): this.properties != null
    //#post(int getRecentBlogEntriesOnHomePage()): init'ed(return_value)
    //#abstractblog.java:338: end of method: int net.sourceforge.pebble.domain.AbstractBlog.getRecentBlogEntriesOnHomePage()
  }

  /**
   * Gets the number of recent comments that are displayed on the home page.
   *
   * @return  an int (0 by default)
   */
  public int getRecentResponsesOnHomePage() {
    return Integer.parseInt(properties.getProperty(RECENT_RESPONSES_ON_HOME_PAGE_KEY));
    //#abstractblog.java:347: method: int net.sourceforge.pebble.domain.AbstractBlog.getRecentResponsesOnHomePage()
    //#input(int getRecentResponsesOnHomePage()): this
    //#input(int getRecentResponsesOnHomePage()): this.properties
    //#output(int getRecentResponsesOnHomePage()): return_value
    //#pre[2] (int getRecentResponsesOnHomePage()): this.properties != null
    //#post(int getRecentResponsesOnHomePage()): init'ed(return_value)
    //#abstractblog.java:347: end of method: int net.sourceforge.pebble.domain.AbstractBlog.getRecentResponsesOnHomePage()
  }

  /**
   * Gets the character encoding in use by this blog.
   *
   * @return  the character encoding as an IANA registered character set code
   */
  public String getCharacterEncoding() {
    return properties.getProperty(CHARACTER_ENCODING_KEY);
    //#abstractblog.java:356: method: String net.sourceforge.pebble.domain.AbstractBlog.getCharacterEncoding()
    //#input(String getCharacterEncoding()): this
    //#input(String getCharacterEncoding()): this.properties
    //#output(String getCharacterEncoding()): return_value
    //#pre[2] (String getCharacterEncoding()): this.properties != null
    //#post(String getCharacterEncoding()): init'ed(return_value)
    //#abstractblog.java:356: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getCharacterEncoding()
  }

  /**
   * Gets string instance representing the language for the blog.
   *
   * @return    a two-letter ISO language code (en by default)
   */
  public String getLanguage() {
    return properties.getProperty(LANGUAGE_KEY);
    //#abstractblog.java:365: method: String net.sourceforge.pebble.domain.AbstractBlog.getLanguage()
    //#input(String getLanguage()): this
    //#input(String getLanguage()): this.properties
    //#output(String getLanguage()): return_value
    //#pre[2] (String getLanguage()): this.properties != null
    //#post(String getLanguage()): init'ed(return_value)
    //#abstractblog.java:365: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getLanguage()
  }

  /**
   * Gets string instance representing the country for the blog.
   *
   * @return    a two-letter ISO country code (GB by default)
   */
  public String getCountry() {
    return properties.getProperty(COUNTRY_KEY);
    //#abstractblog.java:374: method: String net.sourceforge.pebble.domain.AbstractBlog.getCountry()
    //#input(String getCountry()): this
    //#input(String getCountry()): this.properties
    //#output(String getCountry()): return_value
    //#pre[2] (String getCountry()): this.properties != null
    //#post(String getCountry()): init'ed(return_value)
    //#abstractblog.java:374: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getCountry()
  }

  /**
   * Gets the Locale instance for the blog.
   *
   * @return  a Locale instance based upon the language and country.
   */
  public Locale getLocale() {
    return new Locale(getLanguage(), getCountry());
    //#abstractblog.java:383: method: Locale net.sourceforge.pebble.domain.AbstractBlog.getLocale()
    //#abstractblog.java:383: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: Locale getLocale()
    //#    suspicious precondition index: [2]
    //#input(Locale getLocale()): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(Locale getLocale()): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(Locale getLocale()): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(Locale getLocale()): __Descendant_Table[others]
    //#input(Locale getLocale()): __Dispatch_Table.getCountry()Ljava/lang/String;
    //#input(Locale getLocale()): __Dispatch_Table.getLanguage()Ljava/lang/String;
    //#input(Locale getLocale()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getCountry()Ljava/lang/String;
    //#input(Locale getLocale()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getLanguage()Ljava/lang/String;
    //#input(Locale getLocale()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getCountry()Ljava/lang/String;
    //#input(Locale getLocale()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getLanguage()Ljava/lang/String;
    //#input(Locale getLocale()): this
    //#input(Locale getLocale()): this.__Tag
    //#input(Locale getLocale()): this.properties
    //#output(Locale getLocale()): new Locale(getLocale#1) num objects
    //#output(Locale getLocale()): return_value
    //#new obj(Locale getLocale()): new Locale(getLocale#1)
    //#pre[2] (Locale getLocale()): this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[3] (Locale getLocale()): this.properties != null
    //#post(Locale getLocale()): return_value == &new Locale(getLocale#1)
    //#post(Locale getLocale()): new Locale(getLocale#1) num objects == 1
    //#unanalyzed(Locale getLocale()): Effects-of-calling:java.util.Properties:getProperty
    //#abstractblog.java:383: end of method: Locale net.sourceforge.pebble.domain.AbstractBlog.getLocale()
  }

  /**
   * Gets the theme being used.
   *
   * @return  a theme name as a String
   */
  public String getTheme() {
    return properties.getProperty(THEME_KEY);
    //#abstractblog.java:392: method: String net.sourceforge.pebble.domain.AbstractBlog.getTheme()
    //#input(String getTheme()): this
    //#input(String getTheme()): this.properties
    //#output(String getTheme()): return_value
    //#pre[2] (String getTheme()): this.properties != null
    //#post(String getTheme()): init'ed(return_value)
    //#abstractblog.java:392: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getTheme()
  }

  /**
   * Gets the location where the blog images are stored.
   *
   * @return    an absolute, local path on the filing system
   */
  public String getImagesDirectory() {
    return getRoot() + File.separator + "images";
    //#abstractblog.java:401: method: String net.sourceforge.pebble.domain.AbstractBlog.getImagesDirectory()
    //#abstractblog.java:401: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: String getImagesDirectory()
    //#    suspicious precondition index: [2]
    //#input(String getImagesDirectory()): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(String getImagesDirectory()): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(String getImagesDirectory()): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(String getImagesDirectory()): __Descendant_Table[others]
    //#input(String getImagesDirectory()): __Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(String getImagesDirectory()): java.io.File.separator
    //#input(String getImagesDirectory()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(String getImagesDirectory()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(String getImagesDirectory()): this
    //#input(String getImagesDirectory()): this.__Tag
    //#input(String getImagesDirectory()): this.root
    //#output(String getImagesDirectory()): return_value
    //#pre[2] (String getImagesDirectory()): this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[3] (String getImagesDirectory()): init'ed(this.root)
    //#presumption(String getImagesDirectory()): init'ed(java.io.File.separator)
    //#post(String getImagesDirectory()): return_value != null
    //#abstractblog.java:401: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getImagesDirectory()
  }

  /**
   * Gets the location where the blog search indexes are stored.
   *
   * @return    an absolute, local path on the filing system
   */
  public String getIndexesDirectory() {
    return getRoot() + File.separator + "indexes";
    //#abstractblog.java:410: method: String net.sourceforge.pebble.domain.AbstractBlog.getIndexesDirectory()
    //#abstractblog.java:410: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: String getIndexesDirectory()
    //#    suspicious precondition index: [2]
    //#input(String getIndexesDirectory()): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(String getIndexesDirectory()): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(String getIndexesDirectory()): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(String getIndexesDirectory()): __Descendant_Table[others]
    //#input(String getIndexesDirectory()): __Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(String getIndexesDirectory()): java.io.File.separator
    //#input(String getIndexesDirectory()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(String getIndexesDirectory()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(String getIndexesDirectory()): this
    //#input(String getIndexesDirectory()): this.__Tag
    //#input(String getIndexesDirectory()): this.root
    //#output(String getIndexesDirectory()): return_value
    //#pre[2] (String getIndexesDirectory()): this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[3] (String getIndexesDirectory()): init'ed(this.root)
    //#presumption(String getIndexesDirectory()): init'ed(java.io.File.separator)
    //#post(String getIndexesDirectory()): return_value != null
    //#abstractblog.java:410: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getIndexesDirectory()
  }

  /**
   * Gets the location where the blog search indexes are stored.
   *
   * @return    an absolute, local path on the filing system
   */
  public String getSearchIndexDirectory() {
    return getIndexesDirectory() + File.separator + "search";
    //#abstractblog.java:419: method: String net.sourceforge.pebble.domain.AbstractBlog.getSearchIndexDirectory()
    //#abstractblog.java:419: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: String getSearchIndexDirectory()
    //#    suspicious precondition index: [2]
    //#input(String getSearchIndexDirectory()): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(String getSearchIndexDirectory()): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(String getSearchIndexDirectory()): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(String getSearchIndexDirectory()): __Descendant_Table[others]
    //#input(String getSearchIndexDirectory()): __Dispatch_Table.getIndexesDirectory()Ljava/lang/String;
    //#input(String getSearchIndexDirectory()): __Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(String getSearchIndexDirectory()): java.io.File.separator
    //#input(String getSearchIndexDirectory()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getIndexesDirectory()Ljava/lang/String;
    //#input(String getSearchIndexDirectory()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(String getSearchIndexDirectory()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getIndexesDirectory()Ljava/lang/String;
    //#input(String getSearchIndexDirectory()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(String getSearchIndexDirectory()): this
    //#input(String getSearchIndexDirectory()): this.__Tag
    //#input(String getSearchIndexDirectory()): this.root
    //#output(String getSearchIndexDirectory()): return_value
    //#pre[2] (String getSearchIndexDirectory()): this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[3] (String getSearchIndexDirectory()): init'ed(this.root)
    //#presumption(String getSearchIndexDirectory()): init'ed(java.io.File.separator)
    //#post(String getSearchIndexDirectory()): return_value != null
    //#unanalyzed(String getSearchIndexDirectory()): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(String getSearchIndexDirectory()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(String getSearchIndexDirectory()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(String getSearchIndexDirectory()): Effects-of-calling:java.lang.StringBuilder:toString
    //#abstractblog.java:419: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getSearchIndexDirectory()
  }

  /**
   * Gets the location where the blog logs are stored.
   *
   * @return    an absolute, local path on the filing system
   */
  public String getLogsDirectory() {
    return getRoot() + File.separator + "logs";
    //#abstractblog.java:428: method: String net.sourceforge.pebble.domain.AbstractBlog.getLogsDirectory()
    //#abstractblog.java:428: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: String getLogsDirectory()
    //#    suspicious precondition index: [2]
    //#input(String getLogsDirectory()): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(String getLogsDirectory()): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(String getLogsDirectory()): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(String getLogsDirectory()): __Descendant_Table[others]
    //#input(String getLogsDirectory()): __Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(String getLogsDirectory()): java.io.File.separator
    //#input(String getLogsDirectory()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(String getLogsDirectory()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(String getLogsDirectory()): this
    //#input(String getLogsDirectory()): this.__Tag
    //#input(String getLogsDirectory()): this.root
    //#output(String getLogsDirectory()): return_value
    //#pre[2] (String getLogsDirectory()): this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[3] (String getLogsDirectory()): init'ed(this.root)
    //#presumption(String getLogsDirectory()): init'ed(java.io.File.separator)
    //#post(String getLogsDirectory()): return_value != null
    //#abstractblog.java:428: end of method: String net.sourceforge.pebble.domain.AbstractBlog.getLogsDirectory()
  }

  /**
   * Gets the most recent blog entries, the number
   * of which is specified.
   *
   * @param   numberOfEntries   the number of entries to get
   * @return  a List containing the most recent blog entries
   */
  public abstract List getRecentBlogEntries(int numberOfEntries);

  /**
   * Gets the most recent blog entries, the number of which is taken from
   * the recentBlogEntriesOnHomePage property.
   *
   * @return  a List containing the most recent blog entries
   */
  public List getRecentBlogEntries() {
    return getRecentBlogEntries(getRecentBlogEntriesOnHomePage());
    //#abstractblog.java:447: method: List net.sourceforge.pebble.domain.AbstractBlog.getRecentBlogEntries()
    //#abstractblog.java:447: Warning: method not available
    //#    -- call on List getRecentBlogEntries(int)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: List getRecentBlogEntries()
    //#    unanalyzed callee: List getRecentBlogEntries(int)
    //#abstractblog.java:447: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: List getRecentBlogEntries()
    //#    suspicious precondition index: [5]
    //#input(List getRecentBlogEntries()): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(List getRecentBlogEntries()): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(List getRecentBlogEntries()): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(List getRecentBlogEntries()): __Descendant_Table[others]
    //#input(List getRecentBlogEntries()): __Dispatch_Table.getRecentBlogEntries(I)Ljava/util/List;
    //#input(List getRecentBlogEntries()): __Dispatch_Table.getRecentBlogEntriesOnHomePage()I
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/Blog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/Blog.__Descendant_Table[others]
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRecentBlogEntries(I)Ljava/util/List;
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRecentBlogEntriesOnHomePage()I
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRecentPublishedBlogEntries()Ljava/util/List;
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRecentPublishedBlogEntries(I)Ljava/util/List;
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.isPublic()Z
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/Blog.log
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/BlogManager.__Descendant_Table[net/sourceforge/pebble/domain/BlogManager]
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/BlogManager.__Descendant_Table[others]
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/BlogManager.__Dispatch_Table.getPublicBlogs()Ljava/util/List;
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/BlogManager.instance.__Tag
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/BlogService.__Descendant_Table[net/sourceforge/pebble/domain/BlogService]
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/BlogService.__Dispatch_Table.getBlogEntry(Lnet/sourceforge/pebble/domain/Blog;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/BlogEntry;
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getRecentBlogEntries(I)Ljava/util/List;
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getRecentBlogEntriesOnHomePage()I
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/index/BlogEntryIndex.__Descendant_Table[net/sourceforge/pebble/index/BlogEntryIndex]
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/index/BlogEntryIndex.__Descendant_Table[others]
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/index/BlogEntryIndex.__Dispatch_Table.getBlogEntries()Ljava/util/List;
    //#input(List getRecentBlogEntries()): net/sourceforge/pebble/index/BlogEntryIndex.__Dispatch_Table.getPublishedBlogEntries()Ljava/util/List;
    //#input(List getRecentBlogEntries()): this
    //#input(List getRecentBlogEntries()): this.__Tag
    //#input(List getRecentBlogEntries()): this.blogEntryIndex.__Tag
    //#input(List getRecentBlogEntries()): this.properties
    //#output(List getRecentBlogEntries()): new ArrayList(getRecentBlogEntries#2*) num objects
    //#output(List getRecentBlogEntries()): new ArrayList(getRecentBlogEntries#4*) num objects
    //#output(List getRecentBlogEntries()): return_value
    //#new obj(List getRecentBlogEntries()): new ArrayList(getRecentBlogEntries#2*)
    //#new obj(List getRecentBlogEntries()): new ArrayList(getRecentBlogEntries#4*)
    //#pre[5] (List getRecentBlogEntries()): this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[9] (List getRecentBlogEntries()): this.properties != null
    //#post(List getRecentBlogEntries()): init'ed(return_value)
    //#post(List getRecentBlogEntries()): new ArrayList(getRecentBlogEntries#2*) num objects <= 1
    //#post(List getRecentBlogEntries()): new ArrayList(getRecentBlogEntries#4*) num objects <= 1
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.util.Properties:getProperty
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.util.Map:values
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:isPublic
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.util.List:add
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:getRecentPublishedBlogEntries
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.util.List:size
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.util.ArrayList:subList
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:getConfiguredFactory
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:getBlogEntryDAO
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:getBlog
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:getId
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:getCompositeKeyForBlogEntry
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:setPersistent
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:setEventsEnabled
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:net.sourceforge.pebble.domain.BlogServiceException
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:net.sf.ehcache.Cache:get
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:net.sf.ehcache.Element:getValue
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:org.apache.commons.logging.Log:debug
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:loadBlogEntry
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:net.sf.ehcache.Element
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:net.sf.ehcache.Cache:put
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:clone
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:getBlogEntry
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:org.apache.commons.logging.Log:error
    //#unanalyzed(List getRecentBlogEntries()): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#abstractblog.java:447: end of method: List net.sourceforge.pebble.domain.AbstractBlog.getRecentBlogEntries()
  }

  /**
   * Setter method for the recentBlogEntries property - this is here so that
   * the property complies with the JavaBeans standard.
   * 
   * @param entries
   */
  public void setRecentBlogEntries(List entries) {
    // do nothing
  }
    //#abstractblog.java:458: method: void net.sourceforge.pebble.domain.AbstractBlog.setRecentBlogEntries(List)
    //#abstractblog.java:458: end of method: void net.sourceforge.pebble.domain.AbstractBlog.setRecentBlogEntries(List)

  /**
   * Gets the date that this blog was last updated.
   *
   * @return  a Date instance representing the time of the most recent entry
   */
  public abstract Date getLastModified();

  /**
   * Gets a string representation of this object.
   *
   * @return  a String
   */
  public String toString() {
    return getName();
    //#abstractblog.java:473: method: String net.sourceforge.pebble.domain.AbstractBlog.toString()
    //#abstractblog.java:473: Warning: suspicious precondition
    //#    the precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: String toString()
    //#    suspicious precondition index: [2]
    //#input(String toString()): __Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(String toString()): __Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(String toString()): __Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(String toString()): __Descendant_Table[others]
    //#input(String toString()): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(String toString()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String toString()): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String toString()): this
    //#input(String toString()): this.__Tag
    //#input(String toString()): this.properties
    //#output(String toString()): return_value
    //#pre[2] (String toString()): this.__Tag in {net/sourceforge/pebble/domain/AbstractBlog, net/sourceforge/pebble/domain/Blog, net/sourceforge/pebble/domain/MultiBlog}
    //#pre[3] (String toString()): this.properties != null
    //#post(String toString()): init'ed(return_value)
    //#unanalyzed(String toString()): Effects-of-calling:java.util.Properties:getProperty
    //#abstractblog.java:473: end of method: String net.sourceforge.pebble.domain.AbstractBlog.toString()
  }

  public synchronized void info(String text) {
    Message message = new Message(MessageType.INFO, text);
    //#abstractblog.java:477: method: void net.sourceforge.pebble.domain.AbstractBlog.info(String)
    //#input(void info(String)): log
    //#input(void info(String)): net/sourceforge/pebble/domain/Message.__Descendant_Table[net/sourceforge/pebble/domain/Message]
    //#input(void info(String)): net/sourceforge/pebble/domain/Message.__Dispatch_Table.getText()Ljava/lang/String;
    //#input(void info(String)): net/sourceforge/pebble/domain/MessageType.INFO
    //#input(void info(String)): text
    //#input(void info(String)): this
    //#input(void info(String)): this.messages
    //#output(void info(String)): this.messages
    //#pre[1] (void info(String)): log != null
    //#pre[2] (void info(String)): this.messages != null
    //#post(void info(String)): init'ed(this.messages)
    //#unanalyzed(void info(String)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void info(String)): Effects-of-calling:java.util.List:subList
    //#unanalyzed(void info(String)): Effects-of-calling:net.sourceforge.pebble.util.SecurityUtils:getUsername
    //#unanalyzed(void info(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void info(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void info(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void info(String)): Effects-of-calling:java.util.Date
    messages.add(0, message);
    log.info(message.getText());
    //#abstractblog.java:479: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:info(Object)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: void info(String)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:info(Object)
    truncateMessages();
  }
    //#abstractblog.java:481: end of method: void net.sourceforge.pebble.domain.AbstractBlog.info(String)

  public synchronized void warn(String text) {
    Message message = new Message(MessageType.WARN, text);
    //#abstractblog.java:484: method: void net.sourceforge.pebble.domain.AbstractBlog.warn(String)
    //#input(void warn(String)): log
    //#input(void warn(String)): net/sourceforge/pebble/domain/Message.__Descendant_Table[net/sourceforge/pebble/domain/Message]
    //#input(void warn(String)): net/sourceforge/pebble/domain/Message.__Dispatch_Table.getText()Ljava/lang/String;
    //#input(void warn(String)): net/sourceforge/pebble/domain/MessageType.WARN
    //#input(void warn(String)): text
    //#input(void warn(String)): this
    //#input(void warn(String)): this.messages
    //#output(void warn(String)): this.messages
    //#pre[1] (void warn(String)): log != null
    //#pre[2] (void warn(String)): this.messages != null
    //#post(void warn(String)): init'ed(this.messages)
    //#unanalyzed(void warn(String)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void warn(String)): Effects-of-calling:java.util.List:subList
    //#unanalyzed(void warn(String)): Effects-of-calling:net.sourceforge.pebble.util.SecurityUtils:getUsername
    //#unanalyzed(void warn(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void warn(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void warn(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void warn(String)): Effects-of-calling:java.util.Date
    messages.add(0, message);
    log.warn(message.getText());
    //#abstractblog.java:486: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:warn(Object)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: void warn(String)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:warn(Object)
    truncateMessages();
  }
    //#abstractblog.java:488: end of method: void net.sourceforge.pebble.domain.AbstractBlog.warn(String)

  public synchronized void error(String text) {
    Message message = new Message(MessageType.ERROR, text);
    //#abstractblog.java:491: method: void net.sourceforge.pebble.domain.AbstractBlog.error(String)
    //#input(void error(String)): log
    //#input(void error(String)): net/sourceforge/pebble/domain/Message.__Descendant_Table[net/sourceforge/pebble/domain/Message]
    //#input(void error(String)): net/sourceforge/pebble/domain/Message.__Dispatch_Table.getText()Ljava/lang/String;
    //#input(void error(String)): net/sourceforge/pebble/domain/MessageType.ERROR
    //#input(void error(String)): text
    //#input(void error(String)): this
    //#input(void error(String)): this.messages
    //#output(void error(String)): this.messages
    //#pre[1] (void error(String)): log != null
    //#pre[2] (void error(String)): this.messages != null
    //#post(void error(String)): init'ed(this.messages)
    //#unanalyzed(void error(String)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void error(String)): Effects-of-calling:java.util.List:subList
    //#unanalyzed(void error(String)): Effects-of-calling:net.sourceforge.pebble.util.SecurityUtils:getUsername
    //#unanalyzed(void error(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void error(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void error(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void error(String)): Effects-of-calling:java.util.Date
    messages.add(0, message);
    log.error(message.getText());
    //#abstractblog.java:493: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:error(Object)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.AbstractBlog
    //#    method: void error(String)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:error(Object)
    truncateMessages();
  }
    //#abstractblog.java:495: end of method: void net.sourceforge.pebble.domain.AbstractBlog.error(String)

  private void truncateMessages() {
    if (messages.size() > MAXIMUM_MESSAGES) {
    //#abstractblog.java:498: method: void net.sourceforge.pebble.domain.AbstractBlog.truncateMessages()
    //#input(void truncateMessages()): this
    //#input(void truncateMessages()): this.messages
    //#output(void truncateMessages()): this.messages
    //#pre[1] (void truncateMessages()): this.messages != null
    //#post(void truncateMessages()): init'ed(this.messages)
    //#test_vector(void truncateMessages()): java.util.List:size(...)@498: {-2_147_483_648..20}, {21..4_294_967_295}
      messages = messages.subList(0, MAXIMUM_MESSAGES);
    }
  }
    //#abstractblog.java:501: end of method: void net.sourceforge.pebble.domain.AbstractBlog.truncateMessages()

  public synchronized void clearMessages() {
    messages.clear();
    //#abstractblog.java:504: method: void net.sourceforge.pebble.domain.AbstractBlog.clearMessages()
    //#input(void clearMessages()): this
    //#input(void clearMessages()): this.messages
    //#pre[2] (void clearMessages()): this.messages != null
  }
    //#abstractblog.java:505: end of method: void net.sourceforge.pebble.domain.AbstractBlog.clearMessages()

  public List<Message> getMessages() {
    return new ArrayList<Message>(messages);
    //#abstractblog.java:508: method: List net.sourceforge.pebble.domain.AbstractBlog.getMessages()
    //#input(List getMessages()): this
    //#input(List getMessages()): this.messages
    //#output(List getMessages()): new ArrayList(getMessages#1) num objects
    //#output(List getMessages()): return_value
    //#new obj(List getMessages()): new ArrayList(getMessages#1)
    //#pre[2] (List getMessages()): init'ed(this.messages)
    //#post(List getMessages()): return_value == &new ArrayList(getMessages#1)
    //#post(List getMessages()): new ArrayList(getMessages#1) num objects == 1
    //#abstractblog.java:508: end of method: List net.sourceforge.pebble.domain.AbstractBlog.getMessages()
  }

  public int getNumberOfMessages() {
    return messages.size();
    //#abstractblog.java:512: method: int net.sourceforge.pebble.domain.AbstractBlog.getNumberOfMessages()
    //#input(int getNumberOfMessages()): this
    //#input(int getNumberOfMessages()): this.messages
    //#output(int getNumberOfMessages()): return_value
    //#pre[2] (int getNumberOfMessages()): this.messages != null
    //#post(int getNumberOfMessages()): init'ed(return_value)
    //#abstractblog.java:512: end of method: int net.sourceforge.pebble.domain.AbstractBlog.getNumberOfMessages()
  }

  /**
   * Logs this request for blog.
   *
   * @param request   the HttpServletRequest instance for this request
   */
  public abstract void log(HttpServletRequest request, int status);

}    //#abstractblog.java:: end of class: net.sourceforge.pebble.domain.AbstractBlog
