Added built-in ID attribute support to base classes.
[shibboleth/cpp-xmltooling.git] / xmltooling / AbstractAttributeExtensibleXMLObject.h
index e5f716f..e2e65ea 100644 (file)
 /**\r
  * @file AbstractAttributeExtensibleXMLObject.h\r
  * \r
- * An abstract implementation of a DOM-caching AttributeExtensibleXMLObject \r
+ * AbstractXMLObject mixin that implements AttributeExtensibleXMLObject\r
  */\r
 \r
-#if !defined(__xmltooling_absattrextxmlobj_h__)\r
+#ifndef __xmltooling_absattrextxmlobj_h__\r
 #define __xmltooling_absattrextxmlobj_h__\r
 \r
 #include <map>\r
-#include <xmltooling/AbstractDOMCachingXMLObject.h>\r
+#include <xmltooling/AbstractXMLObject.h>\r
 #include <xmltooling/AttributeExtensibleXMLObject.h>\r
 \r
-using namespace xercesc;\r
-\r
 #if defined (_MSC_VER)\r
     #pragma warning( push )\r
     #pragma warning( disable : 4250 4251 )\r
@@ -37,39 +35,43 @@ using namespace xercesc;
 namespace xmltooling {\r
 \r
     /**\r
-     * An abstract implementation of a DOM-caching AttributeExtensibleXMLObject.\r
+     * AbstractXMLObject mixin that implements AttributeExtensibleXMLObject.\r
+     * Inherit from this class to add support for attribute wildcarding.\r
      */\r
-    class XMLTOOL_API AbstractAttributeExtensibleXMLObject : public virtual AttributeExtensibleXMLObject, public virtual AbstractDOMCachingXMLObject\r
+    class XMLTOOL_API AbstractAttributeExtensibleXMLObject\r
+        : public virtual AttributeExtensibleXMLObject, public virtual AbstractXMLObject\r
     {\r
     public:\r
         virtual ~AbstractAttributeExtensibleXMLObject();\r
         \r
-        /**\r
-         * @see AttributeExtensibleXMLObject::getAttribute()\r
-         */\r
-        virtual const XMLCh* getAttribute(QName& qualifiedName) const {\r
+        const XMLCh* getAttribute(const QName& qualifiedName) const {\r
             std::map<QName,XMLCh*>::const_iterator i=m_attributeMap.find(qualifiedName);\r
             return (i==m_attributeMap.end()) ? NULL : i->second;\r
         }\r
         \r
-        /**\r
-         * @see AttributeExtensibleXMLObject::setAttribute()\r
-         */\r
-        virtual void setAttribute(QName& qualifiedName, const XMLCh* value);\r
+        void setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID=false);\r
+    \r
+        const std::map<QName,XMLCh*>& getExtensionAttributes() const {\r
+            return m_attributeMap;\r
+        }\r
+        \r
+        const XMLCh* getXMLID() const {\r
+            return (m_idAttribute == m_attributeMap.end()) ? NULL : m_idAttribute->second;\r
+        }\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
+            m_idAttribute = m_attributeMap.end();\r
+        }\r
 \r
+        /** Copy constructor. */\r
+        AbstractAttributeExtensibleXMLObject(const AbstractAttributeExtensibleXMLObject& src);\r
+\r
+        /** Map of arbitrary attributes. */\r
         std::map<QName,XMLCh*> m_attributeMap;\r
+        \r
+        /** Points to the last attribute designated as an XML ID. */\r
+        std::map<QName,XMLCh*>::const_iterator m_idAttribute;\r
     };\r
     \r
 };\r