comparison src/org/eclipse/jetty/util/resource/ResourceCollection.java @ 802:3428c60d7cfc

replace jetty jars with source
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 07 Sep 2016 21:15:48 -0600
parents
children 6939226e0ac4
comparison
equal deleted inserted replaced
801:6a21393191c1 802:3428c60d7cfc
1 //
2 // ========================================================================
3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
4 // ------------------------------------------------------------------------
5 // All rights reserved. This program and the accompanying materials
6 // are made available under the terms of the Eclipse Public License v1.0
7 // and Apache License v2.0 which accompanies this distribution.
8 //
9 // The Eclipse Public License is available at
10 // http://www.eclipse.org/legal/epl-v10.html
11 //
12 // The Apache License v2.0 is available at
13 // http://www.opensource.org/licenses/apache2.0.php
14 //
15 // You may elect to redistribute this code under either of these licenses.
16 // ========================================================================
17 //
18
19 package org.eclipse.jetty.util.resource;
20
21 import java.io.File;
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.io.OutputStream;
25 import java.net.MalformedURLException;
26 import java.net.URL;
27 import java.util.ArrayList;
28 import java.util.Arrays;
29 import java.util.HashSet;
30 import java.util.List;
31 import java.util.StringTokenizer;
32
33 import org.eclipse.jetty.util.URIUtil;
34
35 /**
36 * A collection of resources (dirs).
37 * Allows webapps to have multiple (static) sources.
38 * The first resource in the collection is the main resource.
39 * If a resource is not found in the main resource, it looks it up in
40 * the order the resources were constructed.
41 *
42 *
43 *
44 */
45 public class ResourceCollection extends Resource
46 {
47 private Resource[] _resources;
48
49 /* ------------------------------------------------------------ */
50 /**
51 * Instantiates an empty resource collection.
52 *
53 * This constructor is used when configuring jetty-maven-plugin.
54 */
55 public ResourceCollection()
56 {
57 _resources = new Resource[0];
58 }
59
60 /* ------------------------------------------------------------ */
61 /**
62 * Instantiates a new resource collection.
63 *
64 * @param resources the resources to be added to collection
65 */
66 public ResourceCollection(Resource... resources)
67 {
68 List<Resource> list = new ArrayList<Resource>();
69 for (Resource r : resources)
70 {
71 if (r==null)
72 continue;
73 if (r instanceof ResourceCollection)
74 {
75 for (Resource r2 : ((ResourceCollection)r).getResources())
76 list.add(r2);
77 }
78 else
79 list.add(r);
80 }
81 _resources = list.toArray(new Resource[list.size()]);
82 for(Resource r : _resources)
83 {
84 if(!r.exists() || !r.isDirectory())
85 throw new IllegalArgumentException(r + " is not an existing directory.");
86 }
87 }
88
89
90 /* ------------------------------------------------------------ */
91 /**
92 * Instantiates a new resource collection.
93 *
94 * @param resources the resource strings to be added to collection
95 */
96 public ResourceCollection(String[] resources)
97 {
98 _resources = new Resource[resources.length];
99 try
100 {
101 for(int i=0; i<resources.length; i++)
102 {
103 _resources[i] = Resource.newResource(resources[i]);
104 if(!_resources[i].exists() || !_resources[i].isDirectory())
105 throw new IllegalArgumentException(_resources[i] + " is not an existing directory.");
106 }
107 }
108 catch(IllegalArgumentException e)
109 {
110 throw e;
111 }
112 catch(Exception e)
113 {
114 throw new RuntimeException(e);
115 }
116 }
117
118 /* ------------------------------------------------------------ */
119 /**
120 * Instantiates a new resource collection.
121 *
122 * @param csvResources the string containing comma-separated resource strings
123 */
124 public ResourceCollection(String csvResources)
125 {
126 setResourcesAsCSV(csvResources);
127 }
128
129 /* ------------------------------------------------------------ */
130 /**
131 * Retrieves the resource collection's resources.
132 *
133 * @return the resource array
134 */
135 public Resource[] getResources()
136 {
137 return _resources;
138 }
139
140 /* ------------------------------------------------------------ */
141 /**
142 * Sets the resource collection's resources.
143 *
144 * @param resources the new resource array
145 */
146 public void setResources(Resource[] resources)
147 {
148 _resources = resources != null ? resources : new Resource[0];
149 }
150
151 /* ------------------------------------------------------------ */
152 /**
153 * Sets the resources as string of comma-separated values.
154 * This method should be used when configuring jetty-maven-plugin.
155 *
156 * @param csvResources the comma-separated string containing
157 * one or more resource strings.
158 */
159 public void setResourcesAsCSV(String csvResources)
160 {
161 StringTokenizer tokenizer = new StringTokenizer(csvResources, ",;");
162 int len = tokenizer.countTokens();
163 if(len==0)
164 {
165 throw new IllegalArgumentException("ResourceCollection@setResourcesAsCSV(String) " +
166 " argument must be a string containing one or more comma-separated resource strings.");
167 }
168
169 _resources = new Resource[len];
170 try
171 {
172 for(int i=0; tokenizer.hasMoreTokens(); i++)
173 {
174 _resources[i] = Resource.newResource(tokenizer.nextToken().trim());
175 if(!_resources[i].exists() || !_resources[i].isDirectory())
176 throw new IllegalArgumentException(_resources[i] + " is not an existing directory.");
177 }
178 }
179 catch(Exception e)
180 {
181 throw new RuntimeException(e);
182 }
183 }
184
185 /* ------------------------------------------------------------ */
186 /**
187 * @param path The path segment to add
188 * @return The contained resource (found first) in the collection of resources
189 */
190 @Override
191 public Resource addPath(String path) throws IOException, MalformedURLException
192 {
193 if(_resources==null)
194 throw new IllegalStateException("*resources* not set.");
195
196 if(path==null)
197 throw new MalformedURLException();
198
199 if(path.length()==0 || URIUtil.SLASH.equals(path))
200 return this;
201
202 Resource resource=null;
203 ArrayList<Resource> resources = null;
204 int i=0;
205 for(; i<_resources.length; i++)
206 {
207 resource = _resources[i].addPath(path);
208 if (resource.exists())
209 {
210 if (resource.isDirectory())
211 break;
212 return resource;
213 }
214 }
215
216 for(i++; i<_resources.length; i++)
217 {
218 Resource r = _resources[i].addPath(path);
219 if (r.exists() && r.isDirectory())
220 {
221 if (resource!=null)
222 {
223 resources = new ArrayList<Resource>();
224 resources.add(resource);
225 resource=null;
226 }
227 resources.add(r);
228 }
229 }
230
231 if (resource!=null)
232 return resource;
233 if (resources!=null)
234 return new ResourceCollection(resources.toArray(new Resource[resources.size()]));
235 return null;
236 }
237
238 /* ------------------------------------------------------------ */
239 /**
240 * @param path
241 * @return the resource(file) if found, returns a list of resource dirs if its a dir, else null.
242 * @throws IOException
243 * @throws MalformedURLException
244 */
245 protected Object findResource(String path) throws IOException, MalformedURLException
246 {
247 Resource resource=null;
248 ArrayList<Resource> resources = null;
249 int i=0;
250 for(; i<_resources.length; i++)
251 {
252 resource = _resources[i].addPath(path);
253 if (resource.exists())
254 {
255 if (resource.isDirectory())
256 break;
257
258 return resource;
259 }
260 }
261
262 for(i++; i<_resources.length; i++)
263 {
264 Resource r = _resources[i].addPath(path);
265 if (r.exists() && r.isDirectory())
266 {
267 if (resource!=null)
268 {
269 resources = new ArrayList<Resource>();
270 resources.add(resource);
271 }
272 resources.add(r);
273 }
274 }
275
276 if (resource!=null)
277 return resource;
278 if (resources!=null)
279 return resources;
280 return null;
281 }
282
283 /* ------------------------------------------------------------ */
284 @Override
285 public boolean delete() throws SecurityException
286 {
287 throw new UnsupportedOperationException();
288 }
289
290 /* ------------------------------------------------------------ */
291 @Override
292 public boolean exists()
293 {
294 if(_resources==null)
295 throw new IllegalStateException("*resources* not set.");
296
297 return true;
298 }
299
300 /* ------------------------------------------------------------ */
301 @Override
302 public File getFile() throws IOException
303 {
304 if(_resources==null)
305 throw new IllegalStateException("*resources* not set.");
306
307 for(Resource r : _resources)
308 {
309 File f = r.getFile();
310 if(f!=null)
311 return f;
312 }
313 return null;
314 }
315
316 /* ------------------------------------------------------------ */
317 @Override
318 public InputStream getInputStream() throws IOException
319 {
320 if(_resources==null)
321 throw new IllegalStateException("*resources* not set.");
322
323 for(Resource r : _resources)
324 {
325 InputStream is = r.getInputStream();
326 if(is!=null)
327 return is;
328 }
329 return null;
330 }
331
332 /* ------------------------------------------------------------ */
333 @Override
334 public String getName()
335 {
336 if(_resources==null)
337 throw new IllegalStateException("*resources* not set.");
338
339 for(Resource r : _resources)
340 {
341 String name = r.getName();
342 if(name!=null)
343 return name;
344 }
345 return null;
346 }
347
348 /* ------------------------------------------------------------ */
349 @Override
350 public OutputStream getOutputStream() throws IOException, SecurityException
351 {
352 if(_resources==null)
353 throw new IllegalStateException("*resources* not set.");
354
355 for(Resource r : _resources)
356 {
357 OutputStream os = r.getOutputStream();
358 if(os!=null)
359 return os;
360 }
361 return null;
362 }
363
364 /* ------------------------------------------------------------ */
365 @Override
366 public URL getURL()
367 {
368 if(_resources==null)
369 throw new IllegalStateException("*resources* not set.");
370
371 for(Resource r : _resources)
372 {
373 URL url = r.getURL();
374 if(url!=null)
375 return url;
376 }
377 return null;
378 }
379
380 /* ------------------------------------------------------------ */
381 @Override
382 public boolean isDirectory()
383 {
384 if(_resources==null)
385 throw new IllegalStateException("*resources* not set.");
386
387 return true;
388 }
389
390 /* ------------------------------------------------------------ */
391 @Override
392 public long lastModified()
393 {
394 if(_resources==null)
395 throw new IllegalStateException("*resources* not set.");
396
397 for(Resource r : _resources)
398 {
399 long lm = r.lastModified();
400 if (lm!=-1)
401 return lm;
402 }
403 return -1;
404 }
405
406 /* ------------------------------------------------------------ */
407 @Override
408 public long length()
409 {
410 return -1;
411 }
412
413 /* ------------------------------------------------------------ */
414 /**
415 * @return The list of resource names(merged) contained in the collection of resources.
416 */
417 @Override
418 public String[] list()
419 {
420 if(_resources==null)
421 throw new IllegalStateException("*resources* not set.");
422
423 HashSet<String> set = new HashSet<String>();
424 for(Resource r : _resources)
425 {
426 for(String s : r.list())
427 set.add(s);
428 }
429 String[] result=set.toArray(new String[set.size()]);
430 Arrays.sort(result);
431 return result;
432 }
433
434 /* ------------------------------------------------------------ */
435 @Override
436 public void release()
437 {
438 if(_resources==null)
439 throw new IllegalStateException("*resources* not set.");
440
441 for(Resource r : _resources)
442 r.release();
443 }
444
445 /* ------------------------------------------------------------ */
446 @Override
447 public boolean renameTo(Resource dest) throws SecurityException
448 {
449 throw new UnsupportedOperationException();
450 }
451
452 /* ------------------------------------------------------------ */
453 @Override
454 public void copyTo(File destination)
455 throws IOException
456 {
457 for (int r=_resources.length;r-->0;)
458 _resources[r].copyTo(destination);
459 }
460
461 /* ------------------------------------------------------------ */
462 /**
463 * @return the list of resources separated by a path separator
464 */
465 @Override
466 public String toString()
467 {
468 if(_resources==null)
469 return "[]";
470
471 return String.valueOf(Arrays.asList(_resources));
472 }
473
474 /* ------------------------------------------------------------ */
475 @Override
476 public boolean isContainedIn(Resource r) throws MalformedURLException
477 {
478 // TODO could look at implementing the semantic of is this collection a subset of the Resource r?
479 return false;
480 }
481
482 }