1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.vfs.provider.url;
18
19 import org.apache.commons.httpclient.URIException;
20 import org.apache.commons.vfs.FileName;
21 import org.apache.commons.vfs.FileObject;
22 import org.apache.commons.vfs.FileSystemException;
23 import org.apache.commons.vfs.FileType;
24 import org.apache.commons.vfs.provider.AbstractFileObject;
25 import org.apache.commons.vfs.provider.URLFileName;
26
27 import java.io.FileNotFoundException;
28 import java.io.InputStream;
29 import java.net.HttpURLConnection;
30 import java.net.MalformedURLException;
31 import java.net.URL;
32 import java.net.URLConnection;
33
34 /***
35 * A {@link FileObject} implementation backed by a {@link URL}.
36 *
37 * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
38 * @version $Revision: 480428 $ $Date: 2006-11-29 07:15:24 +0100 (Mi, 29 Nov 2006) $
39 * @todo Implement set lastModified and get/set attribute
40 * @todo Implement getOutputStream()
41 */
42 public class UrlFileObject
43 extends AbstractFileObject
44 implements FileObject
45 {
46 private URL url;
47
48 protected UrlFileObject(final UrlFileSystem fs,
49 final FileName fileName)
50 {
51 super(fileName, fs);
52 }
53
54 /***
55 * Attaches this file object to its file resource. This method is called
56 * before any of the doBlah() or onBlah() methods. Sub-classes can use
57 * this method to perform lazy initialisation.
58 */
59 protected void doAttach() throws Exception
60 {
61 if (url == null)
62 {
63
64 url = createURL(getName());
65 }
66 }
67
68 protected URL createURL(final FileName name) throws MalformedURLException, FileSystemException, URIException
69 {
70 if (name instanceof URLFileName)
71 {
72 URLFileName urlName = (URLFileName) getName();
73
74
75 return new URL(urlName.getURIEncoded(null));
76 }
77 return new URL(getName().getURI());
78 }
79
80 /***
81 * Determines the type of the file.
82 */
83 protected FileType doGetType() throws Exception
84 {
85 try
86 {
87
88 final URLConnection conn = url.openConnection();
89 final InputStream in = conn.getInputStream();
90 try
91 {
92 if (conn instanceof HttpURLConnection)
93 {
94 final int status = ((HttpURLConnection) conn).getResponseCode();
95
96 if (HttpURLConnection.HTTP_OK != status)
97 {
98 return FileType.IMAGINARY;
99 }
100 }
101
102 return FileType.FILE;
103 }
104 finally
105 {
106 in.close();
107 }
108 }
109 catch (final FileNotFoundException e)
110 {
111 return FileType.IMAGINARY;
112 }
113 }
114
115 /***
116 * Returns the size of the file content (in bytes).
117 */
118 protected long doGetContentSize() throws Exception
119 {
120 final URLConnection conn = url.openConnection();
121 final InputStream in = conn.getInputStream();
122 try
123 {
124 return conn.getContentLength();
125 }
126 finally
127 {
128 in.close();
129 }
130 }
131
132 /***
133 * Returns the last modified time of this file.
134 */
135 protected long doGetLastModifiedTime()
136 throws Exception
137 {
138 final URLConnection conn = url.openConnection();
139 final InputStream in = conn.getInputStream();
140 try
141 {
142 return conn.getLastModified();
143 }
144 finally
145 {
146 in.close();
147 }
148 }
149
150 /***
151 * Lists the children of the file.
152 */
153 protected String[] doListChildren() throws Exception
154 {
155 throw new FileSystemException("Not implemented.");
156 }
157
158 /***
159 * Creates an input stream to read the file content from.
160 */
161 protected InputStream doGetInputStream() throws Exception
162 {
163 return url.openStream();
164 }
165 }