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