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