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]