Major revamp of credential and trust handling code, PKIX engine still needs work.
[shibboleth/cpp-opensaml.git] / saml / saml2 / metadata / Metadata.h
1 /*
2  *  Copyright 2001-2007 Internet2
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /**
18  * @file saml/saml2/metadata/Metadata.h
19  * 
20  * XMLObjects representing the SAML 2.0 Metadata schema
21  */
22
23 #ifndef __saml2_metadata_h__
24 #define __saml2_metadata_h__
25
26 #include <saml/saml2/core/Assertions.h>
27
28 #include <ctime>
29
30 #define DECL_SAML2MDOBJECTBUILDER(cname) \
31     DECL_XMLOBJECTBUILDER(SAML_API,cname,samlconstants::SAML20MD_NS,samlconstants::SAML20MD_PREFIX)
32
33 namespace opensaml {
34
35     /**
36      * @namespace opensaml::saml2md
37      * SAML 2.0 metadata namespace
38      */
39     namespace saml2md {
40         
41         /**
42          * Base class for metadata objects that feature a cacheDuration attribute.
43          */
44         class SAML_API CacheableSAMLObject : public virtual xmltooling::XMLObject
45         {
46         protected:
47             CacheableSAMLObject() {}
48         public:
49             ~CacheableSAMLObject() {}
50             DECL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION);
51         };
52
53         /**
54          * Base class for metadata objects that feature a validUntil attribute.
55          */
56         class SAML_API TimeBoundSAMLObject : public virtual xmltooling::XMLObject
57         {
58         protected:
59             TimeBoundSAMLObject() {}
60         public:
61             ~TimeBoundSAMLObject() {}
62             DECL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL);
63             /** Returns true iff the object is valid at the current time. */
64             bool isValid() const {
65                 return time(NULL) <= getValidUntilEpoch();
66             }
67         };
68
69         DECL_XMLOBJECT_SIMPLE(SAML_API,AffiliateMember,ID,SAML 2.0 AffiliateMember element);
70         DECL_XMLOBJECT_SIMPLE(SAML_API,AttributeProfile,ProfileURI,SAML 2.0 AttributeProfile element);
71         DECL_XMLOBJECT_SIMPLE(SAML_API,Company,Name,SAML 2.0 Company element);
72         DECL_XMLOBJECT_SIMPLE(SAML_API,EmailAddress,Address,SAML 2.0 EmailAddress element);
73         DECL_XMLOBJECT_SIMPLE(SAML_API,GivenName,Name,SAML 2.0 GivenName element);
74         DECL_XMLOBJECT_SIMPLE(SAML_API,NameIDFormat,Format,SAML 2.0 NameIDFormat element);
75         DECL_XMLOBJECT_SIMPLE(SAML_API,SurName,Name,SAML 2.0 SurName element);
76         DECL_XMLOBJECT_SIMPLE(SAML_API,TelephoneNumber,Number,SAML 2.0 TelephoneNumber element);
77         
78         DECL_XMLOBJECT_SIMPLE(SAML_API,ActionNamespace,Namespace,SAML 2.0 Metadata Extension ActionNamespace element);
79         DECL_XMLOBJECT_SIMPLE(SAML_API,SourceID,ID,SAML 1.x Metadata Profile SourceID element);
80
81         BEGIN_XMLOBJECT(SAML_API,localizedNameType,xmltooling::XMLObject,SAML 2.0 localizedNameType type);
82             DECL_STRING_ATTRIB(Lang,LANG);
83             /** localizedNameType local name */
84             static const XMLCh TYPE_NAME[];
85         END_XMLOBJECT;
86
87         BEGIN_XMLOBJECT(SAML_API,localizedURIType,xmltooling::XMLObject,SAML 2.0 localizedURIType type);
88             DECL_STRING_ATTRIB(Lang,LANG);
89             /** localizedURIType local name */
90             static const XMLCh TYPE_NAME[];
91         END_XMLOBJECT;
92
93         BEGIN_XMLOBJECT(SAML_API,OrganizationName,localizedNameType,SAML 2.0 OrganizationName element);
94             DECL_SIMPLE_CONTENT(Name);
95         END_XMLOBJECT;
96
97         BEGIN_XMLOBJECT(SAML_API,OrganizationDisplayName,localizedNameType,SAML 2.0 OrganizationDisplayName element);
98             DECL_SIMPLE_CONTENT(Name);
99         END_XMLOBJECT;
100
101         BEGIN_XMLOBJECT(SAML_API,OrganizationURL,localizedURIType,SAML 2.0 OrganizationURL element);
102             DECL_SIMPLE_CONTENT(URL);
103         END_XMLOBJECT;
104         
105         BEGIN_XMLOBJECT(SAML_API,Extensions,xmltooling::ElementExtensibleXMLObject,SAML 2.0 Extensions element);
106             /** ExtensionsType local name */
107             static const XMLCh TYPE_NAME[];
108         END_XMLOBJECT;
109
110         BEGIN_XMLOBJECT(SAML_API,Organization,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 Organization element);
111             DECL_TYPED_CHILD(Extensions);
112             DECL_TYPED_CHILDREN(OrganizationName);
113             DECL_TYPED_CHILDREN(OrganizationDisplayName);
114             DECL_TYPED_CHILDREN(OrganizationURL);
115             /** OrganizationType local name */
116             static const XMLCh TYPE_NAME[];
117         END_XMLOBJECT;
118
119         BEGIN_XMLOBJECT(SAML_API,ContactPerson,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 ContactPerson element);
120             DECL_STRING_ATTRIB(ContactType,CONTACTTYPE);
121             DECL_TYPED_CHILD(Extensions);
122             DECL_TYPED_CHILD(Company);
123             DECL_TYPED_CHILD(GivenName);
124             DECL_TYPED_CHILD(SurName);
125             DECL_TYPED_CHILDREN(EmailAddress);
126             DECL_TYPED_CHILDREN(TelephoneNumber);
127             /** ContactType local name */
128             static const XMLCh TYPE_NAME[];
129             /** technical Contact Type */
130             static const XMLCh CONTACT_TECHNICAL[];
131             /** support Contact Type */
132             static const XMLCh CONTACT_SUPPORT[];
133             /** administrative Contact Type */
134             static const XMLCh CONTACT_ADMINISTRATIVE[];
135             /** billing Contact Type */
136             static const XMLCh CONTACT_BILLING[];
137             /** other Contact Type */
138             static const XMLCh CONTACT_OTHER[];
139         END_XMLOBJECT;
140
141         BEGIN_XMLOBJECT(SAML_API,AdditionalMetadataLocation,xmltooling::XMLObject,SAML 2.0 AdditionalMetadataLocation element);
142             DECL_STRING_ATTRIB(Namespace,NAMESPACE);
143             DECL_SIMPLE_CONTENT(Location);
144             /** AdditionalMetadataLocationType local name */
145             static const XMLCh TYPE_NAME[];
146         END_XMLOBJECT;
147
148         BEGIN_XMLOBJECT(SAML_API,KeyDescriptor,xmltooling::XMLObject,SAML 2.0 KeyDescriptor element);
149             DECL_STRING_ATTRIB(Use,USE);
150             DECL_TYPED_FOREIGN_CHILD(KeyInfo,xmlsignature);
151             DECL_TYPED_FOREIGN_CHILDREN(EncryptionMethod,xmlencryption);
152             /** KeyDescriptorType local name */
153             static const XMLCh TYPE_NAME[];
154             /** encryption Key Type */
155             static const XMLCh KEYTYPE_ENCRYPTION[];
156             /** signing Key Type */
157             static const XMLCh KEYTYPE_SIGNING[];
158         END_XMLOBJECT;
159
160         BEGIN_XMLOBJECT4(SAML_API,RoleDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,
161                 CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 RoleDescriptor abstract element);
162             DECL_STRING_ATTRIB(ID,ID);
163             DECL_STRING_ATTRIB(ProtocolSupportEnumeration,PROTOCOLSUPPORTENUMERATION);
164             /** Searches the ProtocolSupportEnumeration attribute for the indicated protocol. */
165             virtual bool hasSupport(const XMLCh* protocol) const=0;
166             DECL_STRING_ATTRIB(ErrorURL,ERRORURL);
167             DECL_TYPED_CHILD(Extensions);
168             DECL_TYPED_CHILDREN(KeyDescriptor);
169             DECL_TYPED_CHILD(Organization);
170             DECL_TYPED_CHILDREN(ContactPerson);
171         END_XMLOBJECT;
172
173         BEGIN_XMLOBJECT(SAML_API,EndpointType,xmltooling::ElementProxy,SAML 2.0 EndpointType type);
174             DECL_STRING_ATTRIB(Binding,BINDING);
175             DECL_STRING_ATTRIB(Location,LOCATION);
176             DECL_STRING_ATTRIB(ResponseLocation,RESPONSELOCATION);
177             /** EndpointType local name */
178             static const XMLCh TYPE_NAME[];
179         END_XMLOBJECT;
180
181         BEGIN_XMLOBJECT(SAML_API,IndexedEndpointType,EndpointType,SAML 2.0 IndexedEndpointType type);
182             DECL_INTEGER_ATTRIB(Index,INDEX);
183             DECL_BOOLEAN_ATTRIB(isDefault,ISDEFAULT,false);
184             /** IndexedEndpointType local name */
185             static const XMLCh TYPE_NAME[];
186         END_XMLOBJECT;
187
188         BEGIN_XMLOBJECT(SAML_API,ArtifactResolutionService,IndexedEndpointType,SAML 2.0 ArtifactResolutionService element);
189         END_XMLOBJECT;
190
191         BEGIN_XMLOBJECT(SAML_API,SingleLogoutService,EndpointType,SAML 2.0 SingleLogoutService element);
192         END_XMLOBJECT;
193
194         BEGIN_XMLOBJECT(SAML_API,ManageNameIDService,EndpointType,SAML 2.0 ManageNameIDService element);
195         END_XMLOBJECT;
196
197         BEGIN_XMLOBJECT(SAML_API,SSODescriptorType,RoleDescriptor,SAML 2.0 SSODescriptorType abstract type);
198             DECL_TYPED_CHILDREN(ArtifactResolutionService);
199             DECL_TYPED_CHILDREN(SingleLogoutService);
200             DECL_TYPED_CHILDREN(ManageNameIDService);
201             DECL_TYPED_CHILDREN(NameIDFormat);
202             /** SSODescriptorType local name */
203             static const XMLCh TYPE_NAME[];
204         END_XMLOBJECT;
205
206         BEGIN_XMLOBJECT(SAML_API,SingleSignOnService,EndpointType,SAML 2.0 SingleSignOnService element);
207         END_XMLOBJECT;
208
209         BEGIN_XMLOBJECT(SAML_API,NameIDMappingService,EndpointType,SAML 2.0 NameIDMappingService element);
210         END_XMLOBJECT;
211
212         BEGIN_XMLOBJECT(SAML_API,AssertionIDRequestService,EndpointType,SAML 2.0 AssertionIDRequestService element);
213         END_XMLOBJECT;
214
215         BEGIN_XMLOBJECT(SAML_API,IDPSSODescriptor,SSODescriptorType,SAML 2.0 IDPSSODescriptor element);
216             DECL_BOOLEAN_ATTRIB(WantAuthnRequestsSigned,WANTAUTHNREQUESTSSIGNED,false);
217             DECL_TYPED_CHILDREN(SingleSignOnService);
218             DECL_TYPED_CHILDREN(NameIDMappingService);
219             DECL_TYPED_CHILDREN(AssertionIDRequestService);
220             DECL_TYPED_CHILDREN(AttributeProfile);
221             DECL_TYPED_FOREIGN_CHILDREN(Attribute,saml2);
222             /** IDPSSODescriptorType local name */
223             static const XMLCh TYPE_NAME[];
224         END_XMLOBJECT;
225
226         BEGIN_XMLOBJECT(SAML_API,ServiceName,localizedNameType,SAML 2.0 ServiceName element);
227             DECL_SIMPLE_CONTENT(Name);
228         END_XMLOBJECT;
229
230         BEGIN_XMLOBJECT(SAML_API,ServiceDescription,localizedNameType,SAML 2.0 ServiceDescription element);
231             DECL_SIMPLE_CONTENT(Description);
232         END_XMLOBJECT;
233
234         BEGIN_XMLOBJECT(SAML_API,RequestedAttribute,saml2::Attribute,SAML 2.0 RequestedAttribute element);
235             DECL_BOOLEAN_ATTRIB(isRequired,ISREQUIRED,false);
236             /** RequestedAttributeType local name */
237             static const XMLCh TYPE_NAME[];
238         END_XMLOBJECT;
239
240         BEGIN_XMLOBJECT(SAML_API,AttributeConsumingService,xmltooling::XMLObject,SAML 2.0 AttributeConsumingService element);
241             DECL_INTEGER_ATTRIB(Index,INDEX);
242             DECL_BOOLEAN_ATTRIB(isDefault,ISDEFAULT,false);
243             DECL_TYPED_CHILDREN(ServiceName);
244             DECL_TYPED_CHILDREN(ServiceDescription);
245             DECL_TYPED_CHILDREN(RequestedAttribute);
246             /** AttributeConsumingServiceType local name */
247             static const XMLCh TYPE_NAME[];
248         END_XMLOBJECT;
249
250         BEGIN_XMLOBJECT(SAML_API,AssertionConsumerService,IndexedEndpointType,SAML 2.0 AssertionConsumerService element);
251         END_XMLOBJECT;
252
253         BEGIN_XMLOBJECT(SAML_API,SPSSODescriptor,SSODescriptorType,SAML 2.0 SPSSODescriptor element);
254             DECL_BOOLEAN_ATTRIB(AuthnRequestsSigned,AUTHNREQUESTSSIGNED,false);
255             DECL_BOOLEAN_ATTRIB(WantAssertionsSigned,WANTASSERTIONSSIGNED,false);
256             DECL_TYPED_CHILDREN(AssertionConsumerService);
257             DECL_TYPED_CHILDREN(AttributeConsumingService);
258             /** SPSSODescriptorType local name */
259             static const XMLCh TYPE_NAME[];
260         END_XMLOBJECT;
261
262         BEGIN_XMLOBJECT(SAML_API,AuthnQueryService,EndpointType,SAML 2.0 AuthnQueryService element);
263         END_XMLOBJECT;
264
265         BEGIN_XMLOBJECT(SAML_API,AuthnAuthorityDescriptor,RoleDescriptor,SAML 2.0 AuthnAuthorityDescriptor element);
266             DECL_TYPED_CHILDREN(AuthnQueryService);
267             DECL_TYPED_CHILDREN(AssertionIDRequestService);
268             DECL_TYPED_CHILDREN(NameIDFormat);
269             /** AuthnAuthorityDescriptorType local name */
270             static const XMLCh TYPE_NAME[];
271         END_XMLOBJECT;
272
273         BEGIN_XMLOBJECT(SAML_API,AuthzService,EndpointType,SAML 2.0 AuthzService element);
274         END_XMLOBJECT;
275
276         BEGIN_XMLOBJECT(SAML_API,PDPDescriptor,RoleDescriptor,SAML 2.0 PDPDescriptor element);
277             DECL_TYPED_CHILDREN(AuthzService);
278             DECL_TYPED_CHILDREN(AssertionIDRequestService);
279             DECL_TYPED_CHILDREN(NameIDFormat);
280             /** PDPDescriptorType local name */
281             static const XMLCh TYPE_NAME[];
282         END_XMLOBJECT;
283
284         BEGIN_XMLOBJECT(SAML_API,AttributeService,EndpointType,SAML 2.0 AttributeService element);
285         END_XMLOBJECT;
286
287         BEGIN_XMLOBJECT(SAML_API,AttributeAuthorityDescriptor,RoleDescriptor,SAML 2.0 AttributeAuthorityDescriptor element);
288             DECL_TYPED_CHILDREN(AttributeService);
289             DECL_TYPED_CHILDREN(AssertionIDRequestService);
290             DECL_TYPED_CHILDREN(NameIDFormat);
291             DECL_TYPED_CHILDREN(AttributeProfile);
292             DECL_TYPED_FOREIGN_CHILDREN(Attribute,saml2);
293             /** AttributeAuthorityDescriptorType local name */
294             static const XMLCh TYPE_NAME[];
295         END_XMLOBJECT;
296
297         BEGIN_XMLOBJECT(SAML_API,QueryDescriptorType,RoleDescriptor,SAML 2.0 QueryDescriptorType abstract type);
298             DECL_BOOLEAN_ATTRIB(WantAssertionsSigned,WANTASSERTIONSSIGNED,false);
299             DECL_TYPED_CHILDREN(NameIDFormat);
300             /** QueryDescriptorType local name */
301             static const XMLCh TYPE_NAME[];
302         END_XMLOBJECT;
303
304         BEGIN_XMLOBJECT(SAML_API,AuthnQueryDescriptorType,QueryDescriptorType,SAML 2.0 AuthnQueryDescriptorType extension type);
305             /** AuthnQueryDescriptorType local name */
306             static const XMLCh TYPE_NAME[];
307         END_XMLOBJECT;
308
309         BEGIN_XMLOBJECT(SAML_API,AttributeQueryDescriptorType,QueryDescriptorType,SAML 2.0 AttributeQueryDescriptorType extension type);
310             DECL_TYPED_CHILDREN(AttributeConsumingService);
311             /** AttributeQueryDescriptorType local name */
312             static const XMLCh TYPE_NAME[];
313         END_XMLOBJECT;
314
315         BEGIN_XMLOBJECT(SAML_API,AuthzDecisionQueryDescriptorType,QueryDescriptorType,SAML 2.0 AuthzDecisionQueryDescriptorType extension type);
316             DECL_TYPED_CHILDREN(ActionNamespace);
317             /** AuthzDecisionQueryDescriptorType local name */
318             static const XMLCh TYPE_NAME[];
319         END_XMLOBJECT;
320
321         BEGIN_XMLOBJECT4(SAML_API,AffiliationDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,
322                 CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 AffiliationDescriptor element);
323             DECL_STRING_ATTRIB(ID,ID);
324             DECL_STRING_ATTRIB(AffiliationOwnerID,AFFILIATIONOWNERID);
325             DECL_TYPED_CHILD(Extensions);
326             DECL_TYPED_CHILDREN(AffiliateMember);
327             DECL_TYPED_CHILDREN(KeyDescriptor);
328             /** AffiliationDescriptorType local name */
329             static const XMLCh TYPE_NAME[];
330         END_XMLOBJECT;
331
332         BEGIN_XMLOBJECT4(SAML_API,EntityDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,
333                 CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 EntityDescriptor element);
334             DECL_STRING_ATTRIB(ID,ID);
335             DECL_STRING_ATTRIB(EntityID,ENTITYID);
336             DECL_TYPED_CHILD(Extensions);
337             DECL_TYPED_CHILD(AffiliationDescriptor);
338             DECL_TYPED_CHILDREN(RoleDescriptor);
339             DECL_TYPED_CHILDREN(IDPSSODescriptor);
340             DECL_TYPED_CHILDREN(SPSSODescriptor);
341             DECL_TYPED_CHILDREN(AuthnAuthorityDescriptor);
342             DECL_TYPED_CHILDREN(AttributeAuthorityDescriptor);
343             DECL_TYPED_CHILDREN(PDPDescriptor);
344             DECL_TYPED_CHILDREN(AuthnQueryDescriptorType);
345             DECL_TYPED_CHILDREN(AttributeQueryDescriptorType);
346             DECL_TYPED_CHILDREN(AuthzDecisionQueryDescriptorType);
347             DECL_TYPED_CHILD(Organization);
348             DECL_TYPED_CHILDREN(ContactPerson);
349             DECL_TYPED_CHILDREN(AdditionalMetadataLocation);
350             /** Finds an IDP role supporting a given protocol. */
351             virtual const IDPSSODescriptor* getIDPSSODescriptor(const XMLCh* protocol) const=0;
352             /** Finds an SP role supporting a given protocol. */
353             virtual const SPSSODescriptor* getSPSSODescriptor(const XMLCh* protocol) const=0;
354             /** Finds an Authn Authority role supporting a given protocol. */
355             virtual const AuthnAuthorityDescriptor* getAuthnAuthorityDescriptor(const XMLCh* protocol) const=0;
356             /** Finds an Attribute Authority role supporting a given protocol. */
357             virtual const AttributeAuthorityDescriptor* getAttributeAuthorityDescriptor(const XMLCh* protocol) const=0;
358             /** Finds a PDP role supporting a given protocol. */
359             virtual const PDPDescriptor* getPDPDescriptor(const XMLCh* protocol) const=0;
360             /** Finds an AuthnQuery role supporting a given protocol. */
361             virtual const AuthnQueryDescriptorType* getAuthnQueryDescriptorType(const XMLCh* protocol) const=0;
362             /** Finds an AttributeQuery role supporting a given protocol. */
363             virtual const AttributeQueryDescriptorType* getAttributeQueryDescriptorType(const XMLCh* protocol) const=0;
364             /** Finds an AuthzDecisionQuery role supporting a given protocol. */
365             virtual const AuthzDecisionQueryDescriptorType* getAuthzDecisionQueryDescriptorType(const XMLCh* protocol) const=0;
366             /** Finds an extension role supporting a given protocol. */
367             virtual const RoleDescriptor* getRoleDescriptor(const xmltooling::QName& qname, const XMLCh* protocol) const=0;
368             /** EntityDescriptorType local name */
369             static const XMLCh TYPE_NAME[];
370         END_XMLOBJECT;
371
372         BEGIN_XMLOBJECT3(SAML_API,EntitiesDescriptor,SignableObject,CacheableSAMLObject,
373                 TimeBoundSAMLObject,SAML 2.0 EntitiesDescriptor element);
374             DECL_STRING_ATTRIB(ID,ID);
375             DECL_STRING_ATTRIB(Name,NAME);
376             DECL_TYPED_CHILD(Extensions);
377             DECL_TYPED_CHILDREN(EntityDescriptor);
378             DECL_TYPED_CHILDREN(EntitiesDescriptor);
379             /** EntitiesDescriptorType local name */
380             static const XMLCh TYPE_NAME[];
381         END_XMLOBJECT;
382
383         DECL_SAML2MDOBJECTBUILDER(AdditionalMetadataLocation);
384         DECL_SAML2MDOBJECTBUILDER(AffiliateMember);
385         DECL_SAML2MDOBJECTBUILDER(AffiliationDescriptor);
386         DECL_SAML2MDOBJECTBUILDER(ArtifactResolutionService);
387         DECL_SAML2MDOBJECTBUILDER(AssertionConsumerService);
388         DECL_SAML2MDOBJECTBUILDER(AssertionIDRequestService);
389         DECL_SAML2MDOBJECTBUILDER(AttributeAuthorityDescriptor);
390         DECL_SAML2MDOBJECTBUILDER(AttributeConsumingService);
391         DECL_SAML2MDOBJECTBUILDER(AttributeProfile);
392         DECL_SAML2MDOBJECTBUILDER(AttributeService);
393         DECL_SAML2MDOBJECTBUILDER(AuthnAuthorityDescriptor);
394         DECL_SAML2MDOBJECTBUILDER(AuthnQueryService);
395         DECL_SAML2MDOBJECTBUILDER(AuthzService);
396         DECL_SAML2MDOBJECTBUILDER(Company);
397         DECL_SAML2MDOBJECTBUILDER(ContactPerson);
398         DECL_SAML2MDOBJECTBUILDER(EmailAddress);
399         DECL_SAML2MDOBJECTBUILDER(EntitiesDescriptor);
400         DECL_SAML2MDOBJECTBUILDER(EntityDescriptor);
401         DECL_SAML2MDOBJECTBUILDER(Extensions);
402         DECL_SAML2MDOBJECTBUILDER(GivenName);
403         DECL_SAML2MDOBJECTBUILDER(IDPSSODescriptor);
404         DECL_SAML2MDOBJECTBUILDER(KeyDescriptor);
405         DECL_SAML2MDOBJECTBUILDER(ManageNameIDService);
406         DECL_SAML2MDOBJECTBUILDER(NameIDFormat);
407         DECL_SAML2MDOBJECTBUILDER(NameIDMappingService);
408         DECL_SAML2MDOBJECTBUILDER(Organization);
409         DECL_SAML2MDOBJECTBUILDER(OrganizationName);
410         DECL_SAML2MDOBJECTBUILDER(OrganizationDisplayName);
411         DECL_SAML2MDOBJECTBUILDER(OrganizationURL);
412         DECL_SAML2MDOBJECTBUILDER(PDPDescriptor);
413         DECL_SAML2MDOBJECTBUILDER(RequestedAttribute);
414         DECL_SAML2MDOBJECTBUILDER(ServiceDescription);
415         DECL_SAML2MDOBJECTBUILDER(ServiceName);
416         DECL_SAML2MDOBJECTBUILDER(SingleLogoutService);
417         DECL_SAML2MDOBJECTBUILDER(SingleSignOnService);
418         DECL_SAML2MDOBJECTBUILDER(SPSSODescriptor);
419         DECL_SAML2MDOBJECTBUILDER(SurName);
420         DECL_SAML2MDOBJECTBUILDER(TelephoneNumber);
421         
422         DECL_XMLOBJECTBUILDER(SAML_API,ActionNamespace,samlconstants::SAML20MD_QUERY_EXT_NS,samlconstants::SAML20MD_QUERY_EXT_PREFIX);
423         DECL_XMLOBJECTBUILDER(SAML_API,SourceID,samlconstants::SAML1MD_NS,samlconstants::SAML1MD_PREFIX);
424
425         /**
426          * Builder for localizedNameType objects.
427          * 
428          * This is customized to force the element name to be specified.
429          */
430         class SAML_API localizedNameTypeBuilder : public xmltooling::XMLObjectBuilder {
431         public:
432             virtual ~localizedNameTypeBuilder() {}
433             /** Builder that allows element/type override. */
434 #ifdef HAVE_COVARIANT_RETURNS
435             virtual localizedNameType* buildObject(
436 #else
437             virtual xmltooling::XMLObject* buildObject(
438 #endif
439                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
440                 ) const;
441         
442             /** Singleton builder. */
443             static localizedNameType* buildlocalizedNameType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
444                 const localizedNameTypeBuilder* b = dynamic_cast<const localizedNameTypeBuilder*>(
445                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,localizedNameType::TYPE_NAME))
446                     );
447                 if (b) {
448                     xmltooling::QName schemaType(samlconstants::SAML20MD_NS,localizedNameType::TYPE_NAME,samlconstants::SAML20MD_PREFIX);
449 #ifdef HAVE_COVARIANT_RETURNS
450                     return b->buildObject(nsURI, localName, prefix, &schemaType);
451 #else
452                     return dynamic_cast<localizedNameType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
453 #endif
454                 }
455                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for localizedNameType.");
456             }
457         };
458
459         /**
460          * Builder for localizedURIType objects.
461          * 
462          * This is customized to force the element name to be specified.
463          */
464         class SAML_API localizedURITypeBuilder : public xmltooling::XMLObjectBuilder {
465         public:
466             virtual ~localizedURITypeBuilder() {}
467             /** Builder that allows element/type override. */
468 #ifdef HAVE_COVARIANT_RETURNS
469             virtual localizedURIType* buildObject(
470 #else
471             virtual xmltooling::XMLObject* buildObject(
472 #endif
473                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
474                 ) const;
475         
476             /** Singleton builder. */
477             static localizedURIType* buildlocalizedURIType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
478                 const localizedURITypeBuilder* b = dynamic_cast<const localizedURITypeBuilder*>(
479                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,localizedURIType::TYPE_NAME))
480                     );
481                 if (b) {
482                     xmltooling::QName schemaType(samlconstants::SAML20MD_NS,localizedURIType::TYPE_NAME,samlconstants::SAML20MD_PREFIX);
483 #ifdef HAVE_COVARIANT_RETURNS
484                     return b->buildObject(nsURI, localName, prefix, &schemaType);
485 #else
486                     return dynamic_cast<localizedURIType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
487 #endif
488                 }
489                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for localizedURIType.");
490             }
491         };
492
493         /**
494          * Builder for EndpointType objects.
495          * 
496          * This is customized to force the element name to be specified.
497          */
498         class SAML_API EndpointTypeBuilder : public xmltooling::XMLObjectBuilder {
499         public:
500             virtual ~EndpointTypeBuilder() {}
501             /** Builder that allows element/type override. */
502 #ifdef HAVE_COVARIANT_RETURNS
503             virtual EndpointType* buildObject(
504 #else
505             virtual xmltooling::XMLObject* buildObject(
506 #endif
507                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
508                 ) const;
509         
510             /** Singleton builder. */
511             static EndpointType* buildEndpointType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
512                 const EndpointTypeBuilder* b = dynamic_cast<const EndpointTypeBuilder*>(
513                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,EndpointType::TYPE_NAME))
514                     );
515                 if (b) {
516                     xmltooling::QName schemaType(samlconstants::SAML20MD_NS,EndpointType::TYPE_NAME,samlconstants::SAML20MD_PREFIX);
517 #ifdef HAVE_COVARIANT_RETURNS
518                     return b->buildObject(nsURI, localName, prefix, &schemaType);
519 #else
520                     return dynamic_cast<EndpointType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
521 #endif
522                 }
523                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for EndpointType.");
524             }
525         };
526
527         /**
528          * Builder for IndexedEndpointType objects.
529          * 
530          * This is customized to force the element name to be specified.
531          */
532         class SAML_API IndexedEndpointTypeBuilder : public xmltooling::XMLObjectBuilder {
533         public:
534             virtual ~IndexedEndpointTypeBuilder() {}
535             /** Builder that allows element/type override. */
536 #ifdef HAVE_COVARIANT_RETURNS
537             virtual IndexedEndpointType* buildObject(
538 #else
539             virtual xmltooling::XMLObject* buildObject(
540 #endif
541                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
542                 ) const;
543         
544             /** Singleton builder. */
545             static IndexedEndpointType* buildIndexedEndpointType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
546                 const IndexedEndpointTypeBuilder* b = dynamic_cast<const IndexedEndpointTypeBuilder*>(
547                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,IndexedEndpointType::TYPE_NAME))
548                     );
549                 if (b) {
550                     xmltooling::QName schemaType(samlconstants::SAML20MD_NS,IndexedEndpointType::TYPE_NAME,samlconstants::SAML20MD_PREFIX);
551 #ifdef HAVE_COVARIANT_RETURNS
552                     return b->buildObject(nsURI, localName, prefix, &schemaType);
553 #else
554                     return dynamic_cast<IndexedEndpointType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
555 #endif
556                 }
557                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for IndexedEndpointType.");
558             }
559         };
560
561         /**
562          * Builder for AuthnQueryDescriptorType objects.
563          * 
564          * This is customized to return a RoleDescriptor element with an
565          * xsi:type of AuthnQueryDescriptorType.
566          */
567         class SAML_API AuthnQueryDescriptorTypeBuilder : public xmltooling::XMLObjectBuilder {
568         public:
569             virtual ~AuthnQueryDescriptorTypeBuilder() {}
570             /** Default builder. */
571 #ifdef HAVE_COVARIANT_RETURNS
572             virtual AuthnQueryDescriptorType* buildObject() const {
573 #else
574             virtual xmltooling::XMLObject* buildObject() const {
575 #endif
576                 xmltooling::QName schemaType(
577                     samlconstants::SAML20_NS,AuthnQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX
578                     );
579                 return buildObject(
580                     samlconstants::SAML20_NS,AuthnQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20_PREFIX,&schemaType
581                     );
582             }
583             /** Builder that allows element/type override. */
584 #ifdef HAVE_COVARIANT_RETURNS
585             virtual AuthnQueryDescriptorType* buildObject(
586 #else
587             virtual xmltooling::XMLObject* buildObject(
588 #endif
589                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
590                 ) const;
591         
592             /** Singleton builder. */
593             static AuthnQueryDescriptorType* buildAuthnQueryDescriptorType() {
594                 const AuthnQueryDescriptorTypeBuilder* b = dynamic_cast<const AuthnQueryDescriptorTypeBuilder*>(
595                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_QUERY_EXT_NS,AuthnQueryDescriptorType::TYPE_NAME))
596                     );
597                 if (b) {
598 #ifdef HAVE_COVARIANT_RETURNS
599                     return b->buildObject();
600 #else
601                     return dynamic_cast<AuthnQueryDescriptorType*>(b->buildObject());
602 #endif
603                 }
604                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for AuthnQueryDescriptorType.");
605             }
606         };
607
608         /**
609          * Builder for AttributeQueryDescriptorType objects.
610          * 
611          * This is customized to return a RoleDescriptor element with an
612          * xsi:type of AttributeQueryDescriptorType.
613          */
614         class SAML_API AttributeQueryDescriptorTypeBuilder : public xmltooling::XMLObjectBuilder {
615         public:
616             virtual ~AttributeQueryDescriptorTypeBuilder() {}
617             /** Default builder. */
618 #ifdef HAVE_COVARIANT_RETURNS
619             virtual AttributeQueryDescriptorType* buildObject() const {
620 #else
621             virtual xmltooling::XMLObject* buildObject() const {
622 #endif
623                 xmltooling::QName schemaType(
624                     samlconstants::SAML20_NS,AttributeQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX
625                     );
626                 return buildObject(
627                     samlconstants::SAML20_NS,AttributeQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20_PREFIX,&schemaType
628                     );
629             }
630             /** Builder that allows element/type override. */
631 #ifdef HAVE_COVARIANT_RETURNS
632             virtual AttributeQueryDescriptorType* buildObject(
633 #else
634             virtual xmltooling::XMLObject* buildObject(
635 #endif
636                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
637                 ) const;
638         
639             /** Singleton builder. */
640             static AttributeQueryDescriptorType* buildAttributeQueryDescriptorType() {
641                 const AttributeQueryDescriptorTypeBuilder* b = dynamic_cast<const AttributeQueryDescriptorTypeBuilder*>(
642                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_QUERY_EXT_NS,AttributeQueryDescriptorType::TYPE_NAME))
643                     );
644                 if (b) {
645 #ifdef HAVE_COVARIANT_RETURNS
646                     return b->buildObject();
647 #else
648                     return dynamic_cast<AttributeQueryDescriptorType*>(b->buildObject());
649 #endif
650                 }
651                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for AttributeQueryDescriptorType.");
652             }
653         };
654
655         /**
656          * Builder for AuthzDecisionQueryDescriptorType objects.
657          * 
658          * This is customized to return a RoleDescriptor element with an
659          * xsi:type of AuthzDecisionQueryDescriptorType.
660          */
661         class SAML_API AuthzDecisionQueryDescriptorTypeBuilder : public xmltooling::XMLObjectBuilder {
662         public:
663             virtual ~AuthzDecisionQueryDescriptorTypeBuilder() {}
664             /** Default builder. */
665 #ifdef HAVE_COVARIANT_RETURNS
666             virtual AuthzDecisionQueryDescriptorType* buildObject() const {
667 #else
668             virtual xmltooling::XMLObject* buildObject() const {
669 #endif
670                 xmltooling::QName schemaType(
671                     samlconstants::SAML20_NS,AuthzDecisionQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX
672                     );
673                 return buildObject(
674                     samlconstants::SAML20_NS,AuthzDecisionQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20_PREFIX,&schemaType
675                     );
676             }
677             /** Builder that allows element/type override. */
678 #ifdef HAVE_COVARIANT_RETURNS
679             virtual AuthzDecisionQueryDescriptorType* buildObject(
680 #else
681             virtual xmltooling::XMLObject* buildObject(
682 #endif
683                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
684                 ) const;
685         
686             /** Singleton builder. */
687             static AuthzDecisionQueryDescriptorType* buildAuthzDecisionQueryDescriptorType() {
688                 const AuthzDecisionQueryDescriptorTypeBuilder* b = dynamic_cast<const AuthzDecisionQueryDescriptorTypeBuilder*>(
689                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_QUERY_EXT_NS,AuthzDecisionQueryDescriptorType::TYPE_NAME))
690                     );
691                 if (b) {
692 #ifdef HAVE_COVARIANT_RETURNS
693                     return b->buildObject();
694 #else
695                     return dynamic_cast<AuthzDecisionQueryDescriptorType*>(b->buildObject());
696 #endif
697                 }
698                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for AuthzDecisionQueryDescriptorType.");
699             }
700         };
701
702         /**
703          * Registers builders and validators for SAML 2.0 Metadata classes into the runtime.
704          */
705         void SAML_API registerMetadataClasses();
706     };
707 };
708
709 #endif /* __saml2_metadata_h__ */