1
2
3
4
5
6
7 package org.mule.util.monitor;
8
9 import java.beans.ExceptionListener;
10 import java.io.File;
11 import java.io.IOException;
12 import java.lang.ref.WeakReference;
13 import java.util.ArrayList;
14 import java.util.Collection;
15 import java.util.HashMap;
16 import java.util.Iterator;
17 import java.util.List;
18 import java.util.Map;
19 import java.util.Timer;
20 import java.util.TimerTask;
21
22
23
24
25
26
27
28 public class FileMonitor
29 {
30 private Timer timer;
31 private Map<File, Long> files;
32 private List<WeakReference<FileListener>> listeners;
33 private long pollingInterval;
34
35
36
37
38
39
40 public FileMonitor(long pollingInterval)
41 {
42 files = new HashMap<File, Long>();
43 listeners = new ArrayList<WeakReference<FileListener>>();
44 timer = new Timer(true);
45 this.pollingInterval = pollingInterval;
46 }
47
48
49
50
51 public void stop()
52 {
53 timer.cancel();
54 }
55
56 public void start()
57 {
58 timer.schedule(new FileMonitorNotifier(), 0, pollingInterval);
59 }
60
61
62
63
64
65
66
67
68
69 public void addFile(File file)
70 {
71 if (!files.containsKey(file))
72 {
73 long modifiedTime = file.exists() ? file.lastModified() : -1;
74 files.put(file, new Long(modifiedTime));
75 }
76 }
77
78
79
80
81
82
83 public void removeFile(File file)
84 {
85 files.remove(file);
86 }
87
88
89
90
91
92
93 public void addListener(FileListener fileListener)
94 {
95
96 for (WeakReference<FileListener> reference : listeners)
97 {
98 FileListener listener = reference.get();
99 if (listener == fileListener)
100 {
101 return;
102 }
103 }
104
105
106
107 listeners.add(new WeakReference<FileListener>(fileListener));
108 }
109
110
111
112
113
114
115 public void removeListener(FileListener fileListener)
116 {
117 for (Iterator<WeakReference<FileListener>> i = listeners.iterator(); i.hasNext();)
118 {
119 WeakReference<FileListener> reference = i.next();
120 FileListener listener = reference.get();
121 if (listener == fileListener)
122 {
123 i.remove();
124 break;
125 }
126 }
127 }
128
129
130
131
132
133 public class FileMonitorNotifier extends TimerTask
134 {
135 private ExceptionListener exceptionListener;
136
137 public FileMonitorNotifier()
138 {
139 super();
140 }
141
142 public FileMonitorNotifier(ExceptionListener exceptionListener)
143 {
144 this.exceptionListener = exceptionListener;
145 }
146
147 public void run()
148 {
149
150
151
152 Collection<File> fileKeys = new ArrayList<File>(files.keySet());
153
154 for (File file : fileKeys)
155 {
156 long lastModifiedTime = files.get(file).longValue();
157 long newModifiedTime = file.exists() ? file.lastModified() : -1;
158
159
160 if (newModifiedTime != lastModifiedTime)
161 {
162
163 files.put(file, new Long(newModifiedTime));
164
165
166 for (Iterator<WeakReference<FileListener>> j = listeners.iterator(); j.hasNext();)
167 {
168 WeakReference<FileListener> reference = j.next();
169 FileListener listener = reference.get();
170
171
172 if (listener == null)
173 {
174 j.remove();
175 }
176 else
177 {
178 try
179 {
180 listener.fileChanged(file);
181 }
182 catch (IOException e)
183 {
184
185 if (exceptionListener != null)
186 {
187 exceptionListener.exceptionThrown(e);
188 }
189 }
190 }
191 }
192 }
193 }
194 }
195 }
196 }