1
2
3
4
5
6 package dev.metaschema.core.metapath.item.atomic;
7
8 import java.net.URI;
9
10 import dev.metaschema.core.datatype.adapter.MetaschemaDataTypeProvider;
11 import dev.metaschema.core.metapath.function.InvalidValueForCastFunctionException;
12 import dev.metaschema.core.metapath.item.atomic.impl.AnyUriItemImpl;
13 import dev.metaschema.core.metapath.type.IAtomicOrUnionType;
14 import dev.metaschema.core.metapath.type.InvalidTypeMetapathException;
15 import dev.metaschema.core.util.ObjectUtils;
16 import edu.umd.cs.findbugs.annotations.NonNull;
17
18
19
20
21 public interface IAnyUriItem extends IAnyAtomicItem {
22
23
24
25
26
27 @NonNull
28 static IAtomicOrUnionType<IAnyUriItem> type() {
29 return MetaschemaDataTypeProvider.URI.getItemType();
30 }
31
32 @Override
33 default IAtomicOrUnionType<? extends IAnyUriItem> getType() {
34 return type();
35 }
36
37
38
39
40
41
42
43
44
45
46 @NonNull
47 static IAnyUriItem valueOf(@NonNull String value) {
48 try {
49 return valueOf(MetaschemaDataTypeProvider.URI.parse(value));
50 } catch (IllegalArgumentException ex) {
51 throw new InvalidTypeMetapathException(
52 null,
53 String.format("Invalid URI value '%s'. %s",
54 value,
55 ex.getLocalizedMessage()),
56 ex);
57 }
58 }
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 @NonNull
76 static IAnyUriItem valueOf(@NonNull URI value) {
77 IAnyUriItem retval;
78 if (value.isAbsolute() || value.isOpaque()) {
79 retval = new AnyUriItemImpl(value);
80 } else {
81 retval = IUriReferenceItem.valueOf(value);
82 }
83 return retval;
84 }
85
86
87
88
89
90
91
92
93
94
95
96 @NonNull
97 static IAnyUriItem cast(@NonNull IAnyAtomicItem item) {
98 try {
99 return item instanceof IAnyUriItem
100 ? (IAnyUriItem) item
101 : valueOf(item.asString());
102 } catch (IllegalStateException | InvalidTypeMetapathException ex) {
103
104 throw new InvalidValueForCastFunctionException(ex);
105 }
106 }
107
108 @Override
109 default IAnyUriItem castAsType(IAnyAtomicItem item) {
110 return cast(item);
111 }
112
113
114
115
116
117
118 @NonNull
119 URI asUri();
120
121
122
123
124
125
126 default boolean isAbsolute() {
127 return asUri().isAbsolute();
128 }
129
130
131
132
133
134
135
136 default boolean isOpaque() {
137 return asUri().isOpaque();
138 }
139
140
141
142
143
144
145
146
147
148 @NonNull
149 default IAnyUriItem resolve(@NonNull IAnyUriItem other) {
150 return valueOf(ObjectUtils.notNull(asUri().resolve(other.asUri())));
151 }
152
153
154
155
156
157
158
159
160
161 default int compareTo(@NonNull IAnyUriItem item) {
162 return asUri().compareTo(item.asUri());
163 }
164 }