Refactored Signature signing/validation, various Validator bugs fixed.
[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")),\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_parent(NULL), m_elementQname(src.m_elementQname), m_typeQname(NULL)\r
45 {\r
46     if (src.m_typeQname)\r
47         m_typeQname=new QName(*src.m_typeQname);\r
48 }\r
49 \r
50 XMLCh* AbstractXMLObject::prepareForAssignment(XMLCh* oldValue, const XMLCh* newValue)\r
51 {\r
52     XMLCh* newString = XMLString::replicate(newValue);\r
53     XMLString::trim(newString);\r
54     if (!XMLString::equals(oldValue,newValue)) {\r
55         releaseThisandParentDOM();\r
56         XMLString::release(&oldValue);\r
57         return newString;\r
58     }\r
59     XMLString::release(&newString);\r
60     return oldValue;            \r
61 }\r
62 \r
63 QName* AbstractXMLObject::prepareForAssignment(QName* oldValue, const QName* newValue)\r
64 {\r
65     if (!oldValue) {\r
66         if (newValue) {\r
67             releaseThisandParentDOM();\r
68             Namespace newNamespace(newValue->getNamespaceURI(), newValue->getPrefix());\r
69             addNamespace(newNamespace);\r
70             return new QName(*newValue);\r
71         }\r
72         return NULL;\r
73     }\r
74 \r
75     delete oldValue;\r
76     releaseThisandParentDOM();\r
77     if (newValue) {\r
78         Namespace newNamespace(newValue->getNamespaceURI(), newValue->getPrefix());\r
79         addNamespace(newNamespace);\r
80         return new QName(*newValue);\r
81     }\r
82     return NULL;\r
83 }\r
84 \r
85 DateTime* AbstractXMLObject::prepareForAssignment(DateTime* oldValue, const DateTime* newValue)\r
86 {\r
87     if (!oldValue) {\r
88         if (newValue) {\r
89             releaseThisandParentDOM();\r
90             return new DateTime(*newValue);\r
91         }\r
92         return NULL;\r
93     }\r
94 \r
95     delete oldValue;\r
96     releaseThisandParentDOM();\r
97     return newValue ? new DateTime(*newValue) : NULL;\r
98 }\r
99 \r
100 DateTime* AbstractXMLObject::prepareForAssignment(DateTime* oldValue, time_t newValue)\r
101 {\r
102     delete oldValue;\r
103     releaseThisandParentDOM();\r
104     DateTime* ret = new DateTime(newValue);\r
105     ret->parseDateTime();\r
106     return ret;\r
107 }\r
108 \r
109 DateTime* AbstractXMLObject::prepareForAssignment(DateTime* oldValue, const XMLCh* newValue)\r
110 {\r
111     delete oldValue;\r
112     releaseThisandParentDOM();\r
113     DateTime* ret = new DateTime(newValue);\r
114     ret->parseDateTime();\r
115     return ret;\r
116 }\r
117 \r
118 XMLObject* AbstractXMLObject::prepareForAssignment(XMLObject* oldValue, XMLObject* newValue)\r
119 {\r
120     if (newValue && newValue->hasParent())\r
121         throw XMLObjectException("child XMLObject cannot be added - it is already the child of another XMLObject");\r
122 \r
123     if (!oldValue) {\r
124         if (newValue) {\r
125             releaseThisandParentDOM();\r
126             newValue->setParent(this);\r
127         }\r
128         return newValue;\r
129     }\r
130 \r
131     if (oldValue != newValue) {\r
132         delete oldValue;\r
133         releaseThisandParentDOM();\r
134         if (newValue)\r
135             newValue->setParent(this);\r
136     }\r
137 \r
138     return newValue;\r
139 }\r