1
2
3
4
5
6 package gov.nist.secauto.metaschema.core.qname;
7
8 import gov.nist.secauto.metaschema.core.metapath.StaticContext;
9 import gov.nist.secauto.metaschema.core.metapath.StaticMetapathException;
10 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
11
12 import java.net.URI;
13 import java.util.Optional;
14
15 import javax.xml.XMLConstants;
16 import javax.xml.namespace.QName;
17
18 import edu.umd.cs.findbugs.annotations.NonNull;
19 import edu.umd.cs.findbugs.annotations.Nullable;
20
21
22
23
24
25
26
27
28 public interface IEnhancedQName extends Comparable<IEnhancedQName> {
29
30
31
32
33
34
35
36
37 int getIndexPosition();
38
39
40
41
42
43
44 @NonNull
45 String getNamespace();
46
47
48
49
50
51
52 @NonNull
53 URI getNamespaceAsUri();
54
55
56
57
58
59
60 @NonNull
61 String getLocalName();
62
63
64
65
66
67
68
69
70
71 @SuppressWarnings("PMD.ShortMethodName")
72 @NonNull
73 static Optional<IEnhancedQName> of(int index) {
74 return EQNameFactory.instance().get(index);
75 }
76
77
78
79
80
81
82
83
84 @SuppressWarnings("PMD.ShortMethodName")
85 @NonNull
86 static IEnhancedQName of(@NonNull QName qname) {
87 return of(
88 ObjectUtils.notNull(qname.getNamespaceURI()),
89 ObjectUtils.notNull(qname.getLocalPart()));
90 }
91
92
93
94
95
96
97
98
99 @SuppressWarnings("PMD.ShortMethodName")
100 @NonNull
101 static IEnhancedQName of(@NonNull String localName) {
102 return of("", localName);
103 }
104
105
106
107
108
109
110
111
112
113
114 @SuppressWarnings("PMD.ShortMethodName")
115 @NonNull
116 static IEnhancedQName of(@NonNull URI namespace, @NonNull String localName) {
117 return of(ObjectUtils.notNull(namespace.toASCIIString()), localName);
118 }
119
120
121
122
123
124
125
126
127
128
129 @SuppressWarnings("PMD.ShortMethodName")
130 @NonNull
131 static IEnhancedQName of(@NonNull String namespace, @NonNull String localName) {
132 return EQNameFactory.instance().newQName(namespace, localName);
133 }
134
135
136
137
138
139
140
141
142
143 @NonNull
144 default String toEQName() {
145 return toEQName((NamespaceToPrefixResolver) null);
146 }
147
148
149
150
151
152
153
154
155
156 @NonNull
157 default String toEQName(@Nullable NamespaceToPrefixResolver resolver) {
158 String namespace = getNamespace();
159 String prefix = namespace.isEmpty() ? null : WellKnown.getWellKnownPrefixForUri(namespace);
160 if (prefix == null && resolver != null) {
161 prefix = resolver.resolve(namespace);
162 }
163 return toEQName(namespace, getLocalName(), prefix);
164 }
165
166
167
168
169
170
171
172
173
174
175 @NonNull
176 default String toEQName(@NonNull StaticContext staticContext) {
177 String namespace = getNamespace();
178 String prefix = namespace.isEmpty() ? null : staticContext.lookupPrefixForNamespace(namespace);
179 return toEQName(namespace, getLocalName(), prefix);
180 }
181
182 @NonNull
183 private static String toEQName(
184 @NonNull String namespace,
185 @NonNull String localName,
186 @Nullable String prefix) {
187
188 StringBuilder builder = new StringBuilder();
189 if (prefix == null) {
190 if (!namespace.isEmpty()) {
191 builder.append("Q{")
192 .append(namespace)
193 .append('}');
194 }
195 } else {
196 builder.append(prefix)
197 .append(':');
198 }
199 return ObjectUtils.notNull(builder.append(localName)
200 .toString());
201 }
202
203
204
205
206
207
208 @NonNull
209 default QName toQName() {
210 return toQName(XMLConstants.DEFAULT_NS_PREFIX);
211 }
212
213
214
215
216
217
218
219
220 @NonNull
221 default QName toQName(@NonNull String prefix) {
222 return new QName(getNamespace(), getLocalName(), prefix);
223 }
224
225
226
227
228 @FunctionalInterface
229 interface NamespaceToPrefixResolver {
230
231
232
233
234
235
236
237 @Nullable
238 String resolve(@NonNull String namespace);
239 }
240
241
242
243
244 @FunctionalInterface
245 interface PrefixToNamespaceResolver {
246
247
248
249
250
251
252
253
254
255
256 @NonNull
257 IEnhancedQName resolve(@NonNull String name);
258 }
259
260 }