f7d05aa5d11b6a33c1bc651812bdab4c69ba5711
[shibboleth/cpp-xmltooling.git] / xmltooling / io / AbstractXMLObjectUnmarshaller.h
1 /*\r
2 *  Copyright 2001-2006 Internet2\r
3  * \r
4 * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 /**\r
18  * @file AbstractXMLObjectUnmarshaller.h\r
19  * \r
20  * A thread-safe abstract unmarshaller.\r
21  */\r
22 \r
23 #if !defined(__xmltooling_xmlunmarshaller_h__)\r
24 #define __xmltooling_xmlunmarshaller_h__\r
25 \r
26 #include <xmltooling/io/Unmarshaller.h>\r
27 \r
28 namespace xmltooling {\r
29 \r
30     /**\r
31      * A thread-safe abstract unmarshaller.\r
32      */\r
33     class XMLTOOL_API AbstractXMLObjectUnmarshaller : public virtual Unmarshaller\r
34     {\r
35     public:\r
36         virtual ~AbstractXMLObjectUnmarshaller() {}\r
37 \r
38         /**\r
39          * @see Unmarshaller::unmarshall()\r
40          */\r
41         XMLObject* unmarshall(DOMElement* element, bool bindDocument=false) const;\r
42             \r
43     protected:\r
44         AbstractXMLObjectUnmarshaller();\r
45 \r
46         /**\r
47          * Constructs the XMLObject that the given DOM Element will be unmarshalled into. If the DOM element has an XML\r
48          * Schema type defined this method will attempt to retrieve an XMLObjectBuilder using the schema type. If no\r
49          * schema type is present or no builder is registered for the schema type, the element's QName is used. Once\r
50          * the builder is found the XMLObject is created by invoking XMLObjectBuilder::buildObject().\r
51          * Extending classes may wish to override this logic if more than just schema type or element name\r
52          * (e.g. element attributes or content) need to be used to determine how to create the XMLObject.\r
53          * \r
54          * @param domElement the DOM Element the created XMLObject will represent\r
55          * @return the empty XMLObject that DOM Element can be unmarshalled into\r
56          * \r
57          * @throws UnmarshallingException thrown if there is now XMLObjectBuilder registered for the given DOM Element\r
58          */\r
59         virtual XMLObject* buildXMLObject(const DOMElement* domElement) const;\r
60         \r
61         /**\r
62          * Unmarshalls the attributes from the given DOM Element into the given XMLObject. If the attribute is an XML\r
63          * namespace declaration the namespace is added to the given element via XMLObject::addNamespace().\r
64          * If it is a schema type (xsi:type) the schema type is added to the element via XMLObject::setSchemaType().\r
65          * All other attributes are passed to the processAttribute hook.\r
66          * \r
67          * @param domElement the DOM Element whose attributes will be unmarshalled\r
68          * @param xmlObject the XMLObject that will recieve information from the DOM attribute\r
69          * \r
70          * @throws UnmarshallingException thrown if there is a problem unmarshalling an attribute\r
71          */\r
72         virtual void unmarshallAttributes(const DOMElement* domElement, XMLObject& xmlObject) const;\r
73 \r
74         /**\r
75          * Unmarshalls a given Element's children. For each child an unmarshaller is retrieved using\r
76          * getUnmarshaller(). The unmarshaller is then used to unmarshall the child element and the\r
77          * resulting XMLObject is passed to processChildElement() for further processing.\r
78          * \r
79          * @param domElement the DOM Element whose children will be unmarshalled\r
80          * @param xmlObject the parent object of the unmarshalled children\r
81          * \r
82          * @throws UnmarshallingException thrown if an error occurs unmarshalling the child elements\r
83          */\r
84         virtual void unmarshallChildElements(const DOMElement* domElement, XMLObject& xmlObject) const;\r
85 \r
86         /**\r
87          * Called after a child element has been unmarshalled so that it can be added to the parent XMLObject.\r
88          * \r
89          * @param parent    the parent XMLObject\r
90          * @param child     pointer to the child XMLObject\r
91          * @param childRoot root element of the child (must not be stored, just a hint)\r
92          * \r
93          * @throws UnmarshallingException thrown if there is a problem adding the child to the parent\r
94          */\r
95         virtual void processChildElement(XMLObject& parent, XMLObject* child, const DOMElement* childRoot) const=0;\r
96     \r
97         /**\r
98          * Called after an attribute has been unmarshalled so that it can be added to the XMLObject.\r
99          * \r
100          * @param xmlObject the XMLObject\r
101          * @param attribute the attribute being unmarshalled\r
102          * \r
103          * @throws UnmarshallingException thrown if there is a problem adding the attribute to the XMLObject\r
104          */\r
105         virtual void processAttribute(XMLObject& xmlObject, const DOMAttr* attribute) const=0;\r
106     \r
107         /**\r
108          * Called if the element being unmarshalled contained textual content so that it can be added to the XMLObject.\r
109          * \r
110          * @param xmlObject XMLObject the content will be given to\r
111          * @param elementContent the Element's text content\r
112          */\r
113         virtual void processElementContent(XMLObject& xmlObject, const XMLCh* elementContent) const=0;\r
114 \r
115         void* m_log;\r
116     };\r
117     \r
118 };\r
119 \r
120 #endif /* __xmltooling_xmlunmarshaller_h__ */\r