+/*\r
+ * Copyright 2001-2006 Internet2\r
+ * \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+/**\r
+ * @file AbstractDOMCachingXMLObject.h\r
+ * \r
+ * Extension of AbstractXMLObject that implements a DOMCachingXMLObject. \r
+ */\r
+\r
+#if !defined(__xmltooling_abstractdomxmlobj_h__)\r
+#define __xmltooling_abstractdomxmlobj_h__\r
+\r
+#include <xmltooling/AbstractXMLObject.h>\r
+#include <xmltooling/DOMCachingXMLObject.h>\r
+\r
+#pragma warning( push )\r
+#pragma warning( disable : 4250 4251 )\r
+\r
+namespace xmltooling {\r
+\r
+ /**\r
+ * Extension of AbstractXMLObject that implements a DOMCachingXMLObject.\r
+ */\r
+ class XMLTOOL_API AbstractDOMCachingXMLObject : public virtual AbstractXMLObject, public virtual DOMCachingXMLObject\r
+ {\r
+ public:\r
+ virtual ~AbstractDOMCachingXMLObject();\r
+ \r
+ /**\r
+ * @see DOMCachingXMLObject::getDOM()\r
+ */\r
+ const DOMElement* getDOM() const {\r
+ return m_dom;\r
+ }\r
+ \r
+ /**\r
+ * @see DOMCachingXMLObject::setDOM()\r
+ */\r
+ void setDOM(DOMElement* dom) {\r
+ m_dom=dom;\r
+ }\r
+ \r
+ /**\r
+ * @see DOMCachingXMLObject::setDocument()\r
+ */\r
+ DOMDocument* setDocument(DOMDocument* doc) {\r
+ DOMDocument* ret=m_document;\r
+ m_document=doc;\r
+ return ret;\r
+ }\r
+ \r
+ /**\r
+ * @see DOMCachingXMLObject::releaseDOM()\r
+ */\r
+ void releaseDOM();\r
+ \r
+ /**\r
+ * @see DOMCachingXMLObject::releaseParentDOM()\r
+ */\r
+ void releaseParentDOM(bool propagateRelease=true);\r
+ \r
+ /**\r
+ * @see DOMCachingXMLObject::releaseChildrenDOM()\r
+ */\r
+ void releaseChildrenDOM(bool propagateRelease=true);\r
+ \r
+ /**\r
+ * A convenience method that is equal to calling releaseDOM() then releaseParentDOM(true).\r
+ */\r
+ void releaseThisandParentDOM() {\r
+ if (m_dom) {\r
+ releaseDOM();\r
+ releaseParentDOM(true);\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * A convenience method that is equal to calling releaseDOM() then releaseChildrenDOM(true).\r
+ */\r
+ void releaseThisAndChildrenDOM() {\r
+ if (m_dom) {\r
+ releaseDOM();\r
+ releaseChildrenDOM(true);\r
+ }\r
+ }\r
+ \r
+ protected:\r
+ /**\r
+ * A helper function for derived classes.\r
+ * This 'normalizes' newString and then if it is different from oldString\r
+ * invalidates the DOM. It returns the normalized value.\r
+ * \r
+ * @param oldValue - the current value\r
+ * @param newValue - the new value\r
+ * \r
+ * @return the value that should be assigned\r
+ */\r
+ XMLCh* prepareForAssignment(const XMLCh* oldValue, const XMLCh* newValue) {\r
+ XMLCh* newString = XMLString::replicate(newValue);\r
+ XMLString::trim(newString);\r
+\r
+ if (oldValue && !newValue || !oldValue && newValue || XMLString::compareString(oldValue,newValue))\r
+ releaseThisandParentDOM();\r
+ \r
+ return newString;\r
+ }\r
+ \r
+ /**\r
+ * A helper function for derived classes, for assignment of (singleton) XML objects.\r
+ * \r
+ * It is indifferent to whether either the old or the new version of the value is null. \r
+ * This method will do a safe compare of the objects and will also invalidate the DOM if appropriate\r
+ * \r
+ * @param oldValue - current value\r
+ * @param newValue - proposed new value\r
+ * @return The value to assign to the saved Object.\r
+ * \r
+ * @throws IllegalArgumentException if the child already has a parent.\r
+ */\r
+ XMLObject* prepareForAssignment(const XMLObject* oldValue, XMLObject* newValue);\r
+\r
+ /**\r
+ * Constructor\r
+ * \r
+ * @param namespaceURI the namespace the element is in\r
+ * @param elementLocalName the local name of the XML element this Object represents\r
+ */\r
+ explicit AbstractDOMCachingXMLObject(const XMLCh* namespaceURI, const XMLCh* elementLocalName)\r
+ : AbstractXMLObject(namespaceURI,elementLocalName), m_dom(NULL), m_document(NULL) {}\r
+\r
+ private:\r
+ DOMElement* m_dom;\r
+ DOMDocument* m_document;\r
+ };\r
+ \r
+};\r
+\r
+#pragma warning( pop )\r
+\r
+#endif /* __xmltooling_abstractdomxmlobj_h__ */\r