1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.xml.namespace;
18
19 import javax.xml.namespace.QName;
20
21 import org.springframework.util.Assert;
22 import org.springframework.util.StringUtils;
23 import org.w3c.dom.Node;
24
25
26
27
28
29
30
31
32 public abstract class QNameUtils {
33
34
35 private static boolean qNameHasPrefix;
36
37 static {
38 try {
39 QName.class.getDeclaredConstructor(new Class[]{String.class, String.class, String.class});
40 qNameHasPrefix = true;
41 }
42 catch (NoSuchMethodException e) {
43 qNameHasPrefix = false;
44 }
45 }
46
47
48
49
50
51
52
53
54
55
56
57
58 public static QName createQName(String namespaceUri, String localPart, String prefix) {
59 if (qNameHasPrefix) {
60 return new QName(namespaceUri, localPart, prefix);
61 }
62 else {
63 return new QName(namespaceUri, localPart);
64 }
65 }
66
67
68
69
70
71
72
73
74
75
76 public static String getPrefix(QName qName) {
77 return qNameHasPrefix ? qName.getPrefix() : "";
78 }
79
80
81
82
83
84
85
86 public static boolean validateQName(String text) {
87 if (!StringUtils.hasLength(text)) {
88 return false;
89 }
90 if (text.charAt(0) == '{') {
91 int i = text.indexOf('}');
92
93 if (i == -1 || i == text.length() - 1) {
94 return false;
95 }
96 }
97 return true;
98 }
99
100
101
102
103
104
105
106 public static QName getQNameForNode(Node node) {
107 if (node.getNamespaceURI() != null && node.getPrefix() != null && node.getLocalName() != null) {
108 return createQName(node.getNamespaceURI(), node.getLocalName(), node.getPrefix());
109 }
110 else if (node.getNamespaceURI() != null && node.getLocalName() != null) {
111 return new QName(node.getNamespaceURI(), node.getLocalName());
112 }
113 else if (node.getLocalName() != null) {
114 return new QName(node.getLocalName());
115 }
116 else {
117
118 return new QName(node.getNodeName());
119 }
120 }
121
122
123
124
125
126
127
128
129 public static String toQualifiedName(QName qName) {
130 String prefix = getPrefix(qName);
131 if (!StringUtils.hasLength(prefix)) {
132 return qName.getLocalPart();
133 }
134 else {
135 return prefix + ":" + qName.getLocalPart();
136 }
137 }
138
139
140
141
142
143
144
145
146
147 public static QName toQName(String namespaceUri, String qualifiedName) {
148 int idx = qualifiedName.indexOf(':');
149 if (idx == -1) {
150 return new QName(namespaceUri, qualifiedName);
151 }
152 else {
153 return createQName(namespaceUri, qualifiedName.substring(idx + 1), qualifiedName.substring(0, idx));
154 }
155 }
156
157
158
159
160
161
162
163
164
165
166 public static QName parseQNameString(String qNameString) {
167 Assert.hasLength(qNameString, "QName text may not be null or empty");
168 if (qNameString.charAt(0) != '{') {
169 return new QName(qNameString);
170 }
171 else {
172 int endOfNamespaceURI = qNameString.indexOf('}');
173 if (endOfNamespaceURI == -1) {
174 throw new IllegalArgumentException(
175 "Cannot create QName from \"" + qNameString + "\", missing closing \"}\"");
176 }
177 int prefixSeperator = qNameString.indexOf(':', endOfNamespaceURI + 1);
178 String namespaceURI = qNameString.substring(1, endOfNamespaceURI);
179 if (prefixSeperator == -1) {
180 return new QName(namespaceURI, qNameString.substring(endOfNamespaceURI + 1));
181 }
182 else {
183 return createQName(namespaceURI, qNameString.substring(prefixSeperator + 1),
184 qNameString.substring(endOfNamespaceURI + 1, prefixSeperator));
185 }
186 }
187
188 }
189
190 }