Merge branch '1.x' of ssh://authdev.it.ohio-state.edu/~scantor/git/cpp-xmltooling...
[shibboleth/cpp-xmltooling.git] / xmltooling / validation / ValidatorSuite.cpp
1 /**
2  * Licensed to the University Corporation for Advanced Internet
3  * Development, Inc. (UCAID) under one or more contributor license
4  * agreements. See the NOTICE file distributed with this work for
5  * additional information regarding copyright ownership.
6  *
7  * UCAID licenses this file to you under the Apache License,
8  * Version 2.0 (the "License"); you may not use this file except
9  * in compliance with the License. You may obtain a copy of the
10  * License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
17  * either express or implied. See the License for the specific
18  * language governing permissions and limitations under the License.
19  */
20
21 /**
22  * ValidatorSuite.cpp
23  * 
24  * Groups of rule checkers of XMLObjects based on type or element name. 
25  */
26
27 #include "internal.h"
28 #include "validation/Validator.h"
29 #include "validation/ValidatorSuite.h"
30
31 using namespace xmltooling;
32 using namespace std;
33
34 Validator::Validator()
35 {
36 }
37
38 Validator::~Validator()
39 {
40 }
41
42 ValidatorSuite xmltooling::SchemaValidators("SchemaValidators");
43
44 ValidatorSuite::ValidatorSuite(const char* id) : m_id(id)
45 {
46 }
47
48 ValidatorSuite::~ValidatorSuite()
49 {
50     destroyValidators();
51 }
52
53 const char* ValidatorSuite::getId()
54 {
55     return m_id.c_str();
56 }
57
58 void ValidatorSuite::registerValidator(const QName& key, Validator* validator)
59 {
60     m_map.insert(pair<const QName,Validator*>(key, validator));
61 }
62
63 void ValidatorSuite::deregisterValidators(const QName& key)
64 {
65     pair<multimap<QName,Validator*>::iterator,multimap<QName,Validator*>::iterator> range=m_map.equal_range(key);
66     for_each(range.first, range.second, xmltooling::cleanup_pair<QName,Validator>());
67     m_map.erase(range.first, range.second);
68 }
69
70 void ValidatorSuite::destroyValidators()
71 {
72     for_each(m_map.begin(),m_map.end(),xmltooling::cleanup_pair<QName,Validator>());
73     m_map.clear();
74 }
75
76 void ValidatorSuite::validate(const XMLObject* xmlObject) const
77 {
78     if (!xmlObject)
79         return;
80
81     pair<multimap<QName,Validator*>::const_iterator,multimap<QName,Validator*>::const_iterator> range;
82     if (xmlObject->getSchemaType()) {
83         range=m_map.equal_range(*(xmlObject->getSchemaType()));
84         while (range.first!=range.second) {
85             range.first->second->validate(xmlObject);
86             ++range.first;
87         }
88     }
89     range=m_map.equal_range(xmlObject->getElementQName());
90     while (range.first!=range.second) {
91         range.first->second->validate(xmlObject);
92         ++range.first;
93     }
94
95     const list<XMLObject*>& kids=xmlObject->getOrderedChildren();
96     for (list<XMLObject*>::const_iterator j=kids.begin(); j!=kids.end(); j++)
97         validate(*j);
98 }