Author: amassari
Date: Wed Dec 14 03:13:59 2005
New Revision: 356770

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

Modified:
    xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp
    xerces/c/trunk/src/xercesc/dom/impl/DOMTypeInfoImpl.cpp
    xerces/c/trunk/src/xercesc/dom/impl/DOMTypeInfoImpl.hpp

Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp?rev=356770&r1=356769&r2=356770&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp (original)
+++ xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp Wed Dec 14 03:13:59 
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>
@@ -1034,7 +1035,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->getFeature(XMLUni::fgXercescInterfacePSVITypeInfo,
 0);
+                if(sourcePSVI && 
sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Schema_Specified))
+                    clonedTypeInfo=new (this) DOMTypeInfoImpl(this, 
sourcePSVI);
+                else
+                {
+                    const DOMTypeInfo * 
typeInfo=((DOMElement*)source)->getSchemaTypeInfo();
+                    // copy it only if it has valid data
+                    if(typeInfo && typeInfo->getTypeName()!=NULL)
+                        clonedTypeInfo=new (this) 
DOMTypeInfoImpl(typeInfo->getTypeNamespace(), typeInfo->getTypeName());
+                }
+                if(clonedTypeInfo)
+                    nsElem->setSchemaTypeInfo(clonedTypeInfo);
+                newelement=nsElem;
+            }
             DOMNamedNodeMap *srcattr=source->getAttributes();
             if(srcattr!=0)
                 for(XMLSize_t i=0;i<srcattr->getLength();++i)
@@ -1061,10 +1079,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->getFeature(XMLUni::fgXercescInterfacePSVITypeInfo,
 0);
+            if(sourcePSVI && 
sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Schema_Specified))
+                clonedTypeInfo=new (this) DOMTypeInfoImpl(this, sourcePSVI);
+            else
+            {
+                const DOMTypeInfo * 
typeInfo=((DOMElement*)source)->getSchemaTypeInfo();
+                // copy it only if it has valid data
+                if(typeInfo && typeInfo->getTypeName()!=NULL)
+                    clonedTypeInfo=new (this) 
DOMTypeInfoImpl(typeInfo->getTypeNamespace(), typeInfo->getTypeName());
+            }
+            if(clonedTypeInfo)
+                newattr->setSchemaTypeInfo(clonedTypeInfo);
+            newnode=newattr;
+        }
         deep = true;
         // Kids carry value
 

Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMTypeInfoImpl.cpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/trunk/src/xercesc/dom/impl/DOMTypeInfoImpl.cpp?rev=356770&r1=356769&r2=356770&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/impl/DOMTypeInfoImpl.cpp (original)
+++ xerces/c/trunk/src/xercesc/dom/impl/DOMTypeInfoImpl.cpp Wed Dec 14 03:13:59 
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::getTypeName() const {
     // if it's a DTD, return the data that was stored
     if(!getNumericProperty(PSVI_Schema_Specified))

Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMTypeInfoImpl.hpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/trunk/src/xercesc/dom/impl/DOMTypeInfoImpl.hpp?rev=356770&r1=356769&r2=356770&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/impl/DOMTypeInfoImpl.hpp (original)
+++ xerces/c/trunk/src/xercesc/dom/impl/DOMTypeInfoImpl.hpp Wed Dec 14 03:13:59 
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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to