More boostisms
[shibboleth/cpp-xmltooling.git] / xmltooling / validation / ValidatorSuite.cpp
index 447bee0..9c25046 100644 (file)
@@ -1,75 +1,98 @@
-/*\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
-ValidatorSuite xmltooling::SchemaValidators("SchemaValidators");\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
+/**
+ * Licensed to the University Corporation for Advanced Internet
+ * Development, Inc. (UCAID) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ *
+ * UCAID licenses this file to you 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);
+}