1
2
3
4
5 package net.java.truevfs.access;
6
7 import java.net.URI;
8 import java.net.URISyntaxException;
9 import javax.annotation.concurrent.ThreadSafe;
10 import net.java.truecommons.shed.Paths;
11 import net.java.truecommons.shed.QuotedUriSyntaxException;
12 import net.java.truecommons.shed.UriBuilder;
13 import static net.java.truevfs.kernel.spec.FsNodeName.*;
14
15
16
17
18
19
20 @ThreadSafe
21 final class TUriHelper {
22 static final URI SEPARATOR_URI = URI.create(SEPARATOR);
23 static final URI DOT_URI = URI.create(".");
24 static final URI DOT_DOT_URI = URI.create("..");
25
26 static int pathPrefixLength(final URI uri) {
27 final String ssp = uri.getSchemeSpecificPart();
28 final String a = uri.getAuthority();
29 final int al = null == a ? 0 : 2 + a.length();
30 final int pl = Paths.prefixLength(ssp, SEPARATOR_CHAR, true) - al;
31 return pl >= 0 ? pl : Paths.prefixLength(uri.getPath(), SEPARATOR_CHAR, false);
32 }
33
34 static URI check(final URI uri) throws URISyntaxException {
35 if (null != uri.getFragment())
36 throw new QuotedUriSyntaxException(uri, "Fragment component defined");
37 return uri;
38 }
39
40
41
42
43
44
45
46
47
48
49
50 static URI fix(final URI uri) {
51 final String ssp = uri.getSchemeSpecificPart();
52 final String a = uri.getAuthority();
53
54
55 if (null == ssp
56 || null == a && ssp.startsWith(SEPARATOR + SEPARATOR))
57 return new UriBuilder(uri).toUri();
58 return uri;
59 }
60
61
62
63
64
65
66
67
68
69 static boolean hasAbsolutePath(URI uri) {
70 return !uri.isOpaque() && Paths.isAbsolute(
71 uri.getSchemeSpecificPart(), SEPARATOR_CHAR);
72 }
73
74 private TUriHelper() { }
75 }