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