https://issues.shibboleth.net/jira/browse/CPPOST-70
[shibboleth/cpp-opensaml.git] / saml / saml2 / core / impl / Protocols20Impl.cpp
index 37dfd9a..e663161 100644 (file)
@@ -126,8 +126,7 @@ namespace opensaml {
                 }
 
                 StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                    : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-                {
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                         init();
                 }
 
@@ -170,7 +169,8 @@ namespace opensaml {
                 virtual ~StatusDetailImpl() {}
 
                 StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
+                }
 
                 StatusDetailImpl(const StatusDetailImpl& src)
                         : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
@@ -233,14 +233,12 @@ namespace opensaml {
             IMPL_TYPED_CHILD(StatusDetail);
     
         protected:
-    
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
                 PROC_TYPED_CHILD(StatusCode,SAML20P_NS,false);
                 PROC_TYPED_CHILD(StatusMessage,SAML20P_NS,false);
                 PROC_TYPED_CHILD(StatusDetail,SAML20P_NS,false);
                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
             }
-    
         };
 
 
@@ -289,6 +287,9 @@ namespace opensaml {
             RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src)
                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
                 init();
+            }
+
+            void _clone(const RequestAbstractTypeImpl& src) {
                 setID(src.getID());
                 setVersion(src.getVersion());
                 setIssueInstant(src.getIssueInstant());
@@ -319,6 +320,10 @@ namespace opensaml {
                 if (m_Signature)
                     m_Signature->setContentReference(new opensaml::ContentReference(*this));
             }
+
+            RequestAbstractType* cloneRequestAbstractType() const {
+                return dynamic_cast<RequestAbstractType*>(clone());
+            }
             
             IMPL_STRING_ATTRIB(Version);
             IMPL_ID_ATTRIB_EX(ID,ID,nullptr);
@@ -377,20 +382,19 @@ namespace opensaml {
                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
                 
             AssertionIDRequestImpl(const AssertionIDRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
+            }
+
+            void _clone(const AssertionIDRequestImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
                 VectorOf(AssertionIDRef) v=getAssertionIDRefs();
                 for (vector<AssertionIDRef*>::const_iterator i=src.m_AssertionIDRefs.begin(); i!=src.m_AssertionIDRefs.end(); i++) {
                     if (*i) {                               
                         v.push_back((*i)->cloneAssertionIDRef());
                     }
                 }
-
             }
             
-            IMPL_XMLOBJECT_CLONE(AssertionIDRequest);
-            RequestAbstractType* cloneRequestAbstractType() const {
-                return cloneAssertionIDRequest();
-            }
-
+            IMPL_XMLOBJECT_CLONE_EX(AssertionIDRequest);
             IMPL_TYPED_FOREIGN_CHILDREN(AssertionIDRef,saml2,m_children.end());
     
         protected:
@@ -402,8 +406,7 @@ namespace opensaml {
 
         class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery, public RequestAbstractTypeImpl
         {
-            void init()
-            {
+            void init() {
                 m_Subject = nullptr;
                 m_children.push_back(nullptr);
                 m_pos_Subject = m_pos_Extensions;
@@ -417,17 +420,24 @@ namespace opensaml {
             virtual ~SubjectQueryImpl() { }
     
             SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            { 
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             SubjectQueryImpl(const SubjectQueryImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
                 init();
+            }
+
+            void _clone(const SubjectQueryImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
                 if (src.getSubject())
                     setSubject(src.getSubject()->cloneSubject());
             }
             
+            SubjectQuery* cloneSubjectQuery() const {
+                return dynamic_cast<SubjectQuery*>(clone());
+            }
+
             IMPL_TYPED_FOREIGN_CHILD(Subject,saml2);
     
         protected:
@@ -437,7 +447,6 @@ namespace opensaml {
             }
         };
 
-
         class SAML_DLLLOCAL RequestedAuthnContextImpl : public virtual RequestedAuthnContext,
             public AbstractComplexElement,
             public AbstractDOMCachingXMLObject,
@@ -500,7 +509,6 @@ namespace opensaml {
             }
         };
 
-
         class SAML_DLLLOCAL AuthnQueryImpl : public virtual AuthnQuery, public SubjectQueryImpl
         {
             void init() {
@@ -517,26 +525,22 @@ namespace opensaml {
             }
     
             AuthnQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             AuthnQueryImpl(const AuthnQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
                 init();
+            }
+
+            void _clone(const AuthnQueryImpl& src) {
+                SubjectQueryImpl::_clone(src);
                 setSessionIndex(src.getSessionIndex());
                 if (src.getRequestedAuthnContext())
                     setRequestedAuthnContext(src.getRequestedAuthnContext()->cloneRequestedAuthnContext());
             }
             
-            IMPL_XMLOBJECT_CLONE(AuthnQuery);
-            SubjectQuery* cloneSubjectQuery() const {
-                return cloneAuthnQuery();
-            }
-            RequestAbstractType* cloneRequestAbstractType() const {
-                return cloneAuthnQuery();
-            }
-
+            IMPL_XMLOBJECT_CLONE_EX(AuthnQuery);
             IMPL_STRING_ATTRIB(SessionIndex);
             IMPL_TYPED_CHILD(RequestedAuthnContext);
     
@@ -565,6 +569,10 @@ namespace opensaml {
                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
                 
             AttributeQueryImpl(const AttributeQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
+            }
+
+            void _clone(const AttributeQueryImpl& src) {
+                SubjectQueryImpl::_clone(src);
                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
                     if (*i) {
                         Attribute* attrib=dynamic_cast<Attribute*>(*i);
@@ -574,17 +582,9 @@ namespace opensaml {
                         }
                     }
                 }
-
             }
             
-            IMPL_XMLOBJECT_CLONE(AttributeQuery);
-            SubjectQuery* cloneSubjectQuery() const {
-                return cloneAttributeQuery();
-            }
-            RequestAbstractType* cloneRequestAbstractType() const {
-                return cloneAttributeQuery();
-            }
-
+            IMPL_XMLOBJECT_CLONE_EX(AttributeQuery);
             IMPL_TYPED_FOREIGN_CHILDREN(Attribute,saml2,m_children.end());
     
         protected:
@@ -616,6 +616,10 @@ namespace opensaml {
                 
             AuthzDecisionQueryImpl(const AuthzDecisionQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
                 init();
+            }
+
+            void _clone(const AuthzDecisionQueryImpl& src) {
+                SubjectQueryImpl::_clone(src);
                 setResource(src.getResource());
                 if (src.getEvidence())
                     setEvidence(src.getEvidence()->cloneEvidence());
@@ -630,14 +634,7 @@ namespace opensaml {
                 }
             }
             
-            IMPL_XMLOBJECT_CLONE(AuthzDecisionQuery);
-            SubjectQuery* cloneSubjectQuery() const {
-                return cloneAuthzDecisionQuery();
-            }
-            RequestAbstractType* cloneRequestAbstractType() const {
-                return cloneAuthzDecisionQuery();
-            }
-
+            IMPL_XMLOBJECT_CLONE_EX(AuthzDecisionQuery);
             IMPL_STRING_ATTRIB(Resource);
             IMPL_TYPED_FOREIGN_CHILDREN(Action,saml2,m_pos_Evidence);
             IMPL_TYPED_FOREIGN_CHILD(Evidence,saml2);
@@ -920,14 +917,16 @@ namespace opensaml {
             }
     
             AuthnRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             AuthnRequestImpl(const AuthnRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
                 init();
+            }
 
+            void _clone(const AuthnRequestImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
                 ForceAuthn(m_ForceAuthn);
                 IsPassive(m_IsPassive);
                 setProtocolBinding(src.getProtocolBinding());
@@ -935,7 +934,6 @@ namespace opensaml {
                 setAssertionConsumerServiceURL(src.getAssertionConsumerServiceURL());
                 setAttributeConsumingServiceIndex(m_AttributeConsumingServiceIndex);
                 setProviderName(src.getProviderName());
-
                 if (src.getSubject())
                     setSubject(src.getSubject()->cloneSubject());
                 if (src.getNameIDPolicy())
@@ -948,10 +946,7 @@ namespace opensaml {
                     setScoping(src.getScoping()->cloneScoping());
             }
             
-            IMPL_XMLOBJECT_CLONE(AuthnRequest);
-            RequestAbstractType* cloneRequestAbstractType() const {
-                return cloneAuthnRequest();
-            }
+            IMPL_XMLOBJECT_CLONE_EX(AuthnRequest);
 
             IMPL_BOOLEAN_ATTRIB(ForceAuthn);
             IMPL_BOOLEAN_ATTRIB(IsPassive);
@@ -1043,14 +1038,16 @@ namespace opensaml {
             }
     
             StatusResponseTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+                : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             StatusResponseTypeImpl(const StatusResponseTypeImpl& src)
                     : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
                 init();
+            }
+
+            void _clone(const StatusResponseTypeImpl& src) {
                 setID(src.getID());
                 setInResponseTo(src.getInResponseTo());
                 setVersion(src.getVersion());
@@ -1085,6 +1082,10 @@ namespace opensaml {
                     m_Signature->setContentReference(new opensaml::ContentReference(*this));
             }
             
+            StatusResponseType* cloneStatusResponseType() const {
+                return dynamic_cast<StatusResponseType*>(clone());
+            }
+
             IMPL_STRING_ATTRIB(Version);
             IMPL_ID_ATTRIB_EX(ID,ID,nullptr);
             IMPL_STRING_ATTRIB(InResponseTo);
@@ -1146,6 +1147,10 @@ namespace opensaml {
                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) { }
                 
             ResponseImpl(const ResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
+            }
+
+            void _clone(const ResponseImpl& src) {
+                StatusResponseTypeImpl::_clone(src);
                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
                     if (*i) {
                         saml2::Assertion* assertion=dynamic_cast<saml2::Assertion*>(*i);
@@ -1160,13 +1165,9 @@ namespace opensaml {
                         }
                     }
                 }
-
             }
             
-            IMPL_XMLOBJECT_CLONE(Response);
-            StatusResponseType* cloneStatusResponseType() const {
-                return cloneResponse();
-            }
+            IMPL_XMLOBJECT_CLONE_EX(Response);
 
             IMPL_TYPED_FOREIGN_CHILDREN(Assertion,saml2,m_children.end());
             IMPL_TYPED_FOREIGN_CHILDREN(EncryptedAssertion,saml2,m_children.end());
@@ -1191,22 +1192,21 @@ namespace opensaml {
             virtual ~ArtifactResolveImpl() { }
     
             ArtifactResolveImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            { 
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             ArtifactResolveImpl(const ArtifactResolveImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
                 init();
+            }
+
+            void _clone(const ArtifactResolveImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
                 if(src.getArtifact())
                     setArtifact(src.getArtifact()->cloneArtifact());
             }
             
-            IMPL_XMLOBJECT_CLONE(ArtifactResolve);
-            RequestAbstractType* cloneRequestAbstractType() const {
-                return cloneArtifactResolve();
-            }
-
+            IMPL_XMLOBJECT_CLONE_EX(ArtifactResolve);
             IMPL_TYPED_CHILD(Artifact);
     
         protected:
@@ -1228,36 +1228,31 @@ namespace opensaml {
             virtual ~ArtifactResponseImpl() { }
     
             ArtifactResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             ArtifactResponseImpl(const ArtifactResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
                 init();
+            }
+
+            void _clone(const ArtifactResponseImpl& src) {
+                StatusResponseTypeImpl::_clone(src);
                 if (src.getPayload())
                     setPayload(getPayload()->clone());
-
             }
             
-            IMPL_XMLOBJECT_CLONE(ArtifactResponse);
-            StatusResponseType* cloneStatusResponseType() const {
-                return cloneArtifactResponse();
-            }
-
+            IMPL_XMLOBJECT_CLONE_EX(ArtifactResponse);
             IMPL_XMLOBJECT_CHILD(Payload);
     
         protected:
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
                 // These are valid elements for the parent StatusResponseType, so don't process these.
                 // If not one of these, then it must be the payload.
-                if (
-                    ! XMLHelper::isNodeNamed(root,SAML20_NS,saml2::Issuer::LOCAL_NAME) &&
-                    ! XMLHelper::isNodeNamed(root,XMLSIG_NS,xmlsignature::Signature::LOCAL_NAME) &&
-                    ! XMLHelper::isNodeNamed(root,SAML20P_NS,saml2p::Extensions::LOCAL_NAME) &&
-                    ! XMLHelper::isNodeNamed(root,SAML20P_NS,saml2p::Status::LOCAL_NAME)
-                   )
-                {
+                if (!XMLHelper::isNodeNamed(root,SAML20_NS,saml2::Issuer::LOCAL_NAME) &&
+                    !XMLHelper::isNodeNamed(root,XMLSIG_NS,xmlsignature::Signature::LOCAL_NAME) &&
+                    !XMLHelper::isNodeNamed(root,SAML20P_NS,saml2p::Extensions::LOCAL_NAME) &&
+                    !XMLHelper::isNodeNamed(root,SAML20P_NS,saml2p::Status::LOCAL_NAME)) {
                     setPayload(childXMLObject);
                     return;
                 }
@@ -1279,8 +1274,7 @@ namespace opensaml {
             }
             
         protected:
-            NewEncryptedIDImpl()
-            {
+            NewEncryptedIDImpl() {
                 init();
             }
             
@@ -1288,8 +1282,7 @@ namespace opensaml {
             virtual ~NewEncryptedIDImpl() {}
     
             NewEncryptedIDImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                    : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
@@ -1308,7 +1301,7 @@ namespace opensaml {
     
             IMPL_XMLOBJECT_CLONE(NewEncryptedID);
             EncryptedElementType* cloneEncryptedElementType() const {
-                return new NewEncryptedIDImpl(*this);
+                return cloneNewEncryptedID();
             }
 
             IMPL_TYPED_FOREIGN_CHILD(EncryptedData,xmlencryption);
@@ -1373,14 +1366,16 @@ namespace opensaml {
             virtual ~ManageNameIDRequestImpl() { }
     
             ManageNameIDRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             ManageNameIDRequestImpl(const ManageNameIDRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
                 init();
+            }
 
+            void _clone(const ManageNameIDRequestImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
                 if (src.getNameID())
                     setNameID(src.getNameID()->cloneNameID());
                 if (src.getEncryptedID())
@@ -1391,14 +1386,9 @@ namespace opensaml {
                     setNewEncryptedID(src.getNewEncryptedID()->cloneNewEncryptedID());
                 if (src.getTerminate())
                     setTerminate(src.getTerminate()->cloneTerminate());
-
             }
             
-            IMPL_XMLOBJECT_CLONE(ManageNameIDRequest);
-            RequestAbstractType* cloneRequestAbstractType() const {
-                return cloneManageNameIDRequest();
-            }
-
+            IMPL_XMLOBJECT_CLONE_EX(ManageNameIDRequest);
             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
             IMPL_TYPED_CHILD(NewID);
@@ -1427,10 +1417,7 @@ namespace opensaml {
             ManageNameIDResponseImpl(const ManageNameIDResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
             }
 
-            IMPL_XMLOBJECT_CLONE(ManageNameIDResponse);
-            StatusResponseType* cloneStatusResponseType() const {
-                return cloneManageNameIDResponse();
-            }
+            IMPL_XMLOBJECT_CLONE_EX(ManageNameIDResponse);
         };
 
         class SAML_DLLLOCAL LogoutRequestImpl : public virtual LogoutRequest, public RequestAbstractTypeImpl
@@ -1438,7 +1425,6 @@ namespace opensaml {
             void init() {
                 m_Reason=nullptr;
                 m_NotOnOrAfter=nullptr;
-
                 m_BaseID=nullptr;
                 m_NameID=nullptr;
                 m_EncryptedID=nullptr;
@@ -1460,17 +1446,18 @@ namespace opensaml {
             }
     
             LogoutRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             LogoutRequestImpl(const LogoutRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
                 init();
+            }
 
+            void _clone(const LogoutRequestImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
                 setReason(src.getReason());
                 setNotOnOrAfter(src.getNotOnOrAfter());
-
                 if (src.getBaseID())
                     setBaseID(src.getBaseID()->cloneBaseID());
                 if (src.getNameID())
@@ -1489,11 +1476,7 @@ namespace opensaml {
                 }
             }
             
-            IMPL_XMLOBJECT_CLONE(LogoutRequest);
-            RequestAbstractType* cloneRequestAbstractType() const {
-                return cloneLogoutRequest();
-            }
-
+            IMPL_XMLOBJECT_CLONE_EX(LogoutRequest);
             IMPL_STRING_ATTRIB(Reason);
             IMPL_DATETIME_ATTRIB(NotOnOrAfter,SAMLTIME_MAX);
             IMPL_TYPED_FOREIGN_CHILD(BaseID,saml2);
@@ -1533,10 +1516,7 @@ namespace opensaml {
             LogoutResponseImpl(const LogoutResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
             }
 
-            IMPL_XMLOBJECT_CLONE(LogoutResponse);
-            StatusResponseType* cloneStatusResponseType() const {
-                return cloneLogoutResponse();
-            }
+            IMPL_XMLOBJECT_CLONE_EX(LogoutResponse);
         };
 
 
@@ -1565,14 +1545,16 @@ namespace opensaml {
             virtual ~NameIDMappingRequestImpl() { }
     
             NameIDMappingRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             NameIDMappingRequestImpl(const NameIDMappingRequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
                 init();
+            }
 
+            void _clone(const NameIDMappingRequestImpl& src) {
+                RequestAbstractTypeImpl::_clone(src);
                 if (src.getBaseID())
                     setBaseID(src.getBaseID()->cloneBaseID());
                 if (src.getNameID())
@@ -1581,14 +1563,9 @@ namespace opensaml {
                     setEncryptedID(src.getEncryptedID()->cloneEncryptedID());
                 if (src.getNameIDPolicy())
                     setNameIDPolicy(src.getNameIDPolicy()->cloneNameIDPolicy());
-
             }
             
-            IMPL_XMLOBJECT_CLONE(NameIDMappingRequest);
-            RequestAbstractType* cloneRequestAbstractType() const {
-                return cloneNameIDMappingRequest();
-            }
-
+            IMPL_XMLOBJECT_CLONE_EX(NameIDMappingRequest);
             IMPL_TYPED_FOREIGN_CHILD(BaseID,saml2);
             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
@@ -1620,26 +1597,23 @@ namespace opensaml {
             virtual ~NameIDMappingResponseImpl() { }
     
             NameIDMappingResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                : AbstractXMLObject(nsURI, localName, prefix, schemaType)
-            {
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
                 init();
             }
                 
             NameIDMappingResponseImpl(const NameIDMappingResponseImpl& src) : AbstractXMLObject(src), StatusResponseTypeImpl(src) {
                 init();
+            }
 
+            void _clone(const NameIDMappingResponseImpl& src) {
+                StatusResponseTypeImpl::_clone(src);
                 if (src.getNameID())
                     setNameID(getNameID()->cloneNameID());
                 if (src.getEncryptedID())
                     setEncryptedID(getEncryptedID()->cloneEncryptedID());
-
             }
             
-            IMPL_XMLOBJECT_CLONE(NameIDMappingResponse);
-            StatusResponseType* cloneStatusResponseType() const {
-                return cloneNameIDMappingResponse();
-            }
-
+            IMPL_XMLOBJECT_CLONE_EX(NameIDMappingResponse);
             IMPL_TYPED_FOREIGN_CHILD(NameID,saml2);
             IMPL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);