//# 0 errors, 410 messages
//#
package net.sourceforge.pebble.dao.file;
    //#filestaticpagedao.java:1:1: class: net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter
    //#filestaticpagedao.java:1:1: method: net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter.net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter__static_init
    //#filestaticpagedao.java:1:1: class: net.sourceforge.pebble.dao.file.FileStaticPageDAO$1
    //#filestaticpagedao.java:1:1: method: net.sourceforge.pebble.dao.file.FileStaticPageDAO$1.net.sourceforge.pebble.dao.file.FileStaticPageDAO$1__static_init
    //#filestaticpagedao.java:1:1: class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#filestaticpagedao.java:1: method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO$1.net.sourceforge.pebble.dao.file.FileStaticPageDAO$1(FileStaticPageDAO)
    //#input(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$1(FileStaticPageDAO)): Param_1
    //#input(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$1(FileStaticPageDAO)): this
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$1(FileStaticPageDAO)): this.this$0
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$1(FileStaticPageDAO)): this.this$0 == Param_1
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$1(FileStaticPageDAO)): init'ed(this.this$0)

import net.sourceforge.pebble.dao.PersistenceException;
import net.sourceforge.pebble.dao.StaticPageDAO;
import net.sourceforge.pebble.domain.Blog;
import net.sourceforge.pebble.domain.StaticPage;
import net.sourceforge.pebble.util.SecurityUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.*;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.*;

public class FileStaticPageDAO implements StaticPageDAO {

  /**
   * the log used by this class
   */
  private static Log log = LogFactory.getLog(FileStaticPageDAO.class);
    //#filestaticpagedao.java:26: method: net.sourceforge.pebble.dao.file.FileStaticPageDAO.net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init
    //#filestaticpagedao.java:26: Warning: method not available
    //#    -- call on Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#    method: net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init
    //#    unanalyzed callee: Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Descendant_Table[net/sourceforge/pebble/dao/file/FileStaticPageDAO]
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.getLockFile(Lnet/sourceforge/pebble/domain/StaticPage;)Ljava/io/File;
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.getPath(Lnet/sourceforge/pebble/domain/Blog;Ljava/lang/String;)Ljava/lang/String;
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.getUsernameHoldingLock(Lnet/sourceforge/pebble/domain/StaticPage;)Ljava/lang/String;
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.loadStaticPage(Lnet/sourceforge/pebble/domain/Blog;Ljava/io/File;)Lnet/sourceforge/pebble/domain/StaticPage;
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.loadStaticPage(Lnet/sourceforge/pebble/domain/Blog;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/StaticPage;
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.loadStaticPages(Lnet/sourceforge/pebble/domain/Blog;)Ljava/util/Collection;
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.lock(Lnet/sourceforge/pebble/domain/StaticPage;)Z
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.removeStaticPage(Lnet/sourceforge/pebble/domain/StaticPage;)V
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.storeStaticPage(Lnet/sourceforge/pebble/domain/StaticPage;)V
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.storeStaticPage(Lnet/sourceforge/pebble/domain/StaticPage;Ljava/io/File;)V
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.unlock(Lnet/sourceforge/pebble/domain/StaticPage;)Z
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): log
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): net/sourceforge/pebble/dao/StaticPageDAO.__Descendant_Table[net/sourceforge/pebble/dao/file/FileStaticPageDAO]
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Descendant_Table[net/sourceforge/pebble/dao/file/FileStaticPageDAO] == &__Dispatch_Table
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): net/sourceforge/pebble/dao/StaticPageDAO.__Descendant_Table[net/sourceforge/pebble/dao/file/FileStaticPageDAO] == &__Dispatch_Table
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.getLockFile(Lnet/sourceforge/pebble/domain/StaticPage;)Ljava/io/File; == &getLockFile
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.getPath(Lnet/sourceforge/pebble/domain/Blog;Ljava/lang/String;)Ljava/lang/String; == &getPath
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.getUsernameHoldingLock(Lnet/sourceforge/pebble/domain/StaticPage;)Ljava/lang/String; == &getUsernameHoldingLock
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.loadStaticPage(Lnet/sourceforge/pebble/domain/Blog;Ljava/io/File;)Lnet/sourceforge/pebble/domain/StaticPage; == &loadStaticPage
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.loadStaticPage(Lnet/sourceforge/pebble/domain/Blog;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/StaticPage; == &loadStaticPage
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.loadStaticPages(Lnet/sourceforge/pebble/domain/Blog;)Ljava/util/Collection; == &loadStaticPages
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.lock(Lnet/sourceforge/pebble/domain/StaticPage;)Z == &lock
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.removeStaticPage(Lnet/sourceforge/pebble/domain/StaticPage;)V == &removeStaticPage
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.storeStaticPage(Lnet/sourceforge/pebble/domain/StaticPage;)V == &storeStaticPage
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.storeStaticPage(Lnet/sourceforge/pebble/domain/StaticPage;Ljava/io/File;)V == &storeStaticPage
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): __Dispatch_Table.unlock(Lnet/sourceforge/pebble/domain/StaticPage;)Z == &unlock
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init): init'ed(log)
    //#filestaticpagedao.java:26: end of method: net.sourceforge.pebble.dao.file.FileStaticPageDAO.net.sourceforge.pebble.dao.file.FileStaticPageDAO__static_init
    //#filestaticpagedao.java:26: method: Log net.sourceforge.pebble.dao.file.FileStaticPageDAO.access$0()
    //#input(Log access$0()): log
    //#output(Log access$0()): return_value
    //#pre[1] (Log access$0()): init'ed(log)
    //#post(Log access$0()): return_value == log
    //#post(Log access$0()): init'ed(return_value)
    //#filestaticpagedao.java:26: end of method: Log net.sourceforge.pebble.dao.file.FileStaticPageDAO.access$0()

  private static final String STATIC_PAGES_DIRECTORY_NAME = "pages";
  private static final String STATIC_PAGE_FILE_EXTENSION = ".xml";
  private static final String STATIC_PAGE_LOCK_EXTENSION = ".lock";

  private JAXBContext jaxbContext;

  public FileStaticPageDAO() {
    //#filestaticpagedao.java:34: method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO.net.sourceforge.pebble.dao.file.FileStaticPageDAO()
    //#input(void net.sourceforge.pebble.dao.file.FileStaticPageDAO()): this
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO()): this.jaxbContext
    //#presumption(void net.sourceforge.pebble.dao.file.FileStaticPageDAO()): java.lang.Class:getPackage(...)@36 != null
    //#presumption(void net.sourceforge.pebble.dao.file.FileStaticPageDAO()): java.lang.Object:getClass(...)@36 != null
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO()): possibly_updated(this.jaxbContext)
    try {
      jaxbContext = JAXBContext.newInstance(getClass().getPackage().getName());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
    //#filestaticpagedao.java:40: end of method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO.net.sourceforge.pebble.dao.file.FileStaticPageDAO()

  /** the date/time format used when persisting dates */
  static final String OLD_PERSISTENT_DATETIME_FORMAT = "dd MMM yyyy HH:mm:ss z";
  static final String NEW_PERSISTENT_DATETIME_FORMAT = "dd MMM yyyy HH:mm:ss:S Z";
  static final String REGEX_FOR_YEAR = "\\d\\d\\d\\d";

  /**
   * Loads the static pages for a given blog.
   *
   * @param blog the owning Blog instance
   * @return a Collection of StaticPage instances
   * @throws net.sourceforge.pebble.dao.PersistenceException
   *          if static pages cannot be loaded
   */
  public Collection<StaticPage> loadStaticPages(Blog blog) throws PersistenceException {
    List<StaticPage> list = new ArrayList<StaticPage>();
    //#filestaticpagedao.java:56: method: Collection net.sourceforge.pebble.dao.file.FileStaticPageDAO.loadStaticPages(Blog)
    //#input(Collection loadStaticPages(Blog)): __Descendant_Table[net/sourceforge/pebble/dao/file/FileStaticPageDAO]
    //#input(Collection loadStaticPages(Blog)): __Descendant_Table[others]
    //#input(Collection loadStaticPages(Blog)): __Dispatch_Table.loadStaticPage(Lnet/sourceforge/pebble/domain/Blog;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/StaticPage;
    //#input(Collection loadStaticPages(Blog)): blog
    //#input(Collection loadStaticPages(Blog)): this
    //#input(Collection loadStaticPages(Blog)): this.__Tag
    //#output(Collection loadStaticPages(Blog)): new ArrayList(loadStaticPages#1) num objects
    //#output(Collection loadStaticPages(Blog)): return_value
    //#new obj(Collection loadStaticPages(Blog)): new ArrayList(loadStaticPages#1)
    //#pre[1] (Collection loadStaticPages(Blog)): blog != null
    //#pre[3] (Collection loadStaticPages(Blog)): (soft) this.__Tag == net/sourceforge/pebble/dao/file/FileStaticPageDAO
    //#presumption(Collection loadStaticPages(Blog)): Local_8[Local_6]@58 != null
    //#presumption(Collection loadStaticPages(Blog)): files.length@58 <= 4_294_967_295
    //#post(Collection loadStaticPages(Blog)): return_value == &new ArrayList(loadStaticPages#1)
    //#post(Collection loadStaticPages(Blog)): new ArrayList(loadStaticPages#1) num objects == 1
    //#unanalyzed(Collection loadStaticPages(Blog)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(Collection loadStaticPages(Blog)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getRoot
    //#unanalyzed(Collection loadStaticPages(Blog)): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(Collection loadStaticPages(Blog)): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(Collection loadStaticPages(Blog)): Effects-of-calling:java.io.File
    //#unanalyzed(Collection loadStaticPages(Blog)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(Collection loadStaticPages(Blog)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(Collection loadStaticPages(Blog)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(Collection loadStaticPages(Blog)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(Collection loadStaticPages(Blog)): Effects-of-calling:loadStaticPage
    //#test_vector(Collection loadStaticPages(Blog)): java.io.File:listFiles(...)@58: Addr_Set{null}, Inverse{null}
    //#test_vector(Collection loadStaticPages(Blog)): loadStaticPage(...)@88: Addr_Set{null}, Inverse{null}
    File root = new File(blog.getRoot(), STATIC_PAGES_DIRECTORY_NAME);
    //#filestaticpagedao.java:57: Warning: method not available
    //#    -- call on String net.sourceforge.pebble.domain.Blog:getRoot()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#    method: Collection loadStaticPages(Blog)
    //#    unanalyzed callee: String net.sourceforge.pebble.domain.Blog:getRoot()
    File files[] = root.listFiles(new FilenameFilter() {
    //#filestaticpagedao.java:58: end of method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO$1.net.sourceforge.pebble.dao.file.FileStaticPageDAO$1(FileStaticPageDAO)
        public boolean accept(File dir, String name) {
          return new File(dir, name).isDirectory() && name.matches("\\d+");
    //#filestaticpagedao.java:60: method: bool net.sourceforge.pebble.dao.file.FileStaticPageDAO$1.accept(File, String)
    //#input(bool accept(File, String)): dir
    //#input(bool accept(File, String)): name
    //#output(bool accept(File, String)): return_value
    //#pre[2] (bool accept(File, String)): (soft) name != null
    //#post(bool accept(File, String)): init'ed(return_value)
    //#test_vector(bool accept(File, String)): java.io.File:isDirectory(...)@60: {0}, {1}
    //#test_vector(bool accept(File, String)): java.lang.String:matches(...)@60: {0}, {1}
    //#filestaticpagedao.java:60: end of method: bool net.sourceforge.pebble.dao.file.FileStaticPageDAO$1.accept(File, String)
        }
    });
    
    if (files != null) {
      for (File file : files) {
        StaticPage staticPage = loadStaticPage(blog, file.getName());
        if (staticPage != null) {
          list.add(staticPage);
        }
      }
    }

    return list;
    //#filestaticpagedao.java:73: end of method: Collection net.sourceforge.pebble.dao.file.FileStaticPageDAO.loadStaticPages(Blog)
  }

  /**
   * Loads a specific static page.
   *
   * @param blog   the owning Blog
   * @param pageId the page ID
   * @return a StaticPage instance
   * @throws net.sourceforge.pebble.dao.PersistenceException
   *          if the static page cannot be loaded
   */
  public StaticPage loadStaticPage(Blog blog, String pageId) throws PersistenceException {
    File path = new File(getPath(blog, pageId));
    //#filestaticpagedao.java:86: method: StaticPage net.sourceforge.pebble.dao.file.FileStaticPageDAO.loadStaticPage(Blog, String)
    //#input(StaticPage loadStaticPage(Blog, String)): blog
    //#input(StaticPage loadStaticPage(Blog, String)): pageId
    //#input(StaticPage loadStaticPage(Blog, String)): this
    //#output(StaticPage loadStaticPage(Blog, String)): return_value
    //#pre[1] (StaticPage loadStaticPage(Blog, String)): blog != null
    //#post(StaticPage loadStaticPage(Blog, String)): init'ed(return_value)
    //#unanalyzed(StaticPage loadStaticPage(Blog, String)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(StaticPage loadStaticPage(Blog, String)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getRoot
    //#unanalyzed(StaticPage loadStaticPage(Blog, String)): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(StaticPage loadStaticPage(Blog, String)): Effects-of-calling:java.lang.StringBuffer:toString
    File file = new File(path, pageId + STATIC_PAGE_FILE_EXTENSION);
    return loadStaticPage(blog, file);
    //#filestaticpagedao.java:88: Warning: method not available
    //#    -- call on StaticPage loadStaticPage(Blog, File)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#    method: StaticPage loadStaticPage(Blog, String)
    //#    unanalyzed callee: StaticPage loadStaticPage(Blog, File)
    //#filestaticpagedao.java:88: end of method: StaticPage net.sourceforge.pebble.dao.file.FileStaticPageDAO.loadStaticPage(Blog, String)
  }

  /**
   * Loads a static page from the specified file.
   *
   * @param blog      the Blog to which the static page belongs
   * @param source    the File pointing to the source
   * @return    a StaticPage instance
   * @throws net.sourceforge.pebble.dao.PersistenceException
   *          if the static page can't be loaded
   */
  private StaticPage loadStaticPage(Blog blog, File source) throws PersistenceException {
    if (source.exists()) {
      log.debug("Loading static page from " + source.getAbsolutePath());
      StaticPage staticPage = new StaticPage(blog);

      try {
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        JAXBElement<StaticPageType> controller = (JAXBElement)unmarshaller.unmarshal(source);
        StaticPageType spt = controller.getValue();

        staticPage.setTitle(spt.getTitle());
        staticPage.setSubtitle(spt.getSubtitle());
        staticPage.setBody(spt.getBody());
        staticPage.setTags(spt.getTags());
        staticPage.setAuthor(spt.getAuthor());
        staticPage.setOriginalPermalink(spt.getOriginalPermalink());
        staticPage.setName(spt.getStaticName());
        StaticPageDateConverter converter = new StaticPageDateConverter(staticPage);
        staticPage.setDate(converter.parse(spt.getDate()));
        staticPage.setTemplate(spt.getTemplate());

      } catch (Exception e) {
        log.error(e.getMessage(), e);
        e.printStackTrace();
        throw new PersistenceException(e.getMessage());
      }

      // and is the page locked?
      staticPage.setLockedBy(getUsernameHoldingLock(staticPage));

      return staticPage;
    } else {
      return null;
    }
  }

  /**
   * Stores the specified static page.
   *
   * @param staticPage the static page to store
   * @throws net.sourceforge.pebble.dao.PersistenceException
   *          if something goes wrong storing the static page
   */
  public void storeStaticPage(StaticPage staticPage) throws PersistenceException {
    File outputDir = new File(getPath(staticPage.getBlog(), staticPage.getId()));
    //#filestaticpagedao.java:144: method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO.storeStaticPage(StaticPage)
    //#input(void storeStaticPage(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[net/sourceforge/pebble/domain/StaticPage]
    //#input(void storeStaticPage(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[others]
    //#input(void storeStaticPage(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getBlog()Lnet/sourceforge/pebble/domain/Blog;
    //#input(void storeStaticPage(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void storeStaticPage(StaticPage)): staticPage
    //#input(void storeStaticPage(StaticPage)): staticPage.__Tag
    //#input(void storeStaticPage(StaticPage)): staticPage.blog
    //#input(void storeStaticPage(StaticPage)): staticPage.id
    //#input(void storeStaticPage(StaticPage)): this
    //#pre[1] (void storeStaticPage(StaticPage)): staticPage != null
    //#pre[2] (void storeStaticPage(StaticPage)): staticPage.__Tag == net/sourceforge/pebble/domain/StaticPage
    //#pre[3] (void storeStaticPage(StaticPage)): staticPage.blog != null
    //#pre[4] (void storeStaticPage(StaticPage)): init'ed(staticPage.id)
    //#unanalyzed(void storeStaticPage(StaticPage)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void storeStaticPage(StaticPage)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getRoot
    //#unanalyzed(void storeStaticPage(StaticPage)): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(void storeStaticPage(StaticPage)): Effects-of-calling:java.lang.StringBuffer:toString
    //#test_vector(void storeStaticPage(StaticPage)): java.io.File:exists(...)@145: {1}, {0}
    if (!outputDir.exists()) {
      outputDir.mkdirs();
    }

    File outputFile = new File(outputDir, staticPage.getId() + STATIC_PAGE_FILE_EXTENSION);
    storeStaticPage(staticPage, outputFile);
    //#filestaticpagedao.java:150: Warning: method not available
    //#    -- call on void storeStaticPage(StaticPage, File)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#    method: void storeStaticPage(StaticPage)
    //#    unanalyzed callee: void storeStaticPage(StaticPage, File)
  }
    //#filestaticpagedao.java:151: end of method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO.storeStaticPage(StaticPage)

  /**
   * Stores a static page to the specified file.
   *
   * @param staticPage    the StaticPage that is being stored
   * @param destination the File pointing to the destination
   * @throws PersistenceException if something goes wrong storing the static page
   */
  private void storeStaticPage(StaticPage staticPage, File destination) throws PersistenceException {
    try {
      Marshaller marshaller = jaxbContext.createMarshaller();
      StaticPageType type = new StaticPageType();

      type.setTitle(staticPage.getTitle());
      type.setSubtitle(staticPage.getSubtitle());
      type.setBody(staticPage.getBody());
      type.setTags(staticPage.getTags());
      type.setAuthor(staticPage.getAuthor());
      type.setStaticName(staticPage.getName());
      type.setOriginalPermalink(staticPage.getOriginalPermalink());
      type.setState(ContentState.PUBLISHED);
      type.setTitle(staticPage.getTitle());
      type.setTemplate(staticPage.getTemplate());

      StaticPageDateConverter converter = new StaticPageDateConverter(staticPage);
      type.setDate(converter.format(staticPage.getDate()));

      // now take a backup of the correct file
      if (destination.exists() && destination.length() > 0) {
        removeStaticPage(staticPage); // this archives the current version
      }

      log.debug("Saving to " + destination.getAbsolutePath());
      ObjectFactory objectFactory = new ObjectFactory();
      JAXBElement jaxbElement = objectFactory.createStaticPage(type);

      marshaller.setProperty("jaxb.formatted.output", true);
      marshaller.setProperty("jaxb.encoding", staticPage.getBlog().getCharacterEncoding());
      FileWriter writer = new FileWriter(destination);
      marshaller.marshal(jaxbElement, writer);
      writer.flush();
      writer.close();
    } catch (Exception e) {
      log.error(e.getMessage(), e);
      e.printStackTrace();
      throw new PersistenceException(e.getMessage());
    }
  }

  /**
   * Removes the specified static page.
   *
   * @param staticPage the static page to remove
   * @throws net.sourceforge.pebble.dao.PersistenceException
   *          if something goes wrong removing the page
   */
  public void removeStaticPage(StaticPage staticPage) throws PersistenceException {
    File path = new File(getPath(staticPage.getBlog(), staticPage.getId()));
    //#filestaticpagedao.java:209: method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO.removeStaticPage(StaticPage)
    //#input(void removeStaticPage(StaticPage)): log
    //#input(void removeStaticPage(StaticPage)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void removeStaticPage(StaticPage)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[others]
    //#input(void removeStaticPage(StaticPage)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void removeStaticPage(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[net/sourceforge/pebble/domain/StaticPage]
    //#input(void removeStaticPage(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[others]
    //#input(void removeStaticPage(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getBlog()Lnet/sourceforge/pebble/domain/Blog;
    //#input(void removeStaticPage(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getGuid()Ljava/lang/String;
    //#input(void removeStaticPage(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void removeStaticPage(StaticPage)): staticPage
    //#input(void removeStaticPage(StaticPage)): staticPage.__Tag
    //#input(void removeStaticPage(StaticPage)): staticPage.blog
    //#input(void removeStaticPage(StaticPage)): staticPage.blog.__Tag
    //#input(void removeStaticPage(StaticPage)): staticPage.blog.id
    //#input(void removeStaticPage(StaticPage)): staticPage.id
    //#input(void removeStaticPage(StaticPage)): this
    //#pre[1] (void removeStaticPage(StaticPage)): log != null
    //#pre[2] (void removeStaticPage(StaticPage)): staticPage != null
    //#pre[3] (void removeStaticPage(StaticPage)): staticPage.__Tag == net/sourceforge/pebble/domain/StaticPage
    //#pre[4] (void removeStaticPage(StaticPage)): staticPage.blog != null
    //#pre[5] (void removeStaticPage(StaticPage)): staticPage.blog.__Tag == net/sourceforge/pebble/domain/Blog
    //#pre[6] (void removeStaticPage(StaticPage)): init'ed(staticPage.blog.id)
    //#pre[7] (void removeStaticPage(StaticPage)): init'ed(staticPage.id)
    //#presumption(void removeStaticPage(StaticPage)): java.io.File:renameTo(...)@230 == 1
    //#unanalyzed(void removeStaticPage(StaticPage)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void removeStaticPage(StaticPage)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getRoot
    //#unanalyzed(void removeStaticPage(StaticPage)): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(void removeStaticPage(StaticPage)): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void removeStaticPage(StaticPage)): Effects-of-calling:getBlog
    //#unanalyzed(void removeStaticPage(StaticPage)): Effects-of-calling:getId
    //#unanalyzed(void removeStaticPage(StaticPage)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void removeStaticPage(StaticPage)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void removeStaticPage(StaticPage)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void removeStaticPage(StaticPage)): Effects-of-calling:java.lang.Exception
    //#test_vector(void removeStaticPage(StaticPage)): java.io.File:exists(...)@218: {0}, {1}
    //#test_vector(void removeStaticPage(StaticPage)): java.io.File:exists(...)@225: {0}, {1}
    File file = new File(path, staticPage.getId() + STATIC_PAGE_FILE_EXTENSION);
    log.debug("Removing " + staticPage.getGuid());
    //#filestaticpagedao.java:211: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#    method: void removeStaticPage(StaticPage)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)

    // for archive purposes, the current version of the file will be saved with
    // the timestamp as the extension
    SimpleDateFormat archiveFileExtension = new SimpleDateFormat("yyyyMMdd-HHmmss");
    archiveFileExtension.setTimeZone(staticPage.getBlog().getTimeZone());
    //#filestaticpagedao.java:216: Warning: method not available
    //#    -- call on TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#    method: void removeStaticPage(StaticPage)
    //#    unanalyzed callee: TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
    Date date = new Date();
    if (file.exists()) {
      date = new Date(file.lastModified());
    }
    File backupFile = new File(
        file.getParentFile(),
        file.getName() + "." + archiveFileExtension.format(date));

    if (backupFile.exists()) {
      backupFile.delete();
    }

    log.debug("Archiving current version to " + backupFile.getAbsolutePath());
    //#filestaticpagedao.java:229: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#    method: void removeStaticPage(StaticPage)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
    boolean success = file.renameTo(backupFile);

    if (!success) {
      throw new PersistenceException("Deletion of " + staticPage.getGuid() + " failed");
    }
  }
    //#filestaticpagedao.java:235: end of method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO.removeStaticPage(StaticPage)

  /**
   * Given a blog and static page ID, this method determines the path where
   * that static page is stored.
   *
   * @param blog    the owning Blog
   * @param staticPageId   the ID of the static page
   * @return  a String of the form blogroot/yyyy/MM/dd
   */
  private String getPath(Blog blog, String staticPageId) {
    StringBuffer buf = new StringBuffer();
    //#filestaticpagedao.java:246: method: String net.sourceforge.pebble.dao.file.FileStaticPageDAO.getPath(Blog, String)
    //#input(String getPath(Blog, String)): blog
    //#input(String getPath(Blog, String)): java.io.File.separator
    //#input(String getPath(Blog, String)): staticPageId
    //#output(String getPath(Blog, String)): return_value
    //#pre[1] (String getPath(Blog, String)): blog != null
    //#presumption(String getPath(Blog, String)): init'ed(java.io.File.separator)
    //#post(String getPath(Blog, String)): return_value != null
    buf.append(blog.getRoot());
    //#filestaticpagedao.java:247: Warning: method not available
    //#    -- call on String net.sourceforge.pebble.domain.Blog:getRoot()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#    method: String getPath(Blog, String)
    //#    unanalyzed callee: String net.sourceforge.pebble.domain.Blog:getRoot()
    buf.append(File.separator);
    buf.append("pages");
    buf.append(File.separator);
    buf.append(staticPageId);

    return buf.toString();
    //#filestaticpagedao.java:253: end of method: String net.sourceforge.pebble.dao.file.FileStaticPageDAO.getPath(Blog, String)
  }

  /**
   * Locks the specified static page.
   *
   * @param staticPage the static page to lock
   * @return  true if the page could be locked, false otherwise
   */
  public boolean lock(StaticPage staticPage) {
    File lockFile = getLockFile(staticPage);
    //#filestaticpagedao.java:263: method: bool net.sourceforge.pebble.dao.file.FileStaticPageDAO.lock(StaticPage)
    //#input(bool lock(StaticPage)): log
    //#input(bool lock(StaticPage)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(bool lock(StaticPage)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[others]
    //#input(bool lock(StaticPage)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(bool lock(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[net/sourceforge/pebble/domain/StaticPage]
    //#input(bool lock(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[others]
    //#input(bool lock(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getBlog()Lnet/sourceforge/pebble/domain/Blog;
    //#input(bool lock(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getGuid()Ljava/lang/String;
    //#input(bool lock(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(bool lock(StaticPage)): staticPage
    //#input(bool lock(StaticPage)): staticPage.__Tag
    //#input(bool lock(StaticPage)): staticPage.blog
    //#input(bool lock(StaticPage)): staticPage.blog.__Tag
    //#input(bool lock(StaticPage)): staticPage.blog.id
    //#input(bool lock(StaticPage)): staticPage.id
    //#input(bool lock(StaticPage)): this
    //#output(bool lock(StaticPage)): return_value
    //#pre[4] (bool lock(StaticPage)): staticPage.blog != null
    //#pre[7] (bool lock(StaticPage)): init'ed(staticPage.id)
    //#pre[1] (bool lock(StaticPage)): (soft) log != null
    //#pre[2] (bool lock(StaticPage)): (soft) staticPage != null
    //#pre[3] (bool lock(StaticPage)): (soft) staticPage.__Tag == net/sourceforge/pebble/domain/StaticPage
    //#pre[5] (bool lock(StaticPage)): (soft) staticPage.blog.__Tag == net/sourceforge/pebble/domain/Blog
    //#pre[6] (bool lock(StaticPage)): (soft) init'ed(staticPage.blog.id)
    //#post(bool lock(StaticPage)): init'ed(return_value)
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getRoot
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:java.io.File
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:getLockFile
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:java.io.FileReader
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:java.io.BufferedReader:readLine
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:java.io.BufferedReader:close
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:org.apache.commons.logging.Log:warn
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:getBlog
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:getId
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool lock(StaticPage)): Effects-of-calling:java.lang.StringBuilder:toString
    //#test_vector(bool lock(StaticPage)): java.io.File:createNewFile(...)@265: {0}, {1}
    //#test_vector(bool lock(StaticPage)): java.lang.String:equals(...)@274: {0}, {1}
    try {
      boolean success = lockFile.createNewFile();
      if (success) {
        FileWriter writer = new FileWriter(lockFile);
        writer.write(SecurityUtils.getUsername());
    //#filestaticpagedao.java:268: Warning: method not available
    //#    -- call on String net.sourceforge.pebble.util.SecurityUtils:getUsername()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#    method: bool lock(StaticPage)
    //#    unanalyzed callee: String net.sourceforge.pebble.util.SecurityUtils:getUsername()
        writer.flush();
        writer.close();
        return true;
      } else {
        String lockedBy = getUsernameHoldingLock(staticPage);
        return (lockedBy != null && lockedBy.equals(SecurityUtils.getUsername()));
    //#filestaticpagedao.java:274: Warning: method not available
    //#    -- call on String net.sourceforge.pebble.util.SecurityUtils:getUsername()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#    method: bool lock(StaticPage)
    //#    unanalyzed callee: String net.sourceforge.pebble.util.SecurityUtils:getUsername()
      }
    } catch (IOException e) {
      log.warn("Exceptoin while attempting to lock static page " + staticPage.getGuid(), e);
    //#filestaticpagedao.java:277: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:warn(Object, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#    method: bool lock(StaticPage)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:warn(Object, Throwable)
    }

    return false;
    //#filestaticpagedao.java:280: end of method: bool net.sourceforge.pebble.dao.file.FileStaticPageDAO.lock(StaticPage)
  }

  /**
   * Unlocks the specified static page.
   *
   * @param staticPage the static page to unlock
   * @return true if the page could be unlocked, false otherwise
   */
  public boolean unlock(StaticPage staticPage) {
    File lockFile = getLockFile(staticPage);
    //#filestaticpagedao.java:290: method: bool net.sourceforge.pebble.dao.file.FileStaticPageDAO.unlock(StaticPage)
    //#input(bool unlock(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[net/sourceforge/pebble/domain/StaticPage]
    //#input(bool unlock(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[others]
    //#input(bool unlock(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getBlog()Lnet/sourceforge/pebble/domain/Blog;
    //#input(bool unlock(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(bool unlock(StaticPage)): staticPage
    //#input(bool unlock(StaticPage)): staticPage.__Tag
    //#input(bool unlock(StaticPage)): staticPage.blog
    //#input(bool unlock(StaticPage)): staticPage.id
    //#input(bool unlock(StaticPage)): this
    //#output(bool unlock(StaticPage)): return_value
    //#pre[1] (bool unlock(StaticPage)): staticPage != null
    //#pre[2] (bool unlock(StaticPage)): staticPage.__Tag == net/sourceforge/pebble/domain/StaticPage
    //#pre[3] (bool unlock(StaticPage)): staticPage.blog != null
    //#pre[4] (bool unlock(StaticPage)): init'ed(staticPage.id)
    //#post(bool unlock(StaticPage)): init'ed(return_value)
    //#unanalyzed(bool unlock(StaticPage)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(bool unlock(StaticPage)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getRoot
    //#unanalyzed(bool unlock(StaticPage)): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(bool unlock(StaticPage)): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(bool unlock(StaticPage)): Effects-of-calling:java.io.File
    //#unanalyzed(bool unlock(StaticPage)): Effects-of-calling:getBlog
    //#unanalyzed(bool unlock(StaticPage)): Effects-of-calling:getId
    //#test_vector(bool unlock(StaticPage)): java.io.File:exists(...)@291: {0}, {1}
    if (lockFile.exists()) {
      return lockFile.delete();
    } else {
      return true;
    //#filestaticpagedao.java:294: end of method: bool net.sourceforge.pebble.dao.file.FileStaticPageDAO.unlock(StaticPage)
    }
  }

  /**
   * Given a static page, this method determines the path where
   * that static page is stored.
   *
   * @param staticPage    a StaticPage instance
   * @return  a File instance, representing a lock
   */
  private File getLockFile(StaticPage staticPage) {
    StringBuffer buf = new StringBuffer();
    //#filestaticpagedao.java:306: method: File net.sourceforge.pebble.dao.file.FileStaticPageDAO.getLockFile(StaticPage)
    //#input(File getLockFile(StaticPage)): java.io.File.separator
    //#input(File getLockFile(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[net/sourceforge/pebble/domain/StaticPage]
    //#input(File getLockFile(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[others]
    //#input(File getLockFile(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getBlog()Lnet/sourceforge/pebble/domain/Blog;
    //#input(File getLockFile(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(File getLockFile(StaticPage)): staticPage
    //#input(File getLockFile(StaticPage)): staticPage.__Tag
    //#input(File getLockFile(StaticPage)): staticPage.blog
    //#input(File getLockFile(StaticPage)): staticPage.id
    //#output(File getLockFile(StaticPage)): new File(getLockFile#2) num objects
    //#output(File getLockFile(StaticPage)): return_value
    //#new obj(File getLockFile(StaticPage)): new File(getLockFile#2)
    //#pre[1] (File getLockFile(StaticPage)): staticPage != null
    //#pre[2] (File getLockFile(StaticPage)): staticPage.__Tag == net/sourceforge/pebble/domain/StaticPage
    //#pre[3] (File getLockFile(StaticPage)): staticPage.blog != null
    //#pre[4] (File getLockFile(StaticPage)): init'ed(staticPage.id)
    //#presumption(File getLockFile(StaticPage)): init'ed(java.io.File.separator)
    //#post(File getLockFile(StaticPage)): return_value == &new File(getLockFile#2)
    //#post(File getLockFile(StaticPage)): new File(getLockFile#2) num objects == 1
    buf.append(staticPage.getBlog().getRoot());
    //#filestaticpagedao.java:307: Warning: method not available
    //#    -- call on String net.sourceforge.pebble.domain.Blog:getRoot()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#    method: File getLockFile(StaticPage)
    //#    unanalyzed callee: String net.sourceforge.pebble.domain.Blog:getRoot()
    buf.append(File.separator);
    buf.append(STATIC_PAGES_DIRECTORY_NAME);
    buf.append(File.separator);
    buf.append(staticPage.getId());
    buf.append(STATIC_PAGE_LOCK_EXTENSION);

    return new File(buf.toString());
    //#filestaticpagedao.java:314: end of method: File net.sourceforge.pebble.dao.file.FileStaticPageDAO.getLockFile(StaticPage)
  }

  private String getUsernameHoldingLock(StaticPage staticPage) {
    String username = null;
    //#filestaticpagedao.java:318: method: String net.sourceforge.pebble.dao.file.FileStaticPageDAO.getUsernameHoldingLock(StaticPage)
    //#input(String getUsernameHoldingLock(StaticPage)): log
    //#input(String getUsernameHoldingLock(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[net/sourceforge/pebble/domain/StaticPage]
    //#input(String getUsernameHoldingLock(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[others]
    //#input(String getUsernameHoldingLock(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getBlog()Lnet/sourceforge/pebble/domain/Blog;
    //#input(String getUsernameHoldingLock(StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(String getUsernameHoldingLock(StaticPage)): staticPage
    //#input(String getUsernameHoldingLock(StaticPage)): staticPage.__Tag
    //#input(String getUsernameHoldingLock(StaticPage)): staticPage.blog
    //#input(String getUsernameHoldingLock(StaticPage)): staticPage.id
    //#input(String getUsernameHoldingLock(StaticPage)): this
    //#output(String getUsernameHoldingLock(StaticPage)): return_value
    //#pre[1] (String getUsernameHoldingLock(StaticPage)): (soft) log != null
    //#pre[2] (String getUsernameHoldingLock(StaticPage)): (soft) staticPage != null
    //#pre[3] (String getUsernameHoldingLock(StaticPage)): (soft) staticPage.__Tag == net/sourceforge/pebble/domain/StaticPage
    //#pre[4] (String getUsernameHoldingLock(StaticPage)): (soft) staticPage.blog != null
    //#pre[5] (String getUsernameHoldingLock(StaticPage)): (soft) init'ed(staticPage.id)
    //#post(String getUsernameHoldingLock(StaticPage)): init'ed(return_value)
    //#unanalyzed(String getUsernameHoldingLock(StaticPage)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(String getUsernameHoldingLock(StaticPage)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getRoot
    //#unanalyzed(String getUsernameHoldingLock(StaticPage)): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(String getUsernameHoldingLock(StaticPage)): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(String getUsernameHoldingLock(StaticPage)): Effects-of-calling:java.io.File
    //#unanalyzed(String getUsernameHoldingLock(StaticPage)): Effects-of-calling:getBlog
    //#unanalyzed(String getUsernameHoldingLock(StaticPage)): Effects-of-calling:getId
    //#test_vector(String getUsernameHoldingLock(StaticPage)): java.io.File:exists(...)@321: {0}, {1}
    try {
      File lockFile = getLockFile(staticPage);
      if (lockFile.exists()) {
        BufferedReader reader = new BufferedReader(new FileReader(lockFile));
        username = reader.readLine();
        reader.close();
      }
    } catch (IOException ioe) {
      log.warn("Error reading lock file", ioe);
    //#filestaticpagedao.java:327: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:warn(Object, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
    //#    method: String getUsernameHoldingLock(StaticPage)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:warn(Object, Throwable)
    }

    return username;
    //#filestaticpagedao.java:330: end of method: String net.sourceforge.pebble.dao.file.FileStaticPageDAO.getUsernameHoldingLock(StaticPage)
  }

  class StaticPageDateConverter {

    private SimpleDateFormat dateTimeFormats[];

    StaticPageDateConverter(StaticPage staticPage) {
      // create all date/time formats, for backwards compatibility
      SimpleDateFormat format;
      dateTimeFormats = new SimpleDateFormat[6];

      format = new SimpleDateFormat(FileBlogEntryDAO.NEW_PERSISTENT_DATETIME_FORMAT, Locale.ENGLISH);
      format.setTimeZone(staticPage.getBlog().getTimeZone());
    //#filestaticpagedao.java:343: Warning: method not available
    //#    -- call on TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter
    //#    method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)
    //#    unanalyzed callee: TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
      dateTimeFormats[0] = format;

      format = new SimpleDateFormat(FileBlogEntryDAO.NEW_PERSISTENT_DATETIME_FORMAT, staticPage.getBlog().getLocale());
    //#filestaticpagedao.java:346: Warning: method not available
    //#    -- call on Locale net.sourceforge.pebble.domain.Blog:getLocale()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter
    //#    method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)
    //#    unanalyzed callee: Locale net.sourceforge.pebble.domain.Blog:getLocale()
      format.setTimeZone(staticPage.getBlog().getTimeZone());
    //#filestaticpagedao.java:347: Warning: method not available
    //#    -- call on TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter
    //#    method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)
    //#    unanalyzed callee: TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
      dateTimeFormats[1] = format;

      format = new SimpleDateFormat(FileBlogEntryDAO.NEW_PERSISTENT_DATETIME_FORMAT);
      format.setTimeZone(staticPage.getBlog().getTimeZone());
    //#filestaticpagedao.java:351: Warning: method not available
    //#    -- call on TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter
    //#    method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)
    //#    unanalyzed callee: TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
      dateTimeFormats[2] = format;

      format = new SimpleDateFormat(FileBlogEntryDAO.OLD_PERSISTENT_DATETIME_FORMAT, Locale.ENGLISH);
      format.setTimeZone(staticPage.getBlog().getTimeZone());
    //#filestaticpagedao.java:355: Warning: method not available
    //#    -- call on TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter
    //#    method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)
    //#    unanalyzed callee: TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
      dateTimeFormats[3] = format;

      format = new SimpleDateFormat(FileBlogEntryDAO.OLD_PERSISTENT_DATETIME_FORMAT, staticPage.getBlog().getLocale());
    //#filestaticpagedao.java:358: Warning: method not available
    //#    -- call on Locale net.sourceforge.pebble.domain.Blog:getLocale()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter
    //#    method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)
    //#    unanalyzed callee: Locale net.sourceforge.pebble.domain.Blog:getLocale()
      format.setTimeZone(staticPage.getBlog().getTimeZone());
    //#filestaticpagedao.java:359: Warning: method not available
    //#    -- call on TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter
    //#    method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)
    //#    unanalyzed callee: TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
      dateTimeFormats[4] = format;

      format = new SimpleDateFormat(FileBlogEntryDAO.OLD_PERSISTENT_DATETIME_FORMAT);
      format.setTimeZone(staticPage.getBlog().getTimeZone());
    //#filestaticpagedao.java:363: Warning: method not available
    //#    -- call on TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter
    //#    method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)
    //#    unanalyzed callee: TimeZone net.sourceforge.pebble.domain.Blog:getTimeZone()
      dateTimeFormats[5] = format;
    }
    //#filestaticpagedao.java:365: method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter.net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)
    //#input(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): Param_1
    //#input(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): java.util.Locale.ENGLISH
    //#input(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[net/sourceforge/pebble/domain/StaticPage]
    //#input(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Descendant_Table[others]
    //#input(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getBlog()Lnet/sourceforge/pebble/domain/Blog;
    //#input(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): staticPage
    //#input(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): staticPage.__Tag
    //#input(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): staticPage.blog
    //#input(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#2) num objects
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#3) num objects
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#4) num objects
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#5) num objects
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#6) num objects
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#7) num objects
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat[](FileStaticPageDAO$StaticPageDateConverter#1) num objects
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats.length
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats[0]
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats[1]
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats[2]
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats[3]
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats[4]
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats[5]
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats
    //#output(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.this$0
    //#new obj(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#2)
    //#new obj(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#3)
    //#new obj(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#4)
    //#new obj(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#5)
    //#new obj(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#6)
    //#new obj(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#7)
    //#new obj(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat[](FileStaticPageDAO$StaticPageDateConverter#1)
    //#pre[2] (void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): staticPage != null
    //#pre[3] (void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): staticPage.__Tag == net/sourceforge/pebble/domain/StaticPage
    //#pre[4] (void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): staticPage.blog != null
    //#presumption(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): init'ed(java.util.Locale.ENGLISH)
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats == &new SimpleDateFormat[](FileStaticPageDAO$StaticPageDateConverter#1)
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.this$0 == Param_1
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): init'ed(this.this$0)
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#2) num objects == 1
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#3) num objects == 1
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#4) num objects == 1
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#5) num objects == 1
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#6) num objects == 1
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#7) num objects == 1
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): new SimpleDateFormat[](FileStaticPageDAO$StaticPageDateConverter#1) num objects == 1
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats.length == 6
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats[0] == &new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#2)
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats[1] == &new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#3)
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats[2] == &new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#4)
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats[3] == &new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#5)
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats[4] == &new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#6)
    //#post(void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)): this.dateTimeFormats[5] == &new SimpleDateFormat(FileStaticPageDAO$StaticPageDateConverter#7)
    //#filestaticpagedao.java:365: end of method: void net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter.net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter(FileStaticPageDAO, StaticPage)

    Date parse(String s) {
      for (DateFormat dateTimeFormat : dateTimeFormats) {
    //#filestaticpagedao.java:368: method: Date net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter.parse(String)
    //#input(Date parse(String)): net/sourceforge/pebble/dao/file/FileStaticPageDAO.log
    //#input(Date parse(String)): s
    //#input(Date parse(String)): this
    //#input(Date parse(String)): this.dateTimeFormats
    //#input(Date parse(String)): this.dateTimeFormats.length
    //#input(Date parse(String)): this.dateTimeFormats[0..4_294_967_294]
    //#output(Date parse(String)): return_value
    //#pre[4] (Date parse(String)): this.dateTimeFormats != null
    //#pre[5] (Date parse(String)): this.dateTimeFormats.length <= 4_294_967_295
    //#pre[1] (Date parse(String)): (soft) net/sourceforge/pebble/dao/file/FileStaticPageDAO.log != null
    //#pre[6] (Date parse(String)): (soft) this.dateTimeFormats[0..4_294_967_294] != null
    //#post(Date parse(String)): init'ed(return_value)
        try {
          return dateTimeFormat.parse(s);
        } catch (ParseException pe) {
          // do nothing, just try the next one
        }
      }

      log.error("Could not parse date of " + s);
    //#filestaticpagedao.java:376: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:error(Object)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter
    //#    method: Date parse(String)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:error(Object)
      return null;
    //#filestaticpagedao.java:377: end of method: Date net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter.parse(String)
    }

    String format(Date date) {
      return dateTimeFormats[0].format(date);
    //#filestaticpagedao.java:381: method: String net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter.format(Date)
    //#input(String format(Date)): date
    //#input(String format(Date)): this
    //#input(String format(Date)): this.dateTimeFormats
    //#input(String format(Date)): this.dateTimeFormats.length
    //#input(String format(Date)): this.dateTimeFormats[0]
    //#output(String format(Date)): return_value
    //#pre[3] (String format(Date)): this.dateTimeFormats != null
    //#pre[4] (String format(Date)): this.dateTimeFormats.length >= 1
    //#pre[5] (String format(Date)): this.dateTimeFormats[0] != null
    //#post(String format(Date)): init'ed(return_value)
    //#filestaticpagedao.java:381: end of method: String net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter.format(Date)
    }

  }

}    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter__static_init): __Descendant_Table[net/sourceforge/pebble/dao/file/FileStaticPageDAO$StaticPageDateConverter]
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter__static_init): __Dispatch_Table.format(Ljava/util/Date;)Ljava/lang/String;
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter__static_init): __Dispatch_Table.parse(Ljava/lang/String;)Ljava/util/Date;
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter__static_init): __Descendant_Table[net/sourceforge/pebble/dao/file/FileStaticPageDAO$StaticPageDateConverter] == &__Dispatch_Table
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter__static_init): __Dispatch_Table.format(Ljava/util/Date;)Ljava/lang/String; == &format
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter__static_init): __Dispatch_Table.parse(Ljava/lang/String;)Ljava/util/Date; == &parse
    //#filestaticpagedao.java:: end of method: net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter.net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter__static_init
    //#filestaticpagedao.java:: end of class: net.sourceforge.pebble.dao.file.FileStaticPageDAO$StaticPageDateConverter
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO$1__static_init): __Descendant_Table[net/sourceforge/pebble/dao/file/FileStaticPageDAO$1]
    //#output(net.sourceforge.pebble.dao.file.FileStaticPageDAO$1__static_init): __Dispatch_Table.accept(Ljava/io/File;Ljava/lang/String;)Z
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO$1__static_init): __Descendant_Table[net/sourceforge/pebble/dao/file/FileStaticPageDAO$1] == &__Dispatch_Table
    //#post(net.sourceforge.pebble.dao.file.FileStaticPageDAO$1__static_init): __Dispatch_Table.accept(Ljava/io/File;Ljava/lang/String;)Z == &accept
    //#filestaticpagedao.java:: end of method: net.sourceforge.pebble.dao.file.FileStaticPageDAO$1.net.sourceforge.pebble.dao.file.FileStaticPageDAO$1__static_init
    //#filestaticpagedao.java:: end of class: net.sourceforge.pebble.dao.file.FileStaticPageDAO$1
    //#filestaticpagedao.java:: end of class: net.sourceforge.pebble.dao.file.FileStaticPageDAO
