Parameter to plugin should be a const reference.
[shibboleth/cpp-xmltooling.git] / xmltooling / validation / AbstractValidatingXMLObject.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  * AbstractValidatingXMLObject.cpp\r
19  * \r
20  * Extension of AbstractXMLObject that implements a ValidatingXMLObject. \r
21  */\r
22 \r
23 #include "internal.h"\r
24 #include "exceptions.h"\r
25 #include "validation/AbstractValidatingXMLObject.h"\r
26 \r
27 #include <algorithm>\r
28 #include <functional>\r
29 \r
30 using namespace xmltooling;\r
31 using namespace std;\r
32 \r
33 AbstractValidatingXMLObject::ValidatorWrapper::~ValidatorWrapper()\r
34 {\r
35     for_each(v.begin(),v.end(),cleanup<Validator>());\r
36 }\r
37 \r
38 AbstractValidatingXMLObject::AbstractValidatingXMLObject(const AbstractValidatingXMLObject& src)\r
39     : AbstractXMLObject(src), m_validators(NULL)\r
40 {\r
41     if (src.m_validators) {\r
42         m_validators=new ValidatorWrapper();\r
43         xmltooling::clone(src.m_validators->v,m_validators->v);\r
44     }\r
45 }\r
46 \r
47 AbstractValidatingXMLObject::~AbstractValidatingXMLObject()\r
48 {\r
49     delete m_validators;\r
50 }\r
51 \r
52 void AbstractValidatingXMLObject::registerValidator(Validator* validator)\r
53 {\r
54     if (!m_validators)\r
55         m_validators=new ValidatorWrapper();\r
56     m_validators->v.push_back(validator);\r
57 }\r
58 \r
59 void AbstractValidatingXMLObject::deregisterValidator(Validator* validator)\r
60 {\r
61     if (m_validators) {\r
62         for (std::vector<Validator*>::iterator i=m_validators->v.begin(); i!=m_validators->v.end(); i++) {\r
63             if ((*i)==validator) {\r
64                 m_validators->v.erase(i);\r
65                 return;\r
66             }\r
67         }\r
68     }\r
69 }\r
70 \r
71 void AbstractValidatingXMLObject::deregisterAll()\r
72 {\r
73     delete m_validators;\r
74     m_validators=NULL;\r
75 }\r
76 \r
77 class _validate : public binary_function<const XMLObject*,bool,void> {\r
78 public:\r
79     void operator()(const XMLObject* obj, bool propagate) const {\r
80         const ValidatingXMLObject* val = dynamic_cast<const ValidatingXMLObject*>(obj);\r
81         if (val) {\r
82             val->validate(propagate);\r
83         }\r
84     }\r
85 };\r
86 \r
87 void AbstractValidatingXMLObject::validate(bool validateDescendants) const\r
88 {\r
89     if (m_validators) {\r
90         for_each(\r
91             m_validators->v.begin(),m_validators->v.end(),\r
92             bind2nd(mem_fun<void,Validator,const XMLObject*>(&Validator::validate),this)\r
93             );\r
94     }\r
95     \r
96     if (validateDescendants && hasChildren()) {\r
97         const list<XMLObject*>& children=getOrderedChildren();\r
98         for_each(children.begin(),children.end(),bind2nd(_validate(),validateDescendants));\r
99     }\r
100 }\r