gcc const fix, converted linefeeds
[shibboleth/cpp-xmltooling.git] / xmltooling / io / AbstractXMLObjectMarshaller.h
1 /*
2 *  Copyright 2001-2006 Internet2
3  * 
4 * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /**
18  * @file AbstractXMLObjectMarshaller.h
19  * 
20  * A thread-safe abstract marshaller.
21  */
22
23 #if !defined(__xmltooling_xmlmarshaller_h__)
24 #define __xmltooling_xmlmarshaller_h__
25
26 #include <xmltooling/AbstractDOMCachingXMLObject.h>
27
28 #if defined (_MSC_VER)
29     #pragma warning( push )
30     #pragma warning( disable : 4250 4251 )
31 #endif
32
33 namespace xmltooling {
34
35     /**
36      * A thread-safe abstract marshaller.
37      */
38     class XMLTOOL_API AbstractXMLObjectMarshaller : public virtual AbstractXMLObject
39     {
40     public:
41         virtual ~AbstractXMLObjectMarshaller() {}
42
43         DOMElement* marshall(
44             DOMDocument* document=NULL
45 #ifndef XMLTOOLING_NO_XMLSEC
46             ,const std::vector<xmlsignature::Signature*>* sigs=NULL
47 #endif
48             ) const;
49
50         DOMElement* marshall(
51             DOMElement* parentElement
52 #ifndef XMLTOOLING_NO_XMLSEC
53             ,const std::vector<xmlsignature::Signature*>* sigs=NULL
54 #endif
55             ) const;
56         
57     protected:
58         AbstractXMLObjectMarshaller() {}
59
60         /**
61          * Sets the given element as the Document Element of the given Document.
62          * If the document already has a Document Element it is replaced by the given element.
63          * 
64          * @param document the document
65          * @param element the Element that will serve as the Document Element
66          */
67         void setDocumentElement(DOMDocument* document, DOMElement* element) const {
68             DOMElement* documentRoot = document->getDocumentElement();
69             if (documentRoot)
70                 document->replaceChild(element, documentRoot);
71             else
72                 document->appendChild(element);
73         }
74     
75         /**
76          * Marshalls the XMLObject into the given DOM Element.
77          * The DOM Element must be within a DOM tree rooted in the owning Document.
78          * 
79          * @param targetElement the Element into which the XMLObject is marshalled into
80          * @param ctx           optional marshalling context
81          * 
82          * @throws MarshallingException thrown if there is a problem marshalling the object
83          * @throws SignatureException thrown if a problem occurs during signature creation 
84          */
85         void marshallInto(
86             DOMElement* targetElement
87 #ifndef XMLTOOLING_NO_XMLSEC
88             ,const std::vector<xmlsignature::Signature*>* sigs
89 #endif
90             ) const;
91     
92         /**
93          * Creates an xsi:type attribute, corresponding to the given type of the XMLObject, on the DOM element.
94          * 
95          * @param domElement the DOM element
96          * 
97          * @throws MarshallingException thrown if the type on the XMLObject is doesn't contain
98          * a local name, prefix, and namespace URI
99          */
100         void marshallElementType(DOMElement* domElement) const;
101
102         /**
103          * Creates the xmlns attributes for any namespaces set on the XMLObject.
104          * 
105          * @param domElement the DOM element the namespaces will be added to
106          */
107         void marshallNamespaces(DOMElement* domElement) const;
108     
109         /**
110          * Marshalls the text content and/or child elements of the XMLObject.
111          * 
112          * @param domElement the DOM element that will recieved the marshalled children
113          * 
114          * @throws MarshallingException thrown if there is a problem marshalling a child element
115          */
116         void marshallContent(DOMElement* domElement) const;
117
118         /**
119          * Marshalls the attributes from the XMLObject into the given DOM element.
120          * 
121          * @param domElement the DOM Element into which attributes will be marshalled
122          * 
123          * @throws MarshallingException thrown if there is a problem marshalling an attribute
124          */
125         virtual void marshallAttributes(DOMElement* domElement) const {}
126     };
127     
128 };
129
130 #if defined (_MSC_VER)
131     #pragma warning( pop )
132 #endif
133
134 #endif /* __xmltooling_xmlmarshaller_h__ */