Merge schema validators into one suite.
[shibboleth/cpp-xmltooling.git] / xmltooling / validation / ValidatorSuite.cpp
1 /*\r
2  *  Copyright 2001-2006 Internet2\r
3  * \r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 /**\r
18  * ValidatorSuite.cpp\r
19  * \r
20  * Groups of rule checkers of XMLObjects based on type or element name. \r
21  */\r
22 \r
23 #include "internal.h"\r
24 #include "validation/ValidatorSuite.h"\r
25 #include "util/XMLHelper.h"\r
26 \r
27 using namespace xmltooling;\r
28 using namespace std;\r
29 \r
30 ValidatorSuite xmltooling::SchemaValidators("SchemaValidators");\r
31 \r
32 namespace {\r
33     class XMLTOOL_DLLLOCAL _clearvector {\r
34     public:\r
35         void operator()(const pair< QName, vector<Validator*> >& p) const {\r
36             for_each(p.second.begin(),p.second.end(),xmltooling::cleanup<Validator>());\r
37         }\r
38     };\r
39 }\r
40 \r
41 void ValidatorSuite::deregisterValidators(const QName& key)\r
42 {\r
43     map< QName, vector<Validator*> >::iterator i=m_map.find(key);\r
44     if (i!=m_map.end()) {\r
45         _clearvector f;\r
46         f(*i);\r
47         m_map.erase(i);\r
48     }\r
49 }\r
50 \r
51 void ValidatorSuite::destroyValidators()\r
52 {\r
53     for_each(m_map.begin(),m_map.end(),_clearvector());\r
54     m_map.clear();\r
55 }\r
56 \r
57 void ValidatorSuite::validate(const XMLObject* xmlObject) const\r
58 {\r
59     if (!xmlObject)\r
60         return;\r
61 \r
62     map< QName, vector<Validator*> >::const_iterator i;\r
63     if (xmlObject->getSchemaType()) {\r
64         i=m_map.find(*(xmlObject->getSchemaType()));\r
65         if (i!=m_map.end())\r
66             for_each(i->second.begin(),i->second.end(),bind2nd(mem_fun<void,Validator,const XMLObject*>(&Validator::validate),xmlObject));\r
67     }\r
68     i=m_map.find(xmlObject->getElementQName());\r
69     if (i!=m_map.end())\r
70         for_each(i->second.begin(),i->second.end(),bind2nd(mem_fun<void,Validator,const XMLObject*>(&Validator::validate),xmlObject));\r
71 \r
72     const list<XMLObject*>& kids=xmlObject->getOrderedChildren();\r
73     for (list<XMLObject*>::const_iterator j=kids.begin(); j!=kids.end(); j++)\r
74         validate(*j);\r
75 }\r