X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltooling%2Fbase.h;h=7e7eefaa7e87cbc244b1abfd9e6902d47f10d2c6;hb=c47d9a28b514e071b6fbb1dfce4b5f258d26a67f;hp=d2060cb6d0eb98af3c864223fcd9fab1007065f5;hpb=c162396a9f005de0648b6e6598ff90b4d641deb1;p=shibboleth%2Fcpp-xmltooling.git diff --git a/xmltooling/base.h b/xmltooling/base.h index d2060cb..7e7eefa 100644 --- a/xmltooling/base.h +++ b/xmltooling/base.h @@ -30,11 +30,6 @@ #include #endif -/** - * @namespace xmltooling - * Public namespace of XML Tooling library - */ - // Windows and GCC4 Symbol Visibility Macros #ifdef WIN32 #define XMLTOOL_IMPORT __declspec(dllimport) @@ -70,8 +65,10 @@ #define XMLTOOL_EXCEPTIONAPI(api) #endif -#ifndef NULL -#define NULL 0 +#ifdef _MSC_VER + #define XMLTOOLING_DOXYGEN(desc) /##** desc */ +#else + #define XMLTOOLING_DOXYGEN(desc) #endif /** @@ -82,25 +79,103 @@ type(const type&); \ type& operator=(const type&); +#ifndef DOXYGEN_SKIP +#ifndef NULL +#define NULL 0 +#endif +#define UNICODE_LITERAL_1(a) {chLatin_##a, chNull} +#define UNICODE_LITERAL_2(a,b) {chLatin_##a, chLatin_##b, chNull} +#define UNICODE_LITERAL_3(a,b,c) {chLatin_##a, chLatin_##b, chLatin_##c, chNull} +#define UNICODE_LITERAL_4(a,b,c,d) {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chNull} +#define UNICODE_LITERAL_5(a,b,c,d,e) {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chNull} +#define UNICODE_LITERAL_6(a,b,c,d,e,f) {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chNull} +#define UNICODE_LITERAL_7(a,b,c,d,e,f,g) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chNull} +#define UNICODE_LITERAL_8(a,b,c,d,e,f,g,h) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chNull} +#define UNICODE_LITERAL_9(a,b,c,d,e,f,g,h,i) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, chNull} +#define UNICODE_LITERAL_10(a,b,c,d,e,f,g,h,i,j) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chNull} +#define UNICODE_LITERAL_11(a,b,c,d,e,f,g,h,i,j,k) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chNull} +#define UNICODE_LITERAL_12(a,b,c,d,e,f,g,h,i,j,k,l) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chNull} +#define UNICODE_LITERAL_13(a,b,c,d,e,f,g,h,i,j,k,l,m) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chNull} +#define UNICODE_LITERAL_14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chNull} +#define UNICODE_LITERAL_15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chNull} +#define UNICODE_LITERAL_16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chNull} +#define UNICODE_LITERAL_17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chNull} +#define UNICODE_LITERAL_18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, chNull} +#define UNICODE_LITERAL_19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chNull} +#define UNICODE_LITERAL_20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chNull} +#define UNICODE_LITERAL_21(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chNull} +#define UNICODE_LITERAL_22(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chNull} +#define UNICODE_LITERAL_23(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chLatin_##w, chNull} +#define UNICODE_LITERAL_24(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chLatin_##w, chLatin_##x, chNull} +#define UNICODE_LITERAL_25(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chLatin_##w, chLatin_##x, chLatin_##y, chNull} +#define UNICODE_LITERAL_26(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) \ + {chLatin_##a, chLatin_##b, chLatin_##c, chLatin_##d, chLatin_##e, chLatin_##f, chLatin_##g, chLatin_##h, chLatin_##i, \ + chLatin_##j, chLatin_##k, chLatin_##l, chLatin_##m, chLatin_##n, chLatin_##o, chLatin_##p, chLatin_##q, chLatin_##r, \ + chLatin_##s, chLatin_##t, chLatin_##u, chLatin_##v, chLatin_##w, chLatin_##x, chLatin_##y, chLatin_##z, chNull} +#endif /* DOXYGEN_SKIP */ + /** * Begins the declaration of an XMLObject specialization. * Basic boilerplate includes a protected constructor, empty virtual destructor, * and Unicode constants for the default associated element's name and prefix. * - * @param cname the name of the class to declare - * @param base the base class to derive from using public virtual inheritance + * @param linkage linkage specifier for the class + * @param cname the name of the class to declare + * @param base the base class to derive from using public virtual inheritance + * @param desc documentation comment for class */ -#define BEGIN_XMLOBJECT(cname,base) \ - class XMLTOOL_API cname : public virtual base, public virtual ValidatingXMLObject { \ +#define BEGIN_XMLOBJECT(linkage,cname,base,desc) \ + XMLTOOLING_DOXYGEN(desc) \ + class linkage cname : public virtual base, public virtual xmltooling::ValidatingXMLObject { \ protected: \ cname() {} \ public: \ virtual ~cname() {} \ - /##** Type-specific clone method. */ \ + XMLTOOLING_DOXYGEN(Type-specific clone method.) \ virtual cname* clone##cname() const=0; \ - /##** Element prefix */ \ - static const XMLCh PREFIX[]; \ - /##** Element local name */ \ + XMLTOOLING_DOXYGEN(Element local name) \ static const XMLCh LOCAL_NAME[] /** @@ -115,12 +190,13 @@ * @param upcased the upcased name of the attribute */ #define DECL_XMLOBJECT_ATTRIB(proper,upcased) \ - /##** proper attribute name */ \ - static const XMLCh upcased##_ATTRIB_NAME[]; \ - /##** Returns the proper attribute. */ \ - virtual const XMLCh* get##proper() const=0; \ - /##** Sets the proper attribute. */ \ - virtual void set##proper(const XMLCh* proper)=0 + public: \ + XMLTOOLING_DOXYGEN(proper attribute name) \ + static const XMLCh upcased##_ATTRIB_NAME[]; \ + XMLTOOLING_DOXYGEN(Returns the proper attribute.) \ + virtual const XMLCh* get##proper() const=0; \ + XMLTOOLING_DOXYGEN(Sets the proper attribute.) \ + virtual void set##proper(const XMLCh* proper)=0 /** * Implements get/set methods and a private member for a named XML attribute. @@ -139,6 +215,177 @@ } /** + * Declares abstract get/set methods for a typed XML child object. + * + * @param proper the proper name of the child type + */ +#define DECL_XMLOBJECT_CHILD(proper) \ + public: \ + XMLTOOLING_DOXYGEN(Returns the proper child.) \ + virtual proper* get##proper() const=0; \ + XMLTOOLING_DOXYGEN(Sets the proper child.) \ + virtual void set##proper(proper* child)=0 + +/** + * Implements get/set methods and a private list iterator member for a typed XML child object. + * + * @param proper the proper name of the child type + */ +#define IMPL_XMLOBJECT_CHILD(proper) \ + private: \ + proper* m_##proper; \ + std::list::iterator m_pos_##proper; \ + public: \ + proper* get##proper() const { \ + return m_##proper; \ + } \ + void set##proper(proper* child) { \ + prepareForAssignment(m_##proper,child); \ + *m_pos_##proper = m_##proper = child; \ + } + +/** + * Declares abstract get/set methods for a typed XML child collection. + * + * @param proper the proper name of the child type + */ +#define DECL_XMLOBJECT_CHILDREN(proper) \ + public: \ + XMLTOOLING_DOXYGEN(Returns modifiable proper collection.) \ + virtual VectorOf(proper) get##proper##s()=0; \ + XMLTOOLING_DOXYGEN(Returns reference to immutable proper collection.) \ + virtual const std::vector& get##proper##s() const=0 + +/** + * Implements get method and a private vector member for a typed XML child collection. + * + * @param proper the proper name of the child type + * @param fence insertion fence for new objects of the child collection in backing list + */ +#define IMPL_XMLOBJECT_CHILDREN(proper,fence) \ + private: \ + std::vector m_##proper##s; \ + public: \ + VectorOf(proper) get##proper##s() { \ + return VectorOf(proper)(this, m_##proper##s, &m_children, fence); \ + } \ + const std::vector& get##proper##s() const { \ + return m_##proper##s; \ + } + +/** + * Implements marshalling for an attribute + * + * @param proper the proper name of the attribute + * @param ucase the upcased name of the attribute + * @param namespaceURI the XML namespace of the attribute + */ +#define MARSHALL_XMLOBJECT_ATTRIB(proper,ucase,namespaceURI) \ + if(get##proper()) { \ + domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, get##proper()); \ + } + +/** + * Implements marshalling for an ID attribute + * + * @param proper the proper name of the attribute + * @param ucase the upcased name of the attribute + * @param namespaceURI the XML namespace of the attribute + */ +#define MARSHALL_XMLOBJECT_ID_ATTRIB(proper,ucase,namespaceURI) \ + if(get##proper()) { \ + domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, get##proper()); \ + domElement->setIdAttributeNS(namespaceURI, ucase##_ATTRIB_NAME); \ + } + +/** + * Implements unmarshalling process branch for an attribute + * + * @param proper the proper name of the attribute + * @param ucase the upcased name of the attribute + * @param namespaceURI the XML namespace of the attribute + */ +#define PROC_XMLOBJECT_ATTRIB(proper,ucase,namespaceURI) \ + if (xmltooling::XMLHelper::isNodeNamed(attribute, namespaceURI, ucase##_ATTRIB_NAME)) { \ + set##proper(attribute->getValue()); \ + return; \ + } + +/** + * Implements unmarshalling process branch for an ID attribute + * + * @param proper the proper name of the attribute + * @param ucase the upcased name of the attribute + * @param namespaceURI the XML namespace of the attribute + */ +#define PROC_XMLOBJECT_ID_ATTRIB(proper,ucase,namespaceURI) \ + if (xmltooling::XMLHelper::isNodeNamed(attribute, namespaceURI, ucase##_ATTRIB_NAME)) { \ + set##proper(attribute->getValue()); \ + static_cast(attribute->getParentNode())->setIdAttributeNode(attribute); \ + return; \ + } + +/** + * Implements unmarshalling process branch for typed child collection element + * + * @param proper the proper name of the child type + * @param namespaceURI the XML namespace of the child element + */ +#define PROC_XMLOBJECT_CHILDREN(proper,namespaceURI) \ + if (xmltooling::XMLHelper::isNodeNamed(root,namespaceURI,proper::LOCAL_NAME)) { \ + proper* typesafe=dynamic_cast(childXMLObject); \ + if (typesafe) { \ + get##proper##s().push_back(typesafe); \ + return; \ + } \ + } + +/** + * Implements unmarshalling process branch for typed child singleton element + * + * @param proper the proper name of the child type + * @param namespaceURI the XML namespace of the child element + */ +#define PROC_XMLOBJECT_CHILD(proper,namespaceURI) \ + if (xmltooling::XMLHelper::isNodeNamed(root,namespaceURI,proper::LOCAL_NAME)) { \ + proper* typesafe=dynamic_cast(childXMLObject); \ + if (typesafe) { \ + set##proper(typesafe); \ + return; \ + } \ + } + +/** + * Declares aliased get/set methods for named XML element content. + * + * @param proper the proper name to label the element's content + */ +#define DECL_XMLOBJECT_CONTENT(proper) \ + XMLTOOLING_DOXYGEN(Returns proper.) \ + const XMLCh* get##proper() const { \ + return getTextContent(); \ + } \ + XMLTOOLING_DOXYGEN(Sets or clears proper.) \ + void set##proper(const XMLCh* proper) { \ + setTextContent(proper); \ + } + +/** + * Implements marshalling/unmarshalling for element content. + */ +#define IMPL_XMLOBJECT_CONTENT \ + protected: \ + void marshallElementContent(DOMElement* domElement) const { \ + if(getTextContent()) { \ + domElement->appendChild(domElement->getOwnerDocument()->createTextNode(getTextContent())); \ + } \ + } \ + void processElementContent(const XMLCh* elementContent) { \ + setTextContent(elementContent); \ + } + + +/** * Implements cloning methods for an XMLObject specialization implementation class. * * @param cname the name of the XMLObject specialization @@ -148,7 +395,7 @@ return clone(); \ } \ cname* clone() const { \ - auto_ptr domClone(AbstractDOMCachingXMLObject::clone()); \ + std::auto_ptr domClone(xmltooling::AbstractDOMCachingXMLObject::clone()); \ cname##Impl* ret=dynamic_cast(domClone.get()); \ if (ret) { \ domClone.release(); \ @@ -158,19 +405,72 @@ } /** + * Declares an XMLObject specialization with a simple content model and type, + * handling it as string data. + * + * @param linkage linkage specifier for the class + * @param cname the name of the XMLObject specialization + * @param proper the proper name to label the element's content + * @param desc documentation for class + */ +#define DECL_XMLOBJECT_SIMPLE(linkage,cname,proper,desc) \ + BEGIN_XMLOBJECT(linkage,cname,xmltooling::SimpleElement,desc); \ + DECL_XMLOBJECT_CONTENT(proper); \ + END_XMLOBJECT + +/** + * Declares and defines an implementation class for an XMLObject with + * a simple content model and type, handling it as string data. + * + * @param linkage linkage specifier for the class + * @param cname the name of the XMLObject specialization + */ +#define DECL_XMLOBJECTIMPL_SIMPLE(linkage,cname) \ + class linkage cname##Impl \ + : public cname, \ + public xmltooling::AbstractSimpleElement, \ + public xmltooling::AbstractChildlessElement, \ + public xmltooling::AbstractDOMCachingXMLObject, \ + public xmltooling::AbstractValidatingXMLObject, \ + public xmltooling::AbstractXMLObjectMarshaller, \ + public xmltooling::AbstractXMLObjectUnmarshaller \ + { \ + public: \ + virtual ~cname##Impl() {} \ + cname##Impl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) \ + : xmltooling::AbstractXMLObject(nsURI, localName, prefix, schemaType) { \ + } \ + cname##Impl(const cname##Impl& src) \ + : xmltooling::AbstractXMLObject(src), \ + xmltooling::AbstractSimpleElement(src), \ + xmltooling::AbstractDOMCachingXMLObject(src), \ + xmltooling::AbstractValidatingXMLObject(src) {} \ + IMPL_XMLOBJECT_CLONE(cname) \ + IMPL_XMLOBJECT_CONTENT \ + } + +/** * Begins the declaration of an XMLObjectBuilder specialization. * Basic boilerplate includes an empty virtual destructor, and - * a default builder. + * a default builder that defaults the element name. * - * @param cname the name of the XMLObject specialization + * @param linkage linkage specifier for the class + * @param cname the name of the XMLObject specialization + * @param namespaceURI the XML namespace of the default associated element + * @param namespacePrefix the XML namespace prefix of the default associated element */ -#define BEGIN_XMLOBJECTBUILDER(cname) \ - /##** Builder for cname objects. */ \ - class XMLTOOL_API cname##Builder : public xmltooling::XMLObjectBuilder { \ +#define BEGIN_XMLOBJECTBUILDER(linkage,cname,namespaceURI,namespacePrefix) \ + XMLTOOLING_DOXYGEN(Builder for cname objects.) \ + class linkage cname##Builder : public xmltooling::XMLObjectBuilder { \ public: \ virtual ~cname##Builder() {} \ - /##** Default builder. */ \ - virtual cname* buildObject() const=0 + XMLTOOLING_DOXYGEN(Default builder.) \ + virtual cname* buildObject() const { \ + return buildObject(namespaceURI,cname::LOCAL_NAME,namespacePrefix); \ + } \ + virtual cname* buildObject( \ + const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL \ + ) const /** * Ends the declaration of an XMLObjectBuilder specialization. @@ -178,28 +478,139 @@ #define END_XMLOBJECTBUILDER } /** - * Begins the declaration of an XMLObjectBuilder specialization implementation class. + * Declares a generic XMLObjectBuilder specialization. + * + * @param linkage linkage specifier for the class + * @param cname the name of the XMLObject specialization + * @param namespaceURI the XML namespace of the default associated element + * @param namespacePrefix the XML namespace prefix of the default associated element + */ + #define DECL_XMLOBJECTBUILDER(linkage,cname,namespaceURI,namespacePrefix) \ + BEGIN_XMLOBJECTBUILDER(linkage,cname,namespaceURI,namespacePrefix); \ + END_XMLOBJECTBUILDER + +/** + * Implements the standard XMLObjectBuilder specialization function. + * + * @param cname the name of the XMLObject specialization + */ +#define IMPL_XMLOBJECTBUILDER(cname) \ + cname* cname##Builder::buildObject( \ + const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType \ + ) const \ + { \ + return new cname##Impl(nsURI,localName,prefix,schemaType); \ + } + +/** + * Begins the declaration of a Schema Validator specialization. * - * @param cname the name of the XMLObject specialization - * @param namespaceURI the XML namespace of the default associated element + * @param linkage linkage specifier for the class + * @param cname the base name of the Validator specialization */ -#define BEGIN_XMLOBJECTBUILDERIMPL(cname,namespaceURI) \ - class XMLTOOL_DLLLOCAL cname##BuilderImpl : public cname##Builder { \ + #define BEGIN_XMLOBJECTVALIDATOR(linkage,cname) \ + class linkage cname##SchemaValidator : public xmltooling::Validator \ + { \ public: \ - cname* buildObject( \ - const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const QName* schemaType=NULL\ - ) const; \ - cname* buildObject() const { \ - return buildObject(namespaceURI,cname::LOCAL_NAME,cname::PREFIX); \ - } + virtual ~cname##SchemaValidator() {} \ + virtual cname##SchemaValidator* clone() const { \ + return new cname##SchemaValidator(); \ + } \ + virtual void validate(const xmltooling::XMLObject* xmlObject) const { \ + const cname* ptr=dynamic_cast(xmlObject); \ + if (!ptr) \ + throw xmltooling::ValidationException(#cname"SchemaValidator: unsupported object type ($1).",xmltooling::params(1,typeid(xmlObject).name())) + +/** + * Ends the declaration of a Validator specialization. + */ +#define END_XMLOBJECTVALIDATOR } } + +/** + * Validator code that checks the object type. + * + * @param cname the name of the XMLObject specialization + */ +#define XMLOBJECTVALIDATOR_CHECKTYPE(cname) \ + const cname* ptr=dynamic_cast(xmlObject); \ + if (!ptr) \ + throw xmltooling::ValidationException(#cname"SchemaValidator: unsupported object type ($1).",xmltooling::params(1,typeid(xmlObject).name())) /** - * Ends the declaration of an XMLObjectBuilder specialization implementation class. + * Validator code that checks for a required attribute, content, or singleton. + * + * @param cname the name of the XMLObject specialization + * @param proper the proper name of the attribute, content, or singleton member */ -#define END_XMLOBJECTBUILDERIMPL } +#define XMLOBJECTVALIDATOR_REQUIRE(cname,proper) \ + if (!ptr->get##proper()) \ + throw xmltooling::ValidationException(#cname" must have "#proper".") + +/** + * Validator code that checks for one of a pair of + * required attributes, content, or singletons. + * + * @param cname the name of the XMLObject specialization + * @param proper1 the proper name of the first attribute, content, or singleton member + * @param proper2 the proper name of the second attribute, content, or singleton member + */ +#define XMLOBJECTVALIDATOR_ONEOF(cname,proper1,proper2) \ + if (!ptr->get##proper1() && !ptr->get##proper2()) \ + throw xmltooling::ValidationException(#cname" must have "#proper1" or "#proper2".") + +/** + * Validator code that checks for one of a set of three + * required attributes, content, or singletons. + * + * @param cname the name of the XMLObject specialization + * @param proper1 the proper name of the first attribute, content, or singleton member + * @param proper2 the proper name of the second attribute, content, or singleton member + * @param proper3 the proper name of the third attribute, content, or singleton member + */ +#define XMLOBJECTVALIDATOR_ONEOF3(cname,proper1,proper2,proper3) \ + if (!ptr->get##proper1() && !ptr->get##proper2() && !ptr->get##proper3()) \ + throw xmltooling::ValidationException(#cname" must have "#proper1", "#proper2", or "#proper3".") + +/** + * Validator code that checks a co-constraint (if one present, the other must be) + * between a pair of attributes, content, or singletons. + * + * @param cname the name of the XMLObject specialization + * @param proper1 the proper name of the first attribute, content, or singleton member + * @param proper2 the proper name of the second attribute, content, or singleton member + */ +#define XMLOBJECTVALIDATOR_NONEORBOTH(cname,proper1,proper2) \ + if ((ptr->get##proper1() && !ptr->get##proper2()) || (!ptr->get##proper1() && ptr->get##proper2())) \ + throw xmltooling::ValidationException(#cname" cannot have "#proper1" without "#proper2".") + +/** + * Validator code that checks for a non-empty collection. + * + * @param cname the name of the XMLObject specialization + * @param proper the proper name of the collection item + */ +#define XMLOBJECTVALIDATOR_NONEMPTY(cname,proper) \ + if (ptr->get##proper##s().empty()) \ + throw xmltooling::ValidationException(#cname" must have at least one "#proper".") + +/** + * Declares/defines a Validator specialization that checks object type and + * a non-empty simple content model. + * + * @param linkage linkage specifier for the class + * @param cname the name of the XMLObject specialization + */ +#define XMLOBJECTVALIDATOR_SIMPLE(linkage,cname) \ + BEGIN_XMLOBJECTVALIDATOR(linkage,cname); \ + XMLOBJECTVALIDATOR_REQUIRE(cname,TextContent); \ + END_XMLOBJECTVALIDATOR #include +/** + * @namespace xmltooling + * Public namespace of XML Tooling library + */ namespace xmltooling { /**