1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.vfs2.provider;
18
19 import java.io.IOException;
20 import java.net.URL;
21 import java.net.URLConnection;
22 import java.net.URLStreamHandler;
23
24 import org.apache.commons.io.function.Uncheck;
25 import org.apache.commons.vfs2.FileObject;
26 import org.apache.commons.vfs2.FileSystemOptions;
27
28
29
30
31 public class DefaultURLStreamHandler extends URLStreamHandler {
32
33 private final VfsComponentContext context;
34 private final FileSystemOptions fileSystemOptions;
35
36
37
38
39
40
41 public DefaultURLStreamHandler(final VfsComponentContext context) {
42 this(context, null);
43 }
44
45
46
47
48
49
50
51 public DefaultURLStreamHandler(final VfsComponentContext context, final FileSystemOptions fileSystemOptions) {
52 this.context = context;
53 this.fileSystemOptions = fileSystemOptions;
54 }
55
56 @Override
57 protected URLConnection openConnection(final URL url) throws IOException {
58 final FileObject entry = context.resolveFile(url.toExternalForm(), fileSystemOptions);
59 return new DefaultURLConnection(url, entry.getContent());
60 }
61
62 @Override
63 protected void parseURL(final URL u, final String spec, final int start, final int limit) {
64 Uncheck.run(() -> {
65 final FileObject old = context.resolveFile(u.toExternalForm(), fileSystemOptions);
66
67 final FileObject newURL;
68 if (start > 0 && spec.charAt(start - 1) == ':') {
69 newURL = context.resolveFile(old, spec, fileSystemOptions);
70 } else if (old.isFile() && old.getParent() != null) {
71
72 newURL = old.getParent().resolveFile(spec);
73 } else {
74 newURL = old.resolveFile(spec);
75 }
76
77 final String url = newURL.getName().getURI();
78 final StringBuilder filePart = new StringBuilder();
79 final String protocolPart = UriParser.extractScheme(context.getFileSystemManager().getSchemes(), url, filePart);
80
81 setURL(u, protocolPart, "", -1, null, null, filePart.toString(), null, null);
82 });
83 }
84
85 @Override
86 protected String toExternalForm(final URL u) {
87 return u.getProtocol() + ":" + u.getFile();
88 }
89 }