View Javadoc

    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one or more
    3    * contributor license agreements.  See the NOTICE file distributed with
    4    * this work for additional information regarding copyright ownership.
    5    * The ASF licenses this file to You under the Apache License, Version 2.0
    6    * (the "License"); you may not use this file except in compliance with
    7    * the License.  You may obtain a copy of the License at
    8    *
    9    *      http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17  package org.apache.log4j.lf5.viewer.configure;
    18
    19  import java.io.BufferedInputStream;
    20  import java.io.File;
    21  import java.io.FileInputStream;
    22  import java.io.FileNotFoundException;
    23  import java.io.FileOutputStream;
    24  import java.io.IOException;
    25  import java.io.InputStream;
    26  import java.io.ObjectInputStream;
    27  import java.io.ObjectOutputStream;
    28  import java.net.URL;
    29  import java.util.Iterator;
    30  import java.util.LinkedList;
    31
    32
    33  /**
    34   * <p>MRUFileManager handles the storage and retrival the most
    35   * recently opened log files.
    36   *
    37   * @author Brad Marlborough
    38   * @author Richard Hurst
    39   */
    40
    41  // Contributed by ThoughtWorks Inc.
    42
    43  public class MRUFileManager {
    44    //--------------------------------------------------------------------------
    45    //   Constants:
    46    //--------------------------------------------------------------------------
    47    private static final String CONFIG_FILE_NAME = "mru_file_manager";
    48    private static final int DEFAULT_MAX_SIZE = 3;
    49
    50    //--------------------------------------------------------------------------
    51    //   Protected Variables:
    52    //--------------------------------------------------------------------------
    53
    54    //--------------------------------------------------------------------------
    55    //   Private Variables:
    56    //--------------------------------------------------------------------------
    57    private int _maxSize = 0;
    58    private LinkedList _mruFileList;
    59
    60    //--------------------------------------------------------------------------
    61    //   Constructors:
    62    //--------------------------------------------------------------------------
    63    public MRUFileManager() {
    64      load();
    65      setMaxSize(DEFAULT_MAX_SIZE);
    66    }
    67
    68    public MRUFileManager(int maxSize) {
    69      load();
    70      setMaxSize(maxSize);
    71    }
    72    //--------------------------------------------------------------------------
    73    //   Public Methods:
    74    //--------------------------------------------------------------------------
    75
    76    /**
    77     * Saves a list of MRU files out to a file.
    78     */
    79    public void save() {
    80      File file = new File(getFilename());
    81
    82      try {
    83        ObjectOutputStream oos = new ObjectOutputStream(new
    84            FileOutputStream(file));
    85        oos.writeObject(_mruFileList);
    86        oos.flush();
    87        oos.close();
    88      } catch (Exception e) {
    89        // do nothing
    90        e.printStackTrace();
    91      }
    92    }
    93
    94    /**
    95     * Gets the size of the MRU file list.
    96     */
    97    public int size() {
    98      return _mruFileList.size();
    99    }
    100
    101   /**
    102    * Returns a particular file name stored in a MRU file
    103    * list based on an index value.
    104    */
    105   public Object getFile(int index) {
    106     if (index < size()) {
    107       return _mruFileList.get(index);
    108     }
    109
    110     return null;
    111   }
    112
    113   /**
    114    * Returns a input stream to the resource at the specified index
    115    */
    116   public InputStream getInputStream(int index) throws IOException,
    117       FileNotFoundException {
    118     if (index < size()) {
    119       Object o = getFile(index);
    120       if (o instanceof File) {
    121         return getInputStream((File) o);
    122       } else {
    123         return getInputStream((URL) o);
    124       }
    125     }
    126     return null;
    127   }
    128
    129   /**
    130    * Adds a file name to the MRU file list.
    131    */
    132   public void set(File file) {
    133     setMRU(file);
    134   }
    135
    136   /**
    137    * Adds a url to the MRU file list.
    138    */
    139   public void set(URL url) {
    140     setMRU(url);
    141   }
    142
    143   /**
    144    * Gets the list of files stored in the MRU file list.
    145    */
    146   public String[] getMRUFileList() {
    147     if (size() == 0) {
    148       return null;
    149     }
    150
    151     String[] ss = new String[size()];
    152
    153     for (int i = 0; i < size(); i++) {
    154       Object o = getFile(i);
    155       if (o instanceof File) {
    156         ss[i] = ((File) o).getAbsolutePath();
    157       } else // must be a url
    158       {
    159         ss[i] = o.toString();
    160       }
    161
    162     }
    163
    164     return ss;
    165   }
    166
    167   /**
    168    * Moves the the index to the top of the MRU List
    169    *
    170    * @param index The index to be first in the mru list
    171    */
    172   public void moveToTop(int index) {
    173     _mruFileList.add(0, _mruFileList.remove(index));
    174   }
    175
    176   /**
    177    * Creates the directory where the MRU file list will be written.
    178    * The "lf5" directory is created in the Documents and Settings
    179    * directory on Windows 2000 machines and where ever the user.home
    180    * variable points on all other platforms.
    181    */
    182   public static void createConfigurationDirectory() {
    183     String home = System.getProperty("user.home");
    184     String sep = System.getProperty("file.separator");
    185     File f = new File(home + sep + "lf5");
    186     if (!f.exists()) {
    187       try {
    188         f.mkdir();
    189       } catch (SecurityException e) {
    190         e.printStackTrace();
    191       }
    192     }
    193
    194   }
    195   //--------------------------------------------------------------------------
    196   //   Protected Methods:
    197   //--------------------------------------------------------------------------
    198   /**
    199    * Gets an input stream for the corresponding file.
    200    *
    201    * @param file The file to create the input stream from.
    202    * @return InputStream
    203    */
    204   protected InputStream getInputStream(File file) throws IOException,
    205       FileNotFoundException {
    206     BufferedInputStream reader =
    207         new BufferedInputStream(new FileInputStream(file));
    208
    209     return reader;
    210   }
    211
    212   /**
    213    * Gets an input stream for the corresponding URL.
    214    *
    215    * @param url The url to create the input stream from.
    216    * @return InputStream
    217    */
    218   protected InputStream getInputStream(URL url) throws IOException {
    219     return url.openStream();
    220   }
    221
    222   /**
    223    * Adds an object to the mru.
    224    */
    225   protected void setMRU(Object o) {
    226     int index = _mruFileList.indexOf(o);
    227
    228     if (index == -1) {
    229       _mruFileList.add(0, o);
    230       setMaxSize(_maxSize);
    231     } else {
    232       moveToTop(index);
    233     }
    234   }
    235
    236   /**
    237    * Loads the MRU file list in from a file and stores it in a LinkedList.
    238    * If no file exists, a new LinkedList is created.
    239    */
    240   protected void load() {
    241     createConfigurationDirectory();
    242     File file = new File(getFilename());
    243     if (file.exists()) {
    244       try {
    245         ObjectInputStream ois = new ObjectInputStream(
    246             new FileInputStream(file));
    247         _mruFileList = (LinkedList) ois.readObject();
    248         ois.close();
    249
    250         // check that only files and url are in linked list
    251         Iterator it = _mruFileList.iterator();
    252         while (it.hasNext()) {
    253           Object o = it.next();
    254           if (!(o instanceof File) && !(o instanceof URL)) {
    255             it.remove();
    256           }
    257         }
    258       } catch (Exception e) {
    259         _mruFileList = new LinkedList();
    260       }
    261     } else {
    262       _mruFileList = new LinkedList();
    263     }
    264
    265   }
    266
    267   protected String getFilename() {
    268     String home = System.getProperty("user.home");
    269     String sep = System.getProperty("file.separator");
    270
    271     return home + sep + "lf5" + sep + CONFIG_FILE_NAME;
    272   }
    273
    274   /**
    275    * Ensures that the MRU list will have a MaxSize.
    276    */
    277   protected void setMaxSize(int maxSize) {
    278     if (maxSize < _mruFileList.size()) {
    279       for (int i = 0; i < _mruFileList.size() - maxSize; i++) {
    280         _mruFileList.removeLast();
    281       }
    282     }
    283
    284     _maxSize = maxSize;
    285   }
    286   //--------------------------------------------------------------------------
    287   //   Private Methods:
    288   //--------------------------------------------------------------------------
    289
    290   //--------------------------------------------------------------------------
    291   //   Nested Top-Level Classes or Interfaces
    292   //--------------------------------------------------------------------------
    293 }