CPPOST-95 - Add MD RPI extension implementation to metadata classes.
[shibboleth/cpp-opensaml.git] / saml / saml2 / metadata / Metadata.h
1 /**
2  * Licensed to the University Corporation for Advanced Internet
3  * Development, Inc. (UCAID) under one or more contributor license
4  * agreements. See the NOTICE file distributed with this work for
5  * additional information regarding copyright ownership.
6  *
7  * UCAID licenses this file to you under the Apache License,
8  * Version 2.0 (the "License"); you may not use this file except
9  * in compliance with the License. You may obtain a copy of the
10  * License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
17  * either express or implied. See the License for the specific
18  * language governing permissions and limitations under the License.
19  */
20
21 /**
22  * @file saml/saml2/metadata/Metadata.h
23  *
24  * XMLObjects representing the SAML 2.0 Metadata schema.
25  */
26
27 #ifndef __saml2_metadata_h__
28 #define __saml2_metadata_h__
29
30 #include <saml/saml2/core/Assertions.h>
31
32 #include <ctime>
33 #include <xercesc/util/XMLUniDefs.hpp>
34 #include <xmltooling/util/Predicates.h>
35
36
37 #define DECL_SAML2MDOBJECTBUILDER(cname) \
38     DECL_XMLOBJECTBUILDER(SAML_API,cname,samlconstants::SAML20MD_NS,samlconstants::SAML20MD_PREFIX)
39
40 namespace xmltooling {
41     class XMLTOOL_API Credential;
42     class XMLTOOL_API CredentialResolver;
43 }
44
45 namespace xmlencryption {
46     class XMLTOOL_API EncryptionMethod;
47 };
48
49 namespace opensaml {
50
51     /**
52      * @namespace opensaml::saml2md
53      * SAML 2.0 metadata namespace
54      */
55     namespace saml2md {
56
57         class SAML_API DigestMethod;
58         class SAML_API SigningMethod;
59
60         /**
61          * Base class for metadata objects that feature a cacheDuration attribute.
62          */
63         class SAML_API CacheableSAMLObject : public virtual xmltooling::XMLObject
64         {
65         protected:
66             CacheableSAMLObject() {}
67         public:
68             ~CacheableSAMLObject() {}
69             DECL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION);
70         };
71
72         /**
73          * Base class for metadata objects that feature a validUntil attribute.
74          */
75         class SAML_API TimeBoundSAMLObject : public virtual xmltooling::XMLObject
76         {
77         protected:
78             TimeBoundSAMLObject() {}
79         public:
80             ~TimeBoundSAMLObject() {}
81             DECL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL);
82             /** Returns true iff the object is valid at the current time. */
83             bool isValid() const {
84                 return time(nullptr) <= getValidUntilEpoch();
85             }
86             /**
87              * Returns true iff the object is valid at the supplied time.
88              *
89              * @param t the time to check against
90              */
91             bool isValid(time_t t) const {
92                 return t <= getValidUntilEpoch();
93             }
94         };
95
96         DECL_XMLOBJECT_SIMPLE(SAML_API,AffiliateMember,ID,SAML 2.0 AffiliateMember element);
97         DECL_XMLOBJECT_SIMPLE(SAML_API,AttributeProfile,ProfileURI,SAML 2.0 AttributeProfile element);
98         DECL_XMLOBJECT_SIMPLE(SAML_API,Company,Name,SAML 2.0 Company element);
99         DECL_XMLOBJECT_SIMPLE(SAML_API,EmailAddress,Address,SAML 2.0 EmailAddress element);
100         DECL_XMLOBJECT_SIMPLE(SAML_API,GivenName,Name,SAML 2.0 GivenName element);
101         DECL_XMLOBJECT_SIMPLE(SAML_API,NameIDFormat,Format,SAML 2.0 NameIDFormat element);
102         DECL_XMLOBJECT_SIMPLE(SAML_API,SurName,Name,SAML 2.0 SurName element);
103         DECL_XMLOBJECT_SIMPLE(SAML_API,TelephoneNumber,Number,SAML 2.0 TelephoneNumber element);
104
105         DECL_XMLOBJECT_SIMPLE(SAML_API,ActionNamespace,Namespace,SAML 2.0 Metadata Extension ActionNamespace element);
106
107         BEGIN_XMLOBJECT(SAML_API,localizedNameType,xmltooling::XMLObject,SAML 2.0 localizedNameType type);
108             /** xml:lang attribute name. */
109             static const XMLCh LANG_ATTRIB_NAME[];
110
111             /**
112              * Sets the xml:lang attribute.
113              *
114              * @param Lang  the value to set
115              */
116             virtual void setLang(const XMLCh* Lang)=0;
117
118             /** localizedNameType local name */
119             static const XMLCh TYPE_NAME[];
120         END_XMLOBJECT;
121
122         BEGIN_XMLOBJECT(SAML_API,localizedURIType,xmltooling::XMLObject,SAML 2.0 localizedURIType type);
123             /** xml:lang attribute name. */
124             static const XMLCh LANG_ATTRIB_NAME[];
125
126             /**
127              * Sets the xml:lang attribute.
128              *
129              * @param Lang  the value to set
130              */
131             virtual void setLang(const XMLCh* Lang)=0;
132
133             /** localizedURIType local name */
134             static const XMLCh TYPE_NAME[];
135         END_XMLOBJECT;
136
137         BEGIN_XMLOBJECT(SAML_API,OrganizationName,localizedNameType,SAML 2.0 OrganizationName element);
138             DECL_SIMPLE_CONTENT(Name);
139         END_XMLOBJECT;
140
141         BEGIN_XMLOBJECT(SAML_API,OrganizationDisplayName,localizedNameType,SAML 2.0 OrganizationDisplayName element);
142             DECL_SIMPLE_CONTENT(Name);
143         END_XMLOBJECT;
144
145         BEGIN_XMLOBJECT(SAML_API,OrganizationURL,localizedURIType,SAML 2.0 OrganizationURL element);
146             DECL_SIMPLE_CONTENT(URL);
147         END_XMLOBJECT;
148
149         BEGIN_XMLOBJECT(SAML_API,Extensions,xmltooling::ElementExtensibleXMLObject,SAML 2.0 Extensions element);
150             /** ExtensionsType local name */
151             static const XMLCh TYPE_NAME[];
152         END_XMLOBJECT;
153
154         BEGIN_XMLOBJECT(SAML_API,Organization,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 Organization element);
155             DECL_TYPED_CHILD(Extensions);
156             DECL_TYPED_CHILDREN(OrganizationName);
157             DECL_TYPED_CHILDREN(OrganizationDisplayName);
158             DECL_TYPED_CHILDREN(OrganizationURL);
159             /** OrganizationType local name */
160             static const XMLCh TYPE_NAME[];
161         END_XMLOBJECT;
162
163         BEGIN_XMLOBJECT(SAML_API,ContactPerson,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 ContactPerson element);
164             DECL_STRING_ATTRIB(ContactType,CONTACTTYPE);
165             DECL_TYPED_CHILD(Extensions);
166             DECL_TYPED_CHILD(Company);
167             DECL_TYPED_CHILD(GivenName);
168             DECL_TYPED_CHILD(SurName);
169             DECL_TYPED_CHILDREN(EmailAddress);
170             DECL_TYPED_CHILDREN(TelephoneNumber);
171             /** ContactType local name */
172             static const XMLCh TYPE_NAME[];
173             /** technical Contact Type */
174             static const XMLCh CONTACT_TECHNICAL[];
175             /** support Contact Type */
176             static const XMLCh CONTACT_SUPPORT[];
177             /** administrative Contact Type */
178             static const XMLCh CONTACT_ADMINISTRATIVE[];
179             /** billing Contact Type */
180             static const XMLCh CONTACT_BILLING[];
181             /** other Contact Type */
182             static const XMLCh CONTACT_OTHER[];
183         END_XMLOBJECT;
184
185         BEGIN_XMLOBJECT(SAML_API,AdditionalMetadataLocation,xmltooling::XMLObject,SAML 2.0 AdditionalMetadataLocation element);
186             DECL_STRING_ATTRIB(Namespace,NAMESPACE);
187             DECL_SIMPLE_CONTENT(Location);
188             /** AdditionalMetadataLocationType local name */
189             static const XMLCh TYPE_NAME[];
190         END_XMLOBJECT;
191
192         BEGIN_XMLOBJECT(SAML_API,KeyDescriptor,xmltooling::XMLObject,SAML 2.0 KeyDescriptor element);
193             DECL_STRING_ATTRIB(Use,USE);
194             DECL_TYPED_FOREIGN_CHILD(KeyInfo,xmlsignature);
195             DECL_TYPED_FOREIGN_CHILDREN(EncryptionMethod,xmlencryption);
196             /** KeyDescriptorType local name */
197             static const XMLCh TYPE_NAME[];
198             /** encryption Key Type */
199             static const XMLCh KEYTYPE_ENCRYPTION[];
200             /** signing Key Type */
201             static const XMLCh KEYTYPE_SIGNING[];
202         END_XMLOBJECT;
203
204         BEGIN_XMLOBJECT4(SAML_API,RoleDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,
205                 CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 RoleDescriptor abstract element);
206             DECL_STRING_ATTRIB(ID,ID);
207             DECL_STRING_ATTRIB(ProtocolSupportEnumeration,PROTOCOLSUPPORTENUMERATION);
208             /** Searches the ProtocolSupportEnumeration attribute for the indicated protocol. */
209             virtual bool hasSupport(const XMLCh* protocol) const=0;
210             /** Adds the indicated protocol to the ProtocolSupportEnumeration attribute. */
211             virtual void addSupport(const XMLCh* protocol)=0;
212             DECL_STRING_ATTRIB(ErrorURL,ERRORURL);
213             DECL_TYPED_CHILD(Extensions);
214             DECL_TYPED_CHILDREN(KeyDescriptor);
215             DECL_TYPED_CHILD(Organization);
216             DECL_TYPED_CHILDREN(ContactPerson);
217             /** Returns the first digest method supported by the role and the underlying implementation, if any. */
218             virtual const DigestMethod* getDigestMethod() const;
219             /** Returns the first signing method supported by the role and the underlying implementation, if any, along with a matching credential. */
220             virtual std::pair<const SigningMethod*,const xmltooling::Credential*> getSigningMethod(
221                 const xmltooling::CredentialResolver& resolver, xmltooling::CredentialCriteria& cc
222                 ) const;
223         END_XMLOBJECT;
224
225         BEGIN_XMLOBJECT2(SAML_API,RoleDescriptorType,RoleDescriptor,xmltooling::ElementExtensibleXMLObject,SAML 2.0 RoleDescriptor extension);
226         END_XMLOBJECT;
227
228         BEGIN_XMLOBJECT(SAML_API,EndpointType,xmltooling::ElementProxy,SAML 2.0 EndpointType type);
229             DECL_STRING_ATTRIB(Binding,BINDING);
230             DECL_STRING_ATTRIB(Location,LOCATION);
231             DECL_STRING_ATTRIB(ResponseLocation,RESPONSELOCATION);
232             /** EndpointType local name */
233             static const XMLCh TYPE_NAME[];
234         END_XMLOBJECT;
235
236         BEGIN_XMLOBJECT(SAML_API,IndexedEndpointType,EndpointType,SAML 2.0 IndexedEndpointType type);
237             DECL_INTEGER_ATTRIB(Index,INDEX);
238             DECL_BOOLEAN_ATTRIB(isDefault,ISDEFAULT,false);
239             /** IndexedEndpointType local name */
240             static const XMLCh TYPE_NAME[];
241         END_XMLOBJECT;
242
243         BEGIN_XMLOBJECT(SAML_API,ArtifactResolutionService,IndexedEndpointType,SAML 2.0 ArtifactResolutionService element);
244         END_XMLOBJECT;
245
246         BEGIN_XMLOBJECT(SAML_API,SingleLogoutService,EndpointType,SAML 2.0 SingleLogoutService element);
247         END_XMLOBJECT;
248
249         BEGIN_XMLOBJECT(SAML_API,ManageNameIDService,EndpointType,SAML 2.0 ManageNameIDService element);
250         END_XMLOBJECT;
251
252         BEGIN_XMLOBJECT(SAML_API,SSODescriptorType,RoleDescriptor,SAML 2.0 SSODescriptorType abstract type);
253             DECL_TYPED_CHILDREN(ArtifactResolutionService);
254             DECL_TYPED_CHILDREN(SingleLogoutService);
255             DECL_TYPED_CHILDREN(ManageNameIDService);
256             DECL_TYPED_CHILDREN(NameIDFormat);
257             /** SSODescriptorType local name */
258             static const XMLCh TYPE_NAME[];
259         END_XMLOBJECT;
260
261         BEGIN_XMLOBJECT(SAML_API,SingleSignOnService,EndpointType,SAML 2.0 SingleSignOnService element);
262         END_XMLOBJECT;
263
264         BEGIN_XMLOBJECT(SAML_API,NameIDMappingService,EndpointType,SAML 2.0 NameIDMappingService element);
265         END_XMLOBJECT;
266
267         BEGIN_XMLOBJECT(SAML_API,AssertionIDRequestService,EndpointType,SAML 2.0 AssertionIDRequestService element);
268         END_XMLOBJECT;
269
270         BEGIN_XMLOBJECT(SAML_API,IDPSSODescriptor,SSODescriptorType,SAML 2.0 IDPSSODescriptor element);
271             DECL_BOOLEAN_ATTRIB(WantAuthnRequestsSigned,WANTAUTHNREQUESTSSIGNED,false);
272             DECL_TYPED_CHILDREN(SingleSignOnService);
273             DECL_TYPED_CHILDREN(NameIDMappingService);
274             DECL_TYPED_CHILDREN(AssertionIDRequestService);
275             DECL_TYPED_CHILDREN(AttributeProfile);
276             DECL_TYPED_FOREIGN_CHILDREN(Attribute,saml2);
277             /** IDPSSODescriptorType local name */
278             static const XMLCh TYPE_NAME[];
279             DECL_ELEMENT_QNAME;
280         END_XMLOBJECT;
281
282         BEGIN_XMLOBJECT(SAML_API,ServiceName,localizedNameType,SAML 2.0 ServiceName element);
283             DECL_SIMPLE_CONTENT(Name);
284         END_XMLOBJECT;
285
286         BEGIN_XMLOBJECT(SAML_API,ServiceDescription,localizedNameType,SAML 2.0 ServiceDescription element);
287             DECL_SIMPLE_CONTENT(Description);
288         END_XMLOBJECT;
289
290         BEGIN_XMLOBJECT(SAML_API,RequestedAttribute,saml2::Attribute,SAML 2.0 RequestedAttribute element);
291             DECL_BOOLEAN_ATTRIB(isRequired,ISREQUIRED,false);
292             /** RequestedAttributeType local name */
293             static const XMLCh TYPE_NAME[];
294         END_XMLOBJECT;
295
296         BEGIN_XMLOBJECT(SAML_API,AttributeConsumingService,xmltooling::XMLObject,SAML 2.0 AttributeConsumingService element);
297             DECL_INTEGER_ATTRIB(Index,INDEX);
298             DECL_BOOLEAN_ATTRIB(isDefault,ISDEFAULT,false);
299             DECL_TYPED_CHILDREN(ServiceName);
300             DECL_TYPED_CHILDREN(ServiceDescription);
301             DECL_TYPED_CHILDREN(RequestedAttribute);
302             /** AttributeConsumingServiceType local name */
303             static const XMLCh TYPE_NAME[];
304         END_XMLOBJECT;
305
306         BEGIN_XMLOBJECT(SAML_API,AssertionConsumerService,IndexedEndpointType,SAML 2.0 AssertionConsumerService element);
307         END_XMLOBJECT;
308
309         BEGIN_XMLOBJECT(SAML_API,SPSSODescriptor,SSODescriptorType,SAML 2.0 SPSSODescriptor element);
310             DECL_BOOLEAN_ATTRIB(AuthnRequestsSigned,AUTHNREQUESTSSIGNED,false);
311             DECL_BOOLEAN_ATTRIB(WantAssertionsSigned,WANTASSERTIONSSIGNED,false);
312             DECL_TYPED_CHILDREN(AssertionConsumerService);
313             DECL_TYPED_CHILDREN(AttributeConsumingService);
314             /** SPSSODescriptorType local name */
315             static const XMLCh TYPE_NAME[];
316             DECL_ELEMENT_QNAME;
317         END_XMLOBJECT;
318
319         BEGIN_XMLOBJECT(SAML_API,AuthnQueryService,EndpointType,SAML 2.0 AuthnQueryService element);
320         END_XMLOBJECT;
321
322         BEGIN_XMLOBJECT(SAML_API,AuthnAuthorityDescriptor,RoleDescriptor,SAML 2.0 AuthnAuthorityDescriptor element);
323             DECL_TYPED_CHILDREN(AuthnQueryService);
324             DECL_TYPED_CHILDREN(AssertionIDRequestService);
325             DECL_TYPED_CHILDREN(NameIDFormat);
326             /** AuthnAuthorityDescriptorType local name */
327             static const XMLCh TYPE_NAME[];
328             DECL_ELEMENT_QNAME;
329         END_XMLOBJECT;
330
331         BEGIN_XMLOBJECT(SAML_API,AuthzService,EndpointType,SAML 2.0 AuthzService element);
332         END_XMLOBJECT;
333
334         BEGIN_XMLOBJECT(SAML_API,PDPDescriptor,RoleDescriptor,SAML 2.0 PDPDescriptor element);
335             DECL_TYPED_CHILDREN(AuthzService);
336             DECL_TYPED_CHILDREN(AssertionIDRequestService);
337             DECL_TYPED_CHILDREN(NameIDFormat);
338             /** PDPDescriptorType local name */
339             static const XMLCh TYPE_NAME[];
340             DECL_ELEMENT_QNAME;
341         END_XMLOBJECT;
342
343         BEGIN_XMLOBJECT(SAML_API,AttributeService,EndpointType,SAML 2.0 AttributeService element);
344         END_XMLOBJECT;
345
346         BEGIN_XMLOBJECT(SAML_API,AttributeAuthorityDescriptor,RoleDescriptor,SAML 2.0 AttributeAuthorityDescriptor element);
347             DECL_TYPED_CHILDREN(AttributeService);
348             DECL_TYPED_CHILDREN(AssertionIDRequestService);
349             DECL_TYPED_CHILDREN(NameIDFormat);
350             DECL_TYPED_CHILDREN(AttributeProfile);
351             DECL_TYPED_FOREIGN_CHILDREN(Attribute,saml2);
352             /** AttributeAuthorityDescriptorType local name */
353             static const XMLCh TYPE_NAME[];
354             DECL_ELEMENT_QNAME;
355         END_XMLOBJECT;
356
357         BEGIN_XMLOBJECT(SAML_API,QueryDescriptorType,RoleDescriptor,SAML 2.0 QueryDescriptorType abstract type);
358             DECL_BOOLEAN_ATTRIB(WantAssertionsSigned,WANTASSERTIONSSIGNED,false);
359             DECL_TYPED_CHILDREN(NameIDFormat);
360             /** QueryDescriptorType local name */
361             static const XMLCh TYPE_NAME[];
362         END_XMLOBJECT;
363
364         BEGIN_XMLOBJECT(SAML_API,AuthnQueryDescriptorType,QueryDescriptorType,SAML 2.0 AuthnQueryDescriptorType extension type);
365             /** AuthnQueryDescriptorType local name */
366             static const XMLCh TYPE_NAME[];
367             DECL_TYPE_QNAME;
368         END_XMLOBJECT;
369
370         BEGIN_XMLOBJECT(SAML_API,AttributeQueryDescriptorType,QueryDescriptorType,SAML 2.0 AttributeQueryDescriptorType extension type);
371             DECL_TYPED_CHILDREN(AttributeConsumingService);
372             /** AttributeQueryDescriptorType local name */
373             static const XMLCh TYPE_NAME[];
374             DECL_TYPE_QNAME;
375         END_XMLOBJECT;
376
377         BEGIN_XMLOBJECT(SAML_API,AuthzDecisionQueryDescriptorType,QueryDescriptorType,SAML 2.0 AuthzDecisionQueryDescriptorType extension type);
378             DECL_TYPED_CHILDREN(ActionNamespace);
379             /** AuthzDecisionQueryDescriptorType local name */
380             static const XMLCh TYPE_NAME[];
381             DECL_TYPE_QNAME;
382         END_XMLOBJECT;
383
384         BEGIN_XMLOBJECT4(SAML_API,AffiliationDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,
385                 CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 AffiliationDescriptor element);
386             DECL_STRING_ATTRIB(ID,ID);
387             DECL_STRING_ATTRIB(AffiliationOwnerID,AFFILIATIONOWNERID);
388             DECL_TYPED_CHILD(Extensions);
389             DECL_TYPED_CHILDREN(AffiliateMember);
390             DECL_TYPED_CHILDREN(KeyDescriptor);
391             /** AffiliationDescriptorType local name */
392             static const XMLCh TYPE_NAME[];
393         END_XMLOBJECT;
394
395         BEGIN_XMLOBJECT4(SAML_API,EntityDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,
396                 CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 EntityDescriptor element);
397             DECL_STRING_ATTRIB(ID,ID);
398             DECL_STRING_ATTRIB(EntityID,ENTITYID);
399             DECL_TYPED_CHILD(Extensions);
400             DECL_TYPED_CHILD(AffiliationDescriptor);
401             DECL_TYPED_CHILDREN(RoleDescriptor);
402             DECL_TYPED_CHILDREN(IDPSSODescriptor);
403             DECL_TYPED_CHILDREN(SPSSODescriptor);
404             DECL_TYPED_CHILDREN(AuthnAuthorityDescriptor);
405             DECL_TYPED_CHILDREN(AttributeAuthorityDescriptor);
406             DECL_TYPED_CHILDREN(PDPDescriptor);
407             DECL_TYPED_CHILDREN(AuthnQueryDescriptorType);
408             DECL_TYPED_CHILDREN(AttributeQueryDescriptorType);
409             DECL_TYPED_CHILDREN(AuthzDecisionQueryDescriptorType);
410             DECL_TYPED_CHILD(Organization);
411             DECL_TYPED_CHILDREN(ContactPerson);
412             DECL_TYPED_CHILDREN(AdditionalMetadataLocation);
413             /** Finds an arbitrary role type supporting a given protocol. */
414             virtual const RoleDescriptor* getRoleDescriptor(const xmltooling::QName& qname, const XMLCh* protocol) const=0;
415             /** EntityDescriptorType local name */
416             static const XMLCh TYPE_NAME[];
417         END_XMLOBJECT;
418
419         BEGIN_XMLOBJECT3(SAML_API,EntitiesDescriptor,SignableObject,CacheableSAMLObject,
420                 TimeBoundSAMLObject,SAML 2.0 EntitiesDescriptor element);
421             DECL_STRING_ATTRIB(ID,ID);
422             DECL_STRING_ATTRIB(Name,NAME);
423             DECL_TYPED_CHILD(Extensions);
424             DECL_TYPED_CHILDREN(EntityDescriptor);
425             DECL_TYPED_CHILDREN(EntitiesDescriptor);
426             /** EntitiesDescriptorType local name */
427             static const XMLCh TYPE_NAME[];
428         END_XMLOBJECT;
429
430         // Known Metadata Extensions
431
432         DECL_XMLOBJECT_SIMPLE(SAML_API,SourceID,ID,SAML 1.x Metadata Profile SourceID element);
433
434         BEGIN_XMLOBJECT(SAML_API,DiscoveryResponse,IndexedEndpointType,Identity Provider Discovery Protocol DiscoveryResponse element);
435         END_XMLOBJECT;
436
437         BEGIN_XMLOBJECT(SAML_API,RequestInitiator,EndpointType,Service Provider Request Initiation RequestInitiator element);
438         END_XMLOBJECT;
439
440         BEGIN_XMLOBJECT(SAML_API,EntityAttributes,xmltooling::XMLObject,SAML Metadata Extension for Entity Attributes element);
441             DECL_TYPED_FOREIGN_CHILDREN(Attribute,saml2);
442             DECL_TYPED_FOREIGN_CHILDREN(Assertion,saml2);
443             /** EntityAttributesType local name */
444             static const XMLCh TYPE_NAME[];
445         END_XMLOBJECT;
446
447         BEGIN_XMLOBJECT(SAML_API,DigestMethod,xmltooling::ElementExtensibleXMLObject,SAML Metadata Extension for Algorithm Support DigestMethod element);
448             DECL_STRING_ATTRIB(Algorithm,ALGORITHM);
449             /** DigestMethodType local name */
450             static const XMLCh TYPE_NAME[];
451         END_XMLOBJECT;
452
453         BEGIN_XMLOBJECT(SAML_API,SigningMethod,xmltooling::ElementExtensibleXMLObject,SAML Metadata Extension for Algorithm Support SigningMethod element);
454             DECL_STRING_ATTRIB(Algorithm,ALGORITHM);
455             DECL_INTEGER_ATTRIB(MinKeySize,MINKEYSIZE);
456             DECL_INTEGER_ATTRIB(MaxKeySize,MAXKEYSIZE);
457             /** SigningMethodType local name */
458             static const XMLCh TYPE_NAME[];
459         END_XMLOBJECT;
460
461         BEGIN_XMLOBJECT(SAML_API,DisplayName,localizedNameType,SAML Metadata Extension for Login UI DisplayName element);
462             DECL_SIMPLE_CONTENT(Name);
463         END_XMLOBJECT;
464
465         BEGIN_XMLOBJECT(SAML_API,Description,localizedNameType,SAML Metadata Extension for Login UI Description element);
466             DECL_SIMPLE_CONTENT(Description);
467         END_XMLOBJECT;
468
469         BEGIN_XMLOBJECT(SAML_API,Keywords,xmltooling::XMLObject,SAML Metadata Extension for Login UI Keywords element);
470             /** xml:lang attribute name. */
471             static const XMLCh LANG_ATTRIB_NAME[];
472
473             /**
474              * Sets the xml:lang attribute.
475              *
476              * @param Lang  the value to set
477              */
478             virtual void setLang(const XMLCh* Lang)=0;
479
480             DECL_SIMPLE_CONTENT(Values);
481             /** KeywordsType local name */
482             static const XMLCh TYPE_NAME[];
483         END_XMLOBJECT;
484
485         BEGIN_XMLOBJECT(SAML_API,Logo,xmltooling::XMLObject,SAML Metadata Extension for Login UI Logo element);
486             /** xml:lang attribute name. */
487             static const XMLCh LANG_ATTRIB_NAME[];
488
489             /**
490              * Sets the xml:lang attribute.
491              *
492              * @param Lang  the value to set
493              */
494             virtual void setLang(const XMLCh* Lang)=0;
495
496             DECL_INTEGER_ATTRIB(Height,HEIGHT);
497             DECL_INTEGER_ATTRIB(Width,WIDTH);
498             DECL_SIMPLE_CONTENT(URL);
499             /** LogoType local name */
500             static const XMLCh TYPE_NAME[];
501         END_XMLOBJECT;
502
503         BEGIN_XMLOBJECT(SAML_API,InformationURL,localizedURIType,SAML Metadata Extension for Login UI InformationURL element);
504             DECL_SIMPLE_CONTENT(URL);
505         END_XMLOBJECT;
506
507         BEGIN_XMLOBJECT(SAML_API,PrivacyStatementURL,localizedURIType,SAML Metadata Extension for Login UI PrivacyStatementURL element);
508             DECL_SIMPLE_CONTENT(URL);
509         END_XMLOBJECT;
510
511         BEGIN_XMLOBJECT(SAML_API,UIInfo,xmltooling::ElementExtensibleXMLObject,SAML Metadata Extension for Login UI UIInfo element);
512             DECL_TYPED_CHILDREN(DisplayName);
513             DECL_TYPED_CHILDREN(Description);
514                         DECL_TYPED_CHILDREN(Keywords);
515             DECL_TYPED_CHILDREN(Logo);
516             DECL_TYPED_CHILDREN(InformationURL);
517             DECL_TYPED_CHILDREN(PrivacyStatementURL);
518             /** UIInfoType local name */
519             static const XMLCh TYPE_NAME[];
520         END_XMLOBJECT;
521
522         DECL_XMLOBJECT_SIMPLE(SAML_API,IPHint,Hint,SAML Metadata Extension for Login UI IPHint element);
523         DECL_XMLOBJECT_SIMPLE(SAML_API,DomainHint,Hint,SAML Metadata Extension for Login UI DomainHint element);
524         DECL_XMLOBJECT_SIMPLE(SAML_API,GeolocationHint,Hint,SAML Metadata Extension for Login UI GeolocationHint element);
525
526         BEGIN_XMLOBJECT(SAML_API,DiscoHints,xmltooling::ElementExtensibleXMLObject,SAML Metadata Extension for Login UI DiscoHints element);
527             DECL_TYPED_CHILDREN(IPHint);
528             DECL_TYPED_CHILDREN(DomainHint);
529             DECL_TYPED_CHILDREN(GeolocationHint);
530             /** DiscoHintsType local name */
531             static const XMLCh TYPE_NAME[];
532         END_XMLOBJECT;
533
534         BEGIN_XMLOBJECT(SAML_API, RegistrationPolicy, localizedURIType, SAML Metadata Extension for RPI RegistrationPolicy element);
535             DECL_SIMPLE_CONTENT(URL);
536         END_XMLOBJECT;
537
538         BEGIN_XMLOBJECT(SAML_API,RegistrationInfo,xmltooling::ElementProxy,SAML Metadata Extension for RPI RegistrationInfo element);
539             DECL_STRING_ATTRIB(RegistrationAuthority,REGAUTHORITY);
540             DECL_DATETIME_ATTRIB(RegistrationInstant,REGINSTANT);
541             DECL_TYPED_CHILDREN(RegistrationPolicy);
542             /** RegistrationInfoType local name */
543             static const XMLCh TYPE_NAME[];
544         END_XMLOBJECT;
545
546         BEGIN_XMLOBJECT(SAML_API,Publication,xmltooling::XMLObject,SAML Metadata Extension for RPI Publication element);
547             DECL_STRING_ATTRIB(Publisher,PUBLISHER);
548             DECL_DATETIME_ATTRIB(CreationInstant,CREATIONINSTANT);
549             DECL_STRING_ATTRIB(PublicationID,PUBLICATIONID);
550             /** PublicationType local name */
551             static const XMLCh TYPE_NAME[];
552         END_XMLOBJECT;
553
554         BEGIN_XMLOBJECT(SAML_API,PublicationPath,xmltooling::XMLObject,SAML Metadata Extension for RPI PublicationPath element);
555             DECL_TYPED_CHILDREN(Publication);
556             /** PublicationPathType local name */
557             static const XMLCh TYPE_NAME[];
558         END_XMLOBJECT;
559
560         BEGIN_XMLOBJECT(SAML_API, UsagePolicy, localizedURIType, SAML Metadata Extension for RPI UsagePolicy element);
561             DECL_SIMPLE_CONTENT(URL);
562         END_XMLOBJECT;
563
564         BEGIN_XMLOBJECT(SAML_API,PublicationInfo,xmltooling::ElementProxy,SAML Metadata Extension for RPI PublicationInfo element);
565                         DECL_STRING_ATTRIB(Publisher,PUBLISHER);
566                         DECL_DATETIME_ATTRIB(CreationInstant,CREATIONINSTANT);
567                         DECL_STRING_ATTRIB(PublicationID,PUBLICATIONID);
568                         DECL_TYPED_CHILDREN(UsagePolicy);
569                         /** PublicationInfoType local name */
570                         static const XMLCh TYPE_NAME[];
571         END_XMLOBJECT;
572
573         /**
574          * Predicate to test a role for validity and protocol support.
575          */
576         class isValidForProtocol
577         {
578         public:
579             /**
580              * Constructor.
581              *
582              * @param protocol  support constant to test for
583              */
584             isValidForProtocol(const XMLCh* protocol) : m_time(time(nullptr)), m_protocol(protocol) {
585             }
586
587             /**
588              * Returns true iff the supplied role is valid now and supports the right protocol.
589              *
590              * @param role  role to test
591              * @return  result of predicate
592              */
593             bool operator()(const RoleDescriptor* role) const {
594                 return role ? (role->isValid(m_time) && role->hasSupport(m_protocol)) : false;
595             }
596
597         private:
598             time_t m_time;
599             const XMLCh* m_protocol;
600         };
601
602         /**
603          * Predicate to test a role for type equivalence, validity, and protocol support.
604          */
605         class ofTypeValidForProtocol : public isValidForProtocol, public xmltooling::hasSchemaType
606         {
607         public:
608             /**
609              * Constructor.
610              *
611              * @param q         schema type to test for
612              * @param protocol  support constant to test for
613              */
614             ofTypeValidForProtocol(const xmltooling::QName& q, const XMLCh* protocol)
615                 : isValidForProtocol(protocol), xmltooling::hasSchemaType(q)  {
616             }
617
618             /**
619              * Returns true iff the supplied role is of the right type, valid now, and supports the right protocol.
620              *
621              * @param role  role to test
622              * @return  result of predicate
623              */
624             bool operator()(const RoleDescriptor* role) const {
625                 return xmltooling::hasSchemaType::operator()(role) && isValidForProtocol::operator()(role);
626             }
627         };
628
629         DECL_SAML2MDOBJECTBUILDER(AdditionalMetadataLocation);
630         DECL_SAML2MDOBJECTBUILDER(AffiliateMember);
631         DECL_SAML2MDOBJECTBUILDER(AffiliationDescriptor);
632         DECL_SAML2MDOBJECTBUILDER(ArtifactResolutionService);
633         DECL_SAML2MDOBJECTBUILDER(AssertionConsumerService);
634         DECL_SAML2MDOBJECTBUILDER(AssertionIDRequestService);
635         DECL_SAML2MDOBJECTBUILDER(AttributeAuthorityDescriptor);
636         DECL_SAML2MDOBJECTBUILDER(AttributeConsumingService);
637         DECL_SAML2MDOBJECTBUILDER(AttributeProfile);
638         DECL_SAML2MDOBJECTBUILDER(AttributeService);
639         DECL_SAML2MDOBJECTBUILDER(AuthnAuthorityDescriptor);
640         DECL_SAML2MDOBJECTBUILDER(AuthnQueryService);
641         DECL_SAML2MDOBJECTBUILDER(AuthzService);
642         DECL_SAML2MDOBJECTBUILDER(Company);
643         DECL_SAML2MDOBJECTBUILDER(ContactPerson);
644         DECL_SAML2MDOBJECTBUILDER(EmailAddress);
645         DECL_SAML2MDOBJECTBUILDER(EntitiesDescriptor);
646         DECL_SAML2MDOBJECTBUILDER(EntityDescriptor);
647         DECL_SAML2MDOBJECTBUILDER(Extensions);
648         DECL_SAML2MDOBJECTBUILDER(GivenName);
649         DECL_SAML2MDOBJECTBUILDER(IDPSSODescriptor);
650         DECL_SAML2MDOBJECTBUILDER(KeyDescriptor);
651         DECL_SAML2MDOBJECTBUILDER(ManageNameIDService);
652         DECL_SAML2MDOBJECTBUILDER(NameIDFormat);
653         DECL_SAML2MDOBJECTBUILDER(NameIDMappingService);
654         DECL_SAML2MDOBJECTBUILDER(Organization);
655         DECL_SAML2MDOBJECTBUILDER(OrganizationName);
656         DECL_SAML2MDOBJECTBUILDER(OrganizationDisplayName);
657         DECL_SAML2MDOBJECTBUILDER(OrganizationURL);
658         DECL_SAML2MDOBJECTBUILDER(PDPDescriptor);
659         DECL_SAML2MDOBJECTBUILDER(RequestedAttribute);
660         DECL_SAML2MDOBJECTBUILDER(ServiceDescription);
661         DECL_SAML2MDOBJECTBUILDER(ServiceName);
662         DECL_SAML2MDOBJECTBUILDER(SingleLogoutService);
663         DECL_SAML2MDOBJECTBUILDER(SingleSignOnService);
664         DECL_SAML2MDOBJECTBUILDER(SPSSODescriptor);
665         DECL_SAML2MDOBJECTBUILDER(SurName);
666         DECL_SAML2MDOBJECTBUILDER(TelephoneNumber);
667
668         DECL_XMLOBJECTBUILDER(SAML_API,ActionNamespace,samlconstants::SAML20MD_QUERY_EXT_NS,samlconstants::SAML20MD_QUERY_EXT_PREFIX);
669         DECL_XMLOBJECTBUILDER(SAML_API,SourceID,samlconstants::SAML1MD_NS,samlconstants::SAML1MD_PREFIX);
670         DECL_XMLOBJECTBUILDER(SAML_API,DiscoveryResponse,samlconstants::IDP_DISCOVERY_PROTOCOL_NS,samlconstants::IDP_DISCOVERY_PROTOCOL_PREFIX);
671         DECL_XMLOBJECTBUILDER(SAML_API,RequestInitiator,samlconstants::SP_REQUEST_INIT_NS,samlconstants::SP_REQUEST_INIT_PREFIX);
672         DECL_XMLOBJECTBUILDER(SAML_API,EntityAttributes,samlconstants::SAML20MD_ENTITY_ATTRIBUTE_NS,samlconstants::SAML20MD_ENTITY_ATTRIBUTE_PREFIX);
673         DECL_XMLOBJECTBUILDER(SAML_API,DigestMethod,samlconstants::SAML20MD_ALGSUPPORT_NS,samlconstants::SAML20MD_ALGSUPPORT_PREFIX);
674         DECL_XMLOBJECTBUILDER(SAML_API,SigningMethod,samlconstants::SAML20MD_ALGSUPPORT_NS,samlconstants::SAML20MD_ALGSUPPORT_PREFIX);
675
676         DECL_XMLOBJECTBUILDER(SAML_API,UIInfo,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
677         DECL_XMLOBJECTBUILDER(SAML_API,DisplayName,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
678         DECL_XMLOBJECTBUILDER(SAML_API,Description,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
679                 DECL_XMLOBJECTBUILDER(SAML_API,Keywords,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
680         DECL_XMLOBJECTBUILDER(SAML_API,Logo,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
681         DECL_XMLOBJECTBUILDER(SAML_API,InformationURL,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
682         DECL_XMLOBJECTBUILDER(SAML_API,PrivacyStatementURL,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
683         DECL_XMLOBJECTBUILDER(SAML_API,DiscoHints,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
684         DECL_XMLOBJECTBUILDER(SAML_API,IPHint,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
685         DECL_XMLOBJECTBUILDER(SAML_API,DomainHint,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
686         DECL_XMLOBJECTBUILDER(SAML_API,GeolocationHint,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
687
688         DECL_XMLOBJECTBUILDER(SAML_API, RegistrationInfo, samlconstants::SAML20MD_RPI_NS, samlconstants::SAML20MD_RPI_PREFIX);
689         DECL_XMLOBJECTBUILDER(SAML_API, RegistrationPolicy, samlconstants::SAML20MD_RPI_NS, samlconstants::SAML20MD_RPI_PREFIX);
690         DECL_XMLOBJECTBUILDER(SAML_API, Publication, samlconstants::SAML20MD_RPI_NS, samlconstants::SAML20MD_RPI_PREFIX);
691         DECL_XMLOBJECTBUILDER(SAML_API, PublicationPath, samlconstants::SAML20MD_RPI_NS, samlconstants::SAML20MD_RPI_PREFIX);
692         DECL_XMLOBJECTBUILDER(SAML_API, PublicationInfo, samlconstants::SAML20MD_RPI_NS, samlconstants::SAML20MD_RPI_PREFIX);
693         DECL_XMLOBJECTBUILDER(SAML_API, UsagePolicy, samlconstants::SAML20MD_RPI_NS, samlconstants::SAML20MD_RPI_PREFIX);
694
695         /**
696          * Builder for localizedNameType objects.
697          *
698          * This is customized to force the element name to be specified.
699          */
700         class SAML_API localizedNameTypeBuilder : public xmltooling::XMLObjectBuilder {
701         public:
702             virtual ~localizedNameTypeBuilder() {}
703             /** Builder that allows element/type override. */
704 #ifdef HAVE_COVARIANT_RETURNS
705             virtual localizedNameType* buildObject(
706 #else
707             virtual xmltooling::XMLObject* buildObject(
708 #endif
709                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=nullptr, const xmltooling::QName* schemaType=nullptr
710                 ) const;
711
712             /** Singleton builder. */
713             static localizedNameType* buildlocalizedNameType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=nullptr) {
714                 const localizedNameTypeBuilder* b = dynamic_cast<const localizedNameTypeBuilder*>(
715                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,localizedNameType::TYPE_NAME))
716                     );
717                 if (b) {
718                     xmltooling::QName schemaType(samlconstants::SAML20MD_NS,localizedNameType::TYPE_NAME,samlconstants::SAML20MD_PREFIX);
719 #ifdef HAVE_COVARIANT_RETURNS
720                     return b->buildObject(nsURI, localName, prefix, &schemaType);
721 #else
722                     return dynamic_cast<localizedNameType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
723 #endif
724                 }
725                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for localizedNameType.");
726             }
727         };
728
729         /**
730          * Builder for localizedURIType objects.
731          *
732          * This is customized to force the element name to be specified.
733          */
734         class SAML_API localizedURITypeBuilder : public xmltooling::XMLObjectBuilder {
735         public:
736             virtual ~localizedURITypeBuilder() {}
737             /** Builder that allows element/type override. */
738 #ifdef HAVE_COVARIANT_RETURNS
739             virtual localizedURIType* buildObject(
740 #else
741             virtual xmltooling::XMLObject* buildObject(
742 #endif
743                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=nullptr, const xmltooling::QName* schemaType=nullptr
744                 ) const;
745
746             /** Singleton builder. */
747             static localizedURIType* buildlocalizedURIType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=nullptr) {
748                 const localizedURITypeBuilder* b = dynamic_cast<const localizedURITypeBuilder*>(
749                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,localizedURIType::TYPE_NAME))
750                     );
751                 if (b) {
752                     xmltooling::QName schemaType(samlconstants::SAML20MD_NS,localizedURIType::TYPE_NAME,samlconstants::SAML20MD_PREFIX);
753 #ifdef HAVE_COVARIANT_RETURNS
754                     return b->buildObject(nsURI, localName, prefix, &schemaType);
755 #else
756                     return dynamic_cast<localizedURIType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
757 #endif
758                 }
759                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for localizedURIType.");
760             }
761         };
762
763         /**
764          * Builder for EndpointType objects.
765          *
766          * This is customized to force the element name to be specified.
767          */
768         class SAML_API EndpointTypeBuilder : public xmltooling::XMLObjectBuilder {
769         public:
770             virtual ~EndpointTypeBuilder() {}
771             /** Builder that allows element/type override. */
772 #ifdef HAVE_COVARIANT_RETURNS
773             virtual EndpointType* buildObject(
774 #else
775             virtual xmltooling::XMLObject* buildObject(
776 #endif
777                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=nullptr, const xmltooling::QName* schemaType=nullptr
778                 ) const;
779
780             /** Singleton builder. */
781             static EndpointType* buildEndpointType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=nullptr) {
782                 const EndpointTypeBuilder* b = dynamic_cast<const EndpointTypeBuilder*>(
783                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,EndpointType::TYPE_NAME))
784                     );
785                 if (b) {
786                     xmltooling::QName schemaType(samlconstants::SAML20MD_NS,EndpointType::TYPE_NAME,samlconstants::SAML20MD_PREFIX);
787 #ifdef HAVE_COVARIANT_RETURNS
788                     return b->buildObject(nsURI, localName, prefix, &schemaType);
789 #else
790                     return dynamic_cast<EndpointType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
791 #endif
792                 }
793                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for EndpointType.");
794             }
795         };
796
797         /**
798          * Builder for IndexedEndpointType objects.
799          *
800          * This is customized to force the element name to be specified.
801          */
802         class SAML_API IndexedEndpointTypeBuilder : public xmltooling::XMLObjectBuilder {
803         public:
804             virtual ~IndexedEndpointTypeBuilder() {}
805             /** Builder that allows element/type override. */
806 #ifdef HAVE_COVARIANT_RETURNS
807             virtual IndexedEndpointType* buildObject(
808 #else
809             virtual xmltooling::XMLObject* buildObject(
810 #endif
811                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=nullptr, const xmltooling::QName* schemaType=nullptr
812                 ) const;
813
814             /** Singleton builder. */
815             static IndexedEndpointType* buildIndexedEndpointType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=nullptr) {
816                 const IndexedEndpointTypeBuilder* b = dynamic_cast<const IndexedEndpointTypeBuilder*>(
817                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,IndexedEndpointType::TYPE_NAME))
818                     );
819                 if (b) {
820                     xmltooling::QName schemaType(samlconstants::SAML20MD_NS,IndexedEndpointType::TYPE_NAME,samlconstants::SAML20MD_PREFIX);
821 #ifdef HAVE_COVARIANT_RETURNS
822                     return b->buildObject(nsURI, localName, prefix, &schemaType);
823 #else
824                     return dynamic_cast<IndexedEndpointType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
825 #endif
826                 }
827                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for IndexedEndpointType.");
828             }
829         };
830
831         /**
832          * Builder for RoleDescriptor extension objects.
833          *
834          * This is customized to force the schema type to be specified.
835          */
836         class SAML_API RoleDescriptorBuilder : public xmltooling::XMLObjectBuilder {
837         public:
838             virtual ~RoleDescriptorBuilder() {}
839             /** Builder that allows element/type override. */
840 #ifdef HAVE_COVARIANT_RETURNS
841             virtual RoleDescriptor* buildObject(
842 #else
843             virtual xmltooling::XMLObject* buildObject(
844 #endif
845                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=nullptr, const xmltooling::QName* schemaType=nullptr
846                 ) const;
847
848             /** Singleton builder. */
849             static RoleDescriptor* buildRoleDescriptor(const xmltooling::QName& schemaType) {
850                 const RoleDescriptorBuilder* b = dynamic_cast<const RoleDescriptorBuilder*>(
851                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,RoleDescriptor::LOCAL_NAME))
852                     );
853                 if (b) {
854 #ifdef HAVE_COVARIANT_RETURNS
855                     return b->buildObject(samlconstants::SAML20MD_NS, RoleDescriptor::LOCAL_NAME, samlconstants::SAML20MD_PREFIX, &schemaType);
856 #else
857                     return dynamic_cast<RoleDescriptor*>(b->buildObject(samlconstants::SAML20MD_NS, RoleDescriptor::LOCAL_NAME, samlconstants::SAML20MD_PREFIX, &schemaType));
858 #endif
859                 }
860                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for RoleDescriptor.");
861             }
862         };
863
864         /**
865          * Builder for AuthnQueryDescriptorType objects.
866          *
867          * This is customized to return a RoleDescriptor element with an
868          * xsi:type of AuthnQueryDescriptorType.
869          */
870         class SAML_API AuthnQueryDescriptorTypeBuilder : public xmltooling::ConcreteXMLObjectBuilder {
871         public:
872             virtual ~AuthnQueryDescriptorTypeBuilder() {}
873             /** Default builder. */
874 #ifdef HAVE_COVARIANT_RETURNS
875             virtual AuthnQueryDescriptorType* buildObject() const {
876 #else
877             virtual xmltooling::XMLObject* buildObject() const {
878 #endif
879                 xmltooling::QName schemaType(
880                     samlconstants::SAML20MD_QUERY_EXT_NS,AuthnQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX
881                     );
882                 return buildObject(
883                     samlconstants::SAML20MD_NS,AuthnQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20MD_PREFIX,&schemaType
884                     );
885             }
886             /** Builder that allows element/type override. */
887 #ifdef HAVE_COVARIANT_RETURNS
888             virtual AuthnQueryDescriptorType* buildObject(
889 #else
890             virtual xmltooling::XMLObject* buildObject(
891 #endif
892                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=nullptr, const xmltooling::QName* schemaType=nullptr
893                 ) const;
894
895             /** Singleton builder. */
896             static AuthnQueryDescriptorType* buildAuthnQueryDescriptorType() {
897                 const AuthnQueryDescriptorTypeBuilder* b = dynamic_cast<const AuthnQueryDescriptorTypeBuilder*>(
898                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_QUERY_EXT_NS,AuthnQueryDescriptorType::TYPE_NAME))
899                     );
900                 if (b) {
901 #ifdef HAVE_COVARIANT_RETURNS
902                     return b->buildObject();
903 #else
904                     return dynamic_cast<AuthnQueryDescriptorType*>(b->buildObject());
905 #endif
906                 }
907                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for AuthnQueryDescriptorType.");
908             }
909         };
910
911         /**
912          * Builder for AttributeQueryDescriptorType objects.
913          *
914          * This is customized to return a RoleDescriptor element with an
915          * xsi:type of AttributeQueryDescriptorType.
916          */
917         class SAML_API AttributeQueryDescriptorTypeBuilder : public xmltooling::ConcreteXMLObjectBuilder {
918         public:
919             virtual ~AttributeQueryDescriptorTypeBuilder() {}
920             /** Default builder. */
921 #ifdef HAVE_COVARIANT_RETURNS
922             virtual AttributeQueryDescriptorType* buildObject() const {
923 #else
924             virtual xmltooling::XMLObject* buildObject() const {
925 #endif
926                 xmltooling::QName schemaType(
927                     samlconstants::SAML20MD_QUERY_EXT_NS,AttributeQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX
928                     );
929                 return buildObject(
930                     samlconstants::SAML20MD_NS,AttributeQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20MD_PREFIX,&schemaType
931                     );
932             }
933             /** Builder that allows element/type override. */
934 #ifdef HAVE_COVARIANT_RETURNS
935             virtual AttributeQueryDescriptorType* buildObject(
936 #else
937             virtual xmltooling::XMLObject* buildObject(
938 #endif
939                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=nullptr, const xmltooling::QName* schemaType=nullptr
940                 ) const;
941
942             /** Singleton builder. */
943             static AttributeQueryDescriptorType* buildAttributeQueryDescriptorType() {
944                 const AttributeQueryDescriptorTypeBuilder* b = dynamic_cast<const AttributeQueryDescriptorTypeBuilder*>(
945                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_QUERY_EXT_NS,AttributeQueryDescriptorType::TYPE_NAME))
946                     );
947                 if (b) {
948 #ifdef HAVE_COVARIANT_RETURNS
949                     return b->buildObject();
950 #else
951                     return dynamic_cast<AttributeQueryDescriptorType*>(b->buildObject());
952 #endif
953                 }
954                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for AttributeQueryDescriptorType.");
955             }
956         };
957
958         /**
959          * Builder for AuthzDecisionQueryDescriptorType objects.
960          *
961          * This is customized to return a RoleDescriptor element with an
962          * xsi:type of AuthzDecisionQueryDescriptorType.
963          */
964         class SAML_API AuthzDecisionQueryDescriptorTypeBuilder : public xmltooling::ConcreteXMLObjectBuilder {
965         public:
966             virtual ~AuthzDecisionQueryDescriptorTypeBuilder() {}
967             /** Default builder. */
968 #ifdef HAVE_COVARIANT_RETURNS
969             virtual AuthzDecisionQueryDescriptorType* buildObject() const {
970 #else
971             virtual xmltooling::XMLObject* buildObject() const {
972 #endif
973                 xmltooling::QName schemaType(
974                     samlconstants::SAML20MD_QUERY_EXT_NS,AuthzDecisionQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX
975                     );
976                 return buildObject(
977                     samlconstants::SAML20MD_NS,AuthzDecisionQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20MD_PREFIX,&schemaType
978                     );
979             }
980             /** Builder that allows element/type override. */
981 #ifdef HAVE_COVARIANT_RETURNS
982             virtual AuthzDecisionQueryDescriptorType* buildObject(
983 #else
984             virtual xmltooling::XMLObject* buildObject(
985 #endif
986                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=nullptr, const xmltooling::QName* schemaType=nullptr
987                 ) const;
988
989             /** Singleton builder. */
990             static AuthzDecisionQueryDescriptorType* buildAuthzDecisionQueryDescriptorType() {
991                 const AuthzDecisionQueryDescriptorTypeBuilder* b = dynamic_cast<const AuthzDecisionQueryDescriptorTypeBuilder*>(
992                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_QUERY_EXT_NS,AuthzDecisionQueryDescriptorType::TYPE_NAME))
993                     );
994                 if (b) {
995 #ifdef HAVE_COVARIANT_RETURNS
996                     return b->buildObject();
997 #else
998                     return dynamic_cast<AuthzDecisionQueryDescriptorType*>(b->buildObject());
999 #endif
1000                 }
1001                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for AuthzDecisionQueryDescriptorType.");
1002             }
1003         };
1004
1005         /**
1006          * Registers builders and validators for SAML 2.0 Metadata classes into the runtime.
1007          */
1008         void SAML_API registerMetadataClasses();
1009     };
1010 };
1011
1012 #endif /* __saml2_metadata_h__ */