1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package edu.internet2.middleware.shibboleth.common.config.security;
18
19 import javax.xml.namespace.QName;
20
21 import org.opensaml.xml.util.DatatypeHelper;
22 import org.opensaml.xml.util.XMLHelper;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25 import org.springframework.beans.FatalBeanException;
26 import org.springframework.beans.factory.support.AbstractBeanDefinition;
27 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
28 import org.springframework.beans.factory.support.ManagedList;
29 import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
30 import org.springframework.beans.factory.xml.ParserContext;
31 import org.w3c.dom.Element;
32
33 import edu.internet2.middleware.shibboleth.common.config.SpringConfigurationUtils;
34
35
36 public class ChainingSignatureTrustEngineBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
37
38
39 public static final QName SCHEMA_TYPE = new QName(SecurityNamespaceHandler.NAMESPACE, "SignatureChaining");
40
41
42 private static final QName TRUST_ENGINE_NAME = new QName(SecurityNamespaceHandler.NAMESPACE, "TrustEngine");
43
44
45 private static final QName TRUST_ENGINE_REF_NAME = new QName(SecurityNamespaceHandler.NAMESPACE, "TrustEngineRef");
46
47
48 private final Logger log = LoggerFactory.getLogger(ChainingSignatureTrustEngineBeanDefinitionParser.class);
49
50
51 protected Class getBeanClass(Element element) {
52 return ChainingSignatureTrustEngineFactoryBean.class;
53 }
54
55
56 @SuppressWarnings("unchecked")
57 protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
58 log.info("Parsing configuration for {} trust engine with id: {}", XMLHelper.getXSIType(element).getLocalPart(),
59 element.getAttributeNS(null, "id"));
60
61 ManagedList managedChain = new ManagedList();
62
63 Element child = XMLHelper.getFirstChildElement(element);
64 while (child != null) {
65 QName childName = XMLHelper.getNodeQName(child);
66 if (TRUST_ENGINE_NAME.equals(childName)) {
67 log.debug("Parsing chain trust engine member {}", element.getAttributeNS(null, "id"));
68 managedChain.add(SpringConfigurationUtils.parseCustomElement(child, parserContext));
69 } else if (TRUST_ENGINE_REF_NAME.equals(childName)) {
70 log.debug("Parsing chain trust engine member reference {}", element.getAttributeNS(null, "ref"));
71 managedChain.add(SpringConfigurationUtils.parseCustomElementReference(child, "ref", parserContext));
72 } else {
73 log.error("Unsupported child element of chaining trust engine '{}' encountered with name: {}", element
74 .getAttributeNS(null, "id"), childName);
75 throw new FatalBeanException("Unsupported child element of chaining trust engine encountered");
76 }
77
78 child = XMLHelper.getNextSiblingElement(child);
79 }
80
81 builder.addPropertyValue("chain", managedChain);
82 }
83
84
85 protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) {
86 return DatatypeHelper.safeTrim(element.getAttributeNS(null, "id"));
87 }
88 }