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 } |