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