https://issues.shibboleth.net/jira/browse/CPPOST-70
[shibboleth/cpp-xmltooling.git] / xmltooling / impl / AnyElement.cpp
1 /**
2  * Licensed to the University Corporation for Advanced Internet
3  * Development, Inc. (UCAID) under one or more contributor license
4  * agreements. See the NOTICE file distributed with this work for
5  * additional information regarding copyright ownership.
6  *
7  * UCAID licenses this file to you under the Apache License,
8  * Version 2.0 (the "License"); you may not use this file except
9  * in compliance with the License. You may obtain a copy of the
10  * License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
17  * either express or implied. See the License for the specific
18  * language governing permissions and limitations under the License.
19  */
20
21 /**
22  * AnyElement.cpp
23  * 
24  * Advanced anyType implementation suitable for deep processing of unknown content.
25  */
26
27 #include "internal.h"
28 #include "exceptions.h"
29 #include "impl/AnyElement.h"
30 #include "util/NDC.h"
31 #include "util/XMLHelper.h"
32
33 #include <xercesc/util/XMLUniDefs.hpp>
34
35 using namespace xmltooling;
36 using namespace xercesc;
37 using namespace std;
38
39 AnyElementImpl::AnyElementImpl()
40 {
41 }
42
43 AnyElementImpl::AnyElementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
44     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
45 {
46 }
47
48 AnyElementImpl::AnyElementImpl(const AnyElementImpl& src)
49         : AbstractXMLObject(src),
50           AbstractDOMCachingXMLObject(src),
51           AbstractComplexElement(src),
52           AbstractAttributeExtensibleXMLObject(src)
53 {
54 }
55
56 AnyElementImpl::~AnyElementImpl()
57 {
58 }
59
60 void AnyElementImpl::_clone(const AnyElementImpl& src)
61 {
62     const vector<XMLObject*>& children = src.getUnknownXMLObjects();
63     for (vector<XMLObject*>::const_iterator i=children.begin(); i!=children.end(); ++i)
64         getUnknownXMLObjects().push_back((*i)->clone());
65 }
66
67 XMLObject* AnyElementImpl::clone() const {
68     auto_ptr<XMLObject> domClone(AbstractDOMCachingXMLObject::clone());
69     AnyElementImpl* ret=dynamic_cast<AnyElementImpl*>(domClone.get());
70     if (ret) {
71         domClone.release();
72         return ret;
73     }
74
75     auto_ptr<AnyElementImpl> ret2(new AnyElementImpl(*this));
76     ret2->_clone(*ret2.get());
77     return ret2.release();
78 }
79
80 void AnyElementImpl::marshallAttributes(DOMElement* domElement) const
81 {
82     marshallExtensionAttributes(domElement);
83 }
84
85 void AnyElementImpl::processChildElement(XMLObject* childXMLObject, const DOMElement* root)
86 {
87     getUnknownXMLObjects().push_back(childXMLObject);
88 }
89
90 void AnyElementImpl::processAttribute(const DOMAttr* attribute)
91 {
92     unmarshallExtensionAttribute(attribute);
93 }
94
95 XMLObject* AnyElementBuilder::buildObject(
96     const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType
97     ) const
98 {
99     return new AnyElementImpl(nsURI, localName, prefix, schemaType);
100 }