File Source: filemanager.java

         /* 
    P/P   *  Method: net.sourceforge.pebble.domain.FileManager__static_init
          */
     1  /*
     2   * Copyright (c) 2003-2006, Simon Brown
     3   * All rights reserved.
     4   *
     5   * Redistribution and use in source and binary forms, with or without
     6   * modification, are permitted provided that the following conditions are met:
     7   *
     8   *   - Redistributions of source code must retain the above copyright
     9   *     notice, this list of conditions and the following disclaimer.
    10   *
    11   *   - Redistributions in binary form must reproduce the above copyright
    12   *     notice, this list of conditions and the following disclaimer in
    13   *     the documentation and/or other materials provided with the
    14   *     distribution.
    15   *
    16   *   - Neither the name of Pebble nor the names of its contributors may
    17   *     be used to endorse or promote products derived from this software
    18   *     without specific prior written permission.
    19   *
    20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    30   * POSSIBILITY OF SUCH DAMAGE.
    31   */
    32  package net.sourceforge.pebble.domain;
    33  
    34  import net.sourceforge.pebble.comparator.FileMetaDataComparator;
    35  import net.sourceforge.pebble.util.FileUtils;
    36  import net.sourceforge.pebble.PebbleContext;
    37  
    38  import java.io.*;
    39  import java.util.*;
    40  
    41  /**
    42   * Encapsulates methods for managing and manipulating files under the
    43   * following locations:
    44   * <ul>
    45   * <li>${blog.dir}/images</li>
    46   * <li>${blog.dir}/files</li>
    47   * <li>${editableTheme}</li>
    48   * </ul>
    49   *
    50   * @author Simon Brown
    51   */
    52  public class FileManager {
    53  
    54    /** the type of files being managed */
    55    private String type;
    56  
    57    /** the root directory for the particular file type */
    58    private File root;
    59  
    60    /**
    61     * Creates a new instande for the specified blog and type.
    62     *
    63     * @param blog    the blog that this manager refers to
    64     * @param type    the type of files to manage
    65     */
           /* 
    P/P     *  Method: void net.sourceforge.pebble.domain.FileManager(Blog, String)
            * 
            *  Preconditions:
            *    blog != null
            *    type != null
            * 
            *  Postconditions:
            *    this.root in Addr_Set{&new File(FileManager#3),&new File(FileManager#2),&new File(getPathToLiveTheme#1),&new File(FileManager#1)}
            *    this.type == type
            *    this.type != null
            *    new File(FileManager#1) num objects <= 1
            *    new File(FileManager#2) num objects <= 1
            *    new File(FileManager#3) num objects <= 1
            *    new File(getPathToLiveTheme#1) num objects <= 1
            * 
            *  Test Vectors:
            *    java.lang.String:equals(...)@70: {0}, {1}
            *    java.lang.String:equals(...)@72: {0}, {1}
            *    java.lang.String:equals(...)@74: {0}, {1}
            * 
            *  Preconditions:
            *    (soft) blog.editableTheme != null
            *    (soft) init'ed(blog.editableTheme.name)
            *    (soft) init'ed(blog.editableTheme.pathToLiveThemes)
            *    (soft) init'ed(blog.root)
            */
    66    public FileManager(Blog blog, String type) {
    67      this.type = type;
    68  
    69      // which directory are we looking at?
    70      if (type.equals(FileMetaData.BLOG_IMAGE)) {
    71        this.root = new File(blog.getImagesDirectory());
    72      } else if (type.equals(FileMetaData.THEME_FILE)) {
    73        this.root = blog.getEditableTheme().getPathToLiveTheme();
    74      } else if (type.equals(FileMetaData.BLOG_DATA)) {
    75        this.root = new File(blog.getRoot());
    76      } else {
    77        this.root = new File(blog.getFilesDirectory());
    78      }
    79    }
    80  
    81    /**
    82     * Gets the root directory that this class is managing.
    83     *
    84     * @return  a File instance
    85     */
    86    public File getRootDirectory() {
             /* 
    P/P       *  Method: File getRootDirectory()
              * 
              *  Preconditions:
              *    init'ed(this.root)
              * 
              *  Postconditions:
              *    return_value == this.root
              *    init'ed(return_value)
              */
    87      return this.root;
    88    }
    89  
    90    /**
    91     * Gets meta data about a specific file or directory.
    92     *
    93     * @param path    the path of the file/directory
    94     * @return        a FileMetaData object
    95     */
    96    public FileMetaData getFileMetaData(String path) {
             /* 
    P/P       *  Method: FileMetaData getFileMetaData(String)
              * 
              *  Preconditions:
              *    init'ed(this.type)
              *    (soft) init'ed(this.root)
              * 
              *  Presumptions:
              *    java.util.Iterator:next(...)@110 != null
              * 
              *  Postconditions:
              *    return_value == &new FileMetaData(getFileMetaData#1)
              *    new Date(getFileMetaData#2) num objects <= 1
              *    new FileMetaData(getFileMetaData#1) num objects == 1
              *    return_value.context == this
              *    return_value.context != null
              *    init'ed(return_value.directory)
              *    init'ed(return_value.lastModified)
              *    return_value.name != null
              *    return_value.path != null
              *    init'ed(return_value.size)
              *    ...
              * 
              *  Test Vectors:
              *    java.io.File:exists(...)@102: {0}, {1}
              *    java.io.File:isDirectory(...)@103: {0}, {1}
              *    java.util.Iterator:hasNext(...)@109: {1}, {0}
              */
    97      FileMetaData metaData = new FileMetaData(this, path);
    98      metaData.setType(type);
    99  
   100      // is it a directory?
   101      File file = getFile(metaData);
   102      if (file.exists()) {
   103        if (file.isDirectory()) {
   104          metaData.setDirectory(true);
   105          try {
   106            List files = getFiles(metaData, true);
   107            long size = 0;
   108            Iterator it = files.iterator();
   109            while (it.hasNext()) {
   110              size += ((FileMetaData)it.next()).getSize();
   111            }
   112            metaData.setSize(size);
   113          } catch (IllegalFileAccessException ifae) {
   114            // do nothing
   115          }
   116        } else {
   117          metaData.setSize(file.length());
   118        }
   119  
   120        metaData.setLastModified(new Date(file.lastModified()));
   121      }
   122  
   123      return metaData;
   124    }
   125  
   126    public FileMetaData getParent(FileMetaData file) {
             /* 
    P/P       *  Method: FileMetaData getParent(FileMetaData)
              * 
              *  Preconditions:
              *    file != null
              *    init'ed(file.name)
              *    file.path != null
              *    (soft) init'ed(this.root)
              *    (soft) init'ed(this.type)
              * 
              *  Postconditions:
              *    return_value in Addr_Set{null,&new FileMetaData(getFileMetaData#1)}
              *    new Date(getFileMetaData#2) num objects <= 1
              *    new FileMetaData(getFileMetaData#1) num objects <= 1
              *    new FileMetaData(getFileMetaData#1).context == this
              *    new FileMetaData(getFileMetaData#1).context != null
              *    init'ed(new FileMetaData(getFileMetaData#1).directory)
              *    init'ed(new FileMetaData(getFileMetaData#1).lastModified)
              *    new FileMetaData(getFileMetaData#1).name != null
              *    new FileMetaData(getFileMetaData#1).path != null
              *    init'ed(new FileMetaData(getFileMetaData#1).size)
              *    ...
              * 
              *  Test Vectors:
              *    java.lang.String:equals(...)@127: {0}, {1}
              */
   127      if (file.getAbsolutePath().equals("/")) {
   128        return null;
   129      } else {
   130        return getFileMetaData(file.getPath());
   131      }
   132    }
   133  
   134    /**
   135     * Gets meta data about a specific file or directory.
   136     *
   137     * @param path    the path of the file/directory
   138     * @param name    the name of the file/directory
   139     * @return        a FileMetaData object
   140     */
   141    public FileMetaData getFileMetaData(String path, String name) {
             /* 
    P/P       *  Method: FileMetaData getFileMetaData(String, String)
              * 
              *  Preconditions:
              *    init'ed(this.type)
              *    (soft) init'ed(this.root)
              * 
              *  Postconditions:
              *    return_value == &new FileMetaData(getFileMetaData#1*)
              *    new Date(getFileMetaData#2*) num objects <= 1
              *    new FileMetaData(getFileMetaData#1*) num objects == 1
              *    new FileMetaData(getFileMetaData#1*).context != null
              *    init'ed(new FileMetaData(getFileMetaData#1*).directory)
              *    init'ed(new FileMetaData(getFileMetaData#1*).lastModified)
              *    new FileMetaData(getFileMetaData#1*).name != null
              *    new FileMetaData(getFileMetaData#1*).path != null
              *    init'ed(new FileMetaData(getFileMetaData#1*).size)
              *    init'ed(new FileMetaData(getFileMetaData#1*).type)
              * 
              *  Test Vectors:
              *    path: Addr_Set{null}, Inverse{null}
              *    java.lang.String:endsWith(...)@142: {0}, {1}
              */
   142      if (path != null && path.endsWith("/")) {
   143        return getFileMetaData(path + name);
   144      } else {
   145        return getFileMetaData(path + "/" + name);
   146      }
   147    }
   148  
   149    /**
   150     * Gets a java.io.File reference to the specified path, regardless
   151     * of whether it represents a file or directory.
   152     *
   153     * @param path    an absolute path from the root
   154     * @return    a java.io.File instance
   155     */
   156    public File getFile(String path) {
   157      String relativePath;
             /* 
    P/P       *  Method: File getFile(String)
              * 
              *  Preconditions:
              *    init'ed(this.root)
              * 
              *  Postconditions:
              *    return_value == &new File(getFile#1)
              *    new File(getFile#1) num objects == 1
              * 
              *  Test Vectors:
              *    path: Addr_Set{null}, Inverse{null}
              *    java.lang.String:startsWith(...)@158: {0}, {1}
              */
   158      if (path != null && path.startsWith("/")) {
   159        relativePath = path.substring(1);
   160      } else {
   161        relativePath = path;
   162      }
   163  
   164      return new File(root, relativePath);
   165    }
   166  
   167    /**
   168     * Convenience method to get a java.io.File reference to the file represented
   169     * by the specified FileMetaData object.
   170     *
   171     * @param file    the FileMetaData object representing the path
   172     * @return    a java.io.File instance
   173     */
   174    private File getFile(FileMetaData file) {
             /* 
    P/P       *  Method: File getFile(FileMetaData)
              * 
              *  Preconditions:
              *    file != null
              *    init'ed(file.name)
              *    file.path != null
              *    init'ed(this.root)
              * 
              *  Postconditions:
              *    return_value == &new File(getFile#1)
              *    new File(getFile#1) num objects == 1
              */
   175      String relativePath = file.getAbsolutePath().substring(1);
   176      return new File(root, relativePath);
   177    }
   178  
   179    /**
   180     * Determines whether the specified file is underneath the root directory
   181     * for this file manager.
   182     *
   183     * @param file    the java.io.File to test
   184     * @return    true if the file is underneath the root, false otherwise
   185     */
   186    public boolean isUnderneathRootDirectory(File file) {
             /* 
    P/P       *  Method: bool isUnderneathRootDirectory(File)
              * 
              *  Preconditions:
              *    init'ed(this.root)
              * 
              *  Postconditions:
              *    init'ed(return_value)
              */
   187      return FileUtils.underneathRoot(root, file);
   188    }
   189  
   190    /**
   191     * Creates a new directory with the specified name underneath the given path.
   192     *
   193     * @param path    the path under which to create the directory
   194     * @param name    the name of the directory
   195     * @return    a java.io.File instance representing the new directory
   196     */
   197    public File createDirectory(String path, String name) throws IllegalFileAccessException {
             /* 
    P/P       *  Method: File createDirectory(String, String)
              * 
              *  Preconditions:
              *    init'ed(this.type)
              *    (soft) init'ed(this.root)
              * 
              *  Presumptions:
              *    net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
              * 
              *  Postconditions:
              *    return_value == &new File(createDirectory#1)
              *    new File(createDirectory#1) num objects == 1
              */
   198      FileMetaData subDirectory = getFileMetaData(path);
   199  
   200      File newDirectory = new File(getFile(subDirectory), name);
   201      if (!isUnderneathRootDirectory(newDirectory)) {
   202        throw new IllegalFileAccessException();
   203      } else {
   204        newDirectory.mkdirs();
   205      }
   206  
   207      return newDirectory;
   208    }
   209  
   210    /**
   211     * Copies a file.
   212     *
   213     * @param path      the path under which the file exists
   214     * @param name      the name of the file
   215     * @param newName   the new name of the file
   216     * @return    a java.io.File instance representing the new file, or null
   217     *            if the file isn't copied because no new name was given, or the
   218     *            new name is the same as the old name
   219     */
   220    public File copyFile(String path, String name, String newName) throws IOException, IllegalFileAccessException {
             /* 
    P/P       *  Method: File copyFile(String, String, String)
              * 
              *  Preconditions:
              *    (soft) init'ed(this.root)
              *    (soft) init'ed(this.type)
              * 
              *  Presumptions:
              *    net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
              * 
              *  Postconditions:
              *    return_value in Addr_Set{null,&new File(copyFile#2)}
              *    new File(copyFile#2) num objects <= 1
              * 
              *  Test Vectors:
              *    newName: Addr_Set{null}, Inverse{null}
              *    java.lang.String:equals(...)@221: {1}, {0}
              *    java.lang.String:length(...)@221: {0}, {1..232-1}
              */
   221      if (newName != null && newName.length() > 0 && !newName.equals(name)) {
   222        FileMetaData subDirectory = getFileMetaData(path);
   223        File originalFile = new File(getFile(subDirectory), name);
   224        File newFile = new File(getFile(subDirectory), newName);
   225  
   226        if (!isUnderneathRootDirectory(originalFile) || !isUnderneathRootDirectory(newFile)) {
   227          throw new IllegalFileAccessException();
   228        }
   229  
   230        FileUtils.copyFile(originalFile, newFile);
   231  
   232        return newFile;
   233      } else {
   234        return null;
   235      }
   236    }
   237  
   238    /**
   239     * Renames a file.
   240     *
   241     * @param path      the path under which the file exists
   242     * @param name      the name of the file
   243     * @param newName   the new name of the file
   244     * @return    a java.io.File instance representing the new file, or null
   245     *            if the file isn't copied because no new name was given, or the
   246     *            new name is the same as the old name
   247     */
   248    public File renameFile(String path, String name, String newName) throws IllegalFileAccessException {
             /* 
    P/P       *  Method: File renameFile(String, String, String)
              * 
              *  Preconditions:
              *    (soft) init'ed(this.root)
              *    (soft) init'ed(this.type)
              * 
              *  Presumptions:
              *    net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
              * 
              *  Postconditions:
              *    return_value in Addr_Set{null,&new File(renameFile#2)}
              *    new File(renameFile#2) num objects <= 1
              * 
              *  Test Vectors:
              *    newName: Addr_Set{null}, Inverse{null}
              *    java.lang.String:equals(...)@249: {1}, {0}
              *    java.lang.String:length(...)@249: {0}, {1..232-1}
              */
   249      if (newName != null && newName.length() > 0 && !newName.equals(name)) {
   250        FileMetaData subDirectory = getFileMetaData(path);
   251        File originalFile = new File(getFile(subDirectory), name);
   252        File newFile = new File(getFile(subDirectory), newName);
   253  
   254        // check that newFile is underneath the root directory
   255        if (!isUnderneathRootDirectory(originalFile) || !isUnderneathRootDirectory(newFile)) {
   256          throw new IllegalFileAccessException();
   257        }
   258  
   259        originalFile.renameTo(newFile);
   260        return newFile;
   261      } else {
   262        return null;
   263      }
   264    }
   265  
   266    /**
   267     * Deletes a file.
   268     *
   269     * @param path      the path under which the file exists
   270     * @param name      the name of the file
   271     */
   272    public void deleteFile(String path, String name) throws IllegalFileAccessException {
             /* 
    P/P       *  Method: void deleteFile(String, String)
              * 
              *  Preconditions:
              *    init'ed(this.root)
              *    init'ed(this.type)
              * 
              *  Presumptions:
              *    net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
              */
   273      FileMetaData subDirectory = getFileMetaData(path);
   274      File fileToDelete = new File(getFile(subDirectory), name);
   275  
   276      if (!isUnderneathRootDirectory(fileToDelete)) {
   277        throw new IllegalFileAccessException();
   278      }
   279  
   280      FileUtils.deleteFile(fileToDelete);
   281    }
   282  
   283    /**
   284     * Loads a file into a String.
   285     *
   286     * @param path      the path under which the file exists
   287     * @param name      the name of the file
   288     * @return  a String containing the content of the specified file
   289     */
   290    public String loadFile(String path, String name) throws IllegalFileAccessException {
             /* 
    P/P       *  Method: String loadFile(String, String)
              * 
              *  Preconditions:
              *    init'ed(this.root)
              *    init'ed(this.type)
              * 
              *  Presumptions:
              *    net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
              * 
              *  Postconditions:
              *    return_value != null
              * 
              *  Test Vectors:
              *    java.io.BufferedReader:readLine(...)@306: Addr_Set{null}, Inverse{null}
              */
   291      StringBuffer content = new StringBuffer();
   292  
   293      FileMetaData subDirectory = getFileMetaData(path);
   294      File fileToLoad = new File(getFile(subDirectory), name);
   295  
   296      if (!isUnderneathRootDirectory(fileToLoad)) {
   297        throw new IllegalFileAccessException();
   298      }
   299  
   300      try {
   301        BufferedReader reader = new BufferedReader(new FileReader(fileToLoad));
   302        String line = reader.readLine();
   303        while (line != null) {
   304          content.append(line);
   305  
   306          line = reader.readLine();
   307          if (line != null) {
   308            content.append(System.getProperty("line.separator"));
   309          }
   310        }
   311        reader.close();
   312      } catch (IOException ioe) {
   313        ioe.printStackTrace();
   314      }
   315  
   316      return content.toString();
   317    }
   318  
   319    /**
   320     * Saves a file with the given content.
   321     *
   322     * @param path      the path under which the file exists
   323     * @param name      the name of the file
   324     * @param content   the content as a String
   325     */
   326    public void saveFile(String path, String name, String content) throws IOException, IllegalFileAccessException {
             /* 
    P/P       *  Method: void saveFile(String, String, String)
              * 
              *  Preconditions:
              *    init'ed(this.type)
              *    (soft) init'ed(this.root)
              * 
              *  Presumptions:
              *    net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
              */
   327      FileMetaData subDirectory = getFileMetaData(path);
   328      File fileToSave = new File(getFile(subDirectory), name);
   329  
   330      if (!isUnderneathRootDirectory(fileToSave)) {
   331        throw new IllegalFileAccessException();
   332      }
   333  
   334      BufferedWriter writer = new BufferedWriter(new FileWriter(fileToSave));
   335      writer.write(content);
   336      writer.flush();
   337      writer.close();
   338    }
   339  
   340    /**
   341     * Saves a file with the given binary content.
   342     *
   343     * @param name      the name of the file
   344     * @param content   the binary content
   345     * @return  a FileMetaData instance representing the saved file
   346     */
   347    public FileMetaData saveFile(String name, byte[] content) throws IOException, IllegalFileAccessException {
             /* 
    P/P       *  Method: FileMetaData saveFile(String, byte[])
              * 
              *  Preconditions:
              *    init'ed(this.root)
              *    init'ed(this.type)
              * 
              *  Presumptions:
              *    net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
              * 
              *  Postconditions:
              *    return_value == &new FileMetaData(getFileMetaData#1)
              *    new Date(getFileMetaData#2) num objects <= 1
              *    new FileMetaData(getFileMetaData#1) num objects == 1
              *    return_value.context == this
              *    return_value.context != null
              *    init'ed(return_value.directory)
              *    init'ed(return_value.lastModified)
              *    return_value.name != null
              *    return_value.path != null
              *    init'ed(return_value.size)
              *    ...
              */
   348      FileMetaData file = getFileMetaData(name);
   349      File fileToSave = getFile(name);
   350  
   351      if (!isUnderneathRootDirectory(fileToSave)) {
   352        throw new IllegalFileAccessException();
   353      }
   354  
   355      BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fileToSave));
   356      out.write(content);
   357      out.flush();
   358      out.close();
   359  
   360      return file;
   361    }
   362  
   363    /**
   364     * Gets a list of files that reside under a given path.
   365     *
   366     * @param path      the path under which the file exists
   367     * @return  a List of FileMetaData instances
   368     * @throws IllegalFileAccessException   if trying to access a file outside the root
   369     */
   370    public List getFiles(String path) throws IllegalFileAccessException {
             /* 
    P/P       *  Method: List getFiles(String)
              * 
              *  Preconditions:
              *    init'ed(this.type)
              *    (soft) init'ed(this.root)
              * 
              *  Postconditions:
              *    return_value == &new ArrayList(getFiles#1*)
              *    new ArrayList(getFiles#1*) num objects == 1
              */
   371      return getFiles(path, false);
   372    }
   373  
   374    public List getFiles(String path, boolean includeChildren) throws IllegalFileAccessException {
             /* 
    P/P       *  Method: List getFiles(String, bool)
              * 
              *  Preconditions:
              *    init'ed(this.type)
              *    (soft) init'ed(this.root)
              * 
              *  Postconditions:
              *    return_value == &new ArrayList(getFiles#1*)
              *    new ArrayList(getFiles#1*) num objects == 1
              */
   375      FileMetaData subDirectory = getFileMetaData(path);
   376      return getFiles(subDirectory, includeChildren);
   377    }
   378  
   379    private List getFiles(FileMetaData path, boolean includeChildren) throws IllegalFileAccessException {
             /* 
    P/P       *  Method: List getFiles(FileMetaData, bool)
              * 
              *  Preconditions:
              *    init'ed(this.root)
              *    (soft) path != null
              *    (soft) init'ed(path.name)
              *    (soft) path.path != null
              *    (soft) init'ed(this.type)
              * 
              *  Presumptions:
              *    f.length@389 <= 232-1
              *    f[i]@389 != null
              *    net.sourceforge.pebble.util.FileUtils:underneathRoot(...)@187 == 1
              * 
              *  Postconditions:
              *    return_value == &new ArrayList(getFiles#1)
              *    new ArrayList(getFiles#1) num objects == 1
              * 
              *  Test Vectors:
              *    includeChildren: {0}, {1}
              *    java.io.File:isDirectory(...)@394: {0}, {1}
              *    java.io.File:isFile(...)@408: {0}, {1}
              *    java.io.File:listFiles(...)@389: Addr_Set{null}, Inverse{null}
              */
   380      File directoryToView = getFile(path);
   381  
   382      if (!isUnderneathRootDirectory(directoryToView)) {
   383        throw new IllegalFileAccessException();
   384      }
   385  
   386      List directoriesAndFiles = new ArrayList();
   387      List files = new ArrayList();
   388      List directories = new ArrayList();
   389      File f[] = directoryToView.listFiles();
   390      if (f != null) {
   391        File file;
   392        for (int i = 0; i < f.length; i++) {
   393          file = f[i];
   394          if (file.isDirectory()) {
   395            FileMetaData metaData = getFileMetaData(path.getAbsolutePath(), file.getName());
   396            directories.add(metaData);
   397  
   398            if (includeChildren) {
   399              directories.addAll(getFiles(metaData.getAbsolutePath(), true));
   400            } else {
   401              Collections.sort(directories, new FileMetaDataComparator());
   402            }
   403          }
   404        }
   405  
   406        for (int i = 0; i < f.length; i++) {
   407          file = f[i];
   408          if (file.isFile()) {
   409            FileMetaData metaData = getFileMetaData(path.getAbsolutePath(), file.getName());
   410            files.add(metaData);
   411          }
   412        }
   413  
   414        Collections.sort(files, new FileMetaDataComparator());
   415      }
   416  
   417      directoriesAndFiles.addAll(directories);
   418      directoriesAndFiles.addAll(files);
   419  
   420      return directoriesAndFiles;
   421    }
   422  
   423    /**
   424     * Determines how much space is being used in files, images and theme.
   425     *
   426     * @param blog    the blog to check against
   427     * @return  the number of KB
   428     */
   429    public static double getCurrentUsage(Blog blog) {
             /* 
    P/P       *  Method: double getCurrentUsage(Blog)
              * 
              *  Preconditions:
              *    blog != null
              * 
              *  Postconditions:
              *    return_value in (-Inf..+Inf)
              * 
              *  Preconditions:
              *    (soft) blog.editableTheme != null
              *    (soft) init'ed(blog.editableTheme.name)
              *    (soft) init'ed(blog.editableTheme.pathToLiveThemes)
              *    (soft) init'ed(blog.root)
              */
   430      FileManager imagesFileManager = new FileManager(blog, FileMetaData.BLOG_IMAGE);
   431      FileManager filesFileManager = new FileManager(blog, FileMetaData.BLOG_FILE);
   432      FileManager themeFileManager = new FileManager(blog, FileMetaData.THEME_FILE);
   433      return  imagesFileManager.getFileMetaData("/").getSizeInKB() +
   434              filesFileManager.getFileMetaData("/").getSizeInKB() +
   435              themeFileManager.getFileMetaData("/").getSizeInKB();
   436    }
   437  
   438  
   439    /**
   440     * Determines whether there is enough space to store the given number of KB.
   441     *
   442     * @param blog    the blog to check against
   443     * @param itemSize  the size of the item to be written
   444     * @return  true if there is enough space or quotas aren't active
   445     */
   446    public static boolean hasEnoughSpace(Blog blog, double itemSize) {
             /* 
    P/P       *  Method: bool hasEnoughSpace(Blog, double)
              * 
              *  Preconditions:
              *    (soft) blog != null
              * 
              *  Postconditions:
              *    init'ed(return_value)
              * 
              *  Preconditions:
              *    (soft) blog.editableTheme != null
              *    (soft) init'ed(blog.editableTheme.name)
              *    (soft) init'ed(blog.editableTheme.pathToLiveThemes)
              *    (soft) init'ed(blog.root)
              * 
              *  Presumptions:
              *    net.sourceforge.pebble.PebbleContext:getConfiguration(...)@447 != null
              *    net.sourceforge.pebble.PebbleContext:getInstance(...)@447 != null
              * 
              *  Test Vectors:
              *    net.sourceforge.pebble.PebbleContext:getConfiguration(...).fileUploadQuota@447: {-1}, {-263..-2, 0..264-1}
              */
   447      long quota = PebbleContext.getInstance().getConfiguration().getFileUploadQuota();
   448  
   449      return (quota == -1) || ((quota - getCurrentUsage(blog)) > itemSize);
   450    }
   451  
   452  }








SofCheck Inspector Build Version : 2.22510
filemanager.java 2010-Jun-25 19:40:32
filemanager.class 2010-Jul-19 20:23:40