Completed 2.0 assertions schema classes.
[shibboleth/cpp-opensaml.git] / saml / saml1 / core / impl / AssertionsImpl.cpp
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  * AssertionsImpl.cpp
19  * 
20  * Implementation classes for SAML 1.x Assertions schema
21  */
22
23 #include "internal.h"
24 #include "exceptions.h"
25 #include "saml1/core/Assertions.h"
26
27 #include <xmltooling/AbstractChildlessElement.h>
28 #include <xmltooling/AbstractComplexElement.h>
29 #include <xmltooling/AbstractElementProxy.h>
30 #include <xmltooling/AbstractSimpleElement.h>
31 #include <xmltooling/impl/AnyElement.h>
32 #include <xmltooling/io/AbstractXMLObjectMarshaller.h>
33 #include <xmltooling/io/AbstractXMLObjectUnmarshaller.h>
34 #include <xmltooling/util/XMLHelper.h>
35 #include <xmltooling/validation/AbstractValidatingXMLObject.h>
36
37 #include <ctime>
38 #include <xercesc/util/XMLUniDefs.hpp>
39
40 using namespace opensaml::saml1;
41 using namespace opensaml;
42 using namespace xmlsignature;
43 using namespace xmltooling;
44 using namespace std;
45
46 #if defined (_MSC_VER)
47     #pragma warning( push )
48     #pragma warning( disable : 4250 4251 )
49 #endif
50
51 namespace opensaml {
52     namespace saml1 {
53     
54         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,AssertionIDReference);
55         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,Audience);
56         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,ConfirmationMethod);
57         
58         class SAML_DLLLOCAL AudienceRestrictionConditionImpl : public virtual AudienceRestrictionCondition,
59             public AbstractComplexElement,
60             public AbstractDOMCachingXMLObject,
61             public AbstractValidatingXMLObject,
62             public AbstractXMLObjectMarshaller,
63             public AbstractXMLObjectUnmarshaller
64         {
65         public:
66             virtual ~AudienceRestrictionConditionImpl() {}
67     
68             AudienceRestrictionConditionImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
69                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
70             }
71                 
72             AudienceRestrictionConditionImpl(const AudienceRestrictionConditionImpl& src)
73                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
74                 VectorOf(Audience) v=getAudiences();
75                 for (vector<Audience*>::const_iterator i=src.m_Audiences.begin(); i!=src.m_Audiences.end(); i++) {
76                     if (*i) {
77                         v.push_back((*i)->cloneAudience());
78                     }
79                 }
80             }
81             
82             IMPL_XMLOBJECT_CLONE(AudienceRestrictionCondition);
83             Condition* cloneCondition() const {
84                 return cloneAudienceRestrictionCondition();
85             }
86             IMPL_TYPED_CHILDREN(Audience,m_children.end());
87     
88         protected:
89             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
90                 PROC_TYPED_CHILDREN(Audience,SAMLConstants::SAML1_NS,false);
91                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
92             }
93         };
94
95         class SAML_DLLLOCAL DoNotCacheConditionImpl : public virtual DoNotCacheCondition,
96             public AbstractChildlessElement,
97             public AbstractDOMCachingXMLObject,
98             public AbstractValidatingXMLObject,
99             public AbstractXMLObjectMarshaller,
100             public AbstractXMLObjectUnmarshaller
101         {
102         public:
103             virtual ~DoNotCacheConditionImpl() {}
104     
105             DoNotCacheConditionImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
106                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
107             }
108                 
109             DoNotCacheConditionImpl(const DoNotCacheConditionImpl& src)
110                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
111             }
112             
113             IMPL_XMLOBJECT_CLONE(DoNotCacheCondition);
114             Condition* cloneCondition() const {
115                 return cloneDoNotCacheCondition();
116             }
117         };
118
119         class SAML_DLLLOCAL ConditionsImpl : public virtual Conditions,
120             public AbstractComplexElement,
121             public AbstractDOMCachingXMLObject,
122             public AbstractValidatingXMLObject,
123             public AbstractXMLObjectMarshaller,
124             public AbstractXMLObjectUnmarshaller
125         {
126         public:
127             virtual ~ConditionsImpl() {
128                 delete m_NotBefore;
129                 delete m_NotOnOrAfter;
130             }
131     
132             ConditionsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
133                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
134                 init();
135             }
136                 
137             ConditionsImpl(const ConditionsImpl& src)
138                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
139                 init();
140                 setNotBefore(src.getNotBefore());
141                 setNotOnOrAfter(src.getNotOnOrAfter());
142
143                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
144                     if (*i) {
145                         AudienceRestrictionCondition* arc=dynamic_cast<AudienceRestrictionCondition*>(*i);
146                         if (arc) {
147                             getAudienceRestrictionConditions().push_back(arc->cloneAudienceRestrictionCondition());
148                             continue;
149                         }
150     
151                         DoNotCacheCondition* dncc=dynamic_cast<DoNotCacheCondition*>(*i);
152                         if (dncc) {
153                             getDoNotCacheConditions().push_back(dncc->cloneDoNotCacheCondition());
154                             continue;
155                         }
156     
157                         Condition* c=dynamic_cast<Condition*>(*i);
158                         if (c) {
159                             getConditions().push_back(c->cloneCondition());
160                             continue;
161                         }
162                     }
163                 }
164             }
165             
166             void init() {
167                 m_NotBefore=m_NotOnOrAfter=NULL;
168             }
169             
170             IMPL_XMLOBJECT_CLONE(Conditions);
171             IMPL_DATETIME_ATTRIB(NotBefore);
172             IMPL_DATETIME_ATTRIB(NotOnOrAfter);
173             IMPL_TYPED_CHILDREN(AudienceRestrictionCondition, m_children.end());
174             IMPL_TYPED_CHILDREN(DoNotCacheCondition,m_children.end());
175             IMPL_TYPED_CHILDREN(Condition,m_children.end());
176     
177         protected:
178             void marshallAttributes(DOMElement* domElement) const {
179                 MARSHALL_DATETIME_ATTRIB(NotBefore,NOTBEFORE,NULL);
180                 MARSHALL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,NULL);
181             }
182     
183             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
184                 PROC_TYPED_CHILDREN(AudienceRestrictionCondition,SAMLConstants::SAML1_NS,true);
185                 PROC_TYPED_CHILDREN(DoNotCacheCondition,SAMLConstants::SAML1_NS,true);
186                 PROC_TYPED_CHILDREN(Condition,SAMLConstants::SAML1_NS,true);
187                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
188             }
189     
190             void processAttribute(const DOMAttr* attribute) {
191                 PROC_DATETIME_ATTRIB(NotBefore,NOTBEFORE,NULL);
192                 PROC_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,NULL);
193             }
194         };
195
196         class SAML_DLLLOCAL NameIdentifierImpl : public virtual NameIdentifier,
197             public AbstractSimpleElement,
198             public AbstractChildlessElement,
199             public AbstractDOMCachingXMLObject,
200             public AbstractValidatingXMLObject,
201             public AbstractXMLObjectMarshaller,
202             public AbstractXMLObjectUnmarshaller
203         {
204         public:
205             virtual ~NameIdentifierImpl() {
206                 XMLString::release(&m_Format);
207                 XMLString::release(&m_NameQualifier);
208             }
209     
210             NameIdentifierImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
211                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
212                 init();
213             }
214                 
215             NameIdentifierImpl(const NameIdentifierImpl& src)
216                     : AbstractXMLObject(src), AbstractSimpleElement(src),
217                         AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
218                 init();
219                 setFormat(src.getFormat());
220                 setNameQualifier(src.getNameQualifier());
221             }
222             
223             void init() {
224                 m_Format=m_NameQualifier=NULL;
225             }
226             
227             IMPL_XMLOBJECT_CLONE(NameIdentifier);
228             IMPL_STRING_ATTRIB(Format);
229             IMPL_STRING_ATTRIB(NameQualifier);
230             IMPL_XMLOBJECT_CONTENT;
231     
232         protected:
233             void marshallAttributes(DOMElement* domElement) const {
234                 MARSHALL_STRING_ATTRIB(Format,FORMAT,NULL);
235                 MARSHALL_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER,NULL);
236             }
237
238             void processAttribute(const DOMAttr* attribute) {
239                 PROC_STRING_ATTRIB(Format,FORMAT,NULL);
240                 PROC_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER,NULL);
241             }
242         };
243
244         class SAML_DLLLOCAL SubjectConfirmationDataImpl
245             : public virtual SubjectConfirmationData, public AnyElementImpl, public AbstractValidatingXMLObject
246         {
247         public:
248             virtual ~SubjectConfirmationDataImpl() {}
249     
250             SubjectConfirmationDataImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
251                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
252             }
253                 
254             SubjectConfirmationDataImpl(const SubjectConfirmationDataImpl& src)
255                 : AnyElementImpl(src), AbstractValidatingXMLObject(src) {
256             }
257             
258             IMPL_XMLOBJECT_CLONE(SubjectConfirmationData);
259         };
260
261         class SAML_DLLLOCAL SubjectConfirmationImpl : public virtual SubjectConfirmation,
262             public AbstractComplexElement,
263             public AbstractDOMCachingXMLObject,
264             public AbstractValidatingXMLObject,
265             public AbstractXMLObjectMarshaller,
266             public AbstractXMLObjectUnmarshaller
267         {
268         public:
269             virtual ~SubjectConfirmationImpl() {}
270     
271             SubjectConfirmationImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
272                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
273                 init();
274             }
275                 
276             SubjectConfirmationImpl(const SubjectConfirmationImpl& src)
277                     : AbstractXMLObject(src),
278                         AbstractDOMCachingXMLObject(src),
279                         AbstractValidatingXMLObject(src) {
280                 init();
281                 if (src.getSubjectConfirmationData())
282                     setSubjectConfirmationData(src.getSubjectConfirmationData()->clone());
283                 if (src.getKeyInfo())
284                     setKeyInfo(src.getKeyInfo()->cloneKeyInfo());
285                 VectorOf(ConfirmationMethod) v=getConfirmationMethods();
286                 for (vector<ConfirmationMethod*>::const_iterator i=src.m_ConfirmationMethods.begin(); i!=src.m_ConfirmationMethods.end(); i++) {
287                     if (*i) {
288                         v.push_back((*i)->cloneConfirmationMethod());
289                     }
290                 }
291             }
292             
293             void init() {
294                 m_SubjectConfirmationData=NULL;
295                 m_KeyInfo=NULL;
296                 m_children.push_back(NULL);
297                 m_children.push_back(NULL);
298                 m_pos_SubjectConfirmationData=m_children.begin();
299                 m_pos_KeyInfo=m_pos_SubjectConfirmationData;
300                 ++m_pos_KeyInfo;
301             }
302
303             IMPL_XMLOBJECT_CLONE(SubjectConfirmation);
304             IMPL_TYPED_CHILDREN(ConfirmationMethod,m_pos_SubjectConfirmationData);
305             IMPL_XMLOBJECT_CHILD(SubjectConfirmationData);
306             IMPL_TYPED_CHILD(KeyInfo);
307     
308         protected:
309             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
310                 PROC_TYPED_CHILDREN(ConfirmationMethod,SAMLConstants::SAML1_NS,false);
311                 PROC_TYPED_CHILD(KeyInfo,XMLConstants::XMLSIG_NS,false);
312                 
313                 // Anything else we'll assume is the data.
314                 if (getSubjectConfirmationData())
315                     throw UnmarshallingException("Invalid child element: $1",params(1,childXMLObject->getElementQName().toString().c_str()));
316                 setSubjectConfirmationData(childXMLObject);
317             }
318         };
319
320         class SAML_DLLLOCAL SubjectImpl : public virtual Subject,
321             public AbstractComplexElement,
322             public AbstractDOMCachingXMLObject,
323             public AbstractValidatingXMLObject,
324             public AbstractXMLObjectMarshaller,
325             public AbstractXMLObjectUnmarshaller
326         {
327         public:
328             virtual ~SubjectImpl() {}
329     
330             SubjectImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
331                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
332                 init();
333             }
334                 
335             SubjectImpl(const SubjectImpl& src)
336                     : AbstractXMLObject(src),
337                         AbstractDOMCachingXMLObject(src),
338                         AbstractValidatingXMLObject(src) {
339                 init();
340                 if (src.getNameIdentifier())
341                     setNameIdentifier(src.getNameIdentifier()->cloneNameIdentifier());
342                 if (src.getSubjectConfirmation())
343                     setSubjectConfirmation(src.getSubjectConfirmation()->cloneSubjectConfirmation());
344             }
345             
346             void init() {
347                 m_NameIdentifier=NULL;
348                 m_SubjectConfirmation=NULL;
349                 m_children.push_back(NULL);
350                 m_children.push_back(NULL);
351                 m_pos_NameIdentifier=m_children.begin();
352                 m_pos_SubjectConfirmation=m_pos_NameIdentifier;
353                 ++m_pos_SubjectConfirmation;
354             }
355
356             IMPL_XMLOBJECT_CLONE(Subject);
357             IMPL_TYPED_CHILD(NameIdentifier);
358             IMPL_TYPED_CHILD(SubjectConfirmation);
359     
360         protected:
361             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
362                 PROC_TYPED_CHILD(NameIdentifier,SAMLConstants::SAML1_NS,true);
363                 PROC_TYPED_CHILD(SubjectConfirmation,SAMLConstants::SAML1_NS,true);
364                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
365             }
366         };
367
368         class SAML_DLLLOCAL SubjectStatementImpl : public virtual SubjectStatement,
369             public AbstractComplexElement,
370             public AbstractDOMCachingXMLObject,
371             public AbstractValidatingXMLObject,
372             public AbstractXMLObjectMarshaller,
373             public AbstractXMLObjectUnmarshaller
374         {
375             void init() {
376                 m_Subject=NULL;
377                 m_children.push_back(NULL);
378                 m_pos_Subject=m_children.begin();
379             }
380         protected:
381             SubjectStatementImpl() {
382                 init();
383             }
384         public:
385             virtual ~SubjectStatementImpl() {}
386     
387             SubjectStatementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
388                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
389                 init();
390             }
391                 
392             SubjectStatementImpl(const SubjectStatementImpl& src)
393                     : AbstractXMLObject(src),
394                         AbstractDOMCachingXMLObject(src),
395                         AbstractValidatingXMLObject(src) {
396                 init();
397                 if (src.getSubject())
398                     setSubject(src.getSubject()->cloneSubject());
399             }
400             
401             IMPL_TYPED_CHILD(Subject);
402     
403         protected:
404             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
405                 PROC_TYPED_CHILD(Subject,SAMLConstants::SAML1_NS,true);
406                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
407             }
408         };
409
410         class SAML_DLLLOCAL SubjectLocalityImpl : public virtual SubjectLocality,
411             public AbstractChildlessElement,
412             public AbstractDOMCachingXMLObject,
413             public AbstractValidatingXMLObject,
414             public AbstractXMLObjectMarshaller,
415             public AbstractXMLObjectUnmarshaller
416         {
417         public:
418             virtual ~SubjectLocalityImpl() {
419                 XMLString::release(&m_IPAddress);
420                 XMLString::release(&m_DNSAddress);
421             }
422     
423             SubjectLocalityImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
424                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
425                 init();
426             }
427                 
428             SubjectLocalityImpl(const SubjectLocalityImpl& src)
429                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
430                 init();
431                 setIPAddress(src.getIPAddress());
432                 setDNSAddress(src.getDNSAddress());
433             }
434             
435             void init() {
436                 m_IPAddress=m_DNSAddress=NULL;
437             }
438             
439             IMPL_XMLOBJECT_CLONE(SubjectLocality);
440             IMPL_STRING_ATTRIB(IPAddress);
441             IMPL_STRING_ATTRIB(DNSAddress);
442     
443         protected:
444             void marshallAttributes(DOMElement* domElement) const {
445                 MARSHALL_STRING_ATTRIB(IPAddress,IPADDRESS,NULL);
446                 MARSHALL_STRING_ATTRIB(DNSAddress,DNSADDRESS,NULL);
447             }
448     
449             void processAttribute(const DOMAttr* attribute) {
450                 PROC_STRING_ATTRIB(IPAddress,IPADDRESS,NULL);
451                 PROC_STRING_ATTRIB(DNSAddress,DNSADDRESS,NULL);
452             }
453         };
454
455         class SAML_DLLLOCAL AuthorityBindingImpl : public virtual AuthorityBinding,
456             public AbstractChildlessElement,
457             public AbstractDOMCachingXMLObject,
458             public AbstractValidatingXMLObject,
459             public AbstractXMLObjectMarshaller,
460             public AbstractXMLObjectUnmarshaller
461         {
462         public:
463             virtual ~AuthorityBindingImpl() {
464                 delete m_AuthorityKind;
465                 XMLString::release(&m_Location);
466                 XMLString::release(&m_Binding);
467             }
468     
469             AuthorityBindingImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
470                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
471                 init();
472             }
473                 
474             AuthorityBindingImpl(const AuthorityBindingImpl& src)
475                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
476                 init();
477                 setAuthorityKind(src.getAuthorityKind());
478                 setLocation(src.getLocation());
479                 setBinding(src.getBinding());
480             }
481             
482             void init() {
483                 m_AuthorityKind=NULL;
484                 m_Location=m_Binding=NULL;
485             }
486             
487             IMPL_XMLOBJECT_CLONE(AuthorityBinding);
488             IMPL_XMLOBJECT_ATTRIB(AuthorityKind,QName);
489             IMPL_STRING_ATTRIB(Location);
490             IMPL_STRING_ATTRIB(Binding);
491     
492         protected:
493             void marshallAttributes(DOMElement* domElement) const {
494                 MARSHALL_QNAME_ATTRIB(AuthorityKind,AUTHORITYKIND,NULL);
495                 MARSHALL_STRING_ATTRIB(Location,LOCATION,NULL);
496                 MARSHALL_STRING_ATTRIB(Binding,BINDING,NULL);
497             }
498     
499             void processAttribute(const DOMAttr* attribute) {
500                 PROC_QNAME_ATTRIB(AuthorityKind,AUTHORITYKIND,NULL);
501                 PROC_STRING_ATTRIB(Location,LOCATION,NULL);
502                 PROC_STRING_ATTRIB(Binding,BINDING,NULL);
503             }
504         };
505
506         class SAML_DLLLOCAL AuthenticationStatementImpl : public virtual AuthenticationStatement, public SubjectStatementImpl
507         {
508         public:
509             virtual ~AuthenticationStatementImpl() {
510                 XMLString::release(&m_AuthenticationMethod);
511                 delete m_AuthenticationInstant;
512             }
513     
514             AuthenticationStatementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
515                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
516                 init();
517             }
518                 
519             AuthenticationStatementImpl(const AuthenticationStatementImpl& src)
520                     : AbstractXMLObject(src), SubjectStatementImpl(src) {
521                 init();
522                 setAuthenticationMethod(src.getAuthenticationMethod());
523                 setAuthenticationInstant(src.getAuthenticationInstant());
524                 if (src.getSubjectLocality())
525                     setSubjectLocality(src.getSubjectLocality()->cloneSubjectLocality());
526                 VectorOf(AuthorityBinding) v=getAuthorityBindings();
527                 for (vector<AuthorityBinding*>::const_iterator i=src.m_AuthorityBindings.begin(); i!=src.m_AuthorityBindings.end(); i++) {
528                     if (*i) {
529                         v.push_back((*i)->cloneAuthorityBinding());
530                     }
531                 }
532             }
533             
534             void init() {
535                 m_AuthenticationMethod=NULL;
536                 m_AuthenticationInstant=NULL;
537                 m_SubjectLocality=NULL;
538                 m_children.push_back(NULL);
539                 m_pos_SubjectLocality=m_pos_Subject;
540                 ++m_pos_SubjectLocality;
541             }
542             
543             IMPL_XMLOBJECT_CLONE(AuthenticationStatement);
544             SubjectStatement* cloneSubjectStatement() const {
545                 return cloneAuthenticationStatement();
546             }
547             Statement* cloneStatement() const {
548                 return cloneAuthenticationStatement();
549             }
550             IMPL_STRING_ATTRIB(AuthenticationMethod);
551             IMPL_DATETIME_ATTRIB(AuthenticationInstant);
552             IMPL_TYPED_CHILD(SubjectLocality);
553             IMPL_TYPED_CHILDREN(AuthorityBinding, m_children.end());
554     
555         protected:
556             void marshallAttributes(DOMElement* domElement) const {
557                 MARSHALL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
558                 MARSHALL_DATETIME_ATTRIB(AuthenticationInstant,AUTHENTICATIONINSTANT,NULL);
559                 SubjectStatementImpl::marshallAttributes(domElement);
560             }
561     
562             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
563                 PROC_TYPED_CHILD(SubjectLocality,SAMLConstants::SAML1_NS,false);
564                 PROC_TYPED_CHILDREN(AuthorityBinding,SAMLConstants::SAML1_NS,false);
565                 SubjectStatementImpl::processChildElement(childXMLObject,root);
566             }
567     
568             void processAttribute(const DOMAttr* attribute) {
569                 PROC_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
570                 PROC_DATETIME_ATTRIB(AuthenticationInstant,AUTHENTICATIONINSTANT,NULL);
571                 SubjectStatementImpl::processAttribute(attribute);
572             }
573         };
574
575         class SAML_DLLLOCAL ActionImpl : public virtual Action,
576             public AbstractSimpleElement,
577             public AbstractChildlessElement,
578             public AbstractDOMCachingXMLObject,
579             public AbstractValidatingXMLObject,
580             public AbstractXMLObjectMarshaller,
581             public AbstractXMLObjectUnmarshaller
582         {
583         public:
584             virtual ~ActionImpl() {
585                 XMLString::release(&m_Namespace);
586             }
587     
588             ActionImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
589                     : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Namespace(NULL) {
590             }
591                 
592             ActionImpl(const ActionImpl& src)
593                     : AbstractXMLObject(src), AbstractSimpleElement(src),
594                         AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
595                 setNamespace(src.getNamespace());
596             }
597             
598             IMPL_XMLOBJECT_CLONE(Action);
599             IMPL_STRING_ATTRIB(Namespace);
600             IMPL_XMLOBJECT_CONTENT;
601     
602         protected:
603             void marshallAttributes(DOMElement* domElement) const {
604                 MARSHALL_STRING_ATTRIB(Namespace,NAMESPACE,NULL);
605             }
606
607             void processAttribute(const DOMAttr* attribute) {
608                 PROC_STRING_ATTRIB(Namespace,NAMESPACE,NULL);
609             }
610         };
611
612         class SAML_DLLLOCAL EvidenceImpl : public virtual Evidence,
613             public AbstractComplexElement,
614             public AbstractDOMCachingXMLObject,
615             public AbstractValidatingXMLObject,
616             public AbstractXMLObjectMarshaller,
617             public AbstractXMLObjectUnmarshaller
618         {
619         public:
620             virtual ~EvidenceImpl() {}
621     
622             EvidenceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
623                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
624             }
625                 
626             EvidenceImpl(const EvidenceImpl& src)
627                     : AbstractXMLObject(src),
628                         AbstractDOMCachingXMLObject(src),
629                         AbstractValidatingXMLObject(src) {
630     
631                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
632                     if (*i) {
633                         AssertionIDReference* ref=dynamic_cast<AssertionIDReference*>(*i);
634                         if (ref) {
635                             getAssertionIDReferences().push_back(ref->cloneAssertionIDReference());
636                             continue;
637                         }
638     
639                         Assertion* assertion=dynamic_cast<Assertion*>(*i);
640                         if (assertion) {
641                             getAssertions().push_back(assertion->cloneAssertion());
642                             continue;
643                         }
644                     }
645                 }
646             }
647             
648             IMPL_XMLOBJECT_CLONE(Evidence);
649             IMPL_TYPED_CHILDREN(AssertionIDReference,m_children.end());
650             IMPL_TYPED_CHILDREN(Assertion,m_children.end());
651     
652         protected:
653             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
654                 PROC_TYPED_CHILDREN(AssertionIDReference,SAMLConstants::SAML1_NS,false);
655                 PROC_TYPED_CHILDREN(Assertion,SAMLConstants::SAML1_NS,true);
656                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
657             }
658         };
659
660         class SAML_DLLLOCAL AuthorizationDecisionStatementImpl
661             : public virtual AuthorizationDecisionStatement, public SubjectStatementImpl
662         {
663         public:
664             virtual ~AuthorizationDecisionStatementImpl() {
665                 XMLString::release(&m_Resource);
666                 XMLString::release(&m_Decision);
667             }
668     
669             AuthorizationDecisionStatementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
670                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
671                 init();
672             }
673                 
674             AuthorizationDecisionStatementImpl(const AuthorizationDecisionStatementImpl& src)
675                     : AbstractXMLObject(src), SubjectStatementImpl(src) {
676                 init();
677                 setResource(src.getResource());
678                 setDecision(src.getDecision());
679                 if (src.getEvidence())
680                     setEvidence(src.getEvidence()->cloneEvidence());
681                 VectorOf(Action) v=getActions();
682                 for (vector<Action*>::const_iterator i=src.m_Actions.begin(); i!=src.m_Actions.end(); i++) {
683                     if (*i) {
684                         v.push_back((*i)->cloneAction());
685                     }
686                 }
687             }
688             
689             void init() {
690                 m_Resource=NULL;
691                 m_Decision=NULL;
692                 m_Evidence=NULL;
693                 m_children.push_back(NULL);
694                 m_pos_Evidence=m_pos_Subject;
695                 ++m_pos_Evidence;
696             }
697             
698             IMPL_XMLOBJECT_CLONE(AuthorizationDecisionStatement);
699             SubjectStatement* cloneSubjectStatement() const {
700                 return cloneAuthorizationDecisionStatement();
701             }
702             Statement* cloneStatement() const {
703                 return cloneAuthorizationDecisionStatement();
704             }
705             IMPL_STRING_ATTRIB(Resource);
706             IMPL_STRING_ATTRIB(Decision);
707             IMPL_TYPED_CHILD(Evidence);
708             IMPL_TYPED_CHILDREN(Action, m_pos_Evidence);
709     
710         protected:
711             void marshallAttributes(DOMElement* domElement) const {
712                 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
713                 MARSHALL_STRING_ATTRIB(Decision,DECISION,NULL);
714                 SubjectStatementImpl::marshallAttributes(domElement);
715             }
716     
717             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
718                 PROC_TYPED_CHILD(Evidence,SAMLConstants::SAML1_NS,false);
719                 PROC_TYPED_CHILDREN(Action,SAMLConstants::SAML1_NS,false);
720                 SubjectStatementImpl::processChildElement(childXMLObject,root);
721             }
722     
723             void processAttribute(const DOMAttr* attribute) {
724                 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
725                 PROC_STRING_ATTRIB(Decision,DECISION,NULL);
726                 SubjectStatementImpl::processAttribute(attribute);
727             }
728         };
729
730         class SAML_DLLLOCAL AttributeDesignatorImpl : public virtual AttributeDesignator,
731             public AbstractChildlessElement,
732             public AbstractDOMCachingXMLObject,
733             public AbstractValidatingXMLObject,
734             public AbstractXMLObjectMarshaller,
735             public AbstractXMLObjectUnmarshaller
736         {
737         public:
738             virtual ~AttributeDesignatorImpl() {
739                 XMLString::release(&m_AttributeName);
740                 XMLString::release(&m_AttributeNamespace);
741             }
742     
743             AttributeDesignatorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
744                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
745                 init();
746             }
747                 
748             AttributeDesignatorImpl(const AttributeDesignatorImpl& src)
749                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
750                 init();
751                 setAttributeName(src.getAttributeName());
752                 setAttributeNamespace(src.getAttributeNamespace());
753             }
754             
755             void init() {
756                 m_AttributeName=m_AttributeNamespace=NULL;
757             }
758             
759             IMPL_XMLOBJECT_CLONE(AttributeDesignator);
760             IMPL_STRING_ATTRIB(AttributeName);
761             IMPL_STRING_ATTRIB(AttributeNamespace);
762     
763         protected:
764             void marshallAttributes(DOMElement* domElement) const {
765                 MARSHALL_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
766                 MARSHALL_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
767             }
768     
769             void processAttribute(const DOMAttr* attribute) {
770                 PROC_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
771                 PROC_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
772             }
773         };
774
775         class SAML_DLLLOCAL AttributeImpl : public virtual Attribute,
776             public AbstractComplexElement,
777             public AbstractDOMCachingXMLObject,
778             public AbstractValidatingXMLObject,
779             public AbstractXMLObjectMarshaller,
780             public AbstractXMLObjectUnmarshaller
781         {
782         public:
783             virtual ~AttributeImpl() {
784                 XMLString::release(&m_AttributeName);
785                 XMLString::release(&m_AttributeNamespace);
786             }
787     
788             AttributeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
789                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
790                 init();
791             }
792                 
793             AttributeImpl(const AttributeImpl& src)
794                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
795                 init();
796                 setAttributeName(src.getAttributeName());
797                 setAttributeNamespace(src.getAttributeNamespace());
798                 VectorOf(XMLObject) v=getAttributeValues();
799                 for (vector<XMLObject*>::const_iterator i=src.m_AttributeValues.begin(); i!=src.m_AttributeValues.end(); i++) {
800                     if (*i) {
801                         v.push_back((*i)->clone());
802                     }
803                 }
804             }
805             
806             void init() {
807                 m_AttributeName=m_AttributeNamespace=NULL;
808             }
809             
810             IMPL_XMLOBJECT_CLONE(Attribute);
811             AttributeDesignator* cloneAttributeDesignator() const {
812                 return cloneAttribute();
813             }
814             IMPL_STRING_ATTRIB(AttributeName);
815             IMPL_STRING_ATTRIB(AttributeNamespace);
816             IMPL_XMLOBJECT_CHILDREN(AttributeValue,m_children.end());
817     
818         protected:
819             void marshallAttributes(DOMElement* domElement) const {
820                 MARSHALL_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
821                 MARSHALL_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
822             }
823
824             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
825                 getAttributeValues().push_back(childXMLObject);
826             }
827
828             void processAttribute(const DOMAttr* attribute) {
829                 PROC_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
830                 PROC_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
831             }
832         };
833
834         class SAML_DLLLOCAL AttributeValueImpl
835             : public virtual AttributeValue, public AnyElementImpl, public AbstractValidatingXMLObject
836         {
837         public:
838             virtual ~AttributeValueImpl() {}
839     
840             AttributeValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
841                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
842             }
843                 
844             AttributeValueImpl(const AttributeValueImpl& src) : AnyElementImpl(src), AbstractValidatingXMLObject(src) {}
845             
846             IMPL_XMLOBJECT_CLONE(AttributeValue);
847         };
848
849         class SAML_DLLLOCAL AttributeStatementImpl : public virtual AttributeStatement, public SubjectStatementImpl
850         {
851         public:
852             virtual ~AttributeStatementImpl() {}
853     
854             AttributeStatementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
855                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
856             }
857                 
858             AttributeStatementImpl(const AttributeStatementImpl& src)
859                     : AbstractXMLObject(src), SubjectStatementImpl(src) {
860                 VectorOf(Attribute) v=getAttributes();
861                 for (vector<Attribute*>::const_iterator i=src.m_Attributes.begin(); i!=src.m_Attributes.end(); i++) {
862                     if (*i) {
863                         v.push_back((*i)->cloneAttribute());
864                     }
865                 }
866             }
867             
868             IMPL_XMLOBJECT_CLONE(AttributeStatement);
869             SubjectStatement* cloneSubjectStatement() const {
870                 return cloneAttributeStatement();
871             }
872             Statement* cloneStatement() const {
873                 return cloneAttributeStatement();
874             }
875             IMPL_TYPED_CHILDREN(Attribute, m_children.end());
876     
877         protected:
878             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
879                 PROC_TYPED_CHILDREN(Attribute,SAMLConstants::SAML1_NS,true);
880                 SubjectStatementImpl::processChildElement(childXMLObject,root);
881             }
882         };
883
884         class SAML_DLLLOCAL AdviceImpl : public virtual Advice,
885             public AbstractComplexElement,
886             public AbstractDOMCachingXMLObject,
887             public AbstractValidatingXMLObject,
888             public AbstractXMLObjectMarshaller,
889             public AbstractXMLObjectUnmarshaller
890         {
891         public:
892             virtual ~AdviceImpl() {}
893     
894             AdviceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
895                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
896             }
897                 
898             AdviceImpl(const AdviceImpl& src)
899                     : AbstractXMLObject(src),
900                         AbstractDOMCachingXMLObject(src),
901                         AbstractValidatingXMLObject(src) {
902     
903                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
904                     if (*i) {
905                         AssertionIDReference* ref=dynamic_cast<AssertionIDReference*>(*i);
906                         if (ref) {
907                             getAssertionIDReferences().push_back(ref->cloneAssertionIDReference());
908                             continue;
909                         }
910     
911                         Assertion* assertion=dynamic_cast<Assertion*>(*i);
912                         if (assertion) {
913                             getAssertions().push_back(assertion->cloneAssertion());
914                             continue;
915                         }
916     
917                         getOthers().push_back((*i)->clone());
918                     }
919                 }
920             }
921             
922             IMPL_XMLOBJECT_CLONE(Advice);
923             IMPL_TYPED_CHILDREN(AssertionIDReference,m_children.end());
924             IMPL_TYPED_CHILDREN(Assertion,m_children.end());
925             IMPL_XMLOBJECT_CHILDREN(Other,m_children.end());
926     
927         protected:
928             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
929                 PROC_TYPED_CHILDREN(AssertionIDReference,SAMLConstants::SAML1_NS,false);
930                 PROC_TYPED_CHILDREN(Assertion,SAMLConstants::SAML1_NS,true);
931                 
932                 // Unknown child.
933                 const XMLCh* nsURI=root->getNamespaceURI();
934                 if (!XMLString::equals(nsURI,SAMLConstants::SAML1_NS) && nsURI && *nsURI)
935                     getOthers().push_back(childXMLObject);
936                 
937                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
938             }
939         };
940
941         class SAML_DLLLOCAL AssertionImpl : public virtual Assertion,
942             public AbstractComplexElement,
943             public AbstractDOMCachingXMLObject,
944             public AbstractValidatingXMLObject,
945             public AbstractXMLObjectMarshaller,
946             public AbstractXMLObjectUnmarshaller
947         {
948             void init() {
949                 m_MinorVersion=1;
950                 m_AssertionID=NULL;
951                 m_Issuer=NULL;
952                 m_IssueInstant=NULL;
953                 m_children.push_back(NULL);
954                 m_children.push_back(NULL);
955                 m_children.push_back(NULL);
956                 m_Conditions=NULL;
957                 m_Advice=NULL;
958                 m_Signature=NULL;
959                 m_pos_Conditions=m_children.begin();
960                 m_pos_Advice=m_pos_Conditions;
961                 ++m_pos_Advice;
962                 m_pos_Signature=m_pos_Advice;
963                 ++m_pos_Signature;
964             }
965         public:
966             virtual ~AssertionImpl() {
967                 XMLString::release(&m_AssertionID);
968                 XMLString::release(&m_Issuer);
969                 delete m_IssueInstant;
970             }
971     
972             AssertionImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
973                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
974                 init();
975             }
976                 
977             AssertionImpl(const AssertionImpl& src)                     
978                 : AbstractXMLObject(src),
979                     AbstractDOMCachingXMLObject(src),
980                     AbstractValidatingXMLObject(src) {
981                 init();
982                 setMinorVersion(src.getMinorVersion());
983                 setAssertionID(src.getAssertionID());
984                 setIssuer(src.getIssuer());
985                 setIssueInstant(src.getIssueInstant());
986                 if (src.getConditions())
987                     setConditions(src.getConditions()->cloneConditions());
988                 if (src.getAdvice())
989                     setAdvice(src.getAdvice()->cloneAdvice());
990                 if (src.getSignature())
991                     setSignature(src.getSignature()->cloneSignature());
992                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
993                     if (*i) {
994                         AuthenticationStatement* authst=dynamic_cast<AuthenticationStatement*>(*i);
995                         if (authst) {
996                             getAuthenticationStatements().push_back(authst->cloneAuthenticationStatement());
997                             continue;
998                         }
999
1000                         AttributeStatement* attst=dynamic_cast<AttributeStatement*>(*i);
1001                         if (attst) {
1002                             getAttributeStatements().push_back(attst->cloneAttributeStatement());
1003                             continue;
1004                         }
1005
1006                         AuthorizationDecisionStatement* authzst=dynamic_cast<AuthorizationDecisionStatement*>(*i);
1007                         if (authzst) {
1008                             getAuthorizationDecisionStatements().push_back(authzst->cloneAuthorizationDecisionStatement());
1009                             continue;
1010                         }
1011     
1012                         SubjectStatement* subst=dynamic_cast<SubjectStatement*>(*i);
1013                         if (subst) {
1014                             getSubjectStatements().push_back(subst->cloneSubjectStatement());
1015                             continue;
1016                         }
1017     
1018                         Statement* st=dynamic_cast<Statement*>(*i);
1019                         if (st) {
1020                             getStatements().push_back(st->cloneStatement());
1021                             continue;
1022                         }
1023                     }
1024                 }
1025             }
1026             
1027             const XMLCh* getId() const {
1028                 return getAssertionID();
1029             }
1030
1031             //IMPL_TYPED_CHILD(Signature);
1032             // Need customized setter.
1033         protected:
1034             Signature* m_Signature;
1035             list<XMLObject*>::iterator m_pos_Signature;
1036         public:
1037             Signature* getSignature() const {
1038                 return m_Signature;
1039             }
1040             
1041             void setSignature(Signature* sig) {
1042                 prepareForAssignment(m_Signature,sig);
1043                 *m_pos_Signature=m_Signature=sig;
1044                 // Sync content reference back up.
1045                 if (m_Signature)
1046                     m_Signature->setContentReference(new opensaml::ContentReference(*this));
1047             }
1048             
1049             IMPL_XMLOBJECT_CLONE(Assertion);
1050             IMPL_INTEGER_ATTRIB(MinorVersion);
1051             IMPL_STRING_ATTRIB(AssertionID);
1052             IMPL_STRING_ATTRIB(Issuer);
1053             IMPL_DATETIME_ATTRIB(IssueInstant);
1054             IMPL_TYPED_CHILD(Conditions);
1055             IMPL_TYPED_CHILD(Advice);
1056             IMPL_TYPED_CHILDREN(Statement, m_pos_Signature);
1057             IMPL_TYPED_CHILDREN(SubjectStatement, m_pos_Signature);
1058             IMPL_TYPED_CHILDREN(AuthenticationStatement, m_pos_Signature);
1059             IMPL_TYPED_CHILDREN(AttributeStatement, m_pos_Signature);
1060             IMPL_TYPED_CHILDREN(AuthorizationDecisionStatement, m_pos_Signature);
1061     
1062         protected:
1063             void marshallAttributes(DOMElement* domElement) const {
1064                 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
1065                 static const XMLCh ONE[] = { chDigit_1, chNull };
1066                 domElement->setAttributeNS(NULL,MAJORVERSION,ONE);
1067                 MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
1068                 if (!m_AssertionID)
1069                     const_cast<AssertionImpl*>(this)->m_AssertionID=SAMLConfig::getConfig().generateIdentifier();
1070                 MARSHALL_ID_ATTRIB(AssertionID,ASSERTIONID,NULL);
1071                 MARSHALL_STRING_ATTRIB(Issuer,ISSUER,NULL);
1072                 if (!m_IssueInstant)
1073                     const_cast<AssertionImpl*>(this)->m_IssueInstant=new DateTime(time(NULL));
1074                 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
1075             }
1076     
1077             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1078                 PROC_TYPED_CHILD(Conditions,SAMLConstants::SAML1_NS,false);
1079                 PROC_TYPED_CHILD(Advice,SAMLConstants::SAML1_NS,false);
1080                 PROC_TYPED_CHILD(Signature,XMLConstants::XMLSIG_NS,false);
1081                 PROC_TYPED_CHILDREN(AuthenticationStatement,SAMLConstants::SAML1_NS,false);
1082                 PROC_TYPED_CHILDREN(AttributeStatement,SAMLConstants::SAML1_NS,false);
1083                 PROC_TYPED_CHILDREN(AuthorizationDecisionStatement,SAMLConstants::SAML1_NS,false);
1084                 PROC_TYPED_CHILDREN(SubjectStatement,SAMLConstants::SAML1_NS,true);
1085                 PROC_TYPED_CHILDREN(Statement,SAMLConstants::SAML1_NS,true);
1086                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
1087             }
1088     
1089             void processAttribute(const DOMAttr* attribute) {
1090                 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
1091                 if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
1092                     if (XMLString::parseInt(attribute->getValue()) != 1)
1093                         throw UnmarshallingException("Assertion has invalid major version.");
1094                 }
1095                 PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
1096                 PROC_ID_ATTRIB(AssertionID,ASSERTIONID,NULL);
1097                 PROC_STRING_ATTRIB(Issuer,ISSUER,NULL);
1098                 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
1099             }
1100         };
1101     
1102     };
1103 };
1104
1105 #if defined (_MSC_VER)
1106     #pragma warning( pop )
1107 #endif
1108
1109 // Builder Implementations
1110
1111 IMPL_XMLOBJECTBUILDER(Action);
1112 IMPL_XMLOBJECTBUILDER(Advice);
1113 IMPL_XMLOBJECTBUILDER(Assertion);
1114 IMPL_XMLOBJECTBUILDER(AssertionIDReference);
1115 IMPL_XMLOBJECTBUILDER(Attribute);
1116 IMPL_XMLOBJECTBUILDER(AttributeDesignator);
1117 IMPL_XMLOBJECTBUILDER(AttributeStatement);
1118 IMPL_XMLOBJECTBUILDER(AttributeValue);
1119 IMPL_XMLOBJECTBUILDER(Audience);
1120 IMPL_XMLOBJECTBUILDER(AudienceRestrictionCondition);
1121 IMPL_XMLOBJECTBUILDER(AuthenticationStatement);
1122 IMPL_XMLOBJECTBUILDER(AuthorizationDecisionStatement);
1123 IMPL_XMLOBJECTBUILDER(AuthorityBinding);
1124 IMPL_XMLOBJECTBUILDER(Conditions);
1125 IMPL_XMLOBJECTBUILDER(ConfirmationMethod);
1126 IMPL_XMLOBJECTBUILDER(DoNotCacheCondition);
1127 IMPL_XMLOBJECTBUILDER(Evidence);
1128 IMPL_XMLOBJECTBUILDER(NameIdentifier);
1129 IMPL_XMLOBJECTBUILDER(Subject);
1130 IMPL_XMLOBJECTBUILDER(SubjectConfirmation);
1131 IMPL_XMLOBJECTBUILDER(SubjectConfirmationData);
1132 IMPL_XMLOBJECTBUILDER(SubjectLocality);
1133
1134 // Unicode literals
1135 const XMLCh Action::LOCAL_NAME[] =                  UNICODE_LITERAL_6(A,c,t,i,o,n);
1136 const XMLCh Action::TYPE_NAME[] =                   UNICODE_LITERAL_10(A,c,t,i,o,n,T,y,p,e);
1137 const XMLCh Action::NAMESPACE_ATTRIB_NAME[] =       UNICODE_LITERAL_9(N,a,m,e,s,p,a,c,e);
1138 const XMLCh Advice::LOCAL_NAME[] =                  UNICODE_LITERAL_6(A,d,v,i,c,e);
1139 const XMLCh Advice::TYPE_NAME[] =                   UNICODE_LITERAL_10(A,d,v,i,c,e,T,y,p,e);
1140 const XMLCh Assertion::LOCAL_NAME[] =               UNICODE_LITERAL_9(A,s,s,e,r,t,i,o,n);
1141 const XMLCh Assertion::TYPE_NAME[] =                UNICODE_LITERAL_13(A,s,s,e,r,t,i,o,n,T,y,p,e);
1142 const XMLCh Assertion::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n);
1143 const XMLCh Assertion::ASSERTIONID_ATTRIB_NAME[] =  UNICODE_LITERAL_11(A,s,s,e,r,t,i,o,n,I,D);
1144 const XMLCh Assertion::ISSUER_ATTRIB_NAME[] =       UNICODE_LITERAL_6(I,s,s,u,e,r);
1145 const XMLCh Assertion::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
1146 const XMLCh AssertionIDReference::LOCAL_NAME[] =    UNICODE_LITERAL_20(A,s,s,e,r,t,i,o,n,I,D,R,e,f,e,r,e,n,c,e);
1147 const XMLCh Attribute::LOCAL_NAME[] =               UNICODE_LITERAL_9(A,t,t,r,i,b,u,t,e);
1148 const XMLCh Attribute::TYPE_NAME[] =                UNICODE_LITERAL_13(A,t,t,r,i,b,u,t,e,T,y,p,e);
1149 const XMLCh AttributeDesignator::LOCAL_NAME[] =     UNICODE_LITERAL_19(A,t,t,r,i,b,u,t,e,D,e,s,i,g,n,a,t,o,r);
1150 const XMLCh AttributeDesignator::TYPE_NAME[] =      UNICODE_LITERAL_23(A,t,t,r,i,b,u,t,e,D,e,s,i,g,n,a,t,o,r,T,y,p,e);
1151 const XMLCh AttributeDesignator::ATTRIBUTENAME_ATTRIB_NAME[] =              UNICODE_LITERAL_13(A,t,t,r,i,b,u,t,e,N,a,m,e);
1152 const XMLCh AttributeDesignator::ATTRIBUTENAMESPACE_ATTRIB_NAME[] =         UNICODE_LITERAL_18(A,t,t,r,i,b,u,t,e,N,a,m,e,s,p,a,c,e);
1153 const XMLCh AttributeStatement::LOCAL_NAME[] =      UNICODE_LITERAL_18(A,t,t,r,i,b,u,t,e,S,t,a,t,e,m,e,n,t);
1154 const XMLCh AttributeStatement::TYPE_NAME[] =       UNICODE_LITERAL_22(A,t,t,r,i,b,u,t,e,S,t,a,t,e,m,e,n,t,T,y,p,e);
1155 const XMLCh AttributeValue::LOCAL_NAME[] =          UNICODE_LITERAL_14(A,t,t,r,i,b,u,t,e,V,a,l,u,e);
1156 const XMLCh Audience::LOCAL_NAME[] =                UNICODE_LITERAL_8(A,u,d,i,e,n,c,e);
1157 const XMLCh AudienceRestrictionCondition::LOCAL_NAME[] =    UNICODE_LITERAL_28(A,u,d,i,e,n,c,e,R,e,s,t,r,i,c,t,i,o,n,C,o,n,d,i,t,i,o,n);
1158 const XMLCh AudienceRestrictionCondition::TYPE_NAME[] =     UNICODE_LITERAL_32(A,u,d,i,e,n,c,e,R,e,s,t,r,i,c,t,i,o,n,C,o,n,d,i,t,i,o,n,T,y,p,e);
1159 const XMLCh AuthenticationStatement::LOCAL_NAME[] = UNICODE_LITERAL_23(A,u,t,h,e,n,t,i,c,a,t,i,o,n,S,t,a,t,e,m,e,n,t);
1160 const XMLCh AuthenticationStatement::TYPE_NAME[] =  UNICODE_LITERAL_27(A,u,t,h,e,n,t,i,c,a,t,i,o,n,S,t,a,t,e,m,e,n,t,T,y,p,e);
1161 const XMLCh AuthenticationStatement::AUTHENTICATIONMETHOD_ATTRIB_NAME[] =   UNICODE_LITERAL_20(A,u,t,h,e,n,t,i,c,a,t,i,o,n,M,e,t,h,o,d);
1162 const XMLCh AuthenticationStatement::AUTHENTICATIONINSTANT_ATTRIB_NAME[] =  UNICODE_LITERAL_21(A,u,t,h,e,n,t,i,c,a,t,i,o,n,I,n,s,t,a,n,t);
1163 const XMLCh AuthorityBinding::LOCAL_NAME[] =        UNICODE_LITERAL_16(A,u,t,h,o,r,i,t,y,B,i,n,d,i,n,g);
1164 const XMLCh AuthorityBinding::TYPE_NAME[] =         UNICODE_LITERAL_20(A,u,t,h,o,r,i,t,y,B,i,n,d,i,n,g,T,y,p,e);
1165 const XMLCh AuthorityBinding::AUTHORITYKIND_ATTRIB_NAME[] = UNICODE_LITERAL_13(A,u,t,h,o,r,i,t,y,K,i,n,d);
1166 const XMLCh AuthorityBinding::LOCATION_ATTRIB_NAME[] =      UNICODE_LITERAL_8(L,o,c,a,t,i,o,n);
1167 const XMLCh AuthorityBinding::BINDING_ATTRIB_NAME[] =       UNICODE_LITERAL_7(B,i,n,d,i,n,g);
1168 const XMLCh AuthorizationDecisionStatement::LOCAL_NAME[] =  UNICODE_LITERAL_30(A,u,t,h,o,r,i,z,a,t,i,o,n,D,e,c,i,s,i,o,n,S,t,a,t,e,m,e,n,t);
1169 const XMLCh AuthorizationDecisionStatement::TYPE_NAME[] =   UNICODE_LITERAL_34(A,u,t,h,o,r,i,z,a,t,i,o,n,D,e,c,i,s,i,o,n,S,t,a,t,e,m,e,n,t,T,y,p,e);
1170 const XMLCh AuthorizationDecisionStatement::RESOURCE_ATTRIB_NAME[] =        UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
1171 const XMLCh AuthorizationDecisionStatement::DECISION_ATTRIB_NAME[] =        UNICODE_LITERAL_8(D,e,c,i,s,i,o,n);
1172 const XMLCh AuthorizationDecisionStatement::DECISION_PERMIT[] =             UNICODE_LITERAL_6(P,e,r,m,i,t);
1173 const XMLCh AuthorizationDecisionStatement::DECISION_DENY[] =               UNICODE_LITERAL_4(D,e,n,y);
1174 const XMLCh AuthorizationDecisionStatement::DECISION_INDETERMINATE[] =      UNICODE_LITERAL_13(I,n,d,e,t,e,r,m,i,n,a,t,e);
1175 const XMLCh Condition::LOCAL_NAME[] =               UNICODE_LITERAL_9(C,o,n,d,i,t,i,o,n);
1176 const XMLCh Conditions::LOCAL_NAME[] =              UNICODE_LITERAL_10(C,o,n,d,i,t,i,o,n,s);
1177 const XMLCh Conditions::TYPE_NAME[] =               UNICODE_LITERAL_14(C,o,n,d,i,t,i,o,n,s,T,y,p,e);
1178 const XMLCh Conditions::NOTBEFORE_ATTRIB_NAME[] =   UNICODE_LITERAL_9(N,o,t,B,e,f,o,r,e);
1179 const XMLCh Conditions::NOTONORAFTER_ATTRIB_NAME[] =UNICODE_LITERAL_12(N,o,t,O,n,O,r,A,f,t,e,r);
1180 const XMLCh ConfirmationMethod::LOCAL_NAME[] =      UNICODE_LITERAL_18(C,o,n,f,i,r,m,a,t,i,o,n,M,e,t,h,o,d);
1181 const XMLCh DoNotCacheCondition::LOCAL_NAME[] =     UNICODE_LITERAL_19(D,o,N,o,t,C,a,c,h,e,C,o,n,d,i,t,i,o,n);
1182 const XMLCh DoNotCacheCondition::TYPE_NAME[] =      UNICODE_LITERAL_23(D,o,N,o,t,C,a,c,h,e,C,o,n,d,i,t,i,o,n,T,y,p,e);
1183 const XMLCh Evidence::LOCAL_NAME[] =                UNICODE_LITERAL_8(E,v,i,d,e,n,c,e);
1184 const XMLCh Evidence::TYPE_NAME[] =                 UNICODE_LITERAL_12(E,v,i,d,e,n,c,e,T,y,p,e);
1185 const XMLCh NameIdentifier::LOCAL_NAME[] =          UNICODE_LITERAL_14(N,a,m,e,I,d,e,n,t,i,f,i,e,r);
1186 const XMLCh NameIdentifier::TYPE_NAME[] =           UNICODE_LITERAL_18(N,a,m,e,I,d,e,n,t,i,f,i,e,r,T,y,p,e);
1187 const XMLCh NameIdentifier::NAMEQUALIFIER_ATTRIB_NAME[] =   UNICODE_LITERAL_13(N,a,m,e,Q,u,a,l,i,f,i,e,r);
1188 const XMLCh NameIdentifier::FORMAT_ATTRIB_NAME[] =  UNICODE_LITERAL_6(F,o,r,m,a,t);
1189 const XMLCh Statement::LOCAL_NAME[] =               UNICODE_LITERAL_9(S,t,a,t,e,m,e,n,t);
1190 const XMLCh Subject::LOCAL_NAME[] =                 UNICODE_LITERAL_7(S,u,b,j,e,c,t);
1191 const XMLCh Subject::TYPE_NAME[] =                  UNICODE_LITERAL_11(S,u,b,j,e,c,t,T,y,p,e);
1192 const XMLCh SubjectConfirmation::LOCAL_NAME[] =     UNICODE_LITERAL_19(S,u,b,j,e,c,t,C,o,n,f,i,r,m,a,t,i,o,n);
1193 const XMLCh SubjectConfirmation::TYPE_NAME[] =      UNICODE_LITERAL_23(S,u,b,j,e,c,t,C,o,n,f,i,r,m,a,t,i,o,n,T,y,p,e);
1194 const XMLCh SubjectConfirmationData::LOCAL_NAME[] = UNICODE_LITERAL_23(S,u,b,j,e,c,t,C,o,n,f,i,r,m,a,t,i,o,n,D,a,t,a);
1195 const XMLCh SubjectLocality::LOCAL_NAME[] =         UNICODE_LITERAL_15(S,u,b,j,e,c,t,L,o,c,a,l,i,t,y);
1196 const XMLCh SubjectLocality::TYPE_NAME[] =          UNICODE_LITERAL_19(S,u,b,j,e,c,t,L,o,c,a,l,i,t,y,T,y,p,e);
1197 const XMLCh SubjectLocality::IPADDRESS_ATTRIB_NAME[] =      UNICODE_LITERAL_9(I,P,A,d,d,r,e,s,s);
1198 const XMLCh SubjectLocality::DNSADDRESS_ATTRIB_NAME[] =     UNICODE_LITERAL_10(D,N,S,A,d,d,r,e,s,s);
1199 const XMLCh SubjectStatement::LOCAL_NAME[] =        UNICODE_LITERAL_16(S,u,b,j,e,c,t,S,t,a,t,e,m,e,n,t);
1200
1201 #define XCH(ch) chLatin_##ch
1202 #define XNUM(d) chDigit_##d