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.vfs.FileName;
20 import org.apache.commons.vfs.FileSystemException;
21 import org.apache.commons.vfs.provider.AbstractFileNameParser;
22 import org.apache.commons.vfs.provider.URLFileName;
23 import org.apache.commons.vfs.provider.URLFileNameParser;
24 import org.apache.commons.vfs.provider.VfsComponentContext;
25 import org.apache.commons.vfs.provider.local.GenericFileNameParser;
26
27 /***
28 * Implementation for any java.net.url based filesystem.<br />
29 * Composite of URLFilenameParser and GenericFilenameParser
30 *
31 * @author imario@apache.org
32 * @version $Revision: 480428 $ $Date: 2006-11-29 07:15:24 +0100 (Mi, 29 Nov 2006) $
33 */
34 public class UrlFileNameParser extends AbstractFileNameParser
35 {
36 private URLFileNameParser url = new URLFileNameParser(80);
37 private GenericFileNameParser generic = new GenericFileNameParser();
38
39 public UrlFileNameParser()
40 {
41 super();
42 }
43
44 public boolean encodeCharacter(char ch)
45 {
46 return super.encodeCharacter(ch) || ch == '?';
47 }
48
49 public FileName parseUri(final VfsComponentContext context, final FileName base, final String filename) throws FileSystemException
50 {
51 if (isUrlBased(base, filename))
52 {
53 return url.parseUri(context, base, filename);
54 }
55
56 return generic.parseUri(context, base, filename);
57 }
58
59 /***
60 * Guess is the given filename is a url with host or not. VFS treats such urls differently.<br />
61 * A filename is url-based if the base is a <code>URLFileName</code> or there are only 2 slashes
62 * after the scheme.<br/>
63 * e.g: http://host/path, file:/path/to/file, file:///path/to/file
64 *
65 */
66 protected boolean isUrlBased(final FileName base, final String filename)
67 {
68 if (base instanceof URLFileName)
69 {
70 return true;
71 }
72
73 int nuofSlash = countSlashes(filename);
74 return nuofSlash == 2;
75 }
76
77 /***
78 * This method counts the slashes after the scheme.
79 *
80 * @param filename
81 * @return nuof slashes
82 */
83 protected int countSlashes(final String filename)
84 {
85 int state = 0;
86 int nuofSlash = 0;
87 for (int pos = 0; pos<filename.length(); pos++)
88 {
89 char c = filename.charAt(pos);
90 if (state == 0)
91 {
92 if (c >= 'a' && c <= 'z')
93 {
94 continue;
95 }
96 if (c == ':')
97 {
98 state++;
99 continue;
100 }
101 }
102 else if (state == 1)
103 {
104 if (c == '/')
105 {
106 nuofSlash++;
107 }
108 else
109 {
110 return nuofSlash;
111 }
112 }
113 }
114 return nuofSlash;
115 }
116 }