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

import net.sourceforge.pebble.comparator.FileMetaDataComparator;
import net.sourceforge.pebble.util.FileUtils;
import net.sourceforge.pebble.PebbleContext;

import java.io.*;
import java.util.*;

/**
 * Encapsulates methods for managing and manipulating files under the
 * following locations:
 * <ul>
 * <li>${blog.dir}/images</li>
 * <li>${blog.dir}/files</li>
 * <li>${editableTheme}</li>
 * </ul>
 *
 * @author Simon Brown
 */
public class FileManager {

  /** the type of files being managed */
  private String type;

  /** the root directory for the particular file type */
  private File root;

  /**
   * Creates a new instande for the specified blog and type.
   *
   * @param blog    the blog that this manager refers to
   * @param type    the type of files to manage
   */
  public FileManager(Blog blog, String type) {
    //#filemanager.java:66: method: void net.sourceforge.pebble.domain.FileManager.net.sourceforge.pebble.domain.FileManager(Blog, String)
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): blog
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): blog.__Tag
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): blog.editableTheme
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): blog.editableTheme.__Tag
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): blog.editableTheme.name
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): blog.editableTheme.pathToLiveThemes
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): blog.root
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/AbstractBlog.__Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/AbstractBlog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/AbstractBlog.__Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/AbstractBlog.__Descendant_Table[others]
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/AbstractBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[others]
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getEditableTheme()Lnet/sourceforge/pebble/domain/Theme;
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getFilesDirectory()Ljava/lang/String;
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getImagesDirectory()Ljava/lang/String;
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/Theme.__Descendant_Table[net/sourceforge/pebble/domain/Theme]
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/Theme.__Descendant_Table[others]
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): net/sourceforge/pebble/domain/Theme.__Dispatch_Table.getPathToLiveTheme()Ljava/io/File;
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): this
    //#input(void net.sourceforge.pebble.domain.FileManager(Blog, String)): type
    //#output(void net.sourceforge.pebble.domain.FileManager(Blog, String)): new File(FileManager#1) num objects
    //#output(void net.sourceforge.pebble.domain.FileManager(Blog, String)): new File(FileManager#2) num objects
    //#output(void net.sourceforge.pebble.domain.FileManager(Blog, String)): new File(FileManager#3) num objects
    //#output(void net.sourceforge.pebble.domain.FileManager(Blog, String)): new File(getPathToLiveTheme#1) num objects
    //#output(void net.sourceforge.pebble.domain.FileManager(Blog, String)): this.root
    //#output(void net.sourceforge.pebble.domain.FileManager(Blog, String)): this.type
    //#new obj(void net.sourceforge.pebble.domain.FileManager(Blog, String)): new File(FileManager#1)
    //#new obj(void net.sourceforge.pebble.domain.FileManager(Blog, String)): new File(FileManager#2)
    //#new obj(void net.sourceforge.pebble.domain.FileManager(Blog, String)): new File(FileManager#3)
    //#new obj(void net.sourceforge.pebble.domain.FileManager(Blog, String)): new File(getPathToLiveTheme#1)
    //#pre[1] (void net.sourceforge.pebble.domain.FileManager(Blog, String)): blog != null
    //#pre[2] (void net.sourceforge.pebble.domain.FileManager(Blog, String)): blog.__Tag == net/sourceforge/pebble/domain/Blog
    //#pre[9] (void net.sourceforge.pebble.domain.FileManager(Blog, String)): type != null
    //#pre[3] (void net.sourceforge.pebble.domain.FileManager(Blog, String)): (soft) blog.editableTheme != null
    //#pre[4] (void net.sourceforge.pebble.domain.FileManager(Blog, String)): (soft) blog.editableTheme.__Tag == net/sourceforge/pebble/domain/Theme
    //#pre[5] (void net.sourceforge.pebble.domain.FileManager(Blog, String)): (soft) init'ed(blog.editableTheme.name)
    //#pre[6] (void net.sourceforge.pebble.domain.FileManager(Blog, String)): (soft) init'ed(blog.editableTheme.pathToLiveThemes)
    //#pre[7] (void net.sourceforge.pebble.domain.FileManager(Blog, String)): (soft) init'ed(blog.root)
    //#post(void net.sourceforge.pebble.domain.FileManager(Blog, String)): this.root in Addr_Set{&new File(FileManager#3),&new File(FileManager#2),&new File(getPathToLiveTheme#1),&new File(FileManager#1)}
    //#post(void net.sourceforge.pebble.domain.FileManager(Blog, String)): this.type == type
    //#post(void net.sourceforge.pebble.domain.FileManager(Blog, String)): this.type != null
    //#post(void net.sourceforge.pebble.domain.FileManager(Blog, String)): new File(FileManager#1) num objects <= 1
    //#post(void net.sourceforge.pebble.domain.FileManager(Blog, String)): new File(FileManager#2) num objects <= 1
    //#post(void net.sourceforge.pebble.domain.FileManager(Blog, String)): new File(FileManager#3) num objects <= 1
    //#post(void net.sourceforge.pebble.domain.FileManager(Blog, String)): new File(getPathToLiveTheme#1) num objects <= 1
    //#unanalyzed(void net.sourceforge.pebble.domain.FileManager(Blog, String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void net.sourceforge.pebble.domain.FileManager(Blog, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void net.sourceforge.pebble.domain.FileManager(Blog, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void net.sourceforge.pebble.domain.FileManager(Blog, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void net.sourceforge.pebble.domain.FileManager(Blog, String)): Effects-of-calling:java.io.File
    //#test_vector(void net.sourceforge.pebble.domain.FileManager(Blog, String)): java.lang.String:equals(...)@70: {0}, {1}
    //#test_vector(void net.sourceforge.pebble.domain.FileManager(Blog, String)): java.lang.String:equals(...)@72: {0}, {1}
    //#test_vector(void net.sourceforge.pebble.domain.FileManager(Blog, String)): java.lang.String:equals(...)@74: {0}, {1}
    this.type = type;

    // which directory are we looking at?
    if (type.equals(FileMetaData.BLOG_IMAGE)) {
      this.root = new File(blog.getImagesDirectory());
    } else if (type.equals(FileMetaData.THEME_FILE)) {
      this.root = blog.getEditableTheme().getPathToLiveTheme();
    } else if (type.equals(FileMetaData.BLOG_DATA)) {
      this.root = new File(blog.getRoot());
    } else {
      this.root = new File(blog.getFilesDirectory());
    }
  }
    //#filemanager.java:79: end of method: void net.sourceforge.pebble.domain.FileManager.net.sourceforge.pebble.domain.FileManager(Blog, String)

  /**
   * Gets the root directory that this class is managing.
   *
   * @return  a File instance
   */
  public File getRootDirectory() {
    return this.root;
    //#filemanager.java:87: method: File net.sourceforge.pebble.domain.FileManager.getRootDirectory()
    //#input(File getRootDirectory()): this
    //#input(File getRootDirectory()): this.root
    //#output(File getRootDirectory()): return_value
    //#pre[2] (File getRootDirectory()): init'ed(this.root)
    //#post(File getRootDirectory()): return_value == this.root
    //#post(File getRootDirectory()): init'ed(return_value)
    //#filemanager.java:87: end of method: File net.sourceforge.pebble.domain.FileManager.getRootDirectory()
  }

  /**
   * Gets meta data about a specific file or directory.
   *
   * @param path    the path of the file/directory
   * @return        a FileMetaData object
   */
  public FileMetaData getFileMetaData(String path) {
    FileMetaData metaData = new FileMetaData(this, path);
    //#filemanager.java:97: method: FileMetaData net.sourceforge.pebble.domain.FileManager.getFileMetaData(String)
    //#input(FileMetaData getFileMetaData(String)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(FileMetaData getFileMetaData(String)): __Descendant_Table[others]
    //#input(FileMetaData getFileMetaData(String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(FileMetaData getFileMetaData(String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(FileMetaData getFileMetaData(String)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(FileMetaData getFileMetaData(String)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(FileMetaData getFileMetaData(String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(FileMetaData getFileMetaData(String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(FileMetaData getFileMetaData(String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(FileMetaData getFileMetaData(String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(FileMetaData getFileMetaData(String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(FileMetaData getFileMetaData(String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(FileMetaData getFileMetaData(String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(FileMetaData getFileMetaData(String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(FileMetaData getFileMetaData(String)): path
    //#input(FileMetaData getFileMetaData(String)): this
    //#input(FileMetaData getFileMetaData(String)): this.__Tag
    //#input(FileMetaData getFileMetaData(String)): this.root
    //#input(FileMetaData getFileMetaData(String)): this.type
    //#output(FileMetaData getFileMetaData(String)): new Date(getFileMetaData#2) num objects
    //#output(FileMetaData getFileMetaData(String)): new FileMetaData(getFileMetaData#1) num objects
    //#output(FileMetaData getFileMetaData(String)): return_value.__Tag
    //#output(FileMetaData getFileMetaData(String)): return_value.context
    //#output(FileMetaData getFileMetaData(String)): return_value.directory
    //#output(FileMetaData getFileMetaData(String)): return_value.lastModified
    //#output(FileMetaData getFileMetaData(String)): return_value.name
    //#output(FileMetaData getFileMetaData(String)): return_value.path
    //#output(FileMetaData getFileMetaData(String)): return_value.size
    //#output(FileMetaData getFileMetaData(String)): return_value.type
    //#output(FileMetaData getFileMetaData(String)): return_value
    //#new obj(FileMetaData getFileMetaData(String)): new Date(getFileMetaData#2)
    //#new obj(FileMetaData getFileMetaData(String)): new FileMetaData(getFileMetaData#1)
    //#pre[5] (FileMetaData getFileMetaData(String)): init'ed(this.type)
    //#pre[3] (FileMetaData getFileMetaData(String)): (soft) this.__Tag == net/sourceforge/pebble/domain/FileManager
    //#pre[4] (FileMetaData getFileMetaData(String)): (soft) init'ed(this.root)
    //#presumption(FileMetaData getFileMetaData(String)): java.util.Iterator:next(...).__Tag@110 == net/sourceforge/pebble/domain/FileMetaData
    //#presumption(FileMetaData getFileMetaData(String)): java.util.Iterator:next(...)@110 != null
    //#post(FileMetaData getFileMetaData(String)): return_value == &new FileMetaData(getFileMetaData#1)
    //#post(FileMetaData getFileMetaData(String)): new Date(getFileMetaData#2) num objects <= 1
    //#post(FileMetaData getFileMetaData(String)): new FileMetaData(getFileMetaData#1) num objects == 1
    //#post(FileMetaData getFileMetaData(String)): return_value.__Tag == net/sourceforge/pebble/domain/FileMetaData
    //#post(FileMetaData getFileMetaData(String)): return_value.context == this
    //#post(FileMetaData getFileMetaData(String)): return_value.context != null
    //#post(FileMetaData getFileMetaData(String)): init'ed(return_value.directory)
    //#post(FileMetaData getFileMetaData(String)): init'ed(return_value.lastModified)
    //#post(FileMetaData getFileMetaData(String)): return_value.name != null
    //#post(FileMetaData getFileMetaData(String)): return_value.path != null
    //#post(FileMetaData getFileMetaData(String)): init'ed(return_value.size)
    //#post(FileMetaData getFileMetaData(String)): return_value.type == this.type
    //#post(FileMetaData getFileMetaData(String)): init'ed(return_value.type)
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.io.File
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:getFileMetaData
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:getFiles
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:getFile
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:setType
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:setDirectory
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:getSize
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:setSize
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.io.File:length
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.util.Date
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:setLastModified
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(FileMetaData getFileMetaData(String)): Effects-of-calling:java.lang.String:startsWith
    //#test_vector(FileMetaData getFileMetaData(String)): java.io.File:exists(...)@102: {0}, {1}
    //#test_vector(FileMetaData getFileMetaData(String)): java.io.File:isDirectory(...)@103: {0}, {1}
    //#test_vector(FileMetaData getFileMetaData(String)): java.util.Iterator:hasNext(...)@109: {1}, {0}
    metaData.setType(type);

    // is it a directory?
    File file = getFile(metaData);
    if (file.exists()) {
      if (file.isDirectory()) {
        metaData.setDirectory(true);
        try {
          List files = getFiles(metaData, true);
          long size = 0;
          Iterator it = files.iterator();
          while (it.hasNext()) {
            size += ((FileMetaData)it.next()).getSize();
    //#filemanager.java:110: ?overflow
    //#    size + getSize(...) in -9_223_372_036_854_775_808..18_446_744_073_709_551_615
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.FileManager
    //#    method: FileMetaData getFileMetaData(String)
    //#    basic block: bb_12
    //#    assertion: size + getSize(...) in -9_223_372_036_854_775_808..18_446_744_073_709_551_615
    //#    VN: java.util.Iterator:next(...).size@110 + size
    //#    Expected: {-9_223_372_036_854_775_808..18_446_744_073_709_551_615, Invalid}
    //#    Bad: {-18_446_744_073_709_551_616..-9_223_372_036_854_775_809, 18_446_744_073_709_551_616..36_893_488_147_419_103_230}
    //#    Attribs:  Int  Bad < Exp  Bad > Exp
          }
          metaData.setSize(size);
        } catch (IllegalFileAccessException ifae) {
          // do nothing
        }
      } else {
        metaData.setSize(file.length());
      }

      metaData.setLastModified(new Date(file.lastModified()));
    }

    return metaData;
    //#filemanager.java:123: end of method: FileMetaData net.sourceforge.pebble.domain.FileManager.getFileMetaData(String)
  }

  public FileMetaData getParent(FileMetaData file) {
    if (file.getAbsolutePath().equals("/")) {
    //#filemanager.java:127: method: FileMetaData net.sourceforge.pebble.domain.FileManager.getParent(FileMetaData)
    //#input(FileMetaData getParent(FileMetaData)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(FileMetaData getParent(FileMetaData)): __Descendant_Table[others]
    //#input(FileMetaData getParent(FileMetaData)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(FileMetaData getParent(FileMetaData)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(FileMetaData getParent(FileMetaData)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(FileMetaData getParent(FileMetaData)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(FileMetaData getParent(FileMetaData)): file
    //#input(FileMetaData getParent(FileMetaData)): file.__Tag
    //#input(FileMetaData getParent(FileMetaData)): file.name
    //#input(FileMetaData getParent(FileMetaData)): file.path
    //#input(FileMetaData getParent(FileMetaData)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(FileMetaData getParent(FileMetaData)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(FileMetaData getParent(FileMetaData)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(FileMetaData getParent(FileMetaData)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getPath()Ljava/lang/String;
    //#input(FileMetaData getParent(FileMetaData)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(FileMetaData getParent(FileMetaData)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(FileMetaData getParent(FileMetaData)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(FileMetaData getParent(FileMetaData)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(FileMetaData getParent(FileMetaData)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(FileMetaData getParent(FileMetaData)): this
    //#input(FileMetaData getParent(FileMetaData)): this.__Tag
    //#input(FileMetaData getParent(FileMetaData)): this.root
    //#input(FileMetaData getParent(FileMetaData)): this.type
    //#output(FileMetaData getParent(FileMetaData)): new Date(getFileMetaData#2) num objects
    //#output(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1) num objects
    //#output(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).__Tag
    //#output(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).context
    //#output(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).directory
    //#output(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).lastModified
    //#output(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).name
    //#output(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).path
    //#output(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).size
    //#output(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).type
    //#output(FileMetaData getParent(FileMetaData)): return_value
    //#new obj(FileMetaData getParent(FileMetaData)): new Date(getFileMetaData#2)
    //#new obj(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1)
    //#pre[1] (FileMetaData getParent(FileMetaData)): file != null
    //#pre[2] (FileMetaData getParent(FileMetaData)): file.__Tag == net/sourceforge/pebble/domain/FileMetaData
    //#pre[3] (FileMetaData getParent(FileMetaData)): init'ed(file.name)
    //#pre[4] (FileMetaData getParent(FileMetaData)): file.path != null
    //#pre[6] (FileMetaData getParent(FileMetaData)): (soft) this.__Tag == net/sourceforge/pebble/domain/FileManager
    //#pre[7] (FileMetaData getParent(FileMetaData)): (soft) init'ed(this.root)
    //#pre[8] (FileMetaData getParent(FileMetaData)): (soft) init'ed(this.type)
    //#post(FileMetaData getParent(FileMetaData)): return_value in Addr_Set{null,&new FileMetaData(getFileMetaData#1)}
    //#post(FileMetaData getParent(FileMetaData)): new Date(getFileMetaData#2) num objects <= 1
    //#post(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1) num objects <= 1
    //#post(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).__Tag == net/sourceforge/pebble/domain/FileMetaData
    //#post(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).context == this
    //#post(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).context != null
    //#post(FileMetaData getParent(FileMetaData)): init'ed(new FileMetaData(getFileMetaData#1).directory)
    //#post(FileMetaData getParent(FileMetaData)): init'ed(new FileMetaData(getFileMetaData#1).lastModified)
    //#post(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).name != null
    //#post(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).path != null
    //#post(FileMetaData getParent(FileMetaData)): init'ed(new FileMetaData(getFileMetaData#1).size)
    //#post(FileMetaData getParent(FileMetaData)): new FileMetaData(getFileMetaData#1).type == this.type
    //#post(FileMetaData getParent(FileMetaData)): (soft) init'ed(new FileMetaData(getFileMetaData#1).type)
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.io.File
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:getFileMetaData
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:getFiles
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:getFile
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.util.List:add
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:setType
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:setDirectory
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:getSize
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:setSize
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.io.File:length
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.util.Date
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:setLastModified
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(FileMetaData getParent(FileMetaData)): Effects-of-calling:java.lang.String:startsWith
    //#test_vector(FileMetaData getParent(FileMetaData)): java.lang.String:equals(...)@127: {0}, {1}
      return null;
    } else {
      return getFileMetaData(file.getPath());
    //#filemanager.java:130: end of method: FileMetaData net.sourceforge.pebble.domain.FileManager.getParent(FileMetaData)
    }
  }

  /**
   * Gets meta data about a specific file or directory.
   *
   * @param path    the path of the file/directory
   * @param name    the name of the file/directory
   * @return        a FileMetaData object
   */
  public FileMetaData getFileMetaData(String path, String name) {
    if (path != null && path.endsWith("/")) {
    //#filemanager.java:142: method: FileMetaData net.sourceforge.pebble.domain.FileManager.getFileMetaData(String, String)
    //#input(FileMetaData getFileMetaData(String, String)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(FileMetaData getFileMetaData(String, String)): __Descendant_Table[others]
    //#input(FileMetaData getFileMetaData(String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(FileMetaData getFileMetaData(String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(FileMetaData getFileMetaData(String, String)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(FileMetaData getFileMetaData(String, String)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(FileMetaData getFileMetaData(String, String)): name
    //#input(FileMetaData getFileMetaData(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(FileMetaData getFileMetaData(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(FileMetaData getFileMetaData(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(FileMetaData getFileMetaData(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(FileMetaData getFileMetaData(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(FileMetaData getFileMetaData(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(FileMetaData getFileMetaData(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(FileMetaData getFileMetaData(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(FileMetaData getFileMetaData(String, String)): path
    //#input(FileMetaData getFileMetaData(String, String)): this
    //#input(FileMetaData getFileMetaData(String, String)): this.__Tag
    //#input(FileMetaData getFileMetaData(String, String)): this.root
    //#input(FileMetaData getFileMetaData(String, String)): this.type
    //#output(FileMetaData getFileMetaData(String, String)): new Date(getFileMetaData#2*) num objects
    //#output(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*) num objects
    //#output(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*).__Tag
    //#output(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*).context
    //#output(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*).directory
    //#output(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*).lastModified
    //#output(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*).name
    //#output(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*).path
    //#output(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*).size
    //#output(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*).type
    //#output(FileMetaData getFileMetaData(String, String)): return_value
    //#new obj(FileMetaData getFileMetaData(String, String)): new Date(getFileMetaData#2*)
    //#new obj(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*)
    //#pre[6] (FileMetaData getFileMetaData(String, String)): init'ed(this.type)
    //#pre[4] (FileMetaData getFileMetaData(String, String)): (soft) this.__Tag == net/sourceforge/pebble/domain/FileManager
    //#pre[5] (FileMetaData getFileMetaData(String, String)): (soft) init'ed(this.root)
    //#post(FileMetaData getFileMetaData(String, String)): return_value == &new FileMetaData(getFileMetaData#1*)
    //#post(FileMetaData getFileMetaData(String, String)): new Date(getFileMetaData#2*) num objects <= 1
    //#post(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*) num objects == 1
    //#post(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*).__Tag == net/sourceforge/pebble/domain/FileMetaData
    //#post(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*).context != null
    //#post(FileMetaData getFileMetaData(String, String)): init'ed(new FileMetaData(getFileMetaData#1*).directory)
    //#post(FileMetaData getFileMetaData(String, String)): init'ed(new FileMetaData(getFileMetaData#1*).lastModified)
    //#post(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*).name != null
    //#post(FileMetaData getFileMetaData(String, String)): new FileMetaData(getFileMetaData#1*).path != null
    //#post(FileMetaData getFileMetaData(String, String)): init'ed(new FileMetaData(getFileMetaData#1*).size)
    //#post(FileMetaData getFileMetaData(String, String)): init'ed(new FileMetaData(getFileMetaData#1*).type)
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.io.File
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:getFileMetaData
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:getFiles
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:getFile
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:setType
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:setDirectory
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:getSize
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:setSize
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.io.File:length
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.util.Date
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:setLastModified
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(FileMetaData getFileMetaData(String, String)): Effects-of-calling:java.lang.String:startsWith
    //#test_vector(FileMetaData getFileMetaData(String, String)): path: Addr_Set{null}, Inverse{null}
    //#test_vector(FileMetaData getFileMetaData(String, String)): java.lang.String:endsWith(...)@142: {0}, {1}
      return getFileMetaData(path + name);
    } else {
      return getFileMetaData(path + "/" + name);
    //#filemanager.java:145: end of method: FileMetaData net.sourceforge.pebble.domain.FileManager.getFileMetaData(String, String)
    }
  }

  /**
   * Gets a java.io.File reference to the specified path, regardless
   * of whether it represents a file or directory.
   *
   * @param path    an absolute path from the root
   * @return    a java.io.File instance
   */
  public File getFile(String path) {
    String relativePath;
    if (path != null && path.startsWith("/")) {
    //#filemanager.java:158: method: File net.sourceforge.pebble.domain.FileManager.getFile(String)
    //#input(File getFile(String)): path
    //#input(File getFile(String)): this
    //#input(File getFile(String)): this.root
    //#output(File getFile(String)): new File(getFile#1) num objects
    //#output(File getFile(String)): return_value
    //#new obj(File getFile(String)): new File(getFile#1)
    //#pre[3] (File getFile(String)): init'ed(this.root)
    //#post(File getFile(String)): return_value == &new File(getFile#1)
    //#post(File getFile(String)): new File(getFile#1) num objects == 1
    //#test_vector(File getFile(String)): path: Addr_Set{null}, Inverse{null}
    //#test_vector(File getFile(String)): java.lang.String:startsWith(...)@158: {0}, {1}
      relativePath = path.substring(1);
    } else {
      relativePath = path;
    }

    return new File(root, relativePath);
    //#filemanager.java:164: end of method: File net.sourceforge.pebble.domain.FileManager.getFile(String)
  }

  /**
   * Convenience method to get a java.io.File reference to the file represented
   * by the specified FileMetaData object.
   *
   * @param file    the FileMetaData object representing the path
   * @return    a java.io.File instance
   */
  private File getFile(FileMetaData file) {
    String relativePath = file.getAbsolutePath().substring(1);
    //#filemanager.java:175: method: File net.sourceforge.pebble.domain.FileManager.getFile(FileMetaData)
    //#input(File getFile(FileMetaData)): file
    //#input(File getFile(FileMetaData)): file.__Tag
    //#input(File getFile(FileMetaData)): file.name
    //#input(File getFile(FileMetaData)): file.path
    //#input(File getFile(FileMetaData)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(File getFile(FileMetaData)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(File getFile(FileMetaData)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(File getFile(FileMetaData)): this
    //#input(File getFile(FileMetaData)): this.root
    //#output(File getFile(FileMetaData)): new File(getFile#1) num objects
    //#output(File getFile(FileMetaData)): return_value
    //#new obj(File getFile(FileMetaData)): new File(getFile#1)
    //#pre[1] (File getFile(FileMetaData)): file != null
    //#pre[2] (File getFile(FileMetaData)): file.__Tag == net/sourceforge/pebble/domain/FileMetaData
    //#pre[3] (File getFile(FileMetaData)): init'ed(file.name)
    //#pre[4] (File getFile(FileMetaData)): file.path != null
    //#pre[6] (File getFile(FileMetaData)): init'ed(this.root)
    //#post(File getFile(FileMetaData)): return_value == &new File(getFile#1)
    //#post(File getFile(FileMetaData)): new File(getFile#1) num objects == 1
    //#unanalyzed(File getFile(FileMetaData)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(File getFile(FileMetaData)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(File getFile(FileMetaData)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(File getFile(FileMetaData)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(File getFile(FileMetaData)): Effects-of-calling:java.lang.String:valueOf
    return new File(root, relativePath);
    //#filemanager.java:176: end of method: File net.sourceforge.pebble.domain.FileManager.getFile(FileMetaData)
  }

  /**
   * Determines whether the specified file is underneath the root directory
   * for this file manager.
   *
   * @param file    the java.io.File to test
   * @return    true if the file is underneath the root, false otherwise
   */
  public boolean isUnderneathRootDirectory(File file) {
    return FileUtils.underneathRoot(root, file);
    //#filemanager.java:187: method: bool net.sourceforge.pebble.domain.FileManager.isUnderneathRootDirectory(File)
    //#filemanager.java:187: Warning: method not available
    //#    -- call on bool net.sourceforge.pebble.util.FileUtils:underneathRoot(File, File)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.FileManager
    //#    method: bool isUnderneathRootDirectory(File)
    //#    unanalyzed callee: bool net.sourceforge.pebble.util.FileUtils:underneathRoot(File, File)
    //#input(bool isUnderneathRootDirectory(File)): file
    //#input(bool isUnderneathRootDirectory(File)): this
    //#input(bool isUnderneathRootDirectory(File)): this.root
    //#output(bool isUnderneathRootDirectory(File)): return_value
    //#pre[3] (bool isUnderneathRootDirectory(File)): init'ed(this.root)
    //#post(bool isUnderneathRootDirectory(File)): init'ed(return_value)
    //#filemanager.java:187: end of method: bool net.sourceforge.pebble.domain.FileManager.isUnderneathRootDirectory(File)
  }

  /**
   * Creates a new directory with the specified name underneath the given path.
   *
   * @param path    the path under which to create the directory
   * @param name    the name of the directory
   * @return    a java.io.File instance representing the new directory
   */
  public File createDirectory(String path, String name) throws IllegalFileAccessException {
    FileMetaData subDirectory = getFileMetaData(path);
    //#filemanager.java:198: method: File net.sourceforge.pebble.domain.FileManager.createDirectory(String, String)
    //#input(File createDirectory(String, String)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(File createDirectory(String, String)): __Descendant_Table[others]
    //#input(File createDirectory(String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(File createDirectory(String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(File createDirectory(String, String)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(File createDirectory(String, String)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(File createDirectory(String, String)): name
    //#input(File createDirectory(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(File createDirectory(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(File createDirectory(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(File createDirectory(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(File createDirectory(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(File createDirectory(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(File createDirectory(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(File createDirectory(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(File createDirectory(String, String)): path
    //#input(File createDirectory(String, String)): this
    //#input(File createDirectory(String, String)): this.__Tag
    //#input(File createDirectory(String, String)): this.root
    //#input(File createDirectory(String, String)): this.type
    //#output(File createDirectory(String, String)): new File(createDirectory#1) num objects
    //#output(File createDirectory(String, String)): return_value
    //#new obj(File createDirectory(String, String)): new File(createDirectory#1)
    //#pre[6] (File createDirectory(String, String)): init'ed(this.type)
    //#pre[4] (File createDirectory(String, String)): (soft) this.__Tag == net/sourceforge/pebble/domain/FileManager
    //#pre[5] (File createDirectory(String, String)): (soft) init'ed(this.root)
    //#presumption(File createDirectory(String, String)): net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
    //#post(File createDirectory(String, String)): return_value == &new File(createDirectory#1)
    //#post(File createDirectory(String, String)): new File(createDirectory#1) num objects == 1
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.io.File
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:getFileMetaData
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:getFiles
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:getFile
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:setType
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:setDirectory
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:getSize
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:setSize
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.io.File:length
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.util.Date
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:setLastModified
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(File createDirectory(String, String)): Effects-of-calling:java.lang.String:startsWith

    File newDirectory = new File(getFile(subDirectory), name);
    if (!isUnderneathRootDirectory(newDirectory)) {
      throw new IllegalFileAccessException();
    } else {
      newDirectory.mkdirs();
    }

    return newDirectory;
    //#filemanager.java:207: end of method: File net.sourceforge.pebble.domain.FileManager.createDirectory(String, String)
  }

  /**
   * Copies a file.
   *
   * @param path      the path under which the file exists
   * @param name      the name of the file
   * @param newName   the new name of the file
   * @return    a java.io.File instance representing the new file, or null
   *            if the file isn't copied because no new name was given, or the
   *            new name is the same as the old name
   */
  public File copyFile(String path, String name, String newName) throws IOException, IllegalFileAccessException {
    if (newName != null && newName.length() > 0 && !newName.equals(name)) {
    //#filemanager.java:221: method: File net.sourceforge.pebble.domain.FileManager.copyFile(String, String, String)
    //#input(File copyFile(String, String, String)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(File copyFile(String, String, String)): __Descendant_Table[others]
    //#input(File copyFile(String, String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(File copyFile(String, String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(File copyFile(String, String, String)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(File copyFile(String, String, String)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(File copyFile(String, String, String)): name
    //#input(File copyFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(File copyFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(File copyFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(File copyFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(File copyFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(File copyFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(File copyFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(File copyFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(File copyFile(String, String, String)): newName
    //#input(File copyFile(String, String, String)): path
    //#input(File copyFile(String, String, String)): this
    //#input(File copyFile(String, String, String)): this.__Tag
    //#input(File copyFile(String, String, String)): this.root
    //#input(File copyFile(String, String, String)): this.type
    //#output(File copyFile(String, String, String)): new File(copyFile#2) num objects
    //#output(File copyFile(String, String, String)): return_value
    //#new obj(File copyFile(String, String, String)): new File(copyFile#2)
    //#pre[5] (File copyFile(String, String, String)): (soft) this.__Tag == net/sourceforge/pebble/domain/FileManager
    //#pre[6] (File copyFile(String, String, String)): (soft) init'ed(this.root)
    //#pre[7] (File copyFile(String, String, String)): (soft) init'ed(this.type)
    //#presumption(File copyFile(String, String, String)): net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
    //#presumption(File copyFile(String, String, String)): net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
    //#post(File copyFile(String, String, String)): return_value in Addr_Set{null,&new File(copyFile#2)}
    //#post(File copyFile(String, String, String)): new File(copyFile#2) num objects <= 1
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.io.File
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:getFileMetaData
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:getFiles
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:getFile
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:setType
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:setDirectory
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:getSize
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:setSize
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.io.File:length
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.util.Date
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:setLastModified
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(File copyFile(String, String, String)): Effects-of-calling:java.lang.String:startsWith
    //#test_vector(File copyFile(String, String, String)): newName: Addr_Set{null}, Inverse{null}
    //#test_vector(File copyFile(String, String, String)): java.lang.String:equals(...)@221: {1}, {0}
    //#test_vector(File copyFile(String, String, String)): java.lang.String:length(...)@221: {0}, {1..4_294_967_295}
      FileMetaData subDirectory = getFileMetaData(path);
      File originalFile = new File(getFile(subDirectory), name);
      File newFile = new File(getFile(subDirectory), newName);

      if (!isUnderneathRootDirectory(originalFile) || !isUnderneathRootDirectory(newFile)) {
        throw new IllegalFileAccessException();
      }

      FileUtils.copyFile(originalFile, newFile);
    //#filemanager.java:230: Warning: method not available
    //#    -- call on void net.sourceforge.pebble.util.FileUtils:copyFile(File, File)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.FileManager
    //#    method: File copyFile(String, String, String)
    //#    unanalyzed callee: void net.sourceforge.pebble.util.FileUtils:copyFile(File, File)

      return newFile;
    } else {
      return null;
    //#filemanager.java:234: end of method: File net.sourceforge.pebble.domain.FileManager.copyFile(String, String, String)
    }
  }

  /**
   * Renames a file.
   *
   * @param path      the path under which the file exists
   * @param name      the name of the file
   * @param newName   the new name of the file
   * @return    a java.io.File instance representing the new file, or null
   *            if the file isn't copied because no new name was given, or the
   *            new name is the same as the old name
   */
  public File renameFile(String path, String name, String newName) throws IllegalFileAccessException {
    if (newName != null && newName.length() > 0 && !newName.equals(name)) {
    //#filemanager.java:249: method: File net.sourceforge.pebble.domain.FileManager.renameFile(String, String, String)
    //#input(File renameFile(String, String, String)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(File renameFile(String, String, String)): __Descendant_Table[others]
    //#input(File renameFile(String, String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(File renameFile(String, String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(File renameFile(String, String, String)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(File renameFile(String, String, String)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(File renameFile(String, String, String)): name
    //#input(File renameFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(File renameFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(File renameFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(File renameFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(File renameFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(File renameFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(File renameFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(File renameFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(File renameFile(String, String, String)): newName
    //#input(File renameFile(String, String, String)): path
    //#input(File renameFile(String, String, String)): this
    //#input(File renameFile(String, String, String)): this.__Tag
    //#input(File renameFile(String, String, String)): this.root
    //#input(File renameFile(String, String, String)): this.type
    //#output(File renameFile(String, String, String)): new File(renameFile#2) num objects
    //#output(File renameFile(String, String, String)): return_value
    //#new obj(File renameFile(String, String, String)): new File(renameFile#2)
    //#pre[5] (File renameFile(String, String, String)): (soft) this.__Tag == net/sourceforge/pebble/domain/FileManager
    //#pre[6] (File renameFile(String, String, String)): (soft) init'ed(this.root)
    //#pre[7] (File renameFile(String, String, String)): (soft) init'ed(this.type)
    //#presumption(File renameFile(String, String, String)): net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
    //#presumption(File renameFile(String, String, String)): net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
    //#post(File renameFile(String, String, String)): return_value in Addr_Set{null,&new File(renameFile#2)}
    //#post(File renameFile(String, String, String)): new File(renameFile#2) num objects <= 1
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.io.File
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:getFileMetaData
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:getFiles
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:getFile
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:setType
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:setDirectory
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:getSize
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:setSize
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.io.File:length
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.util.Date
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:setLastModified
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(File renameFile(String, String, String)): Effects-of-calling:java.lang.String:startsWith
    //#test_vector(File renameFile(String, String, String)): newName: Addr_Set{null}, Inverse{null}
    //#test_vector(File renameFile(String, String, String)): java.lang.String:equals(...)@249: {1}, {0}
    //#test_vector(File renameFile(String, String, String)): java.lang.String:length(...)@249: {0}, {1..4_294_967_295}
      FileMetaData subDirectory = getFileMetaData(path);
      File originalFile = new File(getFile(subDirectory), name);
      File newFile = new File(getFile(subDirectory), newName);

      // check that newFile is underneath the root directory
      if (!isUnderneathRootDirectory(originalFile) || !isUnderneathRootDirectory(newFile)) {
        throw new IllegalFileAccessException();
      }

      originalFile.renameTo(newFile);
      return newFile;
    } else {
      return null;
    //#filemanager.java:262: end of method: File net.sourceforge.pebble.domain.FileManager.renameFile(String, String, String)
    }
  }

  /**
   * Deletes a file.
   *
   * @param path      the path under which the file exists
   * @param name      the name of the file
   */
  public void deleteFile(String path, String name) throws IllegalFileAccessException {
    FileMetaData subDirectory = getFileMetaData(path);
    //#filemanager.java:273: method: void net.sourceforge.pebble.domain.FileManager.deleteFile(String, String)
    //#input(void deleteFile(String, String)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(void deleteFile(String, String)): __Descendant_Table[others]
    //#input(void deleteFile(String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(void deleteFile(String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(void deleteFile(String, String)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(void deleteFile(String, String)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(void deleteFile(String, String)): name
    //#input(void deleteFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(void deleteFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(void deleteFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(void deleteFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(void deleteFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(void deleteFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(void deleteFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(void deleteFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(void deleteFile(String, String)): path
    //#input(void deleteFile(String, String)): this
    //#input(void deleteFile(String, String)): this.__Tag
    //#input(void deleteFile(String, String)): this.root
    //#input(void deleteFile(String, String)): this.type
    //#pre[4] (void deleteFile(String, String)): this.__Tag == net/sourceforge/pebble/domain/FileManager
    //#pre[5] (void deleteFile(String, String)): init'ed(this.root)
    //#pre[6] (void deleteFile(String, String)): init'ed(this.type)
    //#presumption(void deleteFile(String, String)): net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.io.File
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:getFileMetaData
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:getFiles
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:getFile
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:setType
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:setDirectory
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:getSize
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:setSize
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.io.File:length
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.util.Date
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:setLastModified
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(void deleteFile(String, String)): Effects-of-calling:java.lang.String:startsWith
    File fileToDelete = new File(getFile(subDirectory), name);

    if (!isUnderneathRootDirectory(fileToDelete)) {
      throw new IllegalFileAccessException();
    }

    FileUtils.deleteFile(fileToDelete);
    //#filemanager.java:280: Warning: method not available
    //#    -- call on void net.sourceforge.pebble.util.FileUtils:deleteFile(File)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.FileManager
    //#    method: void deleteFile(String, String)
    //#    unanalyzed callee: void net.sourceforge.pebble.util.FileUtils:deleteFile(File)
  }
    //#filemanager.java:281: end of method: void net.sourceforge.pebble.domain.FileManager.deleteFile(String, String)

  /**
   * Loads a file into a String.
   *
   * @param path      the path under which the file exists
   * @param name      the name of the file
   * @return  a String containing the content of the specified file
   */
  public String loadFile(String path, String name) throws IllegalFileAccessException {
    StringBuffer content = new StringBuffer();
    //#filemanager.java:291: method: String net.sourceforge.pebble.domain.FileManager.loadFile(String, String)
    //#input(String loadFile(String, String)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(String loadFile(String, String)): __Descendant_Table[others]
    //#input(String loadFile(String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(String loadFile(String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(String loadFile(String, String)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(String loadFile(String, String)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(String loadFile(String, String)): name
    //#input(String loadFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(String loadFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(String loadFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(String loadFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(String loadFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(String loadFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(String loadFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(String loadFile(String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(String loadFile(String, String)): path
    //#input(String loadFile(String, String)): this
    //#input(String loadFile(String, String)): this.__Tag
    //#input(String loadFile(String, String)): this.root
    //#input(String loadFile(String, String)): this.type
    //#output(String loadFile(String, String)): return_value
    //#pre[4] (String loadFile(String, String)): this.__Tag == net/sourceforge/pebble/domain/FileManager
    //#pre[5] (String loadFile(String, String)): init'ed(this.root)
    //#pre[6] (String loadFile(String, String)): init'ed(this.type)
    //#presumption(String loadFile(String, String)): net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
    //#post(String loadFile(String, String)): return_value != null
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.io.File
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:getFileMetaData
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:getFiles
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:getFile
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:setType
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:setDirectory
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:getSize
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:setSize
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.io.File:length
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.util.Date
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:setLastModified
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(String loadFile(String, String)): Effects-of-calling:java.lang.String:startsWith
    //#test_vector(String loadFile(String, String)): java.io.BufferedReader:readLine(...)@306: Addr_Set{null}, Inverse{null}

    FileMetaData subDirectory = getFileMetaData(path);
    File fileToLoad = new File(getFile(subDirectory), name);

    if (!isUnderneathRootDirectory(fileToLoad)) {
      throw new IllegalFileAccessException();
    }

    try {
      BufferedReader reader = new BufferedReader(new FileReader(fileToLoad));
      String line = reader.readLine();
      while (line != null) {
        content.append(line);

        line = reader.readLine();
        if (line != null) {
          content.append(System.getProperty("line.separator"));
        }
      }
      reader.close();
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }

    return content.toString();
    //#filemanager.java:316: end of method: String net.sourceforge.pebble.domain.FileManager.loadFile(String, String)
  }

  /**
   * Saves a file with the given content.
   *
   * @param path      the path under which the file exists
   * @param name      the name of the file
   * @param content   the content as a String
   */
  public void saveFile(String path, String name, String content) throws IOException, IllegalFileAccessException {
    FileMetaData subDirectory = getFileMetaData(path);
    //#filemanager.java:327: method: void net.sourceforge.pebble.domain.FileManager.saveFile(String, String, String)
    //#input(void saveFile(String, String, String)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(void saveFile(String, String, String)): __Descendant_Table[others]
    //#input(void saveFile(String, String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(void saveFile(String, String, String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(void saveFile(String, String, String)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(void saveFile(String, String, String)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(void saveFile(String, String, String)): content
    //#input(void saveFile(String, String, String)): name
    //#input(void saveFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(void saveFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(void saveFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(void saveFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(void saveFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(void saveFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(void saveFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(void saveFile(String, String, String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(void saveFile(String, String, String)): path
    //#input(void saveFile(String, String, String)): this
    //#input(void saveFile(String, String, String)): this.__Tag
    //#input(void saveFile(String, String, String)): this.root
    //#input(void saveFile(String, String, String)): this.type
    //#pre[7] (void saveFile(String, String, String)): init'ed(this.type)
    //#pre[5] (void saveFile(String, String, String)): (soft) this.__Tag == net/sourceforge/pebble/domain/FileManager
    //#pre[6] (void saveFile(String, String, String)): (soft) init'ed(this.root)
    //#presumption(void saveFile(String, String, String)): net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.io.File
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:getFileMetaData
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:getFiles
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:getFile
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:setType
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:setDirectory
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:getSize
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:setSize
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.io.File:length
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.util.Date
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:setLastModified
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(void saveFile(String, String, String)): Effects-of-calling:java.lang.String:startsWith
    File fileToSave = new File(getFile(subDirectory), name);

    if (!isUnderneathRootDirectory(fileToSave)) {
      throw new IllegalFileAccessException();
    }

    BufferedWriter writer = new BufferedWriter(new FileWriter(fileToSave));
    writer.write(content);
    writer.flush();
    writer.close();
  }
    //#filemanager.java:338: end of method: void net.sourceforge.pebble.domain.FileManager.saveFile(String, String, String)

  /**
   * Saves a file with the given binary content.
   *
   * @param name      the name of the file
   * @param content   the binary content
   * @return  a FileMetaData instance representing the saved file
   */
  public FileMetaData saveFile(String name, byte[] content) throws IOException, IllegalFileAccessException {
    FileMetaData file = getFileMetaData(name);
    //#filemanager.java:348: method: FileMetaData net.sourceforge.pebble.domain.FileManager.saveFile(String, byte[])
    //#input(FileMetaData saveFile(String, byte[])): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(FileMetaData saveFile(String, byte[])): __Descendant_Table[others]
    //#input(FileMetaData saveFile(String, byte[])): __Dispatch_Table.getFile(Ljava/lang/String;)Ljava/io/File;
    //#input(FileMetaData saveFile(String, byte[])): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(FileMetaData saveFile(String, byte[])): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(FileMetaData saveFile(String, byte[])): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(FileMetaData saveFile(String, byte[])): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(FileMetaData saveFile(String, byte[])): content
    //#input(FileMetaData saveFile(String, byte[])): name
    //#input(FileMetaData saveFile(String, byte[])): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(FileMetaData saveFile(String, byte[])): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(FileMetaData saveFile(String, byte[])): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(FileMetaData saveFile(String, byte[])): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(FileMetaData saveFile(String, byte[])): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(FileMetaData saveFile(String, byte[])): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(FileMetaData saveFile(String, byte[])): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(FileMetaData saveFile(String, byte[])): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(FileMetaData saveFile(String, byte[])): this
    //#input(FileMetaData saveFile(String, byte[])): this.__Tag
    //#input(FileMetaData saveFile(String, byte[])): this.root
    //#input(FileMetaData saveFile(String, byte[])): this.type
    //#output(FileMetaData saveFile(String, byte[])): new Date(getFileMetaData#2) num objects
    //#output(FileMetaData saveFile(String, byte[])): new FileMetaData(getFileMetaData#1) num objects
    //#output(FileMetaData saveFile(String, byte[])): return_value.__Tag
    //#output(FileMetaData saveFile(String, byte[])): return_value.context
    //#output(FileMetaData saveFile(String, byte[])): return_value.directory
    //#output(FileMetaData saveFile(String, byte[])): return_value.lastModified
    //#output(FileMetaData saveFile(String, byte[])): return_value.name
    //#output(FileMetaData saveFile(String, byte[])): return_value.path
    //#output(FileMetaData saveFile(String, byte[])): return_value.size
    //#output(FileMetaData saveFile(String, byte[])): return_value.type
    //#output(FileMetaData saveFile(String, byte[])): return_value
    //#new obj(FileMetaData saveFile(String, byte[])): new Date(getFileMetaData#2)
    //#new obj(FileMetaData saveFile(String, byte[])): new FileMetaData(getFileMetaData#1)
    //#pre[4] (FileMetaData saveFile(String, byte[])): this.__Tag == net/sourceforge/pebble/domain/FileManager
    //#pre[5] (FileMetaData saveFile(String, byte[])): init'ed(this.root)
    //#pre[6] (FileMetaData saveFile(String, byte[])): init'ed(this.type)
    //#presumption(FileMetaData saveFile(String, byte[])): net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
    //#post(FileMetaData saveFile(String, byte[])): return_value == &new FileMetaData(getFileMetaData#1)
    //#post(FileMetaData saveFile(String, byte[])): new Date(getFileMetaData#2) num objects <= 1
    //#post(FileMetaData saveFile(String, byte[])): new FileMetaData(getFileMetaData#1) num objects == 1
    //#post(FileMetaData saveFile(String, byte[])): return_value.__Tag == net/sourceforge/pebble/domain/FileMetaData
    //#post(FileMetaData saveFile(String, byte[])): return_value.context == this
    //#post(FileMetaData saveFile(String, byte[])): return_value.context != null
    //#post(FileMetaData saveFile(String, byte[])): init'ed(return_value.directory)
    //#post(FileMetaData saveFile(String, byte[])): init'ed(return_value.lastModified)
    //#post(FileMetaData saveFile(String, byte[])): return_value.name != null
    //#post(FileMetaData saveFile(String, byte[])): return_value.path != null
    //#post(FileMetaData saveFile(String, byte[])): init'ed(return_value.size)
    //#post(FileMetaData saveFile(String, byte[])): return_value.type == this.type
    //#post(FileMetaData saveFile(String, byte[])): init'ed(return_value.type)
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.io.File
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:getFileMetaData
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:getFiles
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:getFile
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:getAbsolutePath
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.io.File:getName
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.util.List:add
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:setType
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.io.File:exists
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:setDirectory
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:getSize
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:setSize
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.io.File:length
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.util.Date
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:setLastModified
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.lang.String:length
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(FileMetaData saveFile(String, byte[])): Effects-of-calling:java.lang.String:lastIndexOf
    File fileToSave = getFile(name);

    if (!isUnderneathRootDirectory(fileToSave)) {
      throw new IllegalFileAccessException();
    }

    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fileToSave));
    out.write(content);
    out.flush();
    out.close();

    return file;
    //#filemanager.java:360: end of method: FileMetaData net.sourceforge.pebble.domain.FileManager.saveFile(String, byte[])
  }

  /**
   * Gets a list of files that reside under a given path.
   *
   * @param path      the path under which the file exists
   * @return  a List of FileMetaData instances
   * @throws IllegalFileAccessException   if trying to access a file outside the root
   */
  public List getFiles(String path) throws IllegalFileAccessException {
    return getFiles(path, false);
    //#filemanager.java:371: method: List net.sourceforge.pebble.domain.FileManager.getFiles(String)
    //#input(List getFiles(String)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(List getFiles(String)): __Descendant_Table[others]
    //#input(List getFiles(String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(List getFiles(String)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(List getFiles(String)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(List getFiles(String)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(List getFiles(String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(List getFiles(String)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(List getFiles(String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(List getFiles(String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(List getFiles(String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(List getFiles(String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(List getFiles(String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(List getFiles(String)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(List getFiles(String)): path
    //#input(List getFiles(String)): this
    //#input(List getFiles(String)): this.__Tag
    //#input(List getFiles(String)): this.root
    //#input(List getFiles(String)): this.type
    //#output(List getFiles(String)): new ArrayList(getFiles#1*) num objects
    //#output(List getFiles(String)): return_value
    //#new obj(List getFiles(String)): new ArrayList(getFiles#1*)
    //#pre[3] (List getFiles(String)): this.__Tag == net/sourceforge/pebble/domain/FileManager
    //#pre[5] (List getFiles(String)): init'ed(this.type)
    //#pre[4] (List getFiles(String)): (soft) init'ed(this.root)
    //#post(List getFiles(String)): return_value == &new ArrayList(getFiles#1*)
    //#post(List getFiles(String)): new ArrayList(getFiles#1*) num objects == 1
    //#unanalyzed(List getFiles(String)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.io.File
    //#unanalyzed(List getFiles(String)): Effects-of-calling:getFileMetaData
    //#unanalyzed(List getFiles(String)): Effects-of-calling:getFiles
    //#unanalyzed(List getFiles(String)): Effects-of-calling:getFile
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(List getFiles(String)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(List getFiles(String)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(List getFiles(String)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(List getFiles(String)): Effects-of-calling:setType
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(List getFiles(String)): Effects-of-calling:setDirectory
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(List getFiles(String)): Effects-of-calling:getSize
    //#unanalyzed(List getFiles(String)): Effects-of-calling:setSize
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.io.File:length
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.util.Date
    //#unanalyzed(List getFiles(String)): Effects-of-calling:setLastModified
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(List getFiles(String)): Effects-of-calling:java.lang.String:startsWith
    //#filemanager.java:371: end of method: List net.sourceforge.pebble.domain.FileManager.getFiles(String)
  }

  public List getFiles(String path, boolean includeChildren) throws IllegalFileAccessException {
    FileMetaData subDirectory = getFileMetaData(path);
    //#filemanager.java:375: method: List net.sourceforge.pebble.domain.FileManager.getFiles(String, bool)
    //#input(List getFiles(String, bool)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(List getFiles(String, bool)): __Descendant_Table[others]
    //#input(List getFiles(String, bool)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(List getFiles(String, bool)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(List getFiles(String, bool)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(List getFiles(String, bool)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(List getFiles(String, bool)): includeChildren
    //#input(List getFiles(String, bool)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(List getFiles(String, bool)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(List getFiles(String, bool)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(List getFiles(String, bool)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(List getFiles(String, bool)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(List getFiles(String, bool)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(List getFiles(String, bool)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(List getFiles(String, bool)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(List getFiles(String, bool)): path
    //#input(List getFiles(String, bool)): this
    //#input(List getFiles(String, bool)): this.__Tag
    //#input(List getFiles(String, bool)): this.root
    //#input(List getFiles(String, bool)): this.type
    //#output(List getFiles(String, bool)): new ArrayList(getFiles#1*) num objects
    //#output(List getFiles(String, bool)): return_value
    //#new obj(List getFiles(String, bool)): new ArrayList(getFiles#1*)
    //#pre[4] (List getFiles(String, bool)): this.__Tag == net/sourceforge/pebble/domain/FileManager
    //#pre[6] (List getFiles(String, bool)): init'ed(this.type)
    //#pre[5] (List getFiles(String, bool)): (soft) init'ed(this.root)
    //#post(List getFiles(String, bool)): return_value == &new ArrayList(getFiles#1*)
    //#post(List getFiles(String, bool)): new ArrayList(getFiles#1*) num objects == 1
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.io.File
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:getFileMetaData
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:getFiles
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:getFile
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.util.List:add
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:setType
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:setDirectory
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:getSize
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:setSize
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.io.File:length
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.util.Date
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:setLastModified
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(List getFiles(String, bool)): Effects-of-calling:java.lang.String:startsWith
    return getFiles(subDirectory, includeChildren);
    //#filemanager.java:376: end of method: List net.sourceforge.pebble.domain.FileManager.getFiles(String, bool)
  }

  private List getFiles(FileMetaData path, boolean includeChildren) throws IllegalFileAccessException {
    File directoryToView = getFile(path);
    //#filemanager.java:380: method: List net.sourceforge.pebble.domain.FileManager.getFiles(FileMetaData, bool)
    //#input(List getFiles(FileMetaData, bool)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(List getFiles(FileMetaData, bool)): __Descendant_Table[others]
    //#input(List getFiles(FileMetaData, bool)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(List getFiles(FileMetaData, bool)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(List getFiles(FileMetaData, bool)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(List getFiles(FileMetaData, bool)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(List getFiles(FileMetaData, bool)): includeChildren
    //#input(List getFiles(FileMetaData, bool)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(List getFiles(FileMetaData, bool)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(List getFiles(FileMetaData, bool)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(List getFiles(FileMetaData, bool)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(List getFiles(FileMetaData, bool)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(List getFiles(FileMetaData, bool)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(List getFiles(FileMetaData, bool)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(List getFiles(FileMetaData, bool)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(List getFiles(FileMetaData, bool)): path
    //#input(List getFiles(FileMetaData, bool)): path.__Tag
    //#input(List getFiles(FileMetaData, bool)): path.name
    //#input(List getFiles(FileMetaData, bool)): path.path
    //#input(List getFiles(FileMetaData, bool)): this
    //#input(List getFiles(FileMetaData, bool)): this.__Tag
    //#input(List getFiles(FileMetaData, bool)): this.root
    //#input(List getFiles(FileMetaData, bool)): this.type
    //#output(List getFiles(FileMetaData, bool)): new ArrayList(getFiles#1) num objects
    //#output(List getFiles(FileMetaData, bool)): return_value
    //#new obj(List getFiles(FileMetaData, bool)): new ArrayList(getFiles#1)
    //#pre[7] (List getFiles(FileMetaData, bool)): this.__Tag == net/sourceforge/pebble/domain/FileManager
    //#pre[8] (List getFiles(FileMetaData, bool)): init'ed(this.root)
    //#pre[2] (List getFiles(FileMetaData, bool)): (soft) path != null
    //#pre[3] (List getFiles(FileMetaData, bool)): (soft) path.__Tag == net/sourceforge/pebble/domain/FileMetaData
    //#pre[4] (List getFiles(FileMetaData, bool)): (soft) init'ed(path.name)
    //#pre[5] (List getFiles(FileMetaData, bool)): (soft) path.path != null
    //#pre[9] (List getFiles(FileMetaData, bool)): (soft) init'ed(this.type)
    //#presumption(List getFiles(FileMetaData, bool)): f.length@389 <= 4_294_967_295
    //#presumption(List getFiles(FileMetaData, bool)): f[i]@389 != null
    //#presumption(List getFiles(FileMetaData, bool)): f[i]@389 != null
    //#presumption(List getFiles(FileMetaData, bool)): net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
    //#post(List getFiles(FileMetaData, bool)): return_value == &new ArrayList(getFiles#1)
    //#post(List getFiles(FileMetaData, bool)): new ArrayList(getFiles#1) num objects == 1
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.io.File
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:getFileMetaData
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:getFiles
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:getFile
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.util.List:add
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:setType
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:setDirectory
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:getSize
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:setSize
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.io.File:length
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.util.Date
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:setLastModified
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(List getFiles(FileMetaData, bool)): Effects-of-calling:java.lang.String:startsWith
    //#test_vector(List getFiles(FileMetaData, bool)): includeChildren: {0}, {1}
    //#test_vector(List getFiles(FileMetaData, bool)): java.io.File:isDirectory(...)@394: {0}, {1}
    //#test_vector(List getFiles(FileMetaData, bool)): java.io.File:isFile(...)@408: {0}, {1}
    //#test_vector(List getFiles(FileMetaData, bool)): java.io.File:listFiles(...)@389: Addr_Set{null}, Inverse{null}

    if (!isUnderneathRootDirectory(directoryToView)) {
      throw new IllegalFileAccessException();
    }

    List directoriesAndFiles = new ArrayList();
    List files = new ArrayList();
    List directories = new ArrayList();
    File f[] = directoryToView.listFiles();
    if (f != null) {
      File file;
      for (int i = 0; i < f.length; i++) {
        file = f[i];
        if (file.isDirectory()) {
          FileMetaData metaData = getFileMetaData(path.getAbsolutePath(), file.getName());
          directories.add(metaData);

          if (includeChildren) {
            directories.addAll(getFiles(metaData.getAbsolutePath(), true));
          } else {
            Collections.sort(directories, new FileMetaDataComparator());
          }
        }
      }

      for (int i = 0; i < f.length; i++) {
        file = f[i];
        if (file.isFile()) {
          FileMetaData metaData = getFileMetaData(path.getAbsolutePath(), file.getName());
          files.add(metaData);
        }
      }

      Collections.sort(files, new FileMetaDataComparator());
    }

    directoriesAndFiles.addAll(directories);
    directoriesAndFiles.addAll(files);

    return directoriesAndFiles;
    //#filemanager.java:420: end of method: List net.sourceforge.pebble.domain.FileManager.getFiles(FileMetaData, bool)
  }

  /**
   * Determines how much space is being used in files, images and theme.
   *
   * @param blog    the blog to check against
   * @return  the number of KB
   */
  public static double getCurrentUsage(Blog blog) {
    FileManager imagesFileManager = new FileManager(blog, FileMetaData.BLOG_IMAGE);
    //#filemanager.java:430: method: double net.sourceforge.pebble.domain.FileManager.getCurrentUsage(Blog)
    //#input(double getCurrentUsage(Blog)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(double getCurrentUsage(Blog)): __Descendant_Table[others]
    //#input(double getCurrentUsage(Blog)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(double getCurrentUsage(Blog)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(double getCurrentUsage(Blog)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(double getCurrentUsage(Blog)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(double getCurrentUsage(Blog)): blog
    //#input(double getCurrentUsage(Blog)): blog.__Tag
    //#input(double getCurrentUsage(Blog)): blog.editableTheme
    //#input(double getCurrentUsage(Blog)): blog.editableTheme.__Tag
    //#input(double getCurrentUsage(Blog)): blog.editableTheme.name
    //#input(double getCurrentUsage(Blog)): blog.editableTheme.pathToLiveThemes
    //#input(double getCurrentUsage(Blog)): blog.root
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/AbstractBlog.__Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/AbstractBlog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/AbstractBlog.__Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/AbstractBlog.__Descendant_Table[others]
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/AbstractBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[others]
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getEditableTheme()Lnet/sourceforge/pebble/domain/Theme;
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getFilesDirectory()Ljava/lang/String;
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getImagesDirectory()Ljava/lang/String;
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSizeInKB()D
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/Theme.__Descendant_Table[net/sourceforge/pebble/domain/Theme]
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/Theme.__Descendant_Table[others]
    //#input(double getCurrentUsage(Blog)): net/sourceforge/pebble/domain/Theme.__Dispatch_Table.getPathToLiveTheme()Ljava/io/File;
    //#output(double getCurrentUsage(Blog)): return_value
    //#pre[1] (double getCurrentUsage(Blog)): blog != null
    //#pre[2] (double getCurrentUsage(Blog)): blog.__Tag == net/sourceforge/pebble/domain/Blog
    //#pre[3] (double getCurrentUsage(Blog)): (soft) blog.editableTheme != null
    //#pre[4] (double getCurrentUsage(Blog)): (soft) blog.editableTheme.__Tag == net/sourceforge/pebble/domain/Theme
    //#pre[5] (double getCurrentUsage(Blog)): (soft) init'ed(blog.editableTheme.name)
    //#pre[6] (double getCurrentUsage(Blog)): (soft) init'ed(blog.editableTheme.pathToLiveThemes)
    //#pre[7] (double getCurrentUsage(Blog)): (soft) init'ed(blog.root)
    //#post(double getCurrentUsage(Blog)): return_value in (-Inf..+Inf)
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.io.File
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:getFileMetaData
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:getFiles
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:getFile
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.util.List:add
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:setType
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:setDirectory
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:getSize
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:setSize
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.io.File:length
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.util.Date
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:setLastModified
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(double getCurrentUsage(Blog)): Effects-of-calling:java.lang.String:startsWith
    FileManager filesFileManager = new FileManager(blog, FileMetaData.BLOG_FILE);
    FileManager themeFileManager = new FileManager(blog, FileMetaData.THEME_FILE);
    return  imagesFileManager.getFileMetaData("/").getSizeInKB() +
            filesFileManager.getFileMetaData("/").getSizeInKB() +
            themeFileManager.getFileMetaData("/").getSizeInKB();
    //#filemanager.java:435: end of method: double net.sourceforge.pebble.domain.FileManager.getCurrentUsage(Blog)
  }


  /**
   * Determines whether there is enough space to store the given number of KB.
   *
   * @param blog    the blog to check against
   * @param itemSize  the size of the item to be written
   * @return  true if there is enough space or quotas aren't active
   */
  public static boolean hasEnoughSpace(Blog blog, double itemSize) {
    long quota = PebbleContext.getInstance().getConfiguration().getFileUploadQuota();
    //#filemanager.java:447: method: bool net.sourceforge.pebble.domain.FileManager.hasEnoughSpace(Blog, double)
    //#filemanager.java:447: Warning: method not available
    //#    -- call on PebbleContext net.sourceforge.pebble.PebbleContext:getInstance()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.FileManager
    //#    method: bool hasEnoughSpace(Blog, double)
    //#    unanalyzed callee: PebbleContext net.sourceforge.pebble.PebbleContext:getInstance()
    //#filemanager.java:447: Warning: method not available
    //#    -- call on Configuration net.sourceforge.pebble.PebbleContext:getConfiguration()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.FileManager
    //#    method: bool hasEnoughSpace(Blog, double)
    //#    unanalyzed callee: Configuration net.sourceforge.pebble.PebbleContext:getConfiguration()
    //#input(bool hasEnoughSpace(Blog, double)): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#input(bool hasEnoughSpace(Blog, double)): __Descendant_Table[others]
    //#input(bool hasEnoughSpace(Blog, double)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(bool hasEnoughSpace(Blog, double)): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#input(bool hasEnoughSpace(Blog, double)): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#input(bool hasEnoughSpace(Blog, double)): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#input(bool hasEnoughSpace(Blog, double)): blog
    //#input(bool hasEnoughSpace(Blog, double)): blog.__Tag
    //#input(bool hasEnoughSpace(Blog, double)): blog.editableTheme
    //#input(bool hasEnoughSpace(Blog, double)): blog.editableTheme.__Tag
    //#input(bool hasEnoughSpace(Blog, double)): blog.editableTheme.name
    //#input(bool hasEnoughSpace(Blog, double)): blog.editableTheme.pathToLiveThemes
    //#input(bool hasEnoughSpace(Blog, double)): blog.root
    //#input(bool hasEnoughSpace(Blog, double)): itemSize
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/Configuration.__Descendant_Table[net/sourceforge/pebble/Configuration]
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/Configuration.__Descendant_Table[others]
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/Configuration.__Dispatch_Table.getFileUploadQuota()J
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/AbstractBlog.__Descendant_Table[net/sourceforge/pebble/domain/AbstractBlog]
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/AbstractBlog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/AbstractBlog.__Descendant_Table[net/sourceforge/pebble/domain/MultiBlog]
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/AbstractBlog.__Descendant_Table[others]
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/AbstractBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[others]
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getEditableTheme()Lnet/sourceforge/pebble/domain/Theme;
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getFilesDirectory()Ljava/lang/String;
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getImagesDirectory()Ljava/lang/String;
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[net/sourceforge/pebble/domain/FileMetaData]
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/FileMetaData.__Descendant_Table[others]
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getAbsolutePath()Ljava/lang/String;
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSize()J
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.getSizeInKB()D
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setDirectory(Z)V
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setLastModified(Ljava/util/Date;)V
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setSize(J)V
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/FileMetaData.__Dispatch_Table.setType(Ljava/lang/String;)V
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/MultiBlog.__Dispatch_Table.getRoot()Ljava/lang/String;
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/Theme.__Descendant_Table[net/sourceforge/pebble/domain/Theme]
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/Theme.__Descendant_Table[others]
    //#input(bool hasEnoughSpace(Blog, double)): net/sourceforge/pebble/domain/Theme.__Dispatch_Table.getPathToLiveTheme()Ljava/io/File;
    //#output(bool hasEnoughSpace(Blog, double)): return_value
    //#pre[1] (bool hasEnoughSpace(Blog, double)): (soft) blog != null
    //#pre[2] (bool hasEnoughSpace(Blog, double)): (soft) blog.__Tag == net/sourceforge/pebble/domain/Blog
    //#pre[3] (bool hasEnoughSpace(Blog, double)): (soft) blog.editableTheme != null
    //#pre[4] (bool hasEnoughSpace(Blog, double)): (soft) blog.editableTheme.__Tag == net/sourceforge/pebble/domain/Theme
    //#pre[5] (bool hasEnoughSpace(Blog, double)): (soft) init'ed(blog.editableTheme.name)
    //#pre[6] (bool hasEnoughSpace(Blog, double)): (soft) init'ed(blog.editableTheme.pathToLiveThemes)
    //#pre[7] (bool hasEnoughSpace(Blog, double)): (soft) init'ed(blog.root)
    //#presumption(bool hasEnoughSpace(Blog, double)): net.sourceforge.pebble.PebbleContext:getConfiguration(...).__Tag@447 == net/sourceforge/pebble/Configuration
    //#presumption(bool hasEnoughSpace(Blog, double)): net.sourceforge.pebble.PebbleContext:getConfiguration(...)@447 != null
    //#presumption(bool hasEnoughSpace(Blog, double)): net.sourceforge.pebble.PebbleContext:getInstance(...)@447 != null
    //#post(bool hasEnoughSpace(Blog, double)): init'ed(return_value)
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:net.sourceforge.pebble.util.FileUtils:underneathRoot
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.io.File
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:getFileMetaData
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:getFiles
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:getFile
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:getAbsolutePath
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.io.File:getName
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.util.List:add
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:net.sourceforge.pebble.comparator.FileMetaDataComparator
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:net.sourceforge.pebble.domain.FileMetaData
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:setType
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:setDirectory
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:getSize
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:setSize
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.io.File:length
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.io.File:lastModified
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.util.Date
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:setLastModified
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:getSizeInKB
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(bool hasEnoughSpace(Blog, double)): Effects-of-calling:java.lang.String:startsWith
    //#test_vector(bool hasEnoughSpace(Blog, double)): net.sourceforge.pebble.PebbleContext:getConfiguration(...).fileUploadQuota@447: {-1}, {-9_223_372_036_854_775_808..-2, 0..18_446_744_073_709_551_615}

    return (quota == -1) || ((quota - getCurrentUsage(blog)) > itemSize);
    //#filemanager.java:449: end of method: bool net.sourceforge.pebble.domain.FileManager.hasEnoughSpace(Blog, double)
  }

}
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Descendant_Table[net/sourceforge/pebble/domain/FileManager]
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.copyFile(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/io/File;
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.createDirectory(Ljava/lang/String;Ljava/lang/String;)Ljava/io/File;
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.deleteFile(Ljava/lang/String;Ljava/lang/String;)V
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFile(Ljava/lang/String;)Ljava/io/File;
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFile(Lnet/sourceforge/pebble/domain/FileMetaData;)Ljava/io/File;
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFiles(Ljava/lang/String;)Ljava/util/List;
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List;
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFiles(Lnet/sourceforge/pebble/domain/FileMetaData;Z)Ljava/util/List;
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getParent(Lnet/sourceforge/pebble/domain/FileMetaData;)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getRootDirectory()Ljava/io/File;
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.loadFile(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.renameFile(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/io/File;
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.saveFile(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#output(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.saveFile(Ljava/lang/String;[B)Lnet/sourceforge/pebble/domain/FileMetaData;
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Descendant_Table[net/sourceforge/pebble/domain/FileManager] == &__Dispatch_Table
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.copyFile(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/io/File; == &copyFile
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.createDirectory(Ljava/lang/String;Ljava/lang/String;)Ljava/io/File; == &createDirectory
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.deleteFile(Ljava/lang/String;Ljava/lang/String;)V == &deleteFile
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFile(Ljava/lang/String;)Ljava/io/File; == &getFile
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFile(Lnet/sourceforge/pebble/domain/FileMetaData;)Ljava/io/File; == &getFile
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFileMetaData(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData; == &getFileMetaData
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFileMetaData(Ljava/lang/String;Ljava/lang/String;)Lnet/sourceforge/pebble/domain/FileMetaData; == &getFileMetaData
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFiles(Ljava/lang/String;)Ljava/util/List; == &getFiles
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFiles(Ljava/lang/String;Z)Ljava/util/List; == &getFiles
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getFiles(Lnet/sourceforge/pebble/domain/FileMetaData;Z)Ljava/util/List; == &getFiles
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getParent(Lnet/sourceforge/pebble/domain/FileMetaData;)Lnet/sourceforge/pebble/domain/FileMetaData; == &getParent
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.getRootDirectory()Ljava/io/File; == &getRootDirectory
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.isUnderneathRootDirectory(Ljava/io/File;)Z == &isUnderneathRootDirectory
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.loadFile(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; == &loadFile
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.renameFile(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/io/File; == &renameFile
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.saveFile(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V == &saveFile
    //#post(net.sourceforge.pebble.domain.FileManager__static_init): __Dispatch_Table.saveFile(Ljava/lang/String;[B)Lnet/sourceforge/pebble/domain/FileMetaData; == &saveFile
    //#filemanager.java:: end of method: net.sourceforge.pebble.domain.FileManager.net.sourceforge.pebble.domain.FileManager__static_init
    //#filemanager.java:: end of class: net.sourceforge.pebble.domain.FileManager
