1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.opensaml.xml;
18
19 import java.util.Collections;
20 import java.util.List;
21
22 import org.opensaml.xml.signature.AbstractSignableXMLObject;
23 import org.opensaml.xml.util.LazyList;
24 import org.opensaml.xml.validation.ValidatingXMLObject;
25 import org.opensaml.xml.validation.ValidationException;
26 import org.opensaml.xml.validation.Validator;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30
31
32
33
34 public abstract class AbstractValidatingSignableXMLObject extends AbstractSignableXMLObject implements
35 ValidatingXMLObject {
36
37
38 private final Logger log = LoggerFactory.getLogger(AbstractValidatingSignableXMLObject.class);
39
40
41 private List<Validator> validators;
42
43
44
45
46
47
48
49
50 protected AbstractValidatingSignableXMLObject(String namespaceURI, String elementLocalName, String namespacePrefix) {
51 super(namespaceURI, elementLocalName, namespacePrefix);
52 validators = new LazyList<Validator>();
53 }
54
55
56 public List<Validator> getValidators() {
57 if (validators.size() > 0) {
58 return Collections.unmodifiableList(validators);
59 }
60
61 return null;
62 }
63
64
65 public void registerValidator(Validator validator) {
66 if (validator != null) {
67 validators.add(validator);
68 }
69 }
70
71
72 public void deregisterValidator(Validator validator) {
73 validators.remove(validator);
74 }
75
76
77 @SuppressWarnings("unchecked")
78 public void validate(boolean validateDescendants) throws ValidationException {
79 for (Validator validator : validators) {
80 log.debug("Validating {} using Validator class {}", getElementQName(), validator.getClass().getName());
81 validator.validate(this);
82 }
83
84 if (validateDescendants) {
85 log.debug("Validating descendants of {}", getElementQName());
86 validateChildren(this);
87 }
88 }
89
90
91
92
93
94
95
96
97
98 protected void validateChildren(XMLObject xmlObject) throws ValidationException {
99 for (XMLObject childObject : xmlObject.getOrderedChildren()) {
100 if (childObject == null) {
101 continue;
102 }
103
104 if (childObject instanceof ValidatingXMLObject) {
105 ((ValidatingXMLObject) childObject).validate(false);
106 } else {
107 log.debug("{} does not implement ValidatingXMLObject, ignoring it.", childObject.getElementQName());
108 }
109
110 if (childObject.hasChildren()) {
111 validateChildren(childObject);
112 }
113 }
114 }
115 }