Initial unit test plus fixes
[shibboleth/cpp-xmltooling.git] / xmltooling / XMLObjectBuilder.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  * XMLObjectBuilder.cpp\r
19  * \r
20  * Factory interface for XMLObjects \r
21  */\r
22 \r
23 #include "internal.h"\r
24 #include "XMLObjectBuilder.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,XMLObjectBuilder*> XMLObjectBuilder::m_map;\r
35 XMLObjectBuilder* XMLObjectBuilder::m_default=NULL;\r
36 \r
37 const XMLObjectBuilder* XMLObjectBuilder::getBuilder(const DOMElement* domElement)\r
38 {\r
39 #ifdef _DEBUG\r
40     xmltooling::NDC ndc("getBuilder");\r
41 #endif\r
42     Category& log=Category::getInstance(XMLTOOLING_LOGCAT".XMLObjectBuilder");\r
43  \r
44     auto_ptr<QName> schemaType(XMLHelper::getXSIType(domElement));\r
45     const XMLObjectBuilder* xmlObjectBuilder = getBuilder(*(schemaType.get()));\r
46     if (xmlObjectBuilder) {\r
47         if (log.isDebugEnabled()) {\r
48             log.debug("located XMLObjectBuilder for schema type: %s", schemaType->toString().c_str());\r
49         }\r
50         return xmlObjectBuilder;\r
51     }\r
52     \r
53     auto_ptr<QName> elementName(XMLHelper::getNodeQName(domElement));\r
54     xmlObjectBuilder = getBuilder(*(elementName.get()));\r
55     if (xmlObjectBuilder) {\r
56         if (log.isDebugEnabled()) {\r
57             log.debug("located XMLObjectBuilder for element name: %s", elementName->toString().c_str());\r
58         }\r
59         return xmlObjectBuilder;\r
60     }\r
61 \r
62     if (log.isDebugEnabled()) {\r
63         log.debug("no XMLObjectBuilder registered for element (%s), returning default", elementName->toString().c_str());\r
64     }\r
65     return m_default;\r
66 }\r
67 \r
68 void XMLObjectBuilder::destroyBuilders()\r
69 {\r
70     for_each(m_map.begin(),m_map.end(),cleanup_pair<QName,XMLObjectBuilder>());\r
71     m_map.clear();\r
72     deregisterDefaultBuilder();\r
73 }\r