-/*\r
- * Copyright 2001-2006 Internet2\r
- * \r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-/**\r
- * AbstractValidatingXMLObject.cpp\r
- * \r
- * Extension of AbstractXMLObject that implements a ValidatingXMLObject. \r
- */\r
-\r
-#include "internal.h"\r
-#include "exceptions.h"\r
-#include "validation/AbstractValidatingXMLObject.h"\r
-\r
-#include <algorithm>\r
-#include <functional>\r
-\r
-using namespace xmltooling;\r
-using namespace std;\r
-\r
-AbstractValidatingXMLObject::ValidatorWrapper::~ValidatorWrapper()\r
-{\r
- for_each(v.begin(),v.end(),cleanup<Validator>());\r
-}\r
-\r
-AbstractValidatingXMLObject::AbstractValidatingXMLObject(const AbstractValidatingXMLObject& src)\r
- : AbstractXMLObject(src), m_validators(NULL)\r
-{\r
- if (src.m_validators) {\r
- m_validators=new ValidatorWrapper();\r
- xmltooling::clone(src.m_validators->v,m_validators->v);\r
- }\r
-}\r
-\r
-AbstractValidatingXMLObject::~AbstractValidatingXMLObject()\r
-{\r
- delete m_validators;\r
-}\r
-\r
-void AbstractValidatingXMLObject::registerValidator(Validator* validator)\r
-{\r
- if (!m_validators)\r
- m_validators=new ValidatorWrapper();\r
- m_validators->v.push_back(validator);\r
-}\r
-\r
-void AbstractValidatingXMLObject::deregisterValidator(Validator* validator)\r
-{\r
- if (m_validators) {\r
- for (std::vector<Validator*>::iterator i=m_validators->v.begin(); i!=m_validators->v.end(); i++) {\r
- if ((*i)==validator) {\r
- m_validators->v.erase(i);\r
- return;\r
- }\r
- }\r
- }\r
-}\r
-\r
-void AbstractValidatingXMLObject::deregisterAll()\r
-{\r
- delete m_validators;\r
- m_validators=NULL;\r
-}\r
-\r
-class _validate : public binary_function<const XMLObject*,bool,void> {\r
-public:\r
- void operator()(const XMLObject* obj, bool propagate) const {\r
- const ValidatingXMLObject* val = dynamic_cast<const ValidatingXMLObject*>(obj);\r
- if (val) {\r
- val->validate(propagate);\r
- }\r
- }\r
-};\r
-\r
-void AbstractValidatingXMLObject::validate(bool validateDescendants) const\r
-{\r
- if (m_validators) {\r
- for_each(\r
- m_validators->v.begin(),m_validators->v.end(),\r
- bind2nd(mem_fun<void,Validator,const XMLObject*>(&Validator::validate),this)\r
- );\r
- }\r
- \r
- if (validateDescendants && hasChildren()) {\r
- const list<XMLObject*>& children=getOrderedChildren();\r
- for_each(children.begin(),children.end(),bind2nd(_validate(),validateDescendants));\r
- }\r
-}\r