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 java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.HashMap;
22 import java.util.Iterator;
23 import java.util.List;
24 import java.util.Map;
25 import javax.xml.XMLConstants;
26 import javax.xml.namespace.NamespaceContext;
27
28 import org.springframework.util.Assert;
29
30
31
32
33
34
35
36
37
38 public class SimpleNamespaceContext implements NamespaceContext {
39
40 private Map prefixToNamespaceUri = new HashMap();
41
42
43 private Map namespaceUriToPrefixes = new HashMap();
44
45 private String defaultNamespaceUri = "";
46
47 public String getNamespaceURI(String prefix) {
48 Assert.notNull(prefix, "prefix is null");
49 if (XMLConstants.XML_NS_PREFIX.equals(prefix)) {
50 return XMLConstants.XML_NS_URI;
51 }
52 else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix)) {
53 return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
54 }
55 else if (XMLConstants.DEFAULT_NS_PREFIX.equals(prefix)) {
56 return defaultNamespaceUri;
57 }
58 else if (prefixToNamespaceUri.containsKey(prefix)) {
59 return (String) prefixToNamespaceUri.get(prefix);
60 }
61 return "";
62 }
63
64 public String getPrefix(String namespaceUri) {
65 List prefixes = getPrefixesInternal(namespaceUri);
66 return prefixes.isEmpty() ? null : (String) prefixes.get(0);
67 }
68
69 public Iterator getPrefixes(String namespaceUri) {
70 return getPrefixesInternal(namespaceUri).iterator();
71 }
72
73
74
75
76
77
78 public void setBindings(Map bindings) {
79 for (Iterator iterator = bindings.entrySet().iterator(); iterator.hasNext();) {
80 Map.Entry entry = (Map.Entry) iterator.next();
81 bindNamespaceUri((String) entry.getKey(), (String) entry.getValue());
82 }
83 }
84
85
86
87
88
89
90 public void bindDefaultNamespaceUri(String namespaceUri) {
91 bindNamespaceUri(XMLConstants.DEFAULT_NS_PREFIX, namespaceUri);
92 }
93
94
95
96
97
98
99
100 public void bindNamespaceUri(String prefix, String namespaceUri) {
101 Assert.notNull(prefix, "No prefix given");
102 Assert.notNull(namespaceUri, "No namespaceUri given");
103 if (XMLConstants.DEFAULT_NS_PREFIX.equals(prefix)) {
104 defaultNamespaceUri = namespaceUri;
105 }
106 else {
107 prefixToNamespaceUri.put(prefix, namespaceUri);
108 getPrefixesInternal(namespaceUri).add(prefix);
109 }
110 }
111
112
113 public void clear() {
114 prefixToNamespaceUri.clear();
115 }
116
117
118
119
120
121
122 public Iterator getBoundPrefixes() {
123 return prefixToNamespaceUri.keySet().iterator();
124 }
125
126 private List getPrefixesInternal(String namespaceUri) {
127 if (defaultNamespaceUri.equals(namespaceUri)) {
128 return Collections.singletonList(XMLConstants.DEFAULT_NS_PREFIX);
129 }
130 else if (XMLConstants.XML_NS_URI.equals(namespaceUri)) {
131 return Collections.singletonList(XMLConstants.XML_NS_PREFIX);
132 }
133 else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceUri)) {
134 return Collections.singletonList(XMLConstants.XMLNS_ATTRIBUTE);
135 }
136 else {
137 List list = (List) namespaceUriToPrefixes.get(namespaceUri);
138 if (list == null) {
139 list = new ArrayList();
140 namespaceUriToPrefixes.put(namespaceUri, list);
141 }
142 return list;
143 }
144 }
145
146
147
148
149
150
151 public void removeBinding(String prefix) {
152 if (XMLConstants.DEFAULT_NS_PREFIX.equals(prefix)) {
153 defaultNamespaceUri = "";
154 }
155 else {
156 String namespaceUri = (String) namespaceUriToPrefixes.get(prefix);
157 List prefixes = getPrefixesInternal(namespaceUri);
158 prefixes.remove(prefix);
159 namespaceUriToPrefixes.remove(prefixes);
160 }
161 }
162 }