Added ValidatorSuite around groups of static validators.
authorScott Cantor <cantor.2@osu.edu>
Sun, 2 Jul 2006 22:21:52 +0000 (22:21 +0000)
committerScott Cantor <cantor.2@osu.edu>
Sun, 2 Jul 2006 22:21:52 +0000 (22:21 +0000)
12 files changed:
xmltooling/Makefile.am
xmltooling/XMLToolingConfig.cpp
xmltooling/encryption/Encryption.h
xmltooling/encryption/impl/EncryptionSchemaValidators.cpp
xmltooling/signature/KeyInfo.h
xmltooling/signature/impl/KeyInfoSchemaValidators.cpp
xmltooling/validation/Validator.h
xmltooling/validation/ValidatorSuite.cpp [moved from xmltooling/validation/Validator.cpp with 66% similarity]
xmltooling/validation/ValidatorSuite.h [new file with mode: 0644]
xmltooling/xmltooling.vcproj
xmltoolingtest/EncryptionTest.h
xmltoolingtest/KeyInfoTest.h

index a907fb2..ed8c919 100644 (file)
@@ -73,7 +73,8 @@ utilinclude_HEADERS = \
 valinclude_HEADERS = \
        validation/AbstractValidatingXMLObject.h \
        validation/ValidatingXMLObject.h \
-       validation/Validator.h
+       validation/Validator.h \
+       validation/ValidatorSuite.h
 
 noinst_HEADERS = \
        internal.h
@@ -120,7 +121,7 @@ libxmltooling_la_SOURCES = \
        util/XMLConstants.cpp \
        util/XMLHelper.cpp \
        validation/AbstractValidatingXMLObject.cpp \
-       validation/Validator.cpp \
+       validation/ValidatorSuite.cpp \
        ${xmlsec_sources} \
        $(thread_sources)
 
index e8e6ad8..b22b664 100644 (file)
@@ -190,7 +190,8 @@ bool XMLToolingInternalConfig::init()
 void XMLToolingInternalConfig::term()
 {
     XMLObjectBuilder::destroyBuilders();
-    Validator::destroyValidators();
+    KeyInfoSchemaValidators.destroyValidators();
+    EncryptionSchemaValidators.destroyValidators();
     XMLToolingException::deregisterFactories();
 
     for (vector<void*>::reverse_iterator i=m_libhandles.rbegin(); i!=m_libhandles.rend(); i++) {
index b6d5fc6..e5eda15 100644 (file)
@@ -149,6 +149,11 @@ namespace xmlencryption {
      * Registers builders and validators for XML Encryption classes into the runtime.
      */
     void XMLTOOL_API registerEncryptionClasses();
+
+    /**
+     * Validator suite for XML Encryption schema validation.
+     */
+    extern XMLTOOL_API xmltooling::ValidatorSuite EncryptionSchemaValidators;
 };
 
 #endif /* __xmltooling_encryption_h__ */
index 90407b8..1abf065 100644 (file)
@@ -111,12 +111,14 @@ namespace xmlencryption {
 #define REGISTER_ELEMENT(namespaceURI,cname) \
     q=QName(namespaceURI,cname::LOCAL_NAME); \
     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
-    Validator::registerValidator(q,new cname##SchemaValidator())
+    EncryptionSchemaValidators.registerValidator(q,new cname##SchemaValidator())
     
 #define REGISTER_TYPE(namespaceURI,cname) \
     q=QName(namespaceURI,cname::TYPE_NAME); \
     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
-    Validator::registerValidator(q,new cname##SchemaValidator())
+    EncryptionSchemaValidators.registerValidator(q,new cname##SchemaValidator())
+
+ValidatorSuite xmlencryption::EncryptionSchemaValidators("EncryptionSchemaValidators");
 
 void xmlencryption::registerEncryptionClasses()
 {
index 0f157e5..8c6bc96 100644 (file)
@@ -29,6 +29,7 @@
 #include <xmltooling/XMLObjectBuilder.h>
 #include <xmltooling/util/XMLConstants.h>
 #include <xmltooling/validation/ValidatingXMLObject.h>
+#include <xmltooling/validation/ValidatorSuite.h>
 
 #define DECL_XMLSIGOBJECTBUILDER(cname) \
     DECL_XMLOBJECTBUILDER(XMLTOOL_API,cname,xmltooling::XMLConstants::XMLSIG_NS,xmltooling::XMLConstants::XMLSIG_PREFIX)
@@ -193,6 +194,11 @@ namespace xmlsignature {
      * Registers builders and validators for KeyInfo classes into the runtime.
      */
     void XMLTOOL_API registerKeyInfoClasses();
+
+    /**
+     * Validator suite for KeyInfo schema validation.
+     */
+    extern XMLTOOL_API xmltooling::ValidatorSuite KeyInfoSchemaValidators;
 };
 
 #endif /* __xmltooling_keyinfo_h__ */
index ec4dbaa..44d6635 100644 (file)
@@ -124,12 +124,14 @@ namespace xmlsignature {
 #define REGISTER_ELEMENT(namespaceURI,cname) \
     q=QName(namespaceURI,cname::LOCAL_NAME); \
     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
-    Validator::registerValidator(q,new cname##SchemaValidator())
+    KeyInfoSchemaValidators.registerValidator(q,new cname##SchemaValidator())
     
 #define REGISTER_TYPE(namespaceURI,cname) \
     q=QName(namespaceURI,cname::TYPE_NAME); \
     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
-    Validator::registerValidator(q,new cname##SchemaValidator())
+    KeyInfoSchemaValidators.registerValidator(q,new cname##SchemaValidator())
+
+ValidatorSuite xmlsignature::KeyInfoSchemaValidators("KeyInfoSchemaValidators");
 
 void xmlsignature::registerKeyInfoClasses()
 {
index 6962bb8..7c8f6d7 100644 (file)
  * Rules checking of XMLObjects \r
  */\r
 \r
-#if !defined(__xmltooling_validator_h__)\r
+#ifndef __xmltooling_validator_h__\r
 #define __xmltooling_validator_h__\r
 \r
-#include <map>\r
-#include <vector>\r
-#include <xmltooling/QName.h>\r
 #include <xmltooling/XMLObject.h>\r
 \r
-#if defined (_MSC_VER)\r
-    #pragma warning( push )\r
-    #pragma warning( disable : 4250 4251 )\r
-#endif\r
-\r
 namespace xmltooling {\r
 \r
     /**\r
@@ -61,52 +53,10 @@ namespace xmltooling {
          */\r
         virtual Validator* clone() const=0;\r
 \r
-        /**\r
-         * Evaluates the registered validators against the given XMLObject and it's children.\r
-         * \r
-         * @param xmlObject the XMLObject tree to validate\r
-         * \r
-         * @throws ValidationException thrown if the element tree is not valid\r
-         */\r
-        static void checkValidity(const XMLObject* xmlObject);\r
-\r
-        /**\r
-         * Registers a new validator for the given key.\r
-         * \r
-         * @param key       the key used to retrieve the validator\r
-         * @param validator the validator\r
-         */\r
-        static void registerValidator(const QName& key, Validator* validator) {\r
-            std::map< QName, std::vector<Validator*> >::iterator i=m_map.find(key);\r
-            if (i==m_map.end())\r
-                m_map.insert(std::make_pair(key,std::vector<Validator*>(1,validator)));\r
-            else\r
-                i->second.push_back(validator);\r
-        }\r
-\r
-        /**\r
-         * Deregisters validators.\r
-         * \r
-         * @param key       the key for the validators to be deregistered\r
-         */\r
-        static void deregisterValidators(const QName& key);\r
-\r
-        /**\r
-         * Unregisters and destroys all registered validators. \r
-         */\r
-        static void destroyValidators();\r
-\r
     protected:\r
         Validator() {}\r
-    \r
-    private:\r
-        static std::map< QName, std::vector<Validator*> > m_map;\r
     };\r
 \r
 };\r
 \r
-#if defined (_MSC_VER)\r
-    #pragma warning( pop )\r
-#endif\r
-\r
 #endif /* __xmltooling_validator_h__ */\r
similarity index 66%
rename from xmltooling/validation/Validator.cpp
rename to xmltooling/validation/ValidatorSuite.cpp
index a39a332..1ff5a29 100644 (file)
  */\r
 \r
 /**\r
- * Validator.cpp\r
+ * ValidatorSuite.cpp\r
  * \r
- * Rules checking of XMLObjects \r
+ * Groups of rule checkers of XMLObjects based on type or element name. \r
  */\r
 \r
 #include "internal.h"\r
-#include "validation/Validator.h"\r
+#include "validation/ValidatorSuite.h"\r
 #include "util/XMLHelper.h"\r
 \r
 using namespace xmltooling;\r
 using namespace std;\r
 \r
-map< QName, vector<Validator*> > Validator::m_map;\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 Validator::checkValidity(const XMLObject* xmlObject)\r
+void ValidatorSuite::validate(const XMLObject* xmlObject) const\r
 {\r
     if (!xmlObject)\r
         return;\r
 \r
-    map< QName, vector<Validator*> >::iterator i;\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
@@ -45,28 +68,6 @@ void Validator::checkValidity(const XMLObject* xmlObject)
         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_each(kids.begin(),kids.end(),Validator::checkValidity);\r
-}\r
-\r
-class _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
-void Validator::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 Validator::destroyValidators()\r
-{\r
-    for_each(m_map.begin(),m_map.end(),_clearvector());\r
-    m_map.clear();\r
+    for (list<XMLObject*>::const_iterator j=kids.begin(); j!=kids.end(); j++)\r
+        validate(*j);\r
 }\r
diff --git a/xmltooling/validation/ValidatorSuite.h b/xmltooling/validation/ValidatorSuite.h
new file mode 100644 (file)
index 0000000..6049966
--- /dev/null
@@ -0,0 +1,115 @@
+/*\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
+ * @file ValidatorSuite.h\r
+ * \r
+ * Groups of rule checkers of XMLObjects based on type or element name. \r
+ */\r
+\r
+#ifndef __xmltooling_valsuite_h__\r
+#define __xmltooling_valsuite_h__\r
+\r
+#include <map>\r
+#include <vector>\r
+#include <xmltooling/QName.h>\r
+#include <xmltooling/validation/Validator.h>\r
+\r
+#if defined (_MSC_VER)\r
+    #pragma warning( push )\r
+    #pragma warning( disable : 4250 4251 )\r
+#endif\r
+\r
+namespace xmltooling {\r
+\r
+    /**\r
+     * A collection of validators that can be applied to an XMLObject and its children. These collections can represent\r
+     * usage specific checks, such as those outlined in schemas or profiles of specific XML specifications.\r
+     * \r
+     * Registered Validators must be stateless and cloneable. Validators are fetched based on schema type and\r
+     * element name, in that order.\r
+     */\r
+    class XMLTOOL_API ValidatorSuite\r
+    {\r
+    MAKE_NONCOPYABLE(ValidatorSuite);\r
+    public:\r
+        /**\r
+         * Creates a new suite.\r
+         * \r
+         * @param id    an identifier for the suite\r
+         */\r
+        ValidatorSuite(const char* id) : m_id(id) {}\r
+        \r
+        ~ValidatorSuite() {\r
+            destroyValidators();\r
+        }\r
+\r
+        /**\r
+         * Gets a unique ID for this suite.\r
+         * \r
+         * @return a unique ID for this suite\r
+         */\r
+        const char* getId() {\r
+            return m_id.c_str();\r
+        }\r
+\r
+        /**\r
+         * Evaluates the registered validators against the given XMLObject and it's children.\r
+         * \r
+         * @param xmlObject the XMLObject tree to validate\r
+         * \r
+         * @throws ValidationException thrown if the element tree is not valid\r
+         */\r
+        void validate(const XMLObject* xmlObject) const;\r
+\r
+        /**\r
+         * Registers a new validator for the given key.\r
+         * \r
+         * @param key       the key used to retrieve the validator\r
+         * @param validator the validator\r
+         */\r
+        void registerValidator(const QName& key, Validator* validator) {\r
+            std::map< QName, std::vector<Validator*> >::iterator i=m_map.find(key);\r
+            if (i==m_map.end())\r
+                m_map.insert(std::make_pair(key,std::vector<Validator*>(1,validator)));\r
+            else\r
+                i->second.push_back(validator);\r
+        }\r
+\r
+        /**\r
+         * Deregisters validators.\r
+         * \r
+         * @param key       the key for the validators to be deregistered\r
+         */\r
+        void deregisterValidators(const QName& key);\r
+\r
+        /**\r
+         * Unregisters and destroys all registered validators. \r
+         */\r
+        void destroyValidators();\r
+\r
+    private:\r
+        std::string m_id;\r
+        std::map< QName, std::vector<Validator*> > m_map;\r
+    };\r
+\r
+};\r
+\r
+#if defined (_MSC_VER)\r
+    #pragma warning( pop )\r
+#endif\r
+\r
+#endif /* __xmltooling_valsuite_h__ */\r
index 34b78c8..0199f6b 100644 (file)
                                        >\r
                                </File>\r
                                <File\r
-                                       RelativePath=".\validation\Validator.cpp"\r
+                                       RelativePath=".\validation\ValidatorSuite.cpp"\r
                                        >\r
                                </File>\r
                        </Filter>\r
                                        RelativePath=".\validation\Validator.h"\r
                                        >\r
                                </File>\r
+                               <File\r
+                                       RelativePath=".\validation\ValidatorSuite.h"\r
+                                       >\r
+                               </File>\r
                        </Filter>\r
                        <Filter\r
                                Name="signature"\r
index cff6670..154f8d0 100644 (file)
@@ -102,7 +102,7 @@ public:
             Decrypter decrypter(new KeyResolver(m_key->clone()));\r
             DOMDocumentFragment* frag = decrypter.decryptData(encData2.get());\r
             XMLHelper::serialize(static_cast<DOMElement*>(frag->getFirstChild()), buf);\r
-            TS_TRACE(buf.c_str());\r
+            //TS_TRACE(buf.c_str());\r
             TS_ASSERT(doc->getDocumentElement()->isEqualNode(frag->getFirstChild()));\r
             frag->release();\r
             doc->release();\r
index 2d2ec97..8672906 100644 (file)
@@ -59,7 +59,7 @@ public:
         TSM_ASSERT_SAME_DATA("KeyName was not expected value",\r
             expected.get(), kiObject->getKeyNames().front()->getName(), XMLString::stringLen(expected.get()));\r
 \r
-        Validator::checkValidity(kiObject.get());\r
+        KeyInfoSchemaValidators.validate(kiObject.get());\r
     }\r
 \r
     void testKeyInfo2() {\r
@@ -84,7 +84,7 @@ public:
         TSM_ASSERT_EQUALS("Number of child elements was not expected value",\r
             2, kiObject->getSPKIDatas().front()->getSPKISexps().size());\r
 \r
-        Validator::checkValidity(kiObject.get());\r
+        KeyInfoSchemaValidators.validate(kiObject.get());\r
     }\r
 \r
     void testKeyInfo3() {\r
@@ -102,6 +102,6 @@ public:
             dynamic_cast<KeyInfo*>(b->buildFromDocument(doc))\r
             );\r
         TS_ASSERT(kiObject.get()!=NULL);\r
-        TS_ASSERT_THROWS(Validator::checkValidity(kiObject.get()),ValidationException);\r
+        TS_ASSERT_THROWS(KeyInfoSchemaValidators.validate(kiObject.get()),ValidationException);\r
     }\r
 };\r