1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.wss4j.policy.model;
21
22 import java.io.Serializable;
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 class NSStack {
43
44 private Mapping[] stack;
45 private int top;
46 private int iterator;
47 private int currentDefaultNS = -1;
48
49
50
51
52 NSStack() {
53 stack = new Mapping[32];
54 stack[0] = null;
55 }
56
57
58
59
60 public void push() {
61 top++;
62 if (top >= stack.length) {
63 Mapping[] newstack = new Mapping[stack.length * 2];
64 System.arraycopy(stack, 0, newstack, 0, stack.length);
65 stack = newstack;
66 }
67 stack[top] = null;
68 }
69
70
71
72
73 public void pop() {
74 clearFrame();
75 top--;
76
77
78
79 if (top < currentDefaultNS) {
80
81 currentDefaultNS = top;
82 while (currentDefaultNS > 0) {
83 if (stack[currentDefaultNS] != null
84 && stack[currentDefaultNS].getPrefix().length() == 0) {
85 break;
86 }
87 currentDefaultNS--;
88 }
89 }
90 if (top == 0) {
91 return;
92 }
93 }
94
95
96
97
98 private void clearFrame() {
99 while (stack[top] != null) {
100 top--;
101 }
102 }
103
104
105
106
107
108
109
110 public Mapping topOfFrame() {
111 iterator = top;
112 while (stack[iterator] != null) {
113 iterator--;
114 }
115 iterator++;
116 return next();
117 }
118
119
120
121
122 public Mapping next() {
123 if (iterator > top) {
124 return null;
125 } else {
126 return stack[iterator++];
127 }
128 }
129
130
131
132
133
134
135 public void add(String namespaceURI, String prefix) {
136 int idx = top;
137 try {
138
139 for (int cursor = top; stack[cursor] != null; cursor--) {
140 if (stack[cursor].getPrefix().equals(prefix)) {
141 stack[cursor].setNamespaceURI(namespaceURI);
142 idx = cursor;
143 return;
144 }
145 }
146 push();
147 stack[top] = new Mapping(namespaceURI, prefix);
148 idx = top;
149 } finally {
150
151
152 if (prefix.length() == 0) {
153 currentDefaultNS = idx;
154 }
155 }
156 }
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173 public String getPrefix(String namespaceURI, boolean noDefault) {
174 if (namespaceURI == null || namespaceURI.isEmpty()) {
175 return null;
176 }
177 int hash = namespaceURI.hashCode();
178
179
180
181 if (!noDefault && currentDefaultNS > 0 && stack[currentDefaultNS] != null
182 && namespaceURI.equals(stack[currentDefaultNS].getNamespaceURI())) {
183 return "";
184 }
185 for (int cursor = top; cursor > 0; cursor--) {
186 Mapping map = stack[cursor];
187 if (map == null) {
188 continue;
189 }
190 if (map.getNamespaceHash() == hash && map.getNamespaceURI().equals(namespaceURI)) {
191 String possiblePrefix = map.getPrefix();
192 if (noDefault && possiblePrefix.length() == 0) {
193 continue;
194 }
195
196
197
198 int ppHash = possiblePrefix.hashCode();
199 for (int cursor2 = top; true; cursor2--) {
200 if (cursor2 == cursor) {
201 return possiblePrefix;
202 }
203 map = stack[cursor2];
204 if (map == null) {
205 continue;
206 }
207 if (ppHash == map.getPrefixHash() && possiblePrefix.equals(map.getPrefix())) {
208 break;
209 }
210 }
211 }
212 }
213 return null;
214 }
215
216
217
218
219
220 public String getPrefix(String namespaceURI) {
221 return getPrefix(namespaceURI, false);
222 }
223
224
225
226
227 public String getNamespaceURI(String prefix) {
228 String pfix = prefix;
229 if (pfix == null) {
230 pfix = "";
231 }
232 int hash = pfix.hashCode();
233 for (int cursor = top; cursor > 0; cursor--) {
234 Mapping map = stack[cursor];
235 if (map == null) {
236 continue;
237 }
238 if (map.getPrefixHash() == hash && map.getPrefix().equals(pfix)) {
239 return map.getNamespaceURI();
240 }
241 }
242 return null;
243 }
244
245 private static class Mapping implements Serializable {
246
247
248
249 private static final long serialVersionUID = 4598721541118599293L;
250 private String namespaceURI;
251 private int namespaceHash;
252
253 private String prefix;
254 private int prefixHash;
255
256 Mapping(String namespaceURI, String prefix) {
257 setPrefix(prefix);
258 setNamespaceURI(namespaceURI);
259 }
260
261 public String getNamespaceURI() {
262 return namespaceURI;
263 }
264
265 public int getNamespaceHash() {
266 return namespaceHash;
267 }
268
269 public void setNamespaceURI(String namespaceURI) {
270 this.namespaceURI = namespaceURI;
271 this.namespaceHash = namespaceURI.hashCode();
272 }
273
274 public String getPrefix() {
275 return prefix;
276 }
277
278 public int getPrefixHash() {
279 return prefixHash;
280 }
281
282 public void setPrefix(String prefix) {
283 this.prefix = prefix;
284 this.prefixHash = prefix.hashCode();
285 }
286
287 }
288
289 }