Wrapped encryption schema, also block unknown attributes and handle schemaLocation.
[shibboleth/cpp-xmltooling.git] / xmltooling / AbstractXMLObject.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  * AbstractXMLObject.cpp\r
19  * \r
20  * An abstract implementation of XMLObject.\r
21  */\r
22 \r
23 #include "internal.h"\r
24 #include "AbstractXMLObject.h"\r
25 #include "exceptions.h"\r
26 \r
27 #include <algorithm>\r
28 #include <log4cpp/Category.hh>\r
29 \r
30 using namespace xmltooling;\r
31 \r
32 AbstractXMLObject::AbstractXMLObject(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)\r
33     : m_log(&log4cpp::Category::getInstance(XMLTOOLING_LOGCAT".XMLObject")), m_schemaLocation(NULL),\r
34         m_parent(NULL), m_elementQname(nsURI, localName, prefix), m_typeQname(NULL)\r
35 {\r
36     addNamespace(Namespace(nsURI, prefix));\r
37     if (schemaType) {\r
38         m_typeQname = new QName(*schemaType);\r
39         addNamespace(Namespace(m_typeQname->getNamespaceURI(), m_typeQname->getPrefix()));\r
40     }\r
41 }\r
42 \r
43 AbstractXMLObject::AbstractXMLObject(const AbstractXMLObject& src)\r
44     : m_namespaces(src.m_namespaces), m_log(src.m_log), m_schemaLocation(XMLString::replicate(src.m_schemaLocation)),\r
45         m_parent(NULL), m_elementQname(src.m_elementQname), m_typeQname(NULL)\r
46 {\r
47     if (src.m_typeQname)\r
48         m_typeQname=new QName(*src.m_typeQname);\r
49 }\r
50 \r
51 XMLCh* AbstractXMLObject::prepareForAssignment(XMLCh* oldValue, const XMLCh* newValue)\r
52 {\r
53     XMLCh* newString = XMLString::replicate(newValue);\r
54     XMLString::trim(newString);\r
55     if (!XMLString::equals(oldValue,newValue)) {\r
56         releaseThisandParentDOM();\r
57         XMLString::release(&oldValue);\r
58         return newString;\r
59     }\r
60     XMLString::release(&newString);\r
61     return oldValue;            \r
62 }\r
63 \r
64 QName* AbstractXMLObject::prepareForAssignment(QName* oldValue, const QName* newValue)\r
65 {\r
66     if (!oldValue) {\r
67         if (newValue) {\r
68             releaseThisandParentDOM();\r
69             Namespace newNamespace(newValue->getNamespaceURI(), newValue->getPrefix());\r
70             addNamespace(newNamespace);\r
71             return new QName(*newValue);\r
72         }\r
73         return NULL;\r
74     }\r
75 \r
76     delete oldValue;\r
77     releaseThisandParentDOM();\r
78     if (newValue) {\r
79         Namespace newNamespace(newValue->getNamespaceURI(), newValue->getPrefix());\r
80         addNamespace(newNamespace);\r
81         return new QName(*newValue);\r
82     }\r
83     return NULL;\r
84 }\r
85 \r
86 DateTime* AbstractXMLObject::prepareForAssignment(DateTime* oldValue, const DateTime* newValue)\r
87 {\r
88     if (!oldValue) {\r
89         if (newValue) {\r
90             releaseThisandParentDOM();\r
91             return new DateTime(*newValue);\r
92         }\r
93         return NULL;\r
94     }\r
95 \r
96     delete oldValue;\r
97     releaseThisandParentDOM();\r
98     return newValue ? new DateTime(*newValue) : NULL;\r
99 }\r
100 \r
101 DateTime* AbstractXMLObject::prepareForAssignment(DateTime* oldValue, time_t newValue)\r
102 {\r
103     delete oldValue;\r
104     releaseThisandParentDOM();\r
105     DateTime* ret = new DateTime(newValue);\r
106     ret->parseDateTime();\r
107     return ret;\r
108 }\r
109 \r
110 DateTime* AbstractXMLObject::prepareForAssignment(DateTime* oldValue, const XMLCh* newValue)\r
111 {\r
112     delete oldValue;\r
113     releaseThisandParentDOM();\r
114     DateTime* ret = new DateTime(newValue);\r
115     ret->parseDateTime();\r
116     return ret;\r
117 }\r
118 \r
119 XMLObject* AbstractXMLObject::prepareForAssignment(XMLObject* oldValue, XMLObject* newValue)\r
120 {\r
121     if (newValue && newValue->hasParent())\r
122         throw XMLObjectException("child XMLObject cannot be added - it is already the child of another XMLObject");\r
123 \r
124     if (!oldValue) {\r
125         if (newValue) {\r
126             releaseThisandParentDOM();\r
127             newValue->setParent(this);\r
128         }\r
129         return newValue;\r
130     }\r
131 \r
132     if (oldValue != newValue) {\r
133         delete oldValue;\r
134         releaseThisandParentDOM();\r
135         if (newValue)\r
136             newValue->setParent(this);\r
137     }\r
138 \r
139     return newValue;\r
140 }\r