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