Added some validation code.
[shibboleth/cpp-xmltooling.git] / xmltooling / signature / impl / KeyInfoImpl.cpp
index 2d73ed8..44dc6ab 100644 (file)
 #include "io/AbstractXMLObjectMarshaller.h"\r
 #include "io/AbstractXMLObjectUnmarshaller.h"\r
 #include "signature/impl/KeyInfoImpl.h"\r
-#include "util/NDC.h"\r
 #include "util/XMLHelper.h"\r
 #include "validation/AbstractValidatingXMLObject.h"\r
 \r
-#include <log4cpp/Category.hh>\r
+#include <typeinfo.h>\r
 \r
 using namespace xmltooling;\r
-using namespace log4cpp;\r
 using namespace std;\r
 \r
 #if defined (_MSC_VER)\r
@@ -43,24 +41,35 @@ using namespace std;
 \r
 namespace xmltooling {\r
     \r
-    class XMLTOOL_DLLLOCAL KeyInfoImpl : public KeyInfo, public AbstractDOMCachingXMLObject, public AbstractElementProxy,\r
-        public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller\r
+    class XMLTOOL_DLLLOCAL KeyInfoImpl\r
+        : public KeyInfo,\r
+            public AbstractDOMCachingXMLObject,\r
+            public AbstractElementProxy,\r
+            public AbstractValidatingXMLObject,\r
+            public AbstractXMLObjectMarshaller,\r
+            public AbstractXMLObjectUnmarshaller\r
     {\r
     public:\r
         virtual ~KeyInfoImpl() {}\r
 \r
         KeyInfoImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)\r
-            : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Id(NULL) {}\r
+            : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Id(NULL) {\r
+        }\r
             \r
-        KeyInfoImpl(const KeyInfoImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src),\r
-            AbstractElementProxy(src), AbstractValidatingXMLObject(src), m_Id(XMLString::replicate(src.m_Id)) {\r
+        KeyInfoImpl(const KeyInfoImpl& src)\r
+            : AbstractXMLObject(src),\r
+                AbstractDOMCachingXMLObject(src),\r
+                AbstractElementProxy(src),\r
+                AbstractValidatingXMLObject(src),\r
+                m_Id(XMLString::replicate(src.m_Id)) {\r
+                    \r
             for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {\r
                 getXMLObjects().push_back((*i) ? (*i)->clone() : NULL);\r
             }\r
         }\r
         \r
-        IMPL_XMLOBJECT_ATTRIB(Id);\r
         IMPL_XMLOBJECT_CLONE(KeyInfo);\r
+        IMPL_XMLOBJECT_ATTRIB(Id);\r
 \r
     protected:\r
         void marshallAttributes(DOMElement* domElement) const {\r
@@ -76,29 +85,108 @@ namespace xmltooling {
             }\r
         }\r
 \r
+        void processElementContent(const XMLCh* elementContent) {\r
+            setTextContent(elementContent);\r
+        }\r
+\r
         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {\r
             getXMLObjects().push_back(childXMLObject);\r
         }\r
 \r
         void processAttribute(const DOMAttr* attribute) {\r
-            if (XMLHelper::isNodeNamed(attribute, NULL, ID_ATTRIB_NAME))\r
+            if (XMLHelper::isNodeNamed(attribute, NULL, ID_ATTRIB_NAME)) {\r
                 setId(attribute->getValue());\r
+                static_cast<DOMElement*>(attribute->getParentNode())->setIdAttributeNode(attribute);\r
+            }\r
         }\r
+    };\r
+    \r
+    class XMLTOOL_DLLLOCAL KeyNameImpl\r
+        : public KeyName,\r
+            public AbstractDOMCachingXMLObject,\r
+            public AbstractValidatingXMLObject,\r
+            public AbstractXMLObjectMarshaller,\r
+            public AbstractXMLObjectUnmarshaller\r
+    {\r
+    public:\r
+        virtual ~KeyNameImpl() {}\r
 \r
-        void processElementContent(const XMLCh* elementContent) {\r
-            setTextContent(elementContent);\r
+        KeyNameImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)\r
+            : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Name(NULL) {\r
         }\r
+            \r
+        KeyNameImpl(const KeyNameImpl& src)\r
+            : AbstractXMLObject(src),\r
+                AbstractDOMCachingXMLObject(src),\r
+                AbstractValidatingXMLObject(src),\r
+                m_Name(XMLString::replicate(src.m_Name)) {\r
+        }\r
+        \r
+        IMPL_XMLOBJECT_CLONE(KeyName);\r
+        IMPL_XMLOBJECT_CONTENT(Name);\r
+    };\r
+\r
+    class XMLTOOL_DLLLOCAL MgmtDataImpl\r
+        : public MgmtData,\r
+            public AbstractDOMCachingXMLObject,\r
+            public AbstractValidatingXMLObject,\r
+            public AbstractXMLObjectMarshaller,\r
+            public AbstractXMLObjectUnmarshaller\r
+    {\r
+    public:\r
+        virtual ~MgmtDataImpl() {}\r
+\r
+        MgmtDataImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)\r
+            : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Data(NULL) {\r
+        }\r
+            \r
+        MgmtDataImpl(const MgmtDataImpl& src)\r
+            : AbstractXMLObject(src),\r
+                AbstractDOMCachingXMLObject(src),\r
+                AbstractValidatingXMLObject(src),\r
+                m_Data(XMLString::replicate(src.m_Data)) {\r
+        }\r
+        \r
+        IMPL_XMLOBJECT_CLONE(MgmtData);\r
+        IMPL_XMLOBJECT_CONTENT(Data);\r
     };\r
-    \r
 };\r
 \r
 #if defined (_MSC_VER)\r
     #pragma warning( pop )\r
 #endif\r
 \r
-KeyInfo* KeyInfoBuilderImpl::buildObject(\r
-    const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType\r
-    ) const\r
+// Builder Implementations\r
+\r
+IMPL_XMLOBJECTBUILDER(KeyInfo);\r
+IMPL_XMLOBJECTBUILDER(KeyName);\r
+IMPL_XMLOBJECTBUILDER(MgmtData);\r
+\r
+// Validators\r
+\r
+void KeyInfoSchemaValidator::validate(const XMLObject* xmlObject) const\r
+{\r
+    const KeyInfo* ptr=dynamic_cast<const KeyInfo*>(xmlObject);\r
+    if (!ptr)\r
+        throw ValidationException("KeyInfoSchemaValidator: unsupported object type ($1)",params(1,typeid(xmlObject).name()));\r
+    if (!ptr->hasChildren())\r
+        throw ValidationException("KeyInfo is empty");\r
+}\r
+\r
+void KeyNameSchemaValidator::validate(const XMLObject* xmlObject) const\r
+{\r
+    const KeyName* ptr=dynamic_cast<const KeyName*>(xmlObject);\r
+    if (!ptr)\r
+        throw ValidationException("KeyNameSchemaValidator: unsupported object type ($1)",params(1,typeid(xmlObject).name()));\r
+    if (XMLString::stringLen(ptr->getName())==0)\r
+        throw ValidationException("KeyName is empty");\r
+}\r
+\r
+void MgmtDataSchemaValidator::validate(const XMLObject* xmlObject) const\r
 {\r
-    return new KeyInfoImpl(nsURI,localName,prefix,schemaType);\r
+    const MgmtData* ptr=dynamic_cast<const MgmtData*>(xmlObject);\r
+    if (!ptr)\r
+        throw ValidationException("MgmtDataSchemaValidator: unsupported object type ($1)",params(1,typeid(xmlObject).name()));\r
+    if (XMLString::stringLen(ptr->getData())==0)\r
+        throw ValidationException("MgmtData is empty");\r
 }\r