Initial unit test plus fixes
[shibboleth/cpp-xmltooling.git] / xmltooling / io / Unmarshaller.cpp
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  * Unmarshaller.cpp\r
19  * \r
20  * Transforms DOM trees into XMLObjects \r
21  */\r
22 \r
23 #include "internal.h"\r
24 #include "Unmarshaller.h"\r
25 #include "util/NDC.h"\r
26 #include "util/XMLHelper.h"\r
27 \r
28 #include <log4cpp/Category.hh>\r
29 \r
30 using namespace xmltooling;\r
31 using namespace log4cpp;\r
32 using namespace std;\r
33 \r
34 map<QName,Unmarshaller*> Unmarshaller::m_map;\r
35 \r
36 Unmarshaller* Unmarshaller::m_default=NULL;\r
37 \r
38 const Unmarshaller* Unmarshaller::getUnmarshaller(const DOMElement* domElement)\r
39 {\r
40 #ifdef _DEBUG\r
41     xmltooling::NDC ndc("getUnmarshaller");\r
42 #endif\r
43     Category& log=Category::getInstance(XMLTOOLING_LOGCAT".Unmarshaller");\r
44  \r
45     auto_ptr<QName> schemaType(XMLHelper::getXSIType(domElement));\r
46     const Unmarshaller* m = getUnmarshaller(*(schemaType.get()));\r
47     if (m) {\r
48         if (log.isDebugEnabled()) {\r
49             log.debug("located Unmarshaller for schema type: %s", schemaType->toString().c_str());\r
50         }\r
51         return m;\r
52     }\r
53     \r
54     auto_ptr<QName> elementName(XMLHelper::getNodeQName(domElement));\r
55     m = getUnmarshaller(*(elementName.get()));\r
56     if (m) {\r
57         if (log.isDebugEnabled()) {\r
58             log.debug("located Unmarshaller for element name: %s", elementName->toString().c_str());\r
59         }\r
60         return m;\r
61     }\r
62 \r
63     if (log.isDebugEnabled()) {\r
64         log.debug("no Unmarshaller registered for element (%s), returning default", elementName->toString().c_str());\r
65     }\r
66     return m_default;\r
67 }\r
68 \r
69 void Unmarshaller::destroyUnmarshallers()\r
70 {\r
71     for_each(m_map.begin(),m_map.end(),cleanup_pair<QName,Unmarshaller>());\r
72     m_map.clear();\r
73     deregisterDefaultUnmarshaller();\r
74 }\r