2 * Copyright 2001-2010 Internet2
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 * Implementation classes for SOAP 1.1 schema.
24 #include "AbstractAttributeExtensibleXMLObject.h"
25 #include "AbstractComplexElement.h"
26 #include "AbstractSimpleElement.h"
27 #include "exceptions.h"
28 #include "io/AbstractXMLObjectMarshaller.h"
29 #include "io/AbstractXMLObjectUnmarshaller.h"
30 #include "soap/SOAP.h"
31 #include "util/XMLHelper.h"
33 #include <xercesc/util/XMLUniDefs.hpp>
35 using namespace soap11;
36 using namespace xmltooling;
37 using namespace xercesc;
39 using xmlconstants::SOAP11ENV_NS;
40 using xmlconstants::SOAP11ENV_PREFIX;
42 #if defined (_MSC_VER)
43 #pragma warning( push )
44 #pragma warning( disable : 4250 4251 )
49 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Faultstring);
50 DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Faultactor);
52 class XMLTOOL_DLLLOCAL FaultcodeImpl : public virtual Faultcode,
53 public AbstractSimpleElement,
54 public AbstractDOMCachingXMLObject,
55 public AbstractXMLObjectMarshaller,
56 public AbstractXMLObjectUnmarshaller
58 mutable xmltooling::QName* m_qname;
60 virtual ~FaultcodeImpl() {
64 FaultcodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
65 : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_qname(nullptr) {
68 FaultcodeImpl(const FaultcodeImpl& src)
69 : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src), m_qname(nullptr) {
70 setCode(src.getCode());
73 const xmltooling::QName* getCode() const {
74 if (!m_qname && getDOM() && getDOM()->getTextContent()) {
75 m_qname = XMLHelper::getNodeValueAsQName(getDOM());
80 void setCode(const xmltooling::QName* qname) {
81 m_qname=prepareForAssignment(m_qname,qname);
83 auto_ptr_XMLCh temp(m_qname->toString().c_str());
84 setTextContent(temp.get());
87 setTextContent(nullptr);
91 IMPL_XMLOBJECT_CLONE(Faultcode);
94 class XMLTOOL_DLLLOCAL DetailImpl : public virtual Detail,
95 public AbstractAttributeExtensibleXMLObject,
96 public AbstractComplexElement,
97 public AbstractDOMCachingXMLObject,
98 public AbstractXMLObjectMarshaller,
99 public AbstractXMLObjectUnmarshaller
102 virtual ~DetailImpl() {}
104 DetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
105 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
108 DetailImpl(const DetailImpl& src)
109 : AbstractXMLObject(src),
110 AbstractAttributeExtensibleXMLObject(src),
111 AbstractComplexElement(src),
112 AbstractDOMCachingXMLObject(src) {
113 VectorOf(XMLObject) v=getUnknownXMLObjects();
114 for (vector<XMLObject*>::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i)
115 v.push_back((*i)->clone());
118 IMPL_XMLOBJECT_CLONE(Detail);
119 IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject, m_children.end());
122 void marshallAttributes(DOMElement* domElement) const {
123 marshallExtensionAttributes(domElement);
126 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
127 getUnknownXMLObjects().push_back(childXMLObject);
130 void processAttribute(const DOMAttr* attribute) {
131 unmarshallExtensionAttribute(attribute);
135 class XMLTOOL_DLLLOCAL FaultImpl : public virtual Fault,
136 public AbstractComplexElement,
137 public AbstractDOMCachingXMLObject,
138 public AbstractXMLObjectMarshaller,
139 public AbstractXMLObjectUnmarshaller
143 m_Faultstring=nullptr;
144 m_Faultactor=nullptr;
146 m_children.push_back(nullptr);
147 m_children.push_back(nullptr);
148 m_children.push_back(nullptr);
149 m_children.push_back(nullptr);
150 m_pos_Faultcode=m_children.begin();
151 m_pos_Faultstring=m_pos_Faultcode;
153 m_pos_Faultactor=m_pos_Faultstring;
155 m_pos_Detail=m_pos_Faultactor;
164 virtual ~FaultImpl() {}
166 FaultImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
167 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
171 FaultImpl(const FaultImpl& src)
172 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
174 if (src.getFaultcode())
175 setFaultcode(src.getFaultcode()->cloneFaultcode());
176 if (src.getFaultstring())
177 setFaultstring(src.getFaultstring()->cloneFaultstring());
178 if (src.getFaultactor())
179 setFaultactor(src.getFaultactor()->cloneFaultactor());
181 setDetail(src.getDetail()->cloneDetail());
184 IMPL_XMLOBJECT_CLONE(Fault);
185 IMPL_TYPED_CHILD(Faultcode);
186 IMPL_TYPED_CHILD(Faultstring);
187 IMPL_TYPED_CHILD(Faultactor);
188 IMPL_TYPED_CHILD(Detail);
191 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
192 PROC_TYPED_CHILD(Faultcode,nullptr,false);
193 PROC_TYPED_CHILD(Faultstring,nullptr,false);
194 PROC_TYPED_CHILD(Faultactor,nullptr,false);
195 PROC_TYPED_CHILD(Detail,nullptr,false);
196 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
200 class XMLTOOL_DLLLOCAL BodyImpl : public virtual Body,
201 public AbstractAttributeExtensibleXMLObject,
202 public AbstractComplexElement,
203 public AbstractDOMCachingXMLObject,
204 public AbstractXMLObjectMarshaller,
205 public AbstractXMLObjectUnmarshaller
208 virtual ~BodyImpl() {
211 BodyImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
212 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
215 BodyImpl(const BodyImpl& src)
216 : AbstractXMLObject(src),
217 AbstractAttributeExtensibleXMLObject(src),
218 AbstractComplexElement(src),
219 AbstractDOMCachingXMLObject(src) {
220 VectorOf(XMLObject) v=getUnknownXMLObjects();
221 for (vector<XMLObject*>::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i)
222 v.push_back((*i)->clone());
225 IMPL_XMLOBJECT_CLONE(Body);
226 IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject, m_children.end());
229 void marshallAttributes(DOMElement* domElement) const {
230 marshallExtensionAttributes(domElement);
233 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
234 getUnknownXMLObjects().push_back(childXMLObject);
237 void processAttribute(const DOMAttr* attribute) {
238 unmarshallExtensionAttribute(attribute);
242 class XMLTOOL_DLLLOCAL HeaderImpl : public virtual Header,
243 public AbstractAttributeExtensibleXMLObject,
244 public AbstractComplexElement,
245 public AbstractDOMCachingXMLObject,
246 public AbstractXMLObjectMarshaller,
247 public AbstractXMLObjectUnmarshaller
250 virtual ~HeaderImpl() {
253 HeaderImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
254 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
257 HeaderImpl(const HeaderImpl& src)
258 : AbstractXMLObject(src),
259 AbstractAttributeExtensibleXMLObject(src),
260 AbstractComplexElement(src),
261 AbstractDOMCachingXMLObject(src) {
262 VectorOf(XMLObject) v=getUnknownXMLObjects();
263 for (vector<XMLObject*>::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i)
264 v.push_back((*i)->clone());
267 IMPL_XMLOBJECT_CLONE(Header);
268 IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject, m_children.end());
271 void marshallAttributes(DOMElement* domElement) const {
272 marshallExtensionAttributes(domElement);
275 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
276 getUnknownXMLObjects().push_back(childXMLObject);
279 void processAttribute(const DOMAttr* attribute) {
280 unmarshallExtensionAttribute(attribute);
284 class XMLTOOL_DLLLOCAL EnvelopeImpl : public virtual Envelope,
285 public AbstractAttributeExtensibleXMLObject,
286 public AbstractComplexElement,
287 public AbstractDOMCachingXMLObject,
288 public AbstractXMLObjectMarshaller,
289 public AbstractXMLObjectUnmarshaller
294 m_children.push_back(nullptr);
295 m_children.push_back(nullptr);
296 m_pos_Header=m_children.begin();
297 m_pos_Body=m_pos_Header;
301 virtual ~EnvelopeImpl() {}
303 EnvelopeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
304 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
308 EnvelopeImpl(const EnvelopeImpl& src)
309 : AbstractXMLObject(src), AbstractAttributeExtensibleXMLObject(src),
310 AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
313 setHeader(src.getHeader()->cloneHeader());
315 setBody(src.getBody()->cloneBody());
318 IMPL_TYPED_CHILD(Header);
319 IMPL_TYPED_CHILD(Body);
320 IMPL_XMLOBJECT_CLONE(Envelope);
323 void marshallAttributes(DOMElement* domElement) const {
324 marshallExtensionAttributes(domElement);
327 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
328 PROC_TYPED_CHILD(Header,SOAP11ENV_NS,false);
329 PROC_TYPED_CHILD(Body,SOAP11ENV_NS,false);
330 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
333 void processAttribute(const DOMAttr* attribute) {
334 unmarshallExtensionAttribute(attribute);
339 #if defined (_MSC_VER)
340 #pragma warning( pop )
343 // Builder Implementations
345 IMPL_XMLOBJECTBUILDER(Body);
346 IMPL_XMLOBJECTBUILDER(Detail);
347 IMPL_XMLOBJECTBUILDER(Envelope);
348 IMPL_XMLOBJECTBUILDER(Fault);
349 IMPL_XMLOBJECTBUILDER(Faultactor);
350 IMPL_XMLOBJECTBUILDER(Faultcode);
351 IMPL_XMLOBJECTBUILDER(Faultstring);
352 IMPL_XMLOBJECTBUILDER(Header);
356 const XMLCh Body::LOCAL_NAME[] = UNICODE_LITERAL_4(B,o,d,y);
357 const XMLCh Body::TYPE_NAME[] = UNICODE_LITERAL_4(B,o,d,y);
358 const XMLCh Body::ENCODINGSTYLE_ATTRIB_NAME[] = UNICODE_LITERAL_13(e,n,c,o,d,i,n,g,S,t,y,l,e);
359 const XMLCh Detail::LOCAL_NAME[] = UNICODE_LITERAL_6(d,e,t,a,i,l);
360 const XMLCh Detail::TYPE_NAME[] = UNICODE_LITERAL_6(d,e,t,a,i,l);
361 const XMLCh Envelope::LOCAL_NAME[] = UNICODE_LITERAL_8(E,n,v,e,l,o,p,e);
362 const XMLCh Envelope::TYPE_NAME[] = UNICODE_LITERAL_8(E,n,v,e,l,o,p,e);
363 const XMLCh Fault::LOCAL_NAME[] = UNICODE_LITERAL_5(F,a,u,l,t);
364 const XMLCh Fault::TYPE_NAME[] = UNICODE_LITERAL_5(F,a,u,l,t);
365 const XMLCh Faultactor::LOCAL_NAME[] = UNICODE_LITERAL_10(f,a,u,l,t,a,c,t,o,r);
366 const XMLCh Faultcode::LOCAL_NAME[] = UNICODE_LITERAL_9(f,a,u,l,t,c,o,d,e);
367 const XMLCh Faultstring::LOCAL_NAME[] = UNICODE_LITERAL_11(f,a,u,l,t,s,t,r,i,n,g);
368 const XMLCh Header::LOCAL_NAME[] = UNICODE_LITERAL_6(H,e,a,d,e,r);
369 const XMLCh Header::TYPE_NAME[] = UNICODE_LITERAL_6(H,e,a,d,e,r);
370 const XMLCh Header::ACTOR_ATTRIB_NAME[] = UNICODE_LITERAL_5(a,c,t,o,r);
371 const XMLCh Header::MUSTUNDERSTAND_ATTRIB_NAME[] = UNICODE_LITERAL_14(m,u,s,t,U,n,d,e,r,s,t,a,n,d);
373 static const XMLCh _CLIENT[] = UNICODE_LITERAL_6(C,l,i,e,n,t);
374 static const XMLCh _SERVER[] = UNICODE_LITERAL_6(S,e,r,v,e,r);
375 static const XMLCh _MUSTUNDERSTAND[] = UNICODE_LITERAL_14(M,u,s,t,U,n,d,e,r,s,t,a,n,d);
376 static const XMLCh _VERSIONMISMATCH[] = UNICODE_LITERAL_15(V,e,r,s,i,o,n,M,i,s,m,a,t,c,h);
378 xmltooling::QName Faultcode::CLIENT(SOAP11ENV_NS,_CLIENT,SOAP11ENV_PREFIX);
379 xmltooling::QName Faultcode::SERVER(SOAP11ENV_NS,_SERVER,SOAP11ENV_PREFIX);
380 xmltooling::QName Faultcode::MUSTUNDERSTAND(SOAP11ENV_NS,_MUSTUNDERSTAND,SOAP11ENV_PREFIX);
381 xmltooling::QName Faultcode::VERSIONMISMATCH(SOAP11ENV_NS,_VERSIONMISMATCH,SOAP11ENV_PREFIX);