Add per-object validation.
authorScott Cantor <cantor.2@osu.edu>
Fri, 24 Mar 2006 20:26:17 +0000 (20:26 +0000)
committerScott Cantor <cantor.2@osu.edu>
Fri, 24 Mar 2006 20:26:17 +0000 (20:26 +0000)
13 files changed:
configure.ac
xmltooling/AbstractAttributeExtensibleXMLObject.h
xmltooling/AbstractDOMCachingXMLObject.h
xmltooling/AbstractElementProxy.h
xmltooling/Makefile.am
xmltooling/impl/AnyElement.cpp
xmltooling/impl/UnknownElement.h
xmltooling/validation/AbstractValidatingXMLObject.cpp [new file with mode: 0644]
xmltooling/validation/AbstractValidatingXMLObject.h [new file with mode: 0644]
xmltooling/validation/ValidatingXMLObject.h [new file with mode: 0644]
xmltooling/validation/Validator.h
xmltooling/xmltooling.vcproj
xmltoolingtest/XMLObjectBaseTestCase.h

index 0ee3202..7a2676a 100644 (file)
@@ -11,11 +11,11 @@ AC_ARG_ENABLE(debug,
     enable_debug=$enableval, enable_debug=no)
 
 if test "$enable_debug" = "yes" ; then
-    GCC_CFLAGS="$CFLAGS -g -D_DEBUG"
-    GCC_CXXFLAGS="$CXXFLAGS -g -D_DEBUG"
+    GCC_CFLAGS="$CFLAGS -Wall -g -D_DEBUG"
+    GCC_CXXFLAGS="$CXXFLAGS -Wall -g -D_DEBUG"
 else
-    GCC_CFLAGS="$CFLAGS -O2 -DNDEBUG"
-    GCC_CXXFLAGS="$CXXFLAGS -O2 -DNDEBUG"
+    GCC_CFLAGS="$CFLAGS -Wall -O2 -DNDEBUG"
+    GCC_CXXFLAGS="$CXXFLAGS -Wall -O2 -DNDEBUG"
 fi
 
 AC_PROG_CC([gcc gcc3 cc])
@@ -215,5 +215,7 @@ AC_SUBST(CXXTEST)
 AC_SUBST(CXXTESTFLAGS)
 AM_CONDITIONAL(BUILD_UNITTEST,test -f ${CXXTEST})
 
+LIBTOOL="$LIBTOOL --silent"
+
 # output makefiles
 AC_OUTPUT(Makefile xmltooling/Makefile xmltoolingtest/Makefile schemas/Makefile)
index 458204c..e474ff8 100644 (file)
@@ -56,16 +56,7 @@ namespace xmltooling {
         virtual void setAttribute(QName& qualifiedName, const XMLCh* value);\r
     \r
      protected:\r
-        /**\r
-         * Constructor\r
-         * \r
-         * @param namespaceURI the namespace the element is in\r
-         * @param elementLocalName the local name of the XML element this Object represents\r
-         * @param namespacePrefix the namespace prefix to use\r
-         */\r
-        AbstractAttributeExtensibleXMLObject(\r
-            const XMLCh* namespaceURI=NULL, const XMLCh* elementLocalName=NULL, const XMLCh* namespacePrefix=NULL\r
-            ) : AbstractDOMCachingXMLObject(namespaceURI,elementLocalName, namespacePrefix) {}\r
+        AbstractAttributeExtensibleXMLObject() {}\r
 \r
         std::map<QName,XMLCh*> m_attributeMap;\r
     };\r
index 70f7890..edfc1bf 100644 (file)
@@ -35,9 +35,8 @@ namespace xmltooling {
 \r
     /**\r
      * Extension of AbstractXMLObject that implements a DOMCachingXMLObject.\r
-     * This is the primary base class for XMLObject implementation classes to use.\r
      */\r
-    class XMLTOOL_API AbstractDOMCachingXMLObject : public AbstractXMLObject, public virtual DOMCachingXMLObject\r
+    class XMLTOOL_API AbstractDOMCachingXMLObject : public virtual AbstractXMLObject, public virtual DOMCachingXMLObject\r
     {\r
     public:\r
         virtual ~AbstractDOMCachingXMLObject();\r
@@ -104,16 +103,7 @@ namespace xmltooling {
         XMLObject* clone() const;\r
 \r
      protected:\r
-        /**\r
-         * Constructor\r
-         * \r
-         * @param namespaceURI the namespace the element is in\r
-         * @param elementLocalName the local name of the XML element this Object represents\r
-         * @param namespacePrefix the namespace prefix to use\r
-         */\r
-        AbstractDOMCachingXMLObject(\r
-            const XMLCh* namespaceURI=NULL, const XMLCh* elementLocalName=NULL, const XMLCh* namespacePrefix=NULL\r
-            ) : AbstractXMLObject(namespaceURI,elementLocalName, namespacePrefix), m_dom(NULL), m_document(NULL) {}\r
+        AbstractDOMCachingXMLObject() : m_dom(NULL), m_document(NULL) {}\r
 \r
         /**\r
          * If a DOM representation exists, this clones it into a new document.\r
index 14ea000..a00b9df 100644 (file)
@@ -60,16 +60,7 @@ namespace xmltooling {
         virtual ListOf(XMLObject) getXMLObjects();\r
     \r
      protected:\r
-        /**\r
-         * Constructor\r
-         * \r
-         * @param namespaceURI the namespace the element is in\r
-         * @param elementLocalName the local name of the XML element this Object represents\r
-         * @param namespacePrefix the namespace prefix to use\r
-         */\r
-        AbstractElementProxy(\r
-            const XMLCh* namespaceURI=NULL, const XMLCh* elementLocalName=NULL, const XMLCh* namespacePrefix=NULL\r
-            ) : AbstractDOMCachingXMLObject(namespaceURI,elementLocalName, namespacePrefix), m_value(NULL) {}\r
+        AbstractElementProxy() : m_value(NULL) {}\r
 \r
     private:\r
         XMLCh* m_value;\r
index bd9a7fd..ab0661b 100644 (file)
@@ -16,6 +16,7 @@ libxmltoolinginclude_HEADERS = \
     AbstractAttributeExtensibleXMLObject.h \
     AbstractDOMCachingXMLObject.h \
     AbstractElementProxy.h \
+    AbstractValidatingXMLObject.h \
     AbstractXMLObject.h \
     AttributeExtensibleXMLObject.h \
     base.h \
@@ -27,6 +28,7 @@ libxmltoolinginclude_HEADERS = \
     Namespace.h \
     QName.h \
     unicode.h \
+    ValidatingXMLObject.h \
     version.h \
     XMLObject.h \
     XMLObjectBuilder.h \
@@ -83,6 +85,7 @@ libxmltooling_la_SOURCES = \
     util/ParserPool.cpp \
     util/XMLConstants.cpp \
     util/XMLHelper.cpp \
+    validation/AbstractValidatingXMLObject.cpp \
     validation/Validator.cpp \
     ${xmlsec_sources}
 
index fea0081..132e49a 100644 (file)
@@ -52,9 +52,7 @@ namespace xmltooling {
     {
     public:
         AnyElementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix)
-            : AbstractDOMCachingXMLObject(nsURI, localName, prefix),
-            AbstractElementProxy(nsURI, localName, prefix),
-            AbstractAttributeExtensibleXMLObject(nsURI, localName, prefix) {}
+            : AbstractXMLObject(nsURI, localName, prefix) {}
         virtual ~AnyElementImpl() {}
         
         AnyElementImpl* clone() const {
index d13f22c..3b4862d 100644 (file)
@@ -43,7 +43,7 @@ namespace xmltooling {
     {\r
     public:\r
         UnknownElementImpl(const XMLCh* namespaceURI=NULL, const XMLCh* elementLocalName=NULL, const XMLCh* namespacePrefix=NULL)\r
-            : AbstractDOMCachingXMLObject(namespaceURI, elementLocalName, namespacePrefix) {}\r
+            : AbstractXMLObject(namespaceURI, elementLocalName, namespacePrefix) {}\r
     \r
         void releaseDOM();\r
 \r
diff --git a/xmltooling/validation/AbstractValidatingXMLObject.cpp b/xmltooling/validation/AbstractValidatingXMLObject.cpp
new file mode 100644 (file)
index 0000000..78f5cbb
--- /dev/null
@@ -0,0 +1,83 @@
+/*\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()\r
+{\r
+    delete m_validators;\r
+}\r
+\r
+void AbstractValidatingXMLObject::registerValidator(Validator* validator) const\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) const\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
+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
+        for_each(m_children.begin(),m_children.end(),bind2nd(_validate(),validateDescendants));\r
+    }\r
+}\r
diff --git a/xmltooling/validation/AbstractValidatingXMLObject.h b/xmltooling/validation/AbstractValidatingXMLObject.h
new file mode 100644 (file)
index 0000000..2e8d27b
--- /dev/null
@@ -0,0 +1,77 @@
+/*\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 AbstractValidatingXMLObject.h\r
+ * \r
+ * Extension of AbstractXMLObject that implements a ValidatingXMLObject. \r
+ */\r
+\r
+#if !defined(__xmltooling_abstractvalxmlobj_h__)\r
+#define __xmltooling_abstractvalxmlobj_h__\r
+\r
+#include <xmltooling/AbstractXMLObject.h>\r
+#include <xmltooling/validation/ValidatingXMLObject.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
+     * Extension of AbstractXMLObject that implements a ValidatingXMLObject.\r
+     */\r
+    class XMLTOOL_API AbstractValidatingXMLObject : public virtual AbstractXMLObject, public virtual ValidatingXMLObject\r
+    {\r
+    public:\r
+        virtual ~AbstractValidatingXMLObject();\r
+        \r
+        /**\r
+         * @see ValidatingXMLObject::registerValidator()\r
+         */\r
+        void registerValidator(Validator* validator) const;\r
+        \r
+        /**\r
+         * @see ValidatingXMLObject::deregisterValidator()\r
+         */\r
+        void deregisterValidator(Validator* validator) const;\r
+        \r
+        /**\r
+         * @see ValidatingXMLObject::validate()\r
+         */\r
+        void validate(bool validateDescendants) const;\r
+\r
+    protected:\r
+        AbstractValidatingXMLObject() : m_validators(NULL) {}\r
+\r
+    private:\r
+        struct XMLTOOL_DLLLOCAL ValidatorWrapper {\r
+            ~ValidatorWrapper(); \r
+            std::vector<Validator*> v;\r
+        };\r
+    \r
+        mutable ValidatorWrapper* m_validators;\r
+    };\r
+    \r
+};\r
+\r
+#if defined (_MSC_VER)\r
+    #pragma warning( pop )\r
+#endif\r
+\r
+#endif /* __xmltooling_abstractvalxmlobj_h__ */\r
diff --git a/xmltooling/validation/ValidatingXMLObject.h b/xmltooling/validation/ValidatingXMLObject.h
new file mode 100644 (file)
index 0000000..07d4a0e
--- /dev/null
@@ -0,0 +1,80 @@
+/*\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 ValidatingXMLObject.h\r
+ * \r
+ * An XMLObject that can evaluate per-object validation rules.  \r
+ */\r
+\r
+#if !defined(__xmltooling_valxmlobj_h__)\r
+#define __xmltooling_valxmlobj_h__\r
+\r
+#include <vector>\r
+#include <xmltooling/XMLObject.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 functional interface for XMLObjects that offer the ability\r
+     * to evaluate validation rules defined per-object.\r
+     */\r
+    class XMLTOOL_API ValidatingXMLObject : public virtual XMLObject\r
+    {\r
+    protected:\r
+        ValidatingXMLObject() {}\r
+    \r
+    public:\r
+        virtual ~ValidatingXMLObject() {}\r
+        \r
+        /**\r
+         * Registers a validator for this XMLObject.\r
+         * \r
+         * @param validator the validator\r
+         */\r
+        virtual void registerValidator(Validator* validator) const=0;\r
+        \r
+        /**\r
+         * Deregisters a validator for this XMLObject.\r
+         * \r
+         * @param validator the validator\r
+         */\r
+        virtual void deregisterValidator(Validator* validator) const=0;\r
+        \r
+        /**\r
+         * Validates this XMLObject against all registered validators.\r
+         * \r
+         * @param validateDescendants true if all the descendants of this object should \r
+         * be validated as well, false if not\r
+         * \r
+         * @throws ValidationException thrown if the object is not valid\r
+         */\r
+        virtual void validate(bool validateDescendants) const=0;\r
+    };\r
+    \r
+};\r
+\r
+#if defined (_MSC_VER)\r
+    #pragma warning( pop )\r
+#endif\r
+\r
+#endif /* __xmltooling_valxmlobj_h__ */\r
index 7119883..0734030 100644 (file)
@@ -28,8 +28,6 @@
 #include <xmltooling/QName.h>\r
 #include <xmltooling/XMLObject.h>\r
 \r
-using namespace xercesc;\r
-\r
 #if defined (_MSC_VER)\r
     #pragma warning( push )\r
     #pragma warning( disable : 4250 4251 )\r
index 5fc189b..5c94f40 100644 (file)
                                Name="validation"\r
                                >\r
                                <File\r
+                                       RelativePath=".\validation\AbstractValidatingXMLObject.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
                                        RelativePath=".\validation\Validator.cpp"\r
                                        >\r
                                </File>\r
                                Name="validation"\r
                                >\r
                                <File\r
+                                       RelativePath=".\validation\AbstractValidatingXMLObject.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath=".\validation\ValidatingXMLObject.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
                                        RelativePath=".\validation\Validator.h"\r
                                        >\r
                                </File>\r
index e9cface..f59c1a3 100644 (file)
@@ -55,7 +55,7 @@ public:
 
     SimpleXMLObject(
         const XMLCh* namespaceURI=NULL, const XMLCh* elementLocalName=NULL, const XMLCh* namespacePrefix=NULL
-        ) : AbstractDOMCachingXMLObject(namespaceURI, elementLocalName, namespacePrefix), m_id(NULL), m_value(NULL) {
+        ) : AbstractXMLObject(namespaceURI, elementLocalName, namespacePrefix), m_id(NULL), m_value(NULL) {
 #ifndef XMLTOOLING_NO_XMLSEC
         m_children.push_back(NULL);
         m_signature=m_children.begin();