Handle variant element names, merge in wildcard class, add test cases.
[shibboleth/xmltooling.git] / xmltooling / AbstractXMLObject.h
index 12d8408..d5ebc71 100644 (file)
@@ -38,9 +38,7 @@ namespace xmltooling {
     class XMLTOOL_API AbstractXMLObject : public virtual XMLObject\r
     {\r
     public:\r
-        virtual ~AbstractXMLObject() {\r
-            delete m_typeQname;\r
-        }\r
+        virtual ~AbstractXMLObject();\r
 \r
         /**\r
          * @see XMLObject::getElementQName()\r
@@ -54,6 +52,7 @@ namespace xmltooling {
          */\r
         void setElementNamespacePrefix(const XMLCh* prefix) {\r
             m_elementQname.setPrefix(prefix);\r
+            addNamespace(Namespace(m_elementQname.getNamespaceURI(),prefix));\r
         }\r
 \r
         /**\r
@@ -66,7 +65,7 @@ namespace xmltooling {
         /**\r
          * @see XMLObject::addNamespace()\r
          */\r
-        void addNamespace(const Namespace& ns) {\r
+        void addNamespace(const Namespace& ns) const {\r
             if (ns.alwaysDeclare() || m_namespaces.find(ns)==m_namespaces.end()) {\r
                 m_namespaces.insert(ns);\r
             }\r
@@ -118,26 +117,51 @@ namespace xmltooling {
         void setParent(XMLObject* parent) {\r
             m_parent = parent;\r
         }\r
-    \r
-     protected:\r
-         AbstractXMLObject() : m_typeQname(NULL), m_parent(NULL) {}\r
 \r
         /**\r
+         * @see XMLObject::hasChildren()\r
+         */\r
+        bool hasChildren() const {\r
+            return !m_children.empty();\r
+        }\r
+\r
+        /**\r
+         * @see XMLObject::getOrderedChildren()\r
+         */\r
+        const std::list<XMLObject*>& getOrderedChildren() const {\r
+            return m_children;\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
-        AbstractXMLObject(const XMLCh* namespaceURI, const XMLCh* elementLocalName, const XMLCh* namespacePrefix)\r
-            : m_elementQname(namespaceURI,elementLocalName, namespacePrefix), m_typeQname(NULL), m_parent(NULL) {\r
-            addNamespace(Namespace(namespaceURI, namespacePrefix));\r
-        }\r
-        \r
+        AbstractXMLObject(const XMLCh* namespaceURI=NULL, const XMLCh* elementLocalName=NULL, const XMLCh* namespacePrefix=NULL);\r
+\r
+        /**\r
+         * Underlying list of child objects.\r
+         * Manages the lifetime of the children.\r
+         */\r
+        std::list<XMLObject*> m_children;\r
+\r
+        /**\r
+         * Set of namespaces associated with the object.\r
+         */\r
+        mutable std::set<Namespace> m_namespaces;\r
+\r
+        /**\r
+         * Logging object.\r
+         */\r
+        void* m_log;\r
+\r
     private:\r
         XMLObject* m_parent;\r
         QName m_elementQname;\r
         QName* m_typeQname;\r
-        std::set<Namespace> m_namespaces;\r
     };\r
 \r
 };\r