/*
* 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 index) throws IOException,
FileNotFoundException {
if (index < size()) {
Object o = getFile(index);
if (o instanceof File) {
return getInputStream((File) o);
} else {
return getInputStream((URL) o);
}
}
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 (o instanceof File) {
ss[i] = ((File) o).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 file) throws 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 url) throws 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 = (LinkedList) ois.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 (!(o instanceof File) && !(o 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
//--------------------------------------------------------------------------
}
|