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.ArrayList;
20 import java.util.Collections;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.concurrent.ConcurrentHashMap;
24
25 import javax.xml.namespace.QName;
26
27 import org.opensaml.xml.XMLObject;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31
32
33
34
35
36
37
38
39 public class ValidatorSuite {
40
41
42 private static Logger log = LoggerFactory.getLogger(ValidatorSuite.class);
43
44
45 private String id;
46
47
48 private Map<QName, List<Validator>> validators;
49
50
51
52
53
54
55 public ValidatorSuite(String suiteId) {
56 validators = new ConcurrentHashMap<QName, List<Validator>>();
57 id = suiteId;
58 }
59
60
61
62
63
64
65 public String getId() {
66 return id;
67 }
68
69
70
71
72
73
74
75
76 public void validate(XMLObject xmlObject) throws ValidationException {
77 if (xmlObject == null) {
78 return;
79 }
80
81 log.debug("Beginning to verify XMLObject {} and its children", xmlObject.getElementQName());
82 performValidation(xmlObject);
83
84 List<XMLObject> children = xmlObject.getOrderedChildren();
85 if (children != null) {
86 for (XMLObject child : children) {
87 validate(child);
88 }
89 }
90 }
91
92
93
94
95
96
97
98
99 public List<Validator> getValidators(QName xmlObjectTarget) {
100 return Collections.unmodifiableList(validators.get(xmlObjectTarget));
101 }
102
103
104
105
106
107
108
109 public void registerValidator(QName xmlObjectTarget, Validator validator) {
110 List<Validator> targetValidators = validators.get(xmlObjectTarget);
111
112 if (targetValidators == null) {
113 targetValidators = new ArrayList<Validator>();
114 validators.put(xmlObjectTarget, targetValidators);
115 }
116
117 targetValidators.add(validator);
118 }
119
120
121
122
123
124
125
126 public void deregisterValidator(QName xmlObjectTarget, Validator validator) {
127 List<Validator> targetValidators = validators.get(xmlObjectTarget);
128
129 if (targetValidators != null) {
130 targetValidators.remove(validator);
131 }
132 }
133
134
135
136
137
138
139
140
141 private void performValidation(XMLObject xmlObject) throws ValidationException {
142 QName schemaType = xmlObject.getSchemaType();
143 if (schemaType != null) {
144 log.debug("Validating XMLObject {} against validators registered under its schema type {}", xmlObject
145 .getElementQName(), schemaType);
146 performValidation(schemaType, xmlObject);
147 }
148
149 log.debug("Validating XMLObject {} against validators registered under its element QName", xmlObject
150 .getElementQName());
151 performValidation(xmlObject.getElementQName(), xmlObject);
152 }
153
154
155
156
157
158
159
160
161
162 private void performValidation(QName validatorSetKey, XMLObject xmlObject) throws ValidationException {
163 List<Validator> elementQNameValidators = validators.get(validatorSetKey);
164 if (elementQNameValidators != null) {
165 for (Validator validator : elementQNameValidators) {
166 log.debug("Validating XMLObject {} against Validator {}", xmlObject.getElementQName(), validator
167 .getClass().getName());
168 validator.validate(xmlObject);
169 }
170 } else {
171 log.debug("No validators registered for XMLObject {} under QName {}", xmlObject.getElementQName(),
172 validatorSetKey);
173 }
174 }
175 }