Open Source Repository

Home /log4j/log4j-1.2.9 | Repository Home


org/apache/log4j/lf5/viewer/configure/MRUFileManager.java
/*
 * Copyright (C) The Apache Software Foundation. All rights reserved.
 *
 * This software is published under the terms of the Apache Software
 * License version 1.1, a copy of which has been included with this
 * distribution in the LICENSE.txt file.
 */
package org.apache.log4j.lf5.viewer.configure;

import java.io.*;
import java.net.URL;
import java.util.Iterator;
import java.util.LinkedList;


/**
 <p>MRUFileManager handles the storage and retrival the most
 * recently opened log files.
 *
 @author Brad Marlborough
 @author Richard Hurst
 */

// Contributed by ThoughtWorks Inc.

public class MRUFileManager {
  //--------------------------------------------------------------------------
  //   Constants:
  //--------------------------------------------------------------------------
  private static final String CONFIG_FILE_NAME = "mru_file_manager";
  private static final int DEFAULT_MAX_SIZE = 3;

  //--------------------------------------------------------------------------
  //   Protected Variables:
  //--------------------------------------------------------------------------

  //--------------------------------------------------------------------------
  //   Private Variables:
  //--------------------------------------------------------------------------
  private int _maxSize = 0;
  private LinkedList _mruFileList;

  //--------------------------------------------------------------------------
  //   Constructors:
  //--------------------------------------------------------------------------
  public MRUFileManager() {
    load();
    setMaxSize(DEFAULT_MAX_SIZE);
  }

  public MRUFileManager(int maxSize) {
    load();
    setMaxSize(maxSize);
  }
  //--------------------------------------------------------------------------
  //   Public Methods:
  //--------------------------------------------------------------------------

  /**
   * Saves a list of MRU files out to a file.
   */
  public void save() {
    File file = new File(getFilename());

    try {
      ObjectOutputStream oos = new ObjectOutputStream(new
          FileOutputStream(file));
      oos.writeObject(_mruFileList);
      oos.flush();
      oos.close();
    catch (Exception e) {
      // do nothing
      e.printStackTrace();
    }
  }

  /**
   * Gets the size of the MRU file list.
   */
  public int size() {
    return _mruFileList.size();
  }

  /**
   * Returns a particular file name stored in a MRU file
   * list based on an index value.
   */
  public Object getFile(int index) {
    if (index < size()) {
      return _mruFileList.get(index);
    }

    return null;
  }

  /**
   * Returns a input stream to the resource at the specified index
   */
  public InputStream getInputStream(int indexthrows IOException,
      FileNotFoundException {
    if (index < size()) {
      Object o = getFile(index);
      if (instanceof File) {
        return getInputStream((Fileo);
      else {
        return getInputStream((URLo);
      }
    }
    return null;
  }

  /**
   * Adds a file name to the MRU file list.
   */
  public void set(File file) {
    setMRU(file);
  }

  /**
   * Adds a url to the MRU file list.
   */
  public void set(URL url) {
    setMRU(url);
  }

  /**
   * Gets the list of files stored in the MRU file list.
   */
  public String[] getMRUFileList() {
    if (size() == 0) {
      return null;
    }

    String[] ss = new String[size()];

    for (int i = 0; i < size(); i++) {
      Object o = getFile(i);
      if (instanceof File) {
        ss[i((Fileo).getAbsolutePath();
      else // must be a url
      {
        ss[i= o.toString();
      }

    }

    return ss;
  }

  /**
   * Moves the the index to the top of the MRU List
   *
   @param index The index to be first in the mru list
   */
  public void moveToTop(int index) {
    _mruFileList.add(0, _mruFileList.remove(index));
  }

  /**
   * Creates the directory where the MRU file list will be written.
   * The "lf5" directory is created in the Documents and Settings
   * directory on Windows 2000 machines and where ever the user.home
   * variable points on all other platforms.
   */
  public static void createConfigurationDirectory() {
    String home = System.getProperty("user.home");
    String sep = System.getProperty("file.separator");
    File f = new File(home + sep + "lf5");
    if (!f.exists()) {
      try {
        f.mkdir();
      catch (SecurityException e) {
        e.printStackTrace();
      }
    }

  }
  //--------------------------------------------------------------------------
  //   Protected Methods:
  //--------------------------------------------------------------------------
  /**
   * Gets an input stream for the corresponding file.
   *
   @param file The file to create the input stream from.
   @return InputStream
   */
  protected InputStream getInputStream(File filethrows IOException,
      FileNotFoundException {
    BufferedInputStream reader =
        new BufferedInputStream(new FileInputStream(file));

    return reader;
  }

  /**
   * Gets an input stream for the corresponding URL.
   *
   @param url The url to create the input stream from.
   @return InputStream
   */
  protected InputStream getInputStream(URL urlthrows IOException {
    return url.openStream();
  }

  /**
   * Adds an object to the mru.
   */
  protected void setMRU(Object o) {
    int index = _mruFileList.indexOf(o);

    if (index == -1) {
      _mruFileList.add(0, o);
      setMaxSize(_maxSize);
    else {
      moveToTop(index);
    }
  }

  /**
   * Loads the MRU file list in from a file and stores it in a LinkedList.
   * If no file exists, a new LinkedList is created.
   */
  protected void load() {
    createConfigurationDirectory();
    File file = new File(getFilename());
    if (file.exists()) {
      try {
        ObjectInputStream ois = new ObjectInputStream(
            new FileInputStream(file));
        _mruFileList = (LinkedListois.readObject();
        ois.close();

        // check that only files and url are in linked list
        Iterator it = _mruFileList.iterator();
        while (it.hasNext()) {
          Object o = it.next();
          if (!(instanceof File&& !(instanceof URL)) {
            it.remove();
          }
        }
      catch (Exception e) {
        _mruFileList = new LinkedList();
      }
    else {
      _mruFileList = new LinkedList();
    }

  }

  protected String getFilename() {
    String home = System.getProperty("user.home");
    String sep = System.getProperty("file.separator");

    return home + sep + "lf5" + sep + CONFIG_FILE_NAME;
  }

  /**
   * Ensures that the MRU list will have a MaxSize.
   */
  protected void setMaxSize(int maxSize) {
    if (maxSize < _mruFileList.size()) {
      for (int i = 0; i < _mruFileList.size() - maxSize; i++) {
        _mruFileList.removeLast();
      }
    }

    _maxSize = maxSize;
  }
  //--------------------------------------------------------------------------
  //   Private Methods:
  //--------------------------------------------------------------------------

  //--------------------------------------------------------------------------
  //   Nested Top-Level Classes or Interfaces
  //--------------------------------------------------------------------------
}