Fixes associated with wildcard test classes.
[shibboleth/cpp-xmltooling.git] / xmltoolingtest / XMLObjectBaseTestCase.h
index 48aa272..9adb659 100644 (file)
@@ -15,7 +15,9 @@
  */\r
 \r
 #include <cxxtest/TestSuite.h>\r
+#include <xmltooling/AbstractAttributeExtensibleXMLObject.h>\r
 #include <xmltooling/AbstractDOMCachingXMLObject.h>\r
+#include <xmltooling/AbstractExtensibleXMLObject.h>\r
 #include <xmltooling/exceptions.h>\r
 #include <xmltooling/XMLObjectBuilder.h>\r
 #include <xmltooling/XMLToolingConfig.h>\r
@@ -37,8 +39,6 @@ extern string data_path;
     #pragma warning( disable : 4250 4251 )\r
 #endif\r
 \r
-class SimpleXMLObjectUnmarshaller;\r
-\r
 class SimpleXMLObject : public AbstractDOMCachingXMLObject\r
 {\r
 public:\r
@@ -87,7 +87,7 @@ private:
 class SimpleXMLObjectBuilder : public XMLObjectBuilder\r
 {\r
 public:\r
-    XMLObject* buildObject() const {\r
+    SimpleXMLObject* buildObject() const {\r
         return new SimpleXMLObject();\r
     }\r
 };\r
@@ -95,7 +95,7 @@ public:
 class SimpleXMLObjectMarshaller : public AbstractXMLObjectMarshaller\r
 {\r
 public:\r
-    SimpleXMLObjectMarshaller() : AbstractXMLObjectMarshaller(SimpleXMLObject::NAMESPACE, SimpleXMLObject::LOCAL_NAME) {}\r
+    SimpleXMLObjectMarshaller() {}\r
 \r
 private:\r
     void marshallAttributes(const XMLObject& xmlObject, DOMElement* domElement) const {\r
@@ -119,7 +119,7 @@ private:
 class SimpleXMLObjectUnmarshaller : public AbstractXMLObjectUnmarshaller\r
 {\r
 public:\r
-    SimpleXMLObjectUnmarshaller() : AbstractXMLObjectUnmarshaller(SimpleXMLObject::NAMESPACE, SimpleXMLObject::LOCAL_NAME) {}\r
+    SimpleXMLObjectUnmarshaller() {}\r
 \r
 private:\r
     void processChildElement(XMLObject& parentXMLObject, XMLObject* childXMLObject) const {\r
@@ -153,6 +153,112 @@ private:
 \r
 };\r
 \r
+class WildcardXMLObjectMarshaller;\r
+\r
+class WildcardXMLObject : public AbstractExtensibleXMLObject, public AbstractAttributeExtensibleXMLObject\r
+{\r
+    friend class WildcardXMLObjectMarshaller;\r
+public:\r
+    WildcardXMLObject(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix)\r
+        : AbstractDOMCachingXMLObject(nsURI, localName, prefix),\r
+        AbstractExtensibleXMLObject(nsURI, localName, prefix),\r
+        AbstractAttributeExtensibleXMLObject(nsURI, localName, prefix) {}\r
+    virtual ~WildcardXMLObject() {}\r
+    \r
+    WildcardXMLObject* clone() const {\r
+        auto_ptr<XMLObject> domClone(AbstractDOMCachingXMLObject::clone());\r
+        WildcardXMLObject* ret=dynamic_cast<WildcardXMLObject*>(domClone.get());\r
+        if (ret) {\r
+            domClone.release();\r
+            return ret;\r
+        }\r
+\r
+        ret=new WildcardXMLObject(\r
+            getElementQName().getNamespaceURI(),getElementQName().getLocalPart(),getElementQName().getPrefix()\r
+            );\r
+        for (map<QName,XMLCh*>::const_iterator i=m_attributeMap.begin(); i!=m_attributeMap.end(); i++) {\r
+            ret->m_attributeMap[i->first]=XMLString::replicate(i->second);\r
+        }\r
+        xmltooling::clone(m_children, ret->m_children);\r
+        return ret;\r
+    }\r
+};\r
+\r
+class WildcardXMLObjectBuilder : public XMLObjectBuilder\r
+{\r
+public:\r
+    XMLObject* buildObject() const {\r
+        throw XMLObjectException("No default builder available.");\r
+    }\r
+\r
+    WildcardXMLObject* buildObject(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix) const {\r
+        return new WildcardXMLObject(nsURI,localName,prefix);\r
+    }\r
+};\r
+\r
+class WildcardXMLObjectMarshaller : public AbstractXMLObjectMarshaller\r
+{\r
+public:\r
+    WildcardXMLObjectMarshaller() : AbstractXMLObjectMarshaller() {}\r
+\r
+private:\r
+    void marshallAttributes(const XMLObject& xmlObject, DOMElement* domElement) const {\r
+        const WildcardXMLObject& wcXMLObject = dynamic_cast<const WildcardXMLObject&>(xmlObject);\r
+\r
+        for (map<QName,XMLCh*>::const_iterator i=wcXMLObject.m_attributeMap.begin(); i!=wcXMLObject.m_attributeMap.end(); i++) {\r
+            DOMAttr* attr=domElement->getOwnerDocument()->createAttributeNS(i->first.getNamespaceURI(),i->first.getLocalPart());\r
+            if (i->first.hasPrefix())\r
+                attr->setPrefix(i->first.getPrefix());\r
+            attr->setNodeValue(i->second);\r
+            domElement->setAttributeNode(attr);\r
+        }\r
+    }\r
+\r
+    void marshallElementContent(const XMLObject& xmlObject, DOMElement* domElement) const {\r
+        const WildcardXMLObject& wcXMLObject = dynamic_cast<const WildcardXMLObject&>(xmlObject);\r
+\r
+        if(wcXMLObject.getTextContent()) {\r
+            domElement->appendChild(domElement->getOwnerDocument()->createTextNode(wcXMLObject.getTextContent()));\r
+        }\r
+    }\r
+};\r
+\r
+class WildcardXMLObjectUnmarshaller : public AbstractXMLObjectUnmarshaller\r
+{\r
+public:\r
+    WildcardXMLObjectUnmarshaller() {}\r
+\r
+private:\r
+    XMLObject* buildXMLObject(const DOMElement* domElement) const {\r
+        const WildcardXMLObjectBuilder* builder =\r
+            dynamic_cast<const WildcardXMLObjectBuilder*>(XMLObjectBuilder::getBuilder(domElement));\r
+        if (builder)\r
+            return builder->buildObject(domElement->getNamespaceURI(),domElement->getLocalName(),domElement->getPrefix());\r
+        throw UnmarshallingException("Failed to locate WildcardObjectBuilder for element.");\r
+    }\r
+\r
+    void processChildElement(XMLObject& parentXMLObject, XMLObject* childXMLObject) const {\r
+        WildcardXMLObject& wcXMLObject = dynamic_cast<WildcardXMLObject&>(parentXMLObject);\r
+\r
+        wcXMLObject.getXMLObjects().push_back(childXMLObject);\r
+    }\r
+\r
+    void processAttribute(XMLObject& xmlObject, const DOMAttr* attribute) const {\r
+        WildcardXMLObject& wcXMLObject = dynamic_cast<WildcardXMLObject&>(xmlObject);\r
+        \r
+        wcXMLObject.setAttribute(\r
+            QName(attribute->getNamespaceURI(),attribute->getLocalName(),attribute->getPrefix()),\r
+            attribute->getNodeValue()\r
+            );\r
+    }\r
+\r
+    void processElementContent(XMLObject& xmlObject, const XMLCh* elementContent) const {\r
+        WildcardXMLObject& wcXMLObject = dynamic_cast<WildcardXMLObject&>(xmlObject);\r
+        \r
+        wcXMLObject.setTextContent(elementContent);\r
+    }\r
+\r
+};\r
 \r
 #if defined (_MSC_VER)\r
     #pragma warning( pop )\r