1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.exolab.castor.xml;
17
18 import java.util.ArrayList;
19 import java.util.Enumeration;
20 import java.util.List;
21
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24 import org.xml.sax.helpers.AttributeListImpl;
25
26
27
28
29
30
31
32
33
34 @SuppressWarnings("deprecation")
35 public class NamespacesStack {
36
37 private final Log logger = LogFactory.getLog(this.getClass());
38
39
40
41
42
43 private static final String DEFAULT_NAMESPACE = "";
44
45
46
47
48 private List<Namespaces> namespaceStack = new ArrayList<Namespaces>();
49
50
51
52
53
54
55
56
57
58 public void addNamespace(String namespacePrefix, String namespaceUri) {
59 Namespaces namespaces = getCurrentNamespaceScope();
60 if (namespaces != null) {
61 namespaces.addNamespace(namespacePrefix, namespaceUri);
62 }
63 }
64
65
66
67
68
69
70
71 public void addDefaultNamespace(String namespaceUri) {
72 addNamespace(DEFAULT_NAMESPACE, namespaceUri);
73 }
74
75
76
77
78
79
80
81 public void removeNamespace(String namespacePrefix) {
82 getCurrentNamespaceScope().removeNamespace(namespacePrefix);
83 }
84
85
86
87
88
89
90
91
92
93
94 public String getNamespaceURI(String namespacePrefix) {
95 String namespaceUri = null;
96 for (int ind = namespaceStack.size() - 1; ind >= 0 && namespaceUri == null; ind--) {
97 namespaceUri = namespaceStack.get(ind).getNamespaceURI(namespacePrefix);
98 }
99 return namespaceUri;
100 }
101
102
103
104
105
106
107
108
109
110
111 @SuppressWarnings("deprecation")
112 public void declareAsAttributes(AttributeListImpl attributeList, boolean localOnly) {
113 getCurrentNamespaceScope().declareAsAttributes(attributeList);
114 if (!localOnly) {
115 for (int ind = namespaceStack.size() - 1; ind >= 0; ind--) {
116
117 namespaceStack.get(ind).declareAsAttributes(attributeList);
118 }
119 }
120 }
121
122
123
124
125
126
127 public String getDefaultNamespaceURI() {
128 return getNamespaceURI(DEFAULT_NAMESPACE);
129 }
130
131
132
133
134
135
136
137
138
139 public String getNamespacePrefix(String namespaceUri) {
140 String namespacePrefix = null;
141 for (int ind = namespaceStack.size() - 1; ind >= 0 && namespacePrefix == null; ind--) {
142 namespacePrefix = namespaceStack.get(ind).getNamespacePrefix(namespaceUri);
143 }
144 return namespacePrefix;
145 }
146
147
148
149
150
151
152
153
154
155 public String getNonDefaultNamespacePrefix(String namespaceUri) {
156 String namespacePrefix = null;
157 for (int ind = namespaceStack.size() - 1; ind >= 0 && namespacePrefix == null; ind--) {
158 namespacePrefix = namespaceStack.get(ind).getNonDefaultNamespacePrefix(namespaceUri);
159 }
160 return namespacePrefix;
161 }
162
163
164
165
166
167
168 public Enumeration<String> getLocalNamespacePrefixes() {
169 Namespaces namespaces = getCurrentNamespaceScope();
170 return namespaces != null ? namespaces.getLocalNamespacePrefixes() : null;
171 }
172
173
174
175
176 public void addNewNamespaceScope() {
177 namespaceStack.add(new Namespaces());
178 }
179
180
181
182
183 public void removeNamespaceScope() {
184
185 if (namespaceStack.size() > 0) {
186 namespaceStack.remove(namespaceStack.size() - 1);
187 } else {
188 this.logger.error("Trying to remove a namespaces scope from an empty stack of Namespaces");
189 }
190 }
191
192
193
194
195
196
197 public Namespaces getCurrentNamespaceScope() {
198 if (namespaceStack.size() == 0) {
199 addNewNamespaceScope();
200 }
201 return namespaceStack.get(namespaceStack.size() - 1);
202 }
203 }