Refactored simple content and child-handling into mixin classes.
[shibboleth/cpp-xmltooling.git] / xmltooling / XMLObjectBuilder.h
index 0b05e46..0a3d6bb 100644 (file)
@@ -26,6 +26,7 @@
 #include <map>
 #include <xmltooling/QName.h>
 #include <xmltooling/XMLObject.h>
+#include <xmltooling/util/XMLHelper.h>
 
 #if defined (_MSC_VER)
     #pragma warning( push )
@@ -46,32 +47,25 @@ namespace xmltooling {
         
         /**
          * Creates an empty XMLObject with a particular element name.
+         * The results are undefined if localName is NULL or empty.
          * 
-         * @param namespaceURI          namespace URI for element
-         * @param elementLocalName      local name of element
-         * @param namespacePrefix       prefix of element name
+         * @param nsURI         namespace URI for element
+         * @param localName     local name of element
+         * @param prefix        prefix of element name
+         * @param schemaType    xsi:type of the object
          * @return the empty XMLObject
          */
         virtual XMLObject* buildObject(
-            const XMLCh* namespaceURI, const XMLCh* elementLocalName, const XMLCh* namespacePrefix=NULL
+            const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const QName* schemaType=NULL
             ) const=0;
 
         /**
-         * Creates an empty XMLObject with a defaulted element name.
-         * 
-         * @return the empty XMLObject
-         */
-        virtual XMLObject* buildObject() const {
-            return buildObject(NULL,NULL,NULL);
-        }
-
-        /**
          * Creates an empty XMLObject with a particular element name.
          * 
          * @param q     QName of element for object
          * @return the empty XMLObject
          */
-        virtual XMLObject* buildObject(const QName& q) const {
+        XMLObject* buildFromQName(const QName& q) const {
             return buildObject(q.getNamespaceURI(),q.getLocalPart(),q.getPrefix());
         }
 
@@ -82,8 +76,10 @@ namespace xmltooling {
          * @param bindDocument  true iff the XMLObject should take ownership of the DOM Document
          * @return the unmarshalled XMLObject
          */
-        virtual XMLObject* buildFromElement(DOMElement* element, bool bindDocument=false) const {
-            std::auto_ptr<XMLObject> ret(buildObject(element->getNamespaceURI(),element->getLocalName(),element->getPrefix()));
+        XMLObject* buildFromElement(DOMElement* element, bool bindDocument=false) const {
+            std::auto_ptr<XMLObject> ret(
+                buildObject(element->getNamespaceURI(),element->getLocalName(),element->getPrefix(),XMLHelper::getXSIType(element))
+                );
             ret->unmarshall(element,bindDocument);
             return ret.release();
         }
@@ -95,25 +91,11 @@ namespace xmltooling {
          * @param bindDocument  true iff the XMLObject should take ownership of the DOM Document
          * @return the unmarshalled XMLObject
          */
-        virtual XMLObject* buildFromDocument(DOMDocument* doc, bool bindDocument=true) const {
+        XMLObject* buildFromDocument(DOMDocument* doc, bool bindDocument=true) const {
             return buildFromElement(doc->getDocumentElement(),bindDocument);
         }
 
         /**
-         * Creates an empty XMLObject using the default build method, if a builder can be found.
-         * 
-         * @param key   the key used to locate a builder
-         * @return  the empty object or NULL if no builder is available 
-         */
-        static XMLObject* buildOne(const QName& key) {
-            const XMLObjectBuilder* b=getBuilder(key);
-            if (b)
-                return b->buildObject();
-            b=getDefaultBuilder();
-            return b ? b->buildObject() : NULL;
-        }
-
-        /**
          * Creates an unmarshalled XMLObject using the default build method, if a builder can be found.
          * 
          * @param element       the unmarshalling source