1
2
3
4
5 package net.java.truevfs.kernel.spec;
6
7 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
8 import net.java.truecommons.shed.QuotedUriSyntaxException;
9 import net.java.truecommons.shed.UriBuilder;
10
11 import javax.annotation.concurrent.Immutable;
12 import java.net.URI;
13 import java.net.URISyntaxException;
14
15 import static net.java.truevfs.kernel.spec.FsNodeName.SEPARATOR;
16 import static net.java.truevfs.kernel.spec.FsNodeName.SEPARATOR_CHAR;
17
18
19
20
21
22
23
24
25 @Immutable
26 public enum FsUriModifier {
27
28
29
30
31
32 NULL {
33 @Override
34 URI modify(URI uri, PostFix fix) throws URISyntaxException {
35 if (uri.normalize() != uri)
36 throw new QuotedUriSyntaxException(uri, "URI path not in normal form");
37 return uri;
38 }
39 },
40
41
42
43
44
45 CANONICALIZE {
46 @Override
47 URI modify(URI uri, PostFix fix) throws URISyntaxException {
48 return fix.modify(uri);
49 }
50 };
51
52
53
54
55
56
57
58
59 abstract URI modify(URI uri, PostFix fix) throws URISyntaxException;
60
61
62
63
64
65 public enum PostFix {
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 NODE_PATH {
89 @Override
90 @SuppressFBWarnings("ES_COMPARING_STRINGS_WITH_EQ")
91 URI modify(URI uri) throws URISyntaxException {
92 if (uri.isOpaque()
93 || !uri.isAbsolute()
94 || null != uri.getRawFragment())
95 return uri;
96 {
97 String a = uri.getRawAuthority();
98 String p = uri.getRawPath();
99 if (null == a && null != p && p.startsWith(TWO_SEPARATORS)) {
100 int i = p.indexOf(SEPARATOR_CHAR, 2);
101 if (2 <= i) {
102 a = p.substring(2, i);
103 p = p.substring(i);
104 }
105 uri = new UriBuilder(uri, true).authority(a).path(p).getUri();
106 }
107 uri = uri.normalize();
108 }
109 String s = uri.getScheme();
110 String a = uri.getRawAuthority();
111 String p = uri.getRawPath(), q = p;
112 for (int l; p.endsWith(SEPARATOR)
113 && ( 1 <=(l = p.length()) && null == s
114 || 2 <= l && ':' != p.charAt(l - 2)
115 || 3 <= l && !p.startsWith(SEPARATOR)
116 || 4 < l && p.startsWith(SEPARATOR)
117 || null != a); )
118 p = p.substring(0, l - 1);
119 return p != q
120 ? new UriBuilder(uri, true).path(p).getUri()
121 : uri;
122 }
123 },
124
125
126
127
128
129 MOUNT_POINT {
130 @Override
131 URI modify(URI uri) {
132 return uri.normalize();
133 }
134 },
135
136
137
138
139
140
141
142
143 NODE_NAME {
144 @Override
145 @SuppressFBWarnings("ES_COMPARING_STRINGS_WITH_EQ")
146 URI modify(URI uri) throws URISyntaxException {
147 uri = uri.normalize();
148 if (uri.isAbsolute()
149 || null != uri.getRawAuthority()
150 || null != uri.getRawFragment())
151 return uri;
152 String p = uri.getRawPath(), q = p;
153 while (p.startsWith(SEPARATOR))
154 p = p.substring(1);
155 while (p.endsWith(SEPARATOR))
156 p = p.substring(0, p.length() - 1);
157 return p == q
158 ? uri
159 : new UriBuilder(uri, true).path(p).getUri();
160 }
161 };
162
163
164
165
166
167
168
169 abstract URI modify(URI uri) throws URISyntaxException;
170
171 private static final String TWO_SEPARATORS = SEPARATOR + SEPARATOR;
172 }
173 }