blob: afa6c638e8f08c7434b94d1e762be43ec49bfbf1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined(XALAN_BUILD_DEPRECATED_DOM_BRIDGE)
#include "XercesBridgeNavigator.hpp"
#include <xalanc/XalanDOM/XalanNode.hpp>
#include <xalanc/XercesParserLiaison/Deprecated/XercesAttrBridge.hpp>
#include <xalanc/XercesParserLiaison/Deprecated/XercesDocumentBridge.hpp>
#include <xalanc/XercesParserLiaison/Deprecated/XercesTextBridge.hpp>
#include <xalanc/XercesParserLiaison/XercesDOMException.hpp>
XALAN_CPP_NAMESPACE_BEGIN
// This is used to distinguish between null nodes, which are valid, and
// an uninitialized cached node address.
static XalanNode* const invalidNodeAddress = reinterpret_cast<XalanNode*>(1);
XercesBridgeNavigator::XercesBridgeNavigator(
XercesDocumentBridge* theOwnerDocument,
bool mappingMode) :
m_ownerDocument(theOwnerDocument),
m_parentNode(mappingMode == true ? invalidNodeAddress : 0),
m_previousSibling(mappingMode == true ? invalidNodeAddress : 0),
m_nextSibling(mappingMode == true ? invalidNodeAddress : 0),
m_firstChild(mappingMode == true ? invalidNodeAddress : 0),
m_lastChild(mappingMode == true ? invalidNodeAddress : 0),
m_index(0)
{
}
XercesBridgeNavigator::XercesBridgeNavigator(const XercesBridgeNavigator& theSource) :
m_ownerDocument(theSource.m_ownerDocument),
m_parentNode(theSource.m_parentNode),
m_previousSibling(theSource.m_previousSibling),
m_nextSibling(theSource.m_nextSibling),
m_firstChild(theSource.m_firstChild),
m_lastChild(theSource.m_lastChild),
m_index(theSource.m_index)
{
}
XercesBridgeNavigator::~XercesBridgeNavigator()
{
}
XalanNode*
XercesBridgeNavigator::mapNode(const DOM_NodeType& theXercesNode) const
{
return m_ownerDocument->mapNode(theXercesNode);
}
XalanAttr*
XercesBridgeNavigator::mapNode(const DOM_AttrType& theXercesNode) const
{
return m_ownerDocument->mapNode(theXercesNode);
}
DOM_NodeType
XercesBridgeNavigator::mapNode(const XalanNode* theXalanNode) const
{
return m_ownerDocument->mapNode(theXalanNode);
}
DOM_AttrType
XercesBridgeNavigator::mapNode(const XalanAttr* theXalanNode) const
{
return m_ownerDocument->mapNode(theXalanNode);
}
XalanNode*
XercesBridgeNavigator::getParentNode(const DOM_NodeType& theXercesNode) const
{
if (m_parentNode == invalidNodeAddress)
{
m_parentNode = m_ownerDocument->mapNode(theXercesNode.getParentNode());
}
return m_parentNode;
}
XalanNode*
XercesBridgeNavigator::getPreviousSibling(const DOM_NodeType& theXercesNode) const
{
if (m_previousSibling == invalidNodeAddress)
{
m_previousSibling = m_ownerDocument->mapNode(theXercesNode.getPreviousSibling());
}
return m_previousSibling;
}
XalanNode*
XercesBridgeNavigator::getNextSibling(const DOM_NodeType& theXercesNode) const
{
if (m_nextSibling == invalidNodeAddress)
{
m_nextSibling = m_ownerDocument->mapNode(theXercesNode.getNextSibling());
}
return m_nextSibling;
}
XalanNode*
XercesBridgeNavigator::getFirstChild(const DOM_NodeType& theXercesNode) const
{
if (m_firstChild == invalidNodeAddress)
{
m_firstChild = m_ownerDocument->mapNode(theXercesNode.getFirstChild());
}
return m_firstChild;
}
XalanNode*
XercesBridgeNavigator::getLastChild(const DOM_NodeType& theXercesNode) const
{
if (m_lastChild == invalidNodeAddress)
{
m_lastChild = m_ownerDocument->mapNode(theXercesNode.getLastChild());
}
return m_lastChild;
}
XalanNode*
XercesBridgeNavigator::insertBefore(
DOM_NodeType& theXercesParent,
XalanNode* newChild,
XalanNode* refChild) const
{
assert(newChild != 0);
// Get the corresponding Xerces nodes...
const DOM_NodeType theNewChild = m_ownerDocument->mapNode(newChild);
const DOM_NodeType theRefChild = m_ownerDocument->mapNode(refChild);
try
{
const DOM_NodeType theXercesResult =
theXercesParent.insertBefore(theNewChild, theRefChild);
assert(m_ownerDocument->mapNode(theXercesResult) == newChild);
}
catch(const DOM_DOMExceptionType& theException)
{
throw XercesDOMException(theException);
}
return newChild;
}
XalanNode*
XercesBridgeNavigator:: replaceChild(
DOM_NodeType& theXercesParent,
XalanNode* newChild,
XalanNode* oldChild) const
{
assert(newChild != 0);
assert(oldChild != 0);
// Get the corresponding Xerces nodes...
const DOM_NodeType theNewChild = m_ownerDocument->mapNode(newChild);
const DOM_NodeType theOldChild = m_ownerDocument->mapNode(oldChild);
try
{
const DOM_NodeType theXercesResult =
theXercesParent.replaceChild(theNewChild, theOldChild);
assert(m_ownerDocument->mapNode(theXercesResult) == oldChild);
}
catch(const DOM_DOMExceptionType& theException)
{
throw XercesDOMException(theException);
}
return oldChild;
}
XalanNode*
XercesBridgeNavigator::removeChild(
DOM_NodeType& theXercesParent,
XalanNode* oldChild) const
{
assert(oldChild != 0);
// Get the corresponding Xerces nodes...
const DOM_NodeType theOldChild = m_ownerDocument->mapNode(oldChild);
try
{
const DOM_NodeType theXercesResult =
theXercesParent.removeChild(theOldChild);
assert(m_ownerDocument->mapNode(theXercesResult) == oldChild);
}
catch(const DOM_DOMExceptionType& theException)
{
throw XercesDOMException(theException);
}
return oldChild;
}
XalanNode*
XercesBridgeNavigator::appendChild(
DOM_NodeType& theXercesParent,
XalanNode* newChild) const
{
return insertBefore(theXercesParent, newChild, 0);
}
XalanElement*
XercesBridgeNavigator::getOwnerElement(const DOM_AttrType& theXercesAttr) const
{
if (m_parentNode != invalidNodeAddress)
{
assert(m_parentNode->getNodeType() == XalanNode::ELEMENT_NODE);
return static_cast<XalanElement*>(m_parentNode);
}
else
{
return m_ownerDocument->mapNode(theXercesAttr.getOwnerElement());
}
}
XalanNode*
XercesBridgeNavigator::cloneNode(
const XalanNode* theXalanNode,
const DOM_NodeType& theXercesNode,
bool deep) const
{
return m_ownerDocument->internalCloneNode(theXalanNode, theXercesNode, deep);
}
XalanText*
XercesBridgeNavigator::splitText(
DOM_TextType& theXercesText,
unsigned int offset) const
{
XalanText* theXalanText = 0;
try
{
DOM_TextType theNewXercesText = theXercesText.splitText(offset);
assert(theXercesText.isNull() == false);
theXalanText = m_ownerDocument->createBridgeNode(theNewXercesText, 0, true);
}
catch(const DOM_DOMExceptionType& theException)
{
throw XercesDOMException(theException);
}
return theXalanText;
}
const XalanDOMString&
XercesBridgeNavigator:: getPooledString(const DOMStringType& theString) const
{
return m_ownerDocument->getPooledString(theString.rawBuffer(), theString.length());
}
XALAN_CPP_NAMESPACE_END
#endif //XALAN_BUILD_DEPRECATED_DOM_BRIDGE