1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.eclipse.jetty.deploy.providers;
17
18 import java.io.File;
19 import java.io.FilenameFilter;
20 import java.util.Collections;
21 import java.util.HashMap;
22 import java.util.Map;
23
24 import org.eclipse.jetty.deploy.App;
25 import org.eclipse.jetty.deploy.AppProvider;
26 import org.eclipse.jetty.deploy.DeploymentManager;
27 import org.eclipse.jetty.util.Scanner;
28 import org.eclipse.jetty.util.component.AbstractLifeCycle;
29 import org.eclipse.jetty.util.log.Log;
30 import org.eclipse.jetty.util.resource.Resource;
31
32
33
34 public abstract class ScanningAppProvider extends AbstractLifeCycle implements AppProvider
35 {
36 private Map<String, App> _appMap = new HashMap<String, App>();
37
38 private DeploymentManager _deploymentManager;
39 protected final FilenameFilter _filenameFilter;
40 private Resource _monitoredDir;
41 private boolean _recursive = false;
42 private int _scanInterval = 10;
43 private Scanner _scanner;
44
45
46 private final Scanner.DiscreteListener _scannerListener = new Scanner.DiscreteListener()
47 {
48 public void fileAdded(String filename) throws Exception
49 {
50 ScanningAppProvider.this.fileAdded(filename);
51 }
52
53 public void fileChanged(String filename) throws Exception
54 {
55 ScanningAppProvider.this.fileChanged(filename);
56 }
57
58 public void fileRemoved(String filename) throws Exception
59 {
60 ScanningAppProvider.this.fileRemoved(filename);
61 }
62 };
63
64
65 protected ScanningAppProvider(FilenameFilter filter)
66 {
67 _filenameFilter = filter;
68 }
69
70
71
72
73
74 protected Map<String, App> getDeployedApps()
75 {
76 return _appMap;
77 }
78
79
80
81
82
83
84
85
86
87
88
89
90 protected App createApp(String filename)
91 {
92 return new App(_deploymentManager,this,filename);
93 }
94
95
96 @Override
97 protected void doStart() throws Exception
98 {
99 if (Log.isDebugEnabled()) Log.debug(this.getClass().getSimpleName() + ".doStart()");
100 if (_monitoredDir == null)
101 {
102 throw new IllegalStateException("No configuration dir specified");
103 }
104
105 File scandir = _monitoredDir.getFile();
106 Log.info("Deployment monitor " + scandir + " at interval " + _scanInterval);
107 _scanner = new Scanner();
108 _scanner.setScanDirs(Collections.singletonList(scandir));
109 _scanner.setScanInterval(_scanInterval);
110 _scanner.setRecursive(_recursive);
111 _scanner.setFilenameFilter(_filenameFilter);
112 _scanner.setReportDirs(true);
113 _scanner.addListener(_scannerListener);
114 _scanner.start();
115 }
116
117
118 @Override
119 protected void doStop() throws Exception
120 {
121 if (_scanner!=null)
122 {
123 _scanner.stop();
124 _scanner.removeListener(_scannerListener);
125 _scanner = null;
126 }
127 }
128
129
130 protected void fileAdded(String filename) throws Exception
131 {
132 if (Log.isDebugEnabled()) Log.debug("added ",filename);
133 App app = ScanningAppProvider.this.createApp(filename);
134 if (app != null)
135 {
136 _appMap.put(filename,app);
137 _deploymentManager.addApp(app);
138 }
139 }
140
141
142 protected void fileChanged(String filename) throws Exception
143 {
144 if (Log.isDebugEnabled()) Log.debug("changed ",filename);
145 App app = _appMap.remove(filename);
146 if (app != null)
147 {
148 _deploymentManager.removeApp(app);
149 }
150 app = ScanningAppProvider.this.createApp(filename);
151 if (app != null)
152 {
153 _appMap.put(filename,app);
154 _deploymentManager.addApp(app);
155 }
156 }
157
158
159 protected void fileRemoved(String filename) throws Exception
160 {
161 if (Log.isDebugEnabled()) Log.debug("removed ",filename);
162 App app = _appMap.remove(filename);
163 if (app != null)
164 _deploymentManager.removeApp(app);
165 }
166
167
168
169
170
171
172
173 public DeploymentManager getDeploymentManager()
174 {
175 return _deploymentManager;
176 }
177
178
179
180 public Resource getMonitoredDirResource()
181 {
182 return _monitoredDir;
183 }
184
185
186 public String getMonitoredDirName()
187 {
188 return _monitoredDir.toString();
189 }
190
191
192 public int getScanInterval()
193 {
194 return _scanInterval;
195 }
196
197
198 public boolean isRecursive()
199 {
200 return _recursive;
201 }
202
203
204 public void setDeploymentManager(DeploymentManager deploymentManager)
205 {
206 _deploymentManager = deploymentManager;
207 }
208
209
210 public void setMonitoredDirResource(Resource contextsDir)
211 {
212 _monitoredDir = contextsDir;
213 }
214
215
216 public void addScannerListener(Scanner.Listener listener)
217 {
218 _scanner.addListener(listener);
219 }
220
221
222
223
224
225 public void setMonitoredDir(String dir)
226 {
227 setMonitoredDirName(dir);
228 }
229
230
231
232
233
234
235 public void setMonitoredDirName(String dir)
236 {
237 try
238 {
239 setMonitoredDirResource(Resource.newResource(dir));
240 }
241 catch (Exception e)
242 {
243 throw new IllegalArgumentException(e);
244 }
245 }
246
247
248 protected void setRecursive(boolean recursive)
249 {
250 _recursive = recursive;
251 }
252
253
254 public void setScanInterval(int scanInterval)
255 {
256 _scanInterval = scanInterval;
257 }
258 }