You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by am...@apache.org on 2005/12/14 13:00:06 UTC

svn commit: r356774 - in /xerces/c/branches/xerces-2.7/src/xercesc/dom/impl: DOMDocumentImpl.cpp DOMTypeInfoImpl.cpp DOMTypeInfoImpl.hpp

Author: amassari
Date: Wed Dec 14 03:59:51 2005
New Revision: 356774

URL: http://svn.apache.org/viewcvs?rev=356774&view=rev
Log:
When cloning or importing a node, also copy the type information (jira# 1517)

Modified:
    xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentImpl.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMTypeInfoImpl.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMTypeInfoImpl.hpp

Modified: xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentImpl.cpp
URL: http://svn.apache.org/viewcvs/xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentImpl.cpp?rev=356774&r1=356773&r2=356774&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentImpl.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentImpl.cpp Wed Dec 14 03:59:51 2005
@@ -40,6 +40,7 @@
 #include "DOMNodeIteratorImpl.hpp"
 #include "DOMNodeIDMap.hpp"
 #include "DOMRangeImpl.hpp"
+#include "DOMTypeInfoImpl.hpp"
 
 #include <xercesc/dom/DOMImplementation.hpp>
 #include <xercesc/util/XMLChar.hpp>
@@ -1008,9 +1009,24 @@
             if (source->getLocalName() == 0)
                 newelement = createElement(source->getNodeName());
             else
-                newelement = createElementNS(source->getNamespaceURI(),
-
-            source->getNodeName());
+            {
+                DOMElementNSImpl* nsElem = (DOMElementNSImpl*)createElementNS(source->getNamespaceURI(), source->getNodeName());
+                DOMTypeInfoImpl* clonedTypeInfo=NULL;
+                // if the source has type informations, copy them
+                DOMPSVITypeInfo* sourcePSVI=(DOMPSVITypeInfo*)source->getInterface(XMLUni::fgXercescInterfacePSVITypeInfo);
+                if(sourcePSVI && sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Schema_Specified))
+                    clonedTypeInfo=new (this) DOMTypeInfoImpl(this, sourcePSVI);
+                else
+                {
+                    const DOMTypeInfo * typeInfo=((DOMElement*)source)->getTypeInfo();
+                    // copy it only if it has valid data
+                    if(typeInfo && typeInfo->getName()!=NULL)
+                        clonedTypeInfo=new (this) DOMTypeInfoImpl(typeInfo->getNamespace(), typeInfo->getName());
+                }
+                if(clonedTypeInfo)
+                    nsElem->setTypeInfo(clonedTypeInfo);
+                newelement=nsElem;
+            }
             DOMNamedNodeMap *srcattr=source->getAttributes();
             if(srcattr!=0)
                 for(XMLSize_t i=0;i<srcattr->getLength();++i)
@@ -1037,11 +1053,28 @@
         }
         break;
     case DOMNode::ATTRIBUTE_NODE :
-        if (source->getLocalName() == 0)
-            newnode = createAttribute(source->getNodeName());
-        else
-            newnode = createAttributeNS(source->getNamespaceURI(),
-            source->getNodeName());
+        {
+            DOMAttrImpl* newattr=NULL;
+            if (source->getLocalName() == 0)
+                newattr = (DOMAttrImpl*)createAttribute(source->getNodeName());
+            else
+                newattr = (DOMAttrImpl*)createAttributeNS(source->getNamespaceURI(), source->getNodeName());
+            DOMTypeInfoImpl* clonedTypeInfo=NULL;
+            // if the source has type informations, copy them
+            DOMPSVITypeInfo* sourcePSVI=(DOMPSVITypeInfo*)source->getInterface(XMLUni::fgXercescInterfacePSVITypeInfo);
+            if(sourcePSVI && sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Schema_Specified))
+                clonedTypeInfo=new (this) DOMTypeInfoImpl(this, sourcePSVI);
+            else
+            {
+                const DOMTypeInfo * typeInfo=((DOMElement*)source)->getTypeInfo();
+                // copy it only if it has valid data
+                if(typeInfo && typeInfo->getName()!=NULL)
+                    clonedTypeInfo=new (this) DOMTypeInfoImpl(typeInfo->getNamespace(), typeInfo->getName());
+            }
+            if(clonedTypeInfo)
+                newattr->setTypeInfo(clonedTypeInfo);
+            newnode=newattr;
+        }
         deep = true;
         // Kids carry value
 

Modified: xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMTypeInfoImpl.cpp
URL: http://svn.apache.org/viewcvs/xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMTypeInfoImpl.cpp?rev=356774&r1=356773&r2=356774&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMTypeInfoImpl.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMTypeInfoImpl.cpp Wed Dec 14 03:59:51 2005
@@ -49,6 +49,44 @@
     //  - [schema specified]=false
 }
 
+DOMTypeInfoImpl::DOMTypeInfoImpl(DOMDocumentImpl* ownerDoc, const DOMPSVITypeInfo* sourcePSVI)
+: fBitFields(0),
+  fTypeName(0), 
+  fTypeNamespace(0),
+  fMemberTypeName(0),
+  fMemberTypeNamespace(0),
+  fDefaultValue(0),
+  fNormalizedValue(0)
+{
+    setNumericProperty(DOMPSVITypeInfo::PSVI_Validity, 
+        sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Validity));
+    setNumericProperty(DOMPSVITypeInfo::PSVI_Validitation_Attempted, 
+        sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Validitation_Attempted));
+    setNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Type, 
+        sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Type));
+    setNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Anonymous, 
+        sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Anonymous));
+    setNumericProperty(DOMPSVITypeInfo::PSVI_Nil, 
+        sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Nil));
+    setNumericProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Anonymous, 
+        sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Anonymous));
+    setNumericProperty(DOMPSVITypeInfo::PSVI_Schema_Specified, 
+        sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Schema_Specified));
+
+    setStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Name,
+        ownerDoc->getPooledString(sourcePSVI->getStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Name)));
+    setStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Namespace,
+        ownerDoc->getPooledString(sourcePSVI->getStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Namespace)));
+    setStringProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Name,
+        ownerDoc->getPooledString(sourcePSVI->getStringProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Name)));
+    setStringProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Namespace,
+        ownerDoc->getPooledString(sourcePSVI->getStringProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Namespace)));
+    setStringProperty(DOMPSVITypeInfo::PSVI_Schema_Default,
+        ownerDoc->getPooledString(sourcePSVI->getStringProperty(DOMPSVITypeInfo::PSVI_Schema_Default)));
+    setStringProperty(DOMPSVITypeInfo::PSVI_Schema_Normalized_Value,
+        ownerDoc->getPooledString(sourcePSVI->getStringProperty(DOMPSVITypeInfo::PSVI_Schema_Normalized_Value)));
+}
+
 const XMLCh* DOMTypeInfoImpl::getName() const {
     // if it's a DTD, return the data that was stored
     if(!getNumericProperty(PSVI_Schema_Specified))

Modified: xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMTypeInfoImpl.hpp
URL: http://svn.apache.org/viewcvs/xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMTypeInfoImpl.hpp?rev=356774&r1=356773&r2=356774&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMTypeInfoImpl.hpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMTypeInfoImpl.hpp Wed Dec 14 03:59:51 2005
@@ -45,6 +45,7 @@
     //  Constructor
     //-----------------------------------------------------------------------------------
     DOMTypeInfoImpl(const XMLCh* namespaceUri=0, const XMLCh* name=0);
+    DOMTypeInfoImpl(DOMDocumentImpl* ownerDoc, const DOMPSVITypeInfo* sourcePSVI);
 
     static DOMTypeInfoImpl  g_DtdValidatedElement;
     static DOMTypeInfoImpl  g_DtdNotValidatedAttribute;



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org