-/*\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
- * ValidatorSuite.cpp\r
- * \r
- * Groups of rule checkers of XMLObjects based on type or element name. \r
- */\r
-\r
-#include "internal.h"\r
-#include "validation/ValidatorSuite.h"\r
-#include "util/XMLHelper.h"\r
-\r
-using namespace xmltooling;\r
-using namespace std;\r
-\r
-namespace {\r
- class XMLTOOL_DLLLOCAL _clearvector {\r
- public:\r
- void operator()(const pair< QName, vector<Validator*> >& p) const {\r
- for_each(p.second.begin(),p.second.end(),xmltooling::cleanup<Validator>());\r
- }\r
- };\r
-}\r
-\r
-void ValidatorSuite::deregisterValidators(const QName& key)\r
-{\r
- map< QName, vector<Validator*> >::iterator i=m_map.find(key);\r
- if (i!=m_map.end()) {\r
- _clearvector f;\r
- f(*i);\r
- m_map.erase(i);\r
- }\r
-}\r
-\r
-void ValidatorSuite::destroyValidators()\r
-{\r
- for_each(m_map.begin(),m_map.end(),_clearvector());\r
- m_map.clear();\r
-}\r
-\r
-void ValidatorSuite::validate(const XMLObject* xmlObject) const\r
-{\r
- if (!xmlObject)\r
- return;\r
-\r
- map< QName, vector<Validator*> >::const_iterator i;\r
- if (xmlObject->getSchemaType()) {\r
- i=m_map.find(*(xmlObject->getSchemaType()));\r
- if (i!=m_map.end())\r
- for_each(i->second.begin(),i->second.end(),bind2nd(mem_fun<void,Validator,const XMLObject*>(&Validator::validate),xmlObject));\r
- }\r
- i=m_map.find(xmlObject->getElementQName());\r
- if (i!=m_map.end())\r
- for_each(i->second.begin(),i->second.end(),bind2nd(mem_fun<void,Validator,const XMLObject*>(&Validator::validate),xmlObject));\r
-\r
- const list<XMLObject*>& kids=xmlObject->getOrderedChildren();\r
- for (list<XMLObject*>::const_iterator j=kids.begin(); j!=kids.end(); j++)\r
- validate(*j);\r
-}\r
+/*
+ * Copyright 2001-2009 Internet2
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * ValidatorSuite.cpp
+ *
+ * Groups of rule checkers of XMLObjects based on type or element name.
+ */
+
+#include "internal.h"
+#include "validation/Validator.h"
+#include "validation/ValidatorSuite.h"
+
+using namespace xmltooling;
+using namespace std;
+
+Validator::Validator()
+{
+}
+
+Validator::~Validator()
+{
+}
+
+ValidatorSuite xmltooling::SchemaValidators("SchemaValidators");
+
+ValidatorSuite::ValidatorSuite(const char* id) : m_id(id)
+{
+}
+
+ValidatorSuite::~ValidatorSuite()
+{
+ destroyValidators();
+}
+
+const char* ValidatorSuite::getId()
+{
+ return m_id.c_str();
+}
+
+void ValidatorSuite::registerValidator(const QName& key, Validator* validator)
+{
+ m_map.insert(pair<const QName,Validator*>(key, validator));
+}
+
+void ValidatorSuite::deregisterValidators(const QName& key)
+{
+ pair<multimap<QName,Validator*>::iterator,multimap<QName,Validator*>::iterator> range=m_map.equal_range(key);
+ for_each(range.first, range.second, xmltooling::cleanup_pair<QName,Validator>());
+ m_map.erase(range.first, range.second);
+}
+
+void ValidatorSuite::destroyValidators()
+{
+ for_each(m_map.begin(),m_map.end(),xmltooling::cleanup_pair<QName,Validator>());
+ m_map.clear();
+}
+
+void ValidatorSuite::validate(const XMLObject* xmlObject) const
+{
+ if (!xmlObject)
+ return;
+
+ pair<multimap<QName,Validator*>::const_iterator,multimap<QName,Validator*>::const_iterator> range;
+ if (xmlObject->getSchemaType()) {
+ range=m_map.equal_range(*(xmlObject->getSchemaType()));
+ while (range.first!=range.second) {
+ range.first->second->validate(xmlObject);
+ ++range.first;
+ }
+ }
+ range=m_map.equal_range(xmlObject->getElementQName());
+ while (range.first!=range.second) {
+ range.first->second->validate(xmlObject);
+ ++range.first;
+ }
+
+ const list<XMLObject*>& kids=xmlObject->getOrderedChildren();
+ for (list<XMLObject*>::const_iterator j=kids.begin(); j!=kids.end(); j++)
+ validate(*j);
+}