First metadata check-in, misc. fixes.
[shibboleth/cpp-opensaml.git] / saml / saml2 / metadata / Metadata.h
1 /*
2  *  Copyright 2001-2006 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 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 #include <saml/util/SAMLConstants.h>
28
29 #include <xmltooling/AttributeExtensibleXMLObject.h>
30 #include <xmltooling/ElementProxy.h>
31 #include <xmltooling/SimpleElement.h>
32 #include <xmltooling/XMLObjectBuilder.h>
33 #include <xmltooling/encryption/Encryption.h>
34 #include <xmltooling/signature/KeyInfo.h>
35 #include <xmltooling/signature/Signature.h>
36 #include <xmltooling/util/DateTime.h>
37 #include <xmltooling/validation/ValidatingXMLObject.h>
38
39 #define DECL_SAML2MDOBJECTBUILDER(cname) \
40     DECL_XMLOBJECTBUILDER(SAML_API,cname,opensaml::SAMLConstants::SAML20MD_NS,opensaml::SAMLConstants::SAML20MD_PREFIX)
41
42 namespace opensaml {
43
44     /**
45      * @namespace saml2md
46      * SAML 2.0 metadata namespace
47      */
48     namespace saml2md {
49         
50         DECL_XMLOBJECT_SIMPLE(SAML_API,AffiliateMember,ID,SAML 2.0 AffiliateMember element);
51         DECL_XMLOBJECT_SIMPLE(SAML_API,AttributeProfile,ProfileURI,SAML 2.0 AttributeProfile element);
52         DECL_XMLOBJECT_SIMPLE(SAML_API,Company,Name,SAML 2.0 Company element);
53         DECL_XMLOBJECT_SIMPLE(SAML_API,EmailAddress,Address,SAML 2.0 EmailAddress element);
54         DECL_XMLOBJECT_SIMPLE(SAML_API,GivenName,Name,SAML 2.0 GivenName element);
55         DECL_XMLOBJECT_SIMPLE(SAML_API,NameIDFormat,Format,SAML 2.0 NameIDFormat element);
56         DECL_XMLOBJECT_SIMPLE(SAML_API,SurName,Name,SAML 2.0 SurName element);
57         DECL_XMLOBJECT_SIMPLE(SAML_API,TelephoneNumber,Number,SAML 2.0 TelephoneNumber element);
58
59         BEGIN_XMLOBJECT(SAML_API,localizedNameType,xmltooling::SimpleElement,SAML 2.0 localizedNameType type);
60             DECL_STRING_ATTRIB(Lang,LANG);
61             /** localizedNameType local name */
62             static const XMLCh TYPE_NAME[];
63         END_XMLOBJECT;
64
65         BEGIN_XMLOBJECT(SAML_API,localizedURIType,xmltooling::SimpleElement,SAML 2.0 localizedURIType type);
66             DECL_STRING_ATTRIB(Lang,LANG);
67             /** localizedURIType local name */
68             static const XMLCh TYPE_NAME[];
69         END_XMLOBJECT;
70
71         BEGIN_XMLOBJECT(SAML_API,OrganizationName,localizedNameType,SAML 2.0 OrganizationName element);
72             DECL_XMLOBJECT_CONTENT(Name);
73         END_XMLOBJECT;
74
75         BEGIN_XMLOBJECT(SAML_API,OrganizationDisplayName,localizedNameType,SAML 2.0 OrganizationDisplayName element);
76             DECL_XMLOBJECT_CONTENT(Name);
77         END_XMLOBJECT;
78
79         BEGIN_XMLOBJECT(SAML_API,OrganizationURL,localizedURIType,SAML 2.0 OrganizationURL element);
80             DECL_XMLOBJECT_CONTENT(URL);
81         END_XMLOBJECT;
82         
83         BEGIN_XMLOBJECT(SAML_API,Extensions,xmltooling::ElementProxy,SAML 2.0 Extensions element);
84             /** ExtensionsType local name */
85             static const XMLCh TYPE_NAME[];
86         END_XMLOBJECT;
87
88         BEGIN_XMLOBJECT(SAML_API,Organization,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 Organization element);
89             DECL_TYPED_CHILD(Extensions);
90             DECL_TYPED_CHILDREN(OrganizationName);
91             DECL_TYPED_CHILDREN(OrganizationDisplayName);
92             DECL_TYPED_CHILDREN(OrganizationURL);
93             /** OrganizationType local name */
94             static const XMLCh TYPE_NAME[];
95         END_XMLOBJECT;
96
97         BEGIN_XMLOBJECT(SAML_API,ContactPerson,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 ContactPerson element);
98             DECL_STRING_ATTRIB(ContactType,CONTACTTYPE);
99             DECL_TYPED_CHILD(Extensions);
100             DECL_TYPED_CHILD(Company);
101             DECL_TYPED_CHILD(GivenName);
102             DECL_TYPED_CHILD(SurName);
103             DECL_TYPED_CHILDREN(EmailAddress);
104             DECL_TYPED_CHILDREN(TelephoneNumber);
105             /** ContactType local name */
106             static const XMLCh TYPE_NAME[];
107             /** technical Contact Type */
108             static const XMLCh CONTACT_TECHNICAL[];
109             /** support Contact Type */
110             static const XMLCh CONTACT_SUPPORT[];
111             /** administrative Contact Type */
112             static const XMLCh CONTACT_ADMINISTRATIVE[];
113             /** billing Contact Type */
114             static const XMLCh CONTACT_BILLING[];
115             /** other Contact Type */
116             static const XMLCh CONTACT_OTHER[];
117         END_XMLOBJECT;
118
119         BEGIN_XMLOBJECT(SAML_API,AdditionalMetadataLocation,xmltooling::SimpleElement,SAML 2.0 AdditionalMetadataLocation element);
120             DECL_STRING_ATTRIB(Namespace,NAMESPACE);
121             DECL_XMLOBJECT_CONTENT(Location);
122             /** AdditionalMetadataLocationType local name */
123             static const XMLCh TYPE_NAME[];
124         END_XMLOBJECT;
125
126         BEGIN_XMLOBJECT(SAML_API,KeyDescriptor,xmltooling::XMLObject,SAML 2.0 KeyDescriptor element);
127             DECL_STRING_ATTRIB(Use,USE);
128             DECL_TYPED_FOREIGN_CHILD(KeyInfo,xmlsignature);
129             DECL_TYPED_FOREIGN_CHILDREN(EncryptionMethod,xmlencryption);
130             /** KeyDescriptorType local name */
131             static const XMLCh TYPE_NAME[];
132             /** encryption Key Type */
133             static const XMLCh KEYTYPE_ENCRYPTION[];
134             /** signing Key Type */
135             static const XMLCh KEYTYPE_SIGNING[];
136         END_XMLOBJECT;
137
138         BEGIN_XMLOBJECT2(SAML_API,RoleDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,SAML 2.0 RoleDescriptor abstract element);
139             DECL_STRING_ATTRIB(ID,ID);
140             DECL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL);
141             DECL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION);
142             DECL_STRING_ATTRIB(ProtocolSupportEnumeration,PROTOCOLSUPPORTENUMERATION);
143             DECL_STRING_ATTRIB(ErrorURL,ERRORURL);
144             DECL_TYPED_FOREIGN_CHILD(Signature,xmlsignature);
145             DECL_TYPED_CHILD(Extensions);
146             DECL_TYPED_CHILDREN(KeyDescriptor);
147             DECL_TYPED_CHILD(Organization);
148             DECL_TYPED_CHILDREN(ContactPerson);
149         END_XMLOBJECT;
150
151         BEGIN_XMLOBJECT2(SAML_API,EndpointType,xmltooling::ElementProxy,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 EndpointType type);
152             DECL_STRING_ATTRIB(Binding,BINDING);
153             DECL_STRING_ATTRIB(Location,LOCATION);
154             DECL_STRING_ATTRIB(ResponseLocation,RESPONSELOCATION);
155             /** EndpointType local name */
156             static const XMLCh TYPE_NAME[];
157         END_XMLOBJECT;
158
159         BEGIN_XMLOBJECT(SAML_API,IndexedEndpointType,EndpointType,SAML 2.0 IndexedEndpointType type);
160             DECL_INTEGER_ATTRIB(Index,INDEX);
161             DECL_BOOLEAN_ATTRIB(isDefault,ISDEFAULT);
162             /** IndexedEndpointType local name */
163             static const XMLCh TYPE_NAME[];
164         END_XMLOBJECT;
165
166         BEGIN_XMLOBJECT(SAML_API,ArtifactResolutionService,IndexedEndpointType,SAML 2.0 ArtifactResolutionService element);
167         END_XMLOBJECT;
168
169         BEGIN_XMLOBJECT(SAML_API,SingleLogoutService,EndpointType,SAML 2.0 SingleLogoutService element);
170         END_XMLOBJECT;
171
172         BEGIN_XMLOBJECT(SAML_API,ManageNameIDService,EndpointType,SAML 2.0 ManageNameIDService element);
173         END_XMLOBJECT;
174
175         BEGIN_XMLOBJECT(SAML_API,SSODescriptorType,RoleDescriptor,SAML 2.0 SSODescriptorType abstract type);
176             DECL_TYPED_CHILDREN(ArtifactResolutionService);
177             DECL_TYPED_CHILDREN(SingleLogoutService);
178             DECL_TYPED_CHILDREN(ManageNameIDService);
179             DECL_TYPED_CHILDREN(NameIDFormat);
180             /** SSODescriptorType local name */
181             static const XMLCh TYPE_NAME[];
182         END_XMLOBJECT;
183
184         BEGIN_XMLOBJECT(SAML_API,SingleSignOnService,EndpointType,SAML 2.0 SingleSignOnService element);
185         END_XMLOBJECT;
186
187         BEGIN_XMLOBJECT(SAML_API,NameIDMappingService,EndpointType,SAML 2.0 NameIDMappingService element);
188         END_XMLOBJECT;
189
190         BEGIN_XMLOBJECT(SAML_API,AssertionIDRequestService,EndpointType,SAML 2.0 AssertionIDRequestService element);
191         END_XMLOBJECT;
192
193         BEGIN_XMLOBJECT(SAML_API,IDPSSODescriptor,SSODescriptorType,SAML 2.0 IDPSSODescriptor element);
194             DECL_BOOLEAN_ATTRIB(WantAuthnRequestsSigned,WANTAUTHNREQUESTSSIGNED);
195             DECL_TYPED_CHILDREN(SingleSignOnService);
196             DECL_TYPED_CHILDREN(NameIDMappingService);
197             DECL_TYPED_CHILDREN(AssertionIDRequestService);
198             DECL_TYPED_CHILDREN(AttributeProfile);
199             DECL_TYPED_FOREIGN_CHILDREN(Attribute,saml2);
200             /** IDPSSODescriptorType local name */
201             static const XMLCh TYPE_NAME[];
202         END_XMLOBJECT;
203
204         BEGIN_XMLOBJECT(SAML_API,ServiceName,localizedNameType,SAML 2.0 ServiceName element);
205             DECL_XMLOBJECT_CONTENT(Name);
206         END_XMLOBJECT;
207
208         BEGIN_XMLOBJECT(SAML_API,ServiceDescription,localizedNameType,SAML 2.0 ServiceDescription element);
209             DECL_XMLOBJECT_CONTENT(Description);
210         END_XMLOBJECT;
211
212         BEGIN_XMLOBJECT(SAML_API,RequestedAttribute,saml2::Attribute,SAML 2.0 RequestedAttribute element);
213             DECL_BOOLEAN_ATTRIB(isRequired,ISREQUIRED);
214             /** RequestedAttributeType local name */
215             static const XMLCh TYPE_NAME[];
216         END_XMLOBJECT;
217
218         BEGIN_XMLOBJECT(SAML_API,AttributeConsumingService,xmltooling::XMLObject,SAML 2.0 AttributeConsumingService element);
219             DECL_INTEGER_ATTRIB(Index,INDEX);
220             DECL_BOOLEAN_ATTRIB(isDefault,ISDEFAULT);
221             DECL_TYPED_CHILDREN(ServiceName);
222             DECL_TYPED_CHILDREN(ServiceDescription);
223             DECL_TYPED_CHILDREN(RequestedAttribute);
224             /** AttributeConsumingServiceType local name */
225             static const XMLCh TYPE_NAME[];
226         END_XMLOBJECT;
227
228         BEGIN_XMLOBJECT(SAML_API,AssertionConsumerService,IndexedEndpointType,SAML 2.0 AssertionConsumerService element);
229         END_XMLOBJECT;
230
231         BEGIN_XMLOBJECT(SAML_API,SPSSODescriptor,SSODescriptorType,SAML 2.0 SPSSODescriptor element);
232             DECL_BOOLEAN_ATTRIB(AuthnRequestsSigned,AUTHNREQUESTSSIGNED);
233             DECL_BOOLEAN_ATTRIB(WantAssertionsSigned,WANTASSERTIONSSIGNED);
234             DECL_TYPED_CHILDREN(AssertionConsumerService);
235             DECL_TYPED_CHILDREN(AttributeConsumingService);
236             /** SPSSODescriptorType local name */
237             static const XMLCh TYPE_NAME[];
238         END_XMLOBJECT;
239
240         BEGIN_XMLOBJECT(SAML_API,AuthnQueryService,EndpointType,SAML 2.0 AuthnQueryService element);
241         END_XMLOBJECT;
242
243         BEGIN_XMLOBJECT(SAML_API,AuthnAuthorityDescriptor,RoleDescriptor,SAML 2.0 AuthnAuthorityDescriptor element);
244             DECL_TYPED_CHILDREN(AuthnQueryService);
245             DECL_TYPED_CHILDREN(AssertionIDRequestService);
246             DECL_TYPED_CHILDREN(NameIDFormat);
247             /** AuthnAuthorityDescriptorType local name */
248             static const XMLCh TYPE_NAME[];
249         END_XMLOBJECT;
250
251         BEGIN_XMLOBJECT(SAML_API,AuthzService,EndpointType,SAML 2.0 AuthzService element);
252         END_XMLOBJECT;
253
254         BEGIN_XMLOBJECT(SAML_API,PDPDescriptor,RoleDescriptor,SAML 2.0 PDPDescriptor element);
255             DECL_TYPED_CHILDREN(AuthzService);
256             DECL_TYPED_CHILDREN(AssertionIDRequestService);
257             DECL_TYPED_CHILDREN(NameIDFormat);
258             /** PDPDescriptorType local name */
259             static const XMLCh TYPE_NAME[];
260         END_XMLOBJECT;
261
262         BEGIN_XMLOBJECT(SAML_API,AttributeService,EndpointType,SAML 2.0 AttributeService element);
263         END_XMLOBJECT;
264
265         BEGIN_XMLOBJECT(SAML_API,AttributeAuthorityDescriptor,RoleDescriptor,SAML 2.0 AttributeAuthorityDescriptor element);
266             DECL_TYPED_CHILDREN(AttributeService);
267             DECL_TYPED_CHILDREN(AssertionIDRequestService);
268             DECL_TYPED_CHILDREN(NameIDFormat);
269             DECL_TYPED_CHILDREN(AttributeProfile);
270             DECL_TYPED_FOREIGN_CHILDREN(Attribute,saml2);
271             /** AttributeAuthorityDescriptorType local name */
272             static const XMLCh TYPE_NAME[];
273         END_XMLOBJECT;
274
275         BEGIN_XMLOBJECT2(SAML_API,AffiliationDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,SAML 2.0 AffiliationDescriptor element);
276             DECL_STRING_ATTRIB(ID,ID);
277             DECL_STRING_ATTRIB(AffiliationOwnerID,AFFILIATIONOWNERID);
278             DECL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL);
279             DECL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION);
280             DECL_TYPED_FOREIGN_CHILD(Signature,xmlsignature);
281             DECL_TYPED_CHILD(Extensions);
282             DECL_TYPED_CHILDREN(AffiliateMember);
283             DECL_TYPED_CHILDREN(KeyDescriptor);
284             /** AffiliationDescriptorType local name */
285             static const XMLCh TYPE_NAME[];
286         END_XMLOBJECT;
287
288         BEGIN_XMLOBJECT2(SAML_API,EntityDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,SAML 2.0 EntityDescriptor element);
289             DECL_STRING_ATTRIB(ID,ID);
290             DECL_STRING_ATTRIB(EntityID,ENTITYID);
291             DECL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL);
292             DECL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION);
293             DECL_TYPED_FOREIGN_CHILD(Signature,xmlsignature);
294             DECL_TYPED_CHILD(Extensions);
295             DECL_TYPED_CHILD(AffiliationDescriptor);
296             DECL_TYPED_CHILDREN(RoleDescriptor);
297             DECL_TYPED_CHILDREN(IDPSSODescriptor);
298             DECL_TYPED_CHILDREN(SPSSODescriptor);
299             DECL_TYPED_CHILDREN(AuthnAuthorityDescriptor);
300             DECL_TYPED_CHILDREN(AttributeAuthorityDescriptor);
301             DECL_TYPED_CHILDREN(PDPDescriptor);
302             /** EntityDescriptorType local name */
303             static const XMLCh TYPE_NAME[];
304         END_XMLOBJECT;
305
306         BEGIN_XMLOBJECT(SAML_API,EntitiesDescriptor,SignableObject,SAML 2.0 EntitiesDescriptor element);
307             DECL_STRING_ATTRIB(ID,ID);
308             DECL_STRING_ATTRIB(Name,NAME);
309             DECL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL);
310             DECL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION);
311             DECL_TYPED_FOREIGN_CHILD(Signature,xmlsignature);
312             DECL_TYPED_CHILD(Extensions);
313             DECL_TYPED_CHILDREN(EntityDescriptor);
314             DECL_TYPED_CHILDREN(EntitiesDescriptor);
315             /** EntitiesDescriptorType local name */
316             static const XMLCh TYPE_NAME[];
317         END_XMLOBJECT;
318
319         DECL_SAML2MDOBJECTBUILDER(AdditionalMetadataLocation);
320         DECL_SAML2MDOBJECTBUILDER(AffiliateMember);
321         DECL_SAML2MDOBJECTBUILDER(AffiliationDescriptor);
322         DECL_SAML2MDOBJECTBUILDER(ArtifactResolutionService);
323         DECL_SAML2MDOBJECTBUILDER(AssertionConsumerService);
324         DECL_SAML2MDOBJECTBUILDER(AssertionIDRequestService);
325         DECL_SAML2MDOBJECTBUILDER(AttributeAuthorityDescriptor);
326         DECL_SAML2MDOBJECTBUILDER(AttributeConsumingService);
327         DECL_SAML2MDOBJECTBUILDER(AttributeProfile);
328         DECL_SAML2MDOBJECTBUILDER(AttributeService);
329         DECL_SAML2MDOBJECTBUILDER(AuthnAuthorityDescriptor);
330         DECL_SAML2MDOBJECTBUILDER(AuthnQueryService);
331         DECL_SAML2MDOBJECTBUILDER(AuthzService);
332         DECL_SAML2MDOBJECTBUILDER(Company);
333         DECL_SAML2MDOBJECTBUILDER(ContactPerson);
334         DECL_SAML2MDOBJECTBUILDER(EmailAddress);
335         DECL_SAML2MDOBJECTBUILDER(EntitiesDescriptor);
336         DECL_SAML2MDOBJECTBUILDER(EntityDescriptor);
337         DECL_SAML2MDOBJECTBUILDER(Extensions);
338         DECL_SAML2MDOBJECTBUILDER(GivenName);
339         DECL_SAML2MDOBJECTBUILDER(IDPSSODescriptor);
340         DECL_SAML2MDOBJECTBUILDER(KeyDescriptor);
341         DECL_SAML2MDOBJECTBUILDER(ManageNameIDService);
342         DECL_SAML2MDOBJECTBUILDER(NameIDFormat);
343         DECL_SAML2MDOBJECTBUILDER(NameIDMappingService);
344         DECL_SAML2MDOBJECTBUILDER(Organization);
345         DECL_SAML2MDOBJECTBUILDER(OrganizationName);
346         DECL_SAML2MDOBJECTBUILDER(OrganizationDisplayName);
347         DECL_SAML2MDOBJECTBUILDER(OrganizationURL);
348         DECL_SAML2MDOBJECTBUILDER(PDPDescriptor);
349         DECL_SAML2MDOBJECTBUILDER(RequestedAttribute);
350         DECL_SAML2MDOBJECTBUILDER(ServiceDescription);
351         DECL_SAML2MDOBJECTBUILDER(ServiceName);
352         DECL_SAML2MDOBJECTBUILDER(SingleLogoutService);
353         DECL_SAML2MDOBJECTBUILDER(SingleSignOnService);
354         DECL_SAML2MDOBJECTBUILDER(SPSSODescriptor);
355         DECL_SAML2MDOBJECTBUILDER(SurName);
356         DECL_SAML2MDOBJECTBUILDER(TelephoneNumber);
357
358         /**
359          * Builder for localizedNameType objects.
360          * 
361          * This is customized to force the element name to be specified.
362          */
363         class SAML_API localizedNameTypeBuilder : public xmltooling::XMLObjectBuilder {
364         public:
365             virtual ~localizedNameTypeBuilder() {}
366             /** Builder that allows element/type override. */
367             virtual localizedNameType* buildObject(
368                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
369                 ) const;
370         
371             /** Singleton builder. */
372             static localizedNameType* buildlocalizedNameType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
373                 const localizedNameTypeBuilder* b = dynamic_cast<const localizedNameTypeBuilder*>(
374                     XMLObjectBuilder::getBuilder(xmltooling::QName(SAMLConstants::SAML20MD_NS,localizedNameType::TYPE_NAME))
375                     );
376                 if (b) {
377                     xmltooling::QName schemaType(SAMLConstants::SAML20MD_NS,localizedNameType::TYPE_NAME,SAMLConstants::SAML20MD_PREFIX);
378                     return b->buildObject(nsURI, localName, prefix, &schemaType);
379                 }
380                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for localizedNameType.");
381             }
382         };
383
384         /**
385          * Builder for localizedURIType objects.
386          * 
387          * This is customized to force the element name to be specified.
388          */
389         class SAML_API localizedURITypeBuilder : public xmltooling::XMLObjectBuilder {
390         public:
391             virtual ~localizedURITypeBuilder() {}
392             /** Builder that allows element/type override. */
393             virtual localizedURIType* buildObject(
394                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
395                 ) const;
396         
397             /** Singleton builder. */
398             static localizedURIType* buildlocalizedURIType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
399                 const localizedURITypeBuilder* b = dynamic_cast<const localizedURITypeBuilder*>(
400                     XMLObjectBuilder::getBuilder(xmltooling::QName(SAMLConstants::SAML20MD_NS,localizedURIType::TYPE_NAME))
401                     );
402                 if (b) {
403                     xmltooling::QName schemaType(SAMLConstants::SAML20MD_NS,localizedURIType::TYPE_NAME,SAMLConstants::SAML20MD_PREFIX);
404                     return b->buildObject(nsURI, localName, prefix, &schemaType);
405                 }
406                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for localizedURIType.");
407             }
408         };
409
410         /**
411          * Builder for EndpointType objects.
412          * 
413          * This is customized to force the element name to be specified.
414          */
415         class SAML_API EndpointTypeBuilder : public xmltooling::XMLObjectBuilder {
416         public:
417             virtual ~EndpointTypeBuilder() {}
418             /** Builder that allows element/type override. */
419             virtual EndpointType* buildObject(
420                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
421                 ) const;
422         
423             /** Singleton builder. */
424             static EndpointType* buildEndpointType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
425                 const EndpointTypeBuilder* b = dynamic_cast<const EndpointTypeBuilder*>(
426                     XMLObjectBuilder::getBuilder(xmltooling::QName(SAMLConstants::SAML20MD_NS,EndpointType::TYPE_NAME))
427                     );
428                 if (b) {
429                     xmltooling::QName schemaType(SAMLConstants::SAML20MD_NS,EndpointType::TYPE_NAME,SAMLConstants::SAML20MD_PREFIX);
430                     return b->buildObject(nsURI, localName, prefix, &schemaType);
431                 }
432                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for EndpointType.");
433             }
434         };
435
436         /**
437          * Builder for IndexedEndpointType objects.
438          * 
439          * This is customized to force the element name to be specified.
440          */
441         class SAML_API IndexedEndpointTypeBuilder : public xmltooling::XMLObjectBuilder {
442         public:
443             virtual ~IndexedEndpointTypeBuilder() {}
444             /** Builder that allows element/type override. */
445             virtual IndexedEndpointType* buildObject(
446                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
447                 ) const;
448         
449             /** Singleton builder. */
450             static IndexedEndpointType* buildIndexedEndpointType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
451                 const IndexedEndpointTypeBuilder* b = dynamic_cast<const IndexedEndpointTypeBuilder*>(
452                     XMLObjectBuilder::getBuilder(xmltooling::QName(SAMLConstants::SAML20MD_NS,IndexedEndpointType::TYPE_NAME))
453                     );
454                 if (b) {
455                     xmltooling::QName schemaType(SAMLConstants::SAML20MD_NS,IndexedEndpointType::TYPE_NAME,SAMLConstants::SAML20MD_PREFIX);
456                     return b->buildObject(nsURI, localName, prefix, &schemaType);
457                 }
458                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for IndexedEndpointType.");
459             }
460         };
461
462         /**
463          * Registers builders and validators for Metadata classes into the runtime.
464          */
465         void SAML_API registerMetadataClasses();
466     };
467 };
468
469 #endif /* __saml2_metadata_h__ */