1 package org.apache.log4j.chainsaw.prefs;
2
3 import java.io.Reader;
4 import java.net.URL;
5 import java.util.ArrayList;
6 import java.util.Collections;
7 import java.util.EventListener;
8 import java.util.List;
9
10 import javax.swing.event.ChangeEvent;
11 import javax.swing.event.ChangeListener;
12 import javax.swing.event.EventListenerList;
13
14 import com.thoughtworks.xstream.XStream;
15 import com.thoughtworks.xstream.io.xml.DomDriver;
16
17 public class MRUFileList{
18
19 private static MRUFileList log4jList = new MRUFileList();
20 private static MRUFileList jdk14List = new MRUFileList();
21 private static final int DEFAULT_MRU_SIZE = 5;
22
23 private List fileList = new ArrayList();
24 private int size = DEFAULT_MRU_SIZE;
25
26 private static transient EventListenerList listeners = new EventListenerList();
27
28 private MRUFileList() {
29
30 }
31
32 public static void addChangeListener(ChangeListener listener){
33 listeners.add(ChangeListener.class, listener);
34 }
35 public static void removeChangeListener(ChangeListener listener) {
36 listeners.remove(ChangeListener.class, listener);
37 }
38
39 /***
40 * Call this method when something opens a log file, this method
41 * adds the URL to the list of known URL's, automatically
42 * rolling the list to ensure the list maintains the
43 * size property
44 *
45 *
46 * @param url
47 */
48 public void opened(URL url) {
49
50 fileList.remove(url);
51
52 while(fileList.size()>=size) {
53 fileList.remove(fileList.size()-1);
54 }
55 fileList.add(0, url);
56 fireChangeEvent();
57 }
58
59 private static void fireChangeEvent() {
60
61 ChangeEvent event = null;
62 EventListener[] eventListeners = listeners.getListeners(ChangeListener.class);
63 for (int i = 0; i < eventListeners.length; i++) {
64 ChangeListener listener = (ChangeListener) eventListeners[i];
65 if(event==null) {
66 event = new ChangeEvent(MRUFileList.class);
67 }
68 listener.stateChanged(event);
69 }
70 }
71
72 /***
73 * Returns an <b>unmodifiable</b> List of the MRU opened file list within Chainsaw
74 *
75 * @return
76 */
77 public List getMRUList() {
78 return Collections.unmodifiableList(fileList);
79 }
80
81 public static MRUFileList log4jMRU() {
82 return log4jList;
83 }
84
85 public static void loadLog4jMRUListFromXML(String xml) {
86 XStream xstream = new XStream(new DomDriver());
87 log4jList = (MRUFileList) xstream.fromXML(xml);
88 fireChangeEvent();
89 }
90 public static void loadLog4jMRUListFromReader(Reader reader) {
91 XStream xstream = new XStream(new DomDriver());
92 log4jList = (MRUFileList) xstream.fromXML(reader);
93 fireChangeEvent();
94
95 }
96
97 }