Mercurial Hosting > luan
comparison src/org/eclipse/jetty/util/resource/FileResource.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 | 8e9db0bbf4f9 |
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.FileInputStream; | |
| 23 import java.io.FileOutputStream; | |
| 24 import java.io.IOException; | |
| 25 import java.io.InputStream; | |
| 26 import java.io.OutputStream; | |
| 27 import java.net.MalformedURLException; | |
| 28 import java.net.URI; | |
| 29 import java.net.URISyntaxException; | |
| 30 import java.net.URL; | |
| 31 import java.net.URLConnection; | |
| 32 import java.security.Permission; | |
| 33 | |
| 34 import org.eclipse.jetty.util.IO; | |
| 35 import org.eclipse.jetty.util.URIUtil; | |
| 36 import org.eclipse.jetty.util.log.Log; | |
| 37 import org.eclipse.jetty.util.log.Logger; | |
| 38 | |
| 39 | |
| 40 /* ------------------------------------------------------------ */ | |
| 41 /** File Resource. | |
| 42 * | |
| 43 * Handle resources of implied or explicit file type. | |
| 44 * This class can check for aliasing in the filesystem (eg case | |
| 45 * insensitivity). By default this is turned on, or it can be controlled | |
| 46 * by calling the static method @see FileResource#setCheckAliases(boolean) | |
| 47 * | |
| 48 */ | |
| 49 public class FileResource extends URLResource | |
| 50 { | |
| 51 private static final Logger LOG = Log.getLogger(FileResource.class); | |
| 52 private static boolean __checkAliases = true; | |
| 53 | |
| 54 /* ------------------------------------------------------------ */ | |
| 55 private File _file; | |
| 56 private transient URL _alias=null; | |
| 57 private transient boolean _aliasChecked=false; | |
| 58 | |
| 59 /* ------------------------------------------------------------------------------- */ | |
| 60 /** setCheckAliases. | |
| 61 * @param checkAliases True of resource aliases are to be checked for (eg case insensitivity or 8.3 short names) and treated as not found. | |
| 62 */ | |
| 63 public static void setCheckAliases(boolean checkAliases) | |
| 64 { | |
| 65 __checkAliases=checkAliases; | |
| 66 } | |
| 67 | |
| 68 /* ------------------------------------------------------------------------------- */ | |
| 69 /** getCheckAliases. | |
| 70 * @return True of resource aliases are to be checked for (eg case insensitivity or 8.3 short names) and treated as not found. | |
| 71 */ | |
| 72 public static boolean getCheckAliases() | |
| 73 { | |
| 74 return __checkAliases; | |
| 75 } | |
| 76 | |
| 77 /* -------------------------------------------------------- */ | |
| 78 public FileResource(URL url) | |
| 79 throws IOException, URISyntaxException | |
| 80 { | |
| 81 super(url,null); | |
| 82 | |
| 83 try | |
| 84 { | |
| 85 // Try standard API to convert URL to file. | |
| 86 _file =new File(new URI(url.toString())); | |
| 87 } | |
| 88 catch (URISyntaxException e) | |
| 89 { | |
| 90 throw e; | |
| 91 } | |
| 92 catch (Exception e) | |
| 93 { | |
| 94 LOG.ignore(e); | |
| 95 try | |
| 96 { | |
| 97 // Assume that File.toURL produced unencoded chars. So try | |
| 98 // encoding them. | |
| 99 String file_url="file:"+URIUtil.encodePath(url.toString().substring(5)); | |
| 100 URI uri = new URI(file_url); | |
| 101 if (uri.getAuthority()==null) | |
| 102 _file = new File(uri); | |
| 103 else | |
| 104 _file = new File("//"+uri.getAuthority()+URIUtil.decodePath(url.getFile())); | |
| 105 } | |
| 106 catch (Exception e2) | |
| 107 { | |
| 108 LOG.ignore(e2); | |
| 109 | |
| 110 // Still can't get the file. Doh! try good old hack! | |
| 111 checkConnection(); | |
| 112 Permission perm = _connection.getPermission(); | |
| 113 _file = new File(perm==null?url.getFile():perm.getName()); | |
| 114 } | |
| 115 } | |
| 116 if (_file.isDirectory()) | |
| 117 { | |
| 118 if (!_urlString.endsWith("/")) | |
| 119 _urlString=_urlString+"/"; | |
| 120 } | |
| 121 else | |
| 122 { | |
| 123 if (_urlString.endsWith("/")) | |
| 124 _urlString=_urlString.substring(0,_urlString.length()-1); | |
| 125 } | |
| 126 | |
| 127 } | |
| 128 | |
| 129 /* -------------------------------------------------------- */ | |
| 130 FileResource(URL url, URLConnection connection, File file) | |
| 131 { | |
| 132 super(url,connection); | |
| 133 _file=file; | |
| 134 if (_file.isDirectory() && !_urlString.endsWith("/")) | |
| 135 _urlString=_urlString+"/"; | |
| 136 } | |
| 137 | |
| 138 /* -------------------------------------------------------- */ | |
| 139 @Override | |
| 140 public Resource addPath(String path) | |
| 141 throws IOException,MalformedURLException | |
| 142 { | |
| 143 URLResource r=null; | |
| 144 String url=null; | |
| 145 | |
| 146 path = org.eclipse.jetty.util.URIUtil.canonicalPath(path); | |
| 147 | |
| 148 if ("/".equals(path)) | |
| 149 return this; | |
| 150 else if (!isDirectory()) | |
| 151 { | |
| 152 r=(FileResource)super.addPath(path); | |
| 153 url=r._urlString; | |
| 154 } | |
| 155 else | |
| 156 { | |
| 157 if (path==null) | |
| 158 throw new MalformedURLException(); | |
| 159 | |
| 160 // treat all paths being added as relative | |
| 161 String rel=path; | |
| 162 if (path.startsWith("/")) | |
| 163 rel = path.substring(1); | |
| 164 | |
| 165 url=URIUtil.addPaths(_urlString,URIUtil.encodePath(rel)); | |
| 166 r=(URLResource)Resource.newResource(url); | |
| 167 } | |
| 168 | |
| 169 // Check for encoding aliases | |
| 170 // The encoded path should be a suffix of the resource (give or take a directory / ) | |
| 171 String encoded=URIUtil.encodePath(path); | |
| 172 int expected=r.toString().length()-encoded.length(); | |
| 173 int index = r._urlString.lastIndexOf(encoded, expected); | |
| 174 if (expected!=index && ((expected-1)!=index || path.endsWith("/") || !r.isDirectory())) | |
| 175 { | |
| 176 if (r instanceof FileResource) | |
| 177 { | |
| 178 ((FileResource)r)._alias=((FileResource)r)._file.getCanonicalFile().toURI().toURL(); | |
| 179 ((FileResource)r)._aliasChecked=true; | |
| 180 } | |
| 181 } | |
| 182 return r; | |
| 183 } | |
| 184 | |
| 185 | |
| 186 /* ------------------------------------------------------------ */ | |
| 187 @Override | |
| 188 public URL getAlias() | |
| 189 { | |
| 190 if (__checkAliases && !_aliasChecked) | |
| 191 { | |
| 192 try | |
| 193 { | |
| 194 String abs=_file.getAbsolutePath(); | |
| 195 String can=_file.getCanonicalPath(); | |
| 196 | |
| 197 if (abs.length()!=can.length() || !abs.equals(can)) | |
| 198 _alias=Resource.toURL(new File(can)); | |
| 199 | |
| 200 _aliasChecked=true; | |
| 201 | |
| 202 if (_alias!=null && LOG.isDebugEnabled()) | |
| 203 { | |
| 204 LOG.debug("ALIAS abs="+abs); | |
| 205 LOG.debug("ALIAS can="+can); | |
| 206 } | |
| 207 } | |
| 208 catch(Exception e) | |
| 209 { | |
| 210 LOG.warn(Log.EXCEPTION,e); | |
| 211 return getURL(); | |
| 212 } | |
| 213 } | |
| 214 return _alias; | |
| 215 } | |
| 216 | |
| 217 /* -------------------------------------------------------- */ | |
| 218 /** | |
| 219 * Returns true if the resource exists. | |
| 220 */ | |
| 221 @Override | |
| 222 public boolean exists() | |
| 223 { | |
| 224 return _file.exists(); | |
| 225 } | |
| 226 | |
| 227 /* -------------------------------------------------------- */ | |
| 228 /** | |
| 229 * Returns the last modified time | |
| 230 */ | |
| 231 @Override | |
| 232 public long lastModified() | |
| 233 { | |
| 234 return _file.lastModified(); | |
| 235 } | |
| 236 | |
| 237 /* -------------------------------------------------------- */ | |
| 238 /** | |
| 239 * Returns true if the respresenetd resource is a container/directory. | |
| 240 */ | |
| 241 @Override | |
| 242 public boolean isDirectory() | |
| 243 { | |
| 244 return _file.isDirectory(); | |
| 245 } | |
| 246 | |
| 247 /* --------------------------------------------------------- */ | |
| 248 /** | |
| 249 * Return the length of the resource | |
| 250 */ | |
| 251 @Override | |
| 252 public long length() | |
| 253 { | |
| 254 return _file.length(); | |
| 255 } | |
| 256 | |
| 257 | |
| 258 /* --------------------------------------------------------- */ | |
| 259 /** | |
| 260 * Returns the name of the resource | |
| 261 */ | |
| 262 @Override | |
| 263 public String getName() | |
| 264 { | |
| 265 return _file.getAbsolutePath(); | |
| 266 } | |
| 267 | |
| 268 /* ------------------------------------------------------------ */ | |
| 269 /** | |
| 270 * Returns an File representing the given resource or NULL if this | |
| 271 * is not possible. | |
| 272 */ | |
| 273 @Override | |
| 274 public File getFile() | |
| 275 { | |
| 276 return _file; | |
| 277 } | |
| 278 | |
| 279 /* --------------------------------------------------------- */ | |
| 280 /** | |
| 281 * Returns an input stream to the resource | |
| 282 */ | |
| 283 @Override | |
| 284 public InputStream getInputStream() throws IOException | |
| 285 { | |
| 286 return new FileInputStream(_file); | |
| 287 } | |
| 288 | |
| 289 /* --------------------------------------------------------- */ | |
| 290 /** | |
| 291 * Returns an output stream to the resource | |
| 292 */ | |
| 293 @Override | |
| 294 public OutputStream getOutputStream() | |
| 295 throws java.io.IOException, SecurityException | |
| 296 { | |
| 297 return new FileOutputStream(_file); | |
| 298 } | |
| 299 | |
| 300 /* --------------------------------------------------------- */ | |
| 301 /** | |
| 302 * Deletes the given resource | |
| 303 */ | |
| 304 @Override | |
| 305 public boolean delete() | |
| 306 throws SecurityException | |
| 307 { | |
| 308 return _file.delete(); | |
| 309 } | |
| 310 | |
| 311 /* --------------------------------------------------------- */ | |
| 312 /** | |
| 313 * Rename the given resource | |
| 314 */ | |
| 315 @Override | |
| 316 public boolean renameTo( Resource dest) | |
| 317 throws SecurityException | |
| 318 { | |
| 319 if( dest instanceof FileResource) | |
| 320 return _file.renameTo( ((FileResource)dest)._file); | |
| 321 else | |
| 322 return false; | |
| 323 } | |
| 324 | |
| 325 /* --------------------------------------------------------- */ | |
| 326 /** | |
| 327 * Returns a list of resources contained in the given resource | |
| 328 */ | |
| 329 @Override | |
| 330 public String[] list() | |
| 331 { | |
| 332 String[] list =_file.list(); | |
| 333 if (list==null) | |
| 334 return null; | |
| 335 for (int i=list.length;i-->0;) | |
| 336 { | |
| 337 if (new File(_file,list[i]).isDirectory() && | |
| 338 !list[i].endsWith("/")) | |
| 339 list[i]+="/"; | |
| 340 } | |
| 341 return list; | |
| 342 } | |
| 343 | |
| 344 /* ------------------------------------------------------------ */ | |
| 345 /** Encode according to this resource type. | |
| 346 * File URIs are encoded. | |
| 347 * @param uri URI to encode. | |
| 348 * @return The uri unchanged. | |
| 349 */ | |
| 350 @Override | |
| 351 public String encode(String uri) | |
| 352 { | |
| 353 return uri; | |
| 354 } | |
| 355 | |
| 356 /* ------------------------------------------------------------ */ | |
| 357 /** | |
| 358 * @param o | |
| 359 * @return <code>true</code> of the object <code>o</code> is a {@link FileResource} pointing to the same file as this resource. | |
| 360 */ | |
| 361 @Override | |
| 362 public boolean equals( Object o) | |
| 363 { | |
| 364 if (this == o) | |
| 365 return true; | |
| 366 | |
| 367 if (null == o || ! (o instanceof FileResource)) | |
| 368 return false; | |
| 369 | |
| 370 FileResource f=(FileResource)o; | |
| 371 return f._file == _file || (null != _file && _file.equals(f._file)); | |
| 372 } | |
| 373 | |
| 374 /* ------------------------------------------------------------ */ | |
| 375 /** | |
| 376 * @return the hashcode. | |
| 377 */ | |
| 378 @Override | |
| 379 public int hashCode() | |
| 380 { | |
| 381 return null == _file ? super.hashCode() : _file.hashCode(); | |
| 382 } | |
| 383 | |
| 384 /* ------------------------------------------------------------ */ | |
| 385 @Override | |
| 386 public void copyTo(File destination) | |
| 387 throws IOException | |
| 388 { | |
| 389 if (isDirectory()) | |
| 390 { | |
| 391 IO.copyDir(getFile(),destination); | |
| 392 } | |
| 393 else | |
| 394 { | |
| 395 if (destination.exists()) | |
| 396 throw new IllegalArgumentException(destination+" exists"); | |
| 397 IO.copy(getFile(),destination); | |
| 398 } | |
| 399 } | |
| 400 } |
