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