Revised builder API
authorcantor <cantor@de75baf8-a10c-0410-a50a-987c0e22f00f>
Sun, 26 Mar 2006 23:13:32 +0000 (23:13 +0000)
committercantor <cantor@de75baf8-a10c-0410-a50a-987c0e22f00f>
Sun, 26 Mar 2006 23:13:32 +0000 (23:13 +0000)
git-svn-id: https://svn.middleware.georgetown.edu/cpp-xmltooling/trunk@59 de75baf8-a10c-0410-a50a-987c0e22f00f

xmltooling/XMLObjectBuilder.h
xmltooling/exceptions.h
xmltooling/impl/AnyElement.cpp
xmltooling/impl/AnyElement.h
xmltooling/impl/UnknownElement.h
xmltooling/signature/Signature.h
xmltooling/signature/impl/XMLSecSignature.h

index 0b05e46..f78ae6d 100644 (file)
@@ -46,6 +46,7 @@ namespace xmltooling {
         
         /**
          * Creates an empty XMLObject with a particular element name.
+         * The results are undefined if elementLocalName is NULL or empty.
          * 
          * @param namespaceURI          namespace URI for element
          * @param elementLocalName      local name of element
@@ -57,21 +58,12 @@ namespace xmltooling {
             ) 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,7 +74,7 @@ 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 {
+        XMLObject* buildFromElement(DOMElement* element, bool bindDocument=false) const {
             std::auto_ptr<XMLObject> ret(buildObject(element->getNamespaceURI(),element->getLocalName(),element->getPrefix()));
             ret->unmarshall(element,bindDocument);
             return ret.release();
@@ -95,22 +87,22 @@ 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
+         * @param key   the element 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();
+                return b->buildFromQName(key);
             b=getDefaultBuilder();
-            return b ? b->buildObject() : NULL;
+            return b ? b->buildFromQName(key) : NULL;
         }
 
         /**
index 39ee359..4d343e5 100644 (file)
  */\r
 #define REGISTER_EXCEPTION_FACTORY(name) XMLToolingException::registerFactory("xmltooling::"#name,name##Factory)\r
 \r
+#if defined (_MSC_VER)\r
+    #pragma warning( push )\r
+    #pragma warning( disable : 4250 4251 )\r
+#endif\r
+\r
 namespace xmltooling {\r
     \r
     /**\r
@@ -332,4 +337,8 @@ namespace xmltooling {
 \r
 };\r
 \r
+#if defined (_MSC_VER)\r
+    #pragma warning( pop )\r
+#endif\r
+\r
 #endif /* __xmltooling_exceptions_h__ */\r
index 132e49a..a467741 100644 (file)
@@ -115,7 +115,5 @@ namespace xmltooling {
 XMLObject* AnyElementBuilder::buildObject(
     const XMLCh* namespaceURI, const XMLCh* elementLocalName, const XMLCh* namespacePrefix
     ) const {
-    if (XMLString::stringLen(elementLocalName)==0)
-        throw XMLObjectException("Constructing this object requires an element name.");
     return new AnyElementImpl(namespaceURI,elementLocalName,namespacePrefix);
 }
index 803de11..8fd619f 100644 (file)
@@ -38,6 +38,9 @@ namespace xmltooling {
     class XMLTOOL_API AnyElementBuilder : public XMLObjectBuilder
     {
     public:
+        /**
+         * @see XMLObjectBuilder::buildObject(const XMLCh*,const XMLCh*,const XMLCh*)
+         */
         XMLObject* buildObject(
             const XMLCh* namespaceURI, const XMLCh* elementLocalName, const XMLCh* namespacePrefix=NULL
             ) const;
index 3b4862d..0ad445d 100644 (file)
@@ -23,6 +23,7 @@
 #if !defined(__xmltooling_unkelement_h__)\r
 #define __xmltooling_unkelement_h__\r
 \r
+#include <xmltooling/exceptions.h>\r
 #include <xmltooling/XMLObjectBuilder.h>\r
 #include <xmltooling/io/AbstractXMLObjectMarshaller.h>\r
 #include <xmltooling/io/AbstractXMLObjectUnmarshaller.h>\r
@@ -68,11 +69,14 @@ namespace xmltooling {
     };\r
 \r
     /**\r
-     * Factory for UnknownElementImpl objects.\r
+     * Builder for UnknownElementImpl objects.\r
      */\r
     class XMLTOOL_API UnknownElementBuilder : public XMLObjectBuilder\r
     {\r
     public:\r
+        /**\r
+         * @see XMLObjectBuilder::buildObject(const XMLCh*,const XMLCh*,const XMLCh*)\r
+         */\r
         UnknownElementImpl* buildObject(\r
             const XMLCh* namespaceURI, const XMLCh* elementLocalName, const XMLCh* namespacePrefix=NULL\r
             ) const {\r
index c1031da..1794722 100644 (file)
@@ -23,7 +23,7 @@
 #if !defined(__xmltooling_sig_h__) && !defined(XMLTOOLING_NO_XMLSEC)\r
 #define __xmltooling_sig_h__\r
 \r
-#include <xmltooling/XMLObject.h>\r
+#include <xmltooling/XMLObjectBuilder.h>\r
 #include <xmltooling/signature/SigningContext.h>\r
 #include <xmltooling/signature/VerifyingContext.h>\r
 \r
@@ -79,6 +79,19 @@ namespace xmltooling {
         Signature() {}\r
     };\r
 \r
+    /**\r
+     * Builder for Signature objects.\r
+     */\r
+    class XMLTOOL_API SignatureBuilder : public XMLObjectBuilder\r
+    {\r
+    public:\r
+        virtual ~SignatureBuilder() {}\r
+\r
+        /**\r
+         * Default typed builder method.\r
+         */\r
+        virtual Signature* buildObject() const=0;\r
+    };\r
 };\r
 \r
 #endif /* __xmltooling_sig_h__ */\r
index e22421c..276bbab 100644 (file)
@@ -74,6 +74,12 @@ namespace xmltooling {
         XMLSecSignatureImpl* buildObject(\r
             const XMLCh* namespaceURI, const XMLCh* elementLocalName, const XMLCh* namespacePrefix=NULL\r
             ) const {\r
+            if (!XMLString::equals(namespaceURI,XMLConstants::XMLSIG_NS) || !XMLString::equals(elementLocalName, Signature::LOCAL_NAME))\r
+                throw XMLObjectException("XMLSecSignatureBuilder requires standard Signature element name.");\r
+            return buildObject();\r
+        }\r
+        \r
+        XMLSecSignatureImpl* buildObject() const {\r
             return new XMLSecSignatureImpl();\r
         }\r
     };\r