blob: c2005e64a985854e43dedca565ab31ed1b640a3b [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.
*/
#include "XercesDOMSupport.hpp"
#include "xercesc/dom/DOMDocument.hpp"
#include "xercesc/dom/DOMDocumentType.hpp"
#include "xercesc/dom/DOMEntity.hpp"
#include "xercesc/dom/DOMNamedNodeMap.hpp"
#include "xalanc/DOMSupport/DOMServices.hpp"
#include "xalanc/XercesParserLiaison/XercesDocumentWrapper.hpp"
#include "xalanc/XercesParserLiaison/XercesParserLiaison.hpp"
namespace XALAN_CPP_NAMESPACE {
static const XalanDOMString s_emptyString(XalanMemMgrs::getDummyMemMgr());
XercesDOMSupport::XercesDOMSupport(XercesParserLiaison& theLiaison) :
DOMSupport(),
m_liaison(theLiaison)
{
}
XercesDOMSupport::~XercesDOMSupport()
{
}
void
XercesDOMSupport::reset()
{
}
const XalanDOMString&
XercesDOMSupport::getUnparsedEntityURI(
const XalanDOMString& theName,
const XalanDocument& theDocument) const
{
const XercesDocumentWrapper* const theWrapper =
m_liaison.mapDocumentToWrapper(&theDocument);
if (theWrapper != 0)
{
using xercesc::DOMDocument;
using xercesc::DOMDocumentType;
using xercesc::DOMEntity;
using xercesc::DOMNamedNodeMap;
using xercesc::DOMNode;
const DOMDocument* const theDOMDocument =
theWrapper->getXercesDocument();
assert(theDOMDocument != 0);
const DOMDocumentType* const theDoctype =
theDOMDocument->getDoctype();
if (theDoctype != 0)
{
const DOMNamedNodeMap* const theEntities =
theDoctype->getEntities();
if (theEntities != 0)
{
const DOMNode* const theNode =
theEntities->getNamedItem(theName.c_str());
if (theNode != 0 && theNode->getNodeType() == DOMNode::ENTITY_NODE)
{
const DOMEntity* const theEntity =
static_cast<const DOMEntity*>(theNode);
if(length(theEntity->getNotationName()) != 0) // then it's unparsed
{
// The draft says: "The XSLT processor may use the public
// identifier to generate a URI for the entity instead of the URI
// specified in the system identifier. If the XSLT processor does
// not use the public identifier to generate the URI, it must use
// the system identifier; if the system identifier is a relative
// URI, it must be resolved into an absolute URI using the URI of
// the resource containing the entity declaration as the base
// URI [RFC2396]."
// So I'm falling a bit short here.
const XMLCh* theURI = theEntity->getSystemId();
if(theURI == 0)
{
theURI = theEntity->getPublicId();
}
if(theURI != 0)
{
return theWrapper->getPooledString(theURI);
}
}
}
}
}
}
return s_emptyString;
}
bool
XercesDOMSupport::isNodeAfter(
const XalanNode& node1,
const XalanNode& node2) const
{
return DOMServices::isNodeAfter(node1, node2);
}
}