Mercurial Hosting > luan
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 } | 
