1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package edu.internet2.middleware.shibboleth.common.config;
19
20 import java.util.HashMap;
21 import java.util.Map;
22
23 import javax.xml.namespace.QName;
24
25 import org.opensaml.xml.util.XMLHelper;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28 import org.springframework.beans.factory.config.BeanDefinition;
29 import org.springframework.beans.factory.config.BeanDefinitionHolder;
30 import org.springframework.beans.factory.xml.BeanDefinitionDecorator;
31 import org.springframework.beans.factory.xml.BeanDefinitionParser;
32 import org.springframework.beans.factory.xml.NamespaceHandler;
33 import org.springframework.beans.factory.xml.ParserContext;
34 import org.w3c.dom.Attr;
35 import org.w3c.dom.Element;
36 import org.w3c.dom.Node;
37
38
39
40
41
42
43
44
45 public abstract class BaseSpringNamespaceHandler implements NamespaceHandler {
46
47
48 private final Logger log = LoggerFactory.getLogger(BaseSpringNamespaceHandler.class);
49
50
51
52
53
54 private Map<QName, BeanDefinitionParser> parsers = new HashMap<QName, BeanDefinitionParser>();
55
56
57
58
59
60 private Map<QName, BeanDefinitionDecorator> decorators = new HashMap<QName, BeanDefinitionDecorator>();
61
62
63
64
65
66 private Map<QName, BeanDefinitionDecorator> attributeDecorators = new HashMap<QName, BeanDefinitionDecorator>();
67
68
69
70
71
72
73
74
75
76
77
78 public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder definition, ParserContext parserContext) {
79 return findDecoratorForNode(node).decorate(node, definition, parserContext);
80 }
81
82
83
84
85
86
87
88
89
90
91 public BeanDefinition parse(Element element, ParserContext parserContext) {
92 return findParserForElement(element).parse(element, parserContext);
93 }
94
95
96
97
98
99
100
101
102
103 protected BeanDefinitionParser findParserForElement(Element element) {
104 QName parserId;
105 BeanDefinitionParser parser = null;
106
107 parserId = XMLHelper.getXSIType(element);
108 if (parserId != null) {
109 log.trace("Attempting to find parser for element of type: {}", parserId);
110 parser = parsers.get(parserId);
111 }
112
113 if (parser == null) {
114 parserId = XMLHelper.getNodeQName(element);
115 log.trace("Attempting to find parser with element name: {}", parserId);
116 parser = parsers.get(parserId);
117 }
118
119 if (parser == null) {
120 log.error("Cannot locate BeanDefinitionParser for element: " + parserId);
121 throw new IllegalArgumentException("Cannot locate BeanDefinitionParser for element: " + parserId);
122 }
123
124 return parser;
125 }
126
127
128
129
130
131
132
133
134
135 protected BeanDefinitionDecorator findDecoratorForNode(Node node) {
136 BeanDefinitionDecorator decorator = null;
137
138 if (node instanceof Element) {
139 decorator = decorators.get(XMLHelper.getXSIType((Element) node));
140 if (decorator == null) {
141 decorator = decorators.get(XMLHelper.getNodeQName(node));
142 }
143 } else if (node instanceof Attr) {
144 decorator = attributeDecorators.get(node.getLocalName());
145 } else {
146 throw new IllegalArgumentException("Cannot decorate based on Nodes of type [" + node.getClass().getName()
147 + "]");
148 }
149
150 if (decorator == null) {
151 throw new IllegalArgumentException("Cannot locate BeanDefinitionDecorator for " + " ["
152 + node.getLocalName() + "]");
153 }
154
155 return decorator;
156 }
157
158
159
160
161
162
163
164
165 protected void registerBeanDefinitionParser(QName elementNameOrType, BeanDefinitionParser parser) {
166 parsers.put(elementNameOrType, parser);
167 }
168
169
170
171
172
173
174
175
176 protected void registerBeanDefinitionDecorator(QName elementNameOrType, BeanDefinitionDecorator decorator) {
177 decorators.put(elementNameOrType, decorator);
178 }
179
180
181
182
183
184
185
186
187 protected void registerBeanDefinitionDecoratorForAttribute(QName attributeName, BeanDefinitionDecorator decorator) {
188 attributeDecorators.put(attributeName, decorator);
189 }
190 }