blob: 02e4b1e222353a8ebaf51b884727d007353df441 [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 "StylesheetConstructionContextDefault.hpp"
#include <algorithm>
#include <xalanc/Include/STLHelper.hpp>
#include <xalanc/PlatformSupport/StringTokenizer.hpp>
#include <xalanc/PlatformSupport/URISupport.hpp>
#include <xalanc/PlatformSupport/XalanMessageLoader.hpp>
#include <xalanc/DOMSupport/DOMServices.hpp>
#include <xalanc/XPath/XObjectFactory.hpp>
#include <xalanc/XPath/XPathEnvSupport.hpp>
#include <xalanc/XPath/XPathFactory.hpp>
#include <xalanc/XPath/XPathProcessorImpl.hpp>
#include "Constants.hpp"
#include "ElemApplyImport.hpp"
#include "ElemChoose.hpp"
#include "ElemComment.hpp"
#include "ElemCopy.hpp"
#include "ElemCopyOf.hpp"
#include "ElemDecimalFormat.hpp"
#include "ElemExtensionCall.hpp"
#include "ElemFallback.hpp"
#include "ElemForwardCompatible.hpp"
#include "ElemForEach.hpp"
#include "ElemIf.hpp"
#include "ElemMessage.hpp"
#include "ElemNumber.hpp"
#include "ElemOtherwise.hpp"
#include "ElemParam.hpp"
#include "ElemPI.hpp"
#include "ElemSort.hpp"
#include "ElemWhen.hpp"
#include "ElemWithParam.hpp"
#include "StylesheetRoot.hpp"
#include "XSLTEngineImpl.hpp"
#include "XSLTInputSource.hpp"
namespace XALAN_CPP_NAMESPACE {
StylesheetConstructionContextDefault::StylesheetConstructionContextDefault(
MemoryManager& theManager,
XSLTEngineImpl& processor,
XPathFactory& xpathFactory,
VectorAllocatorSizeType theXalanDOMCharVectorAllocatorBlockSize,
XalanAVTAllocator::size_type theAVTAllocatorBlockSize,
XalanAVTPartSimpleAllocator::size_type theAVTPartSimpleAllocatorBlockSize,
XalanAVTPartXPathAllocator::size_type theAVTPartXPathAllocatorBlockSize,
XalanQNameByValueAllocator::size_type theXalanQNameByValueAllocatorBlockSize,
VectorAllocatorSizeType thePointerVectorAllocatorBlockSize) :
StylesheetConstructionContext(theManager),
m_processor(processor),
m_xpathFactory(xpathFactory),
m_xpathProcessor(
theManager,
XPathProcessorImpl::create(theManager)),
m_stylesheets(theManager),
m_stringPool(theManager),
m_xalanDOMCharVectorAllocator(
theManager,
theXalanDOMCharVectorAllocatorBlockSize),
m_tempBuffer(theManager),
m_scratchQName(theManager),
m_stringCache(theManager),
m_avtAllocator(
theManager,
theAVTAllocatorBlockSize),
m_avtPartSimpleAllocator(
theManager,
theAVTPartSimpleAllocatorBlockSize),
m_avtPartXPathAllocator(
theManager,
theAVTPartXPathAllocatorBlockSize),
m_xalanQNameByValueAllocator(
theManager,
theXalanQNameByValueAllocatorBlockSize),
m_useAttributeSetsQName(
XSLTEngineImpl::getXSLNameSpaceURL(),
Constants::ATTRNAME_USEATTRIBUTESETS),
m_pointerVectorAllocator(
theManager,
thePointerVectorAllocatorBlockSize),
m_allocatedElements(theManager),
m_elemApplyTemplatesAllocator(
theManager,
eDefaultElemApplyTemplatesBlockSize),
m_elemAttributeAllocator(
theManager,
eDefaultElemAttributeBlockSize),
m_elemAttributeSetAllocator(
theManager,
eDefaultElemAttributeSetBlockSize),
m_elemCallTemplateAllocator(
theManager,
eDefaultElemCallTemplateBlockSize),
m_elemElementAllocator(
theManager,
eDefaultElemElementBlockSize),
m_elemLiteralResultAllocator(
theManager,
eDefaultElemLiteralResultBlockSize),
m_elemTemplateAllocator(
theManager,
eDefaultElemTemplateBlockSize),
m_elemTextLiteralAllocator(
theManager,
eDefaultElemTextLiteralBlockSize),
m_elemValueOfAllocator(
theManager,
eDefaultElemValueOfBlockSize),
m_elemVariableAllocator(
theManager,
eDefaultElemVariableBlockSize),
m_matchPatternDataAllocator(
theManager,
eDefaultMatchPatternDataBlockSize),
m_spaceAttrQName(
DOMServices::s_XMLNamespaceURI,
Constants::ATTRNAME_SPACE)
{
}
StylesheetConstructionContextDefault::~StylesheetConstructionContextDefault()
{
reset();
}
void
StylesheetConstructionContextDefault::problem(
eSource source,
eClassification classification,
const XalanDOMString& msg,
const Locator* locator,
const XalanNode* sourceNode)
{
m_processor.problem(
source,
classification,
msg,
locator,
sourceNode);
}
void
StylesheetConstructionContextDefault::problem(
eSource source,
eClassification classification,
const XalanDOMString& msg,
const XalanNode* sourceNode)
{
m_processor.problem(
source,
classification,
msg,
sourceNode);
}
void
StylesheetConstructionContextDefault::reset()
{
using std::for_each;
for_each(
m_stylesheets.begin(),
m_stylesheets.end(),
DeleteFunctor<StylesheetRoot>(getMemoryManager()));
m_stylesheets.clear();
for_each(
m_allocatedElements.begin(),
m_allocatedElements.end(),
DeleteFunctor<ElemTemplateElement>(getMemoryManager()));
m_allocatedElements.clear();
m_xpathFactory.reset();
m_stringPool.clear();
m_stringCache.reset();
m_avtAllocator.reset();
m_avtPartSimpleAllocator.reset();
m_avtPartXPathAllocator.reset();
m_xalanQNameByValueAllocator.reset();
m_pointerVectorAllocator.reset();
m_elemApplyTemplatesAllocator.reset();
m_elemAttributeAllocator.reset();
m_elemAttributeSetAllocator.reset();
m_elemCallTemplateAllocator.reset();
m_elemElementAllocator.reset();
m_elemLiteralResultAllocator.reset();
m_elemTemplateAllocator.reset();
m_elemTextLiteralAllocator.reset();
m_elemValueOfAllocator.reset();
m_elemVariableAllocator.reset();
m_matchPatternDataAllocator.reset();
}
StylesheetRoot*
StylesheetConstructionContextDefault::create(const XalanDOMString& theBaseIdentifier)
{
m_stylesheets.reserve(m_stylesheets.size() + 1);
StylesheetRoot* const theStylesheetRoot =
StylesheetRoot::create(
getMemoryManager(),
theBaseIdentifier,
*this);
m_stylesheets.push_back(theStylesheetRoot);
return theStylesheetRoot;
}
StylesheetRoot*
StylesheetConstructionContextDefault::create(const XSLTInputSource& theInputSource)
{
const XMLCh* const theSystemID =
theInputSource.getSystemId();
const GetCachedString theGuard(*this);
XalanDOMString& theBaseIdentifier = theGuard.get();
if (theSystemID != 0)
{
theBaseIdentifier.assign(theSystemID);
}
return create(theBaseIdentifier);
}
Stylesheet*
StylesheetConstructionContextDefault::create(
StylesheetRoot& theStylesheetRoot,
const XalanDOMString& theBaseIdentifier)
{
Stylesheet* const theStylesheet =
Stylesheet::create(
getMemoryManager(),
theStylesheetRoot,
theBaseIdentifier,
*this);
return theStylesheet;
}
void
StylesheetConstructionContextDefault::destroy(StylesheetRoot* theStylesheetRoot)
{
using std::find;
const StylesheetVectorType::iterator i =
find(
m_stylesheets.begin(),
m_stylesheets.end(),
theStylesheetRoot);
if (i != m_stylesheets.end())
{
m_stylesheets.erase(i);
delete theStylesheetRoot;
}
if (m_stylesheets.empty() == true)
{
reset();
}
}
StylesheetConstructionContextDefault::URLAutoPtrType
StylesheetConstructionContextDefault::getURLFromString(const XalanDOMString& urlString)
{
return URISupport::getURLFromString(
urlString,
getMemoryManager());
}
XalanDOMString&
StylesheetConstructionContextDefault::getURLStringFromString(
const XalanDOMString& urlString,
XalanDOMString& theResult)
{
URISupport::getURLStringFromString(
urlString,
theResult);
return theResult;
}
StylesheetConstructionContextDefault::URLAutoPtrType
StylesheetConstructionContextDefault::getURLFromString(
const XalanDOMString& urlString,
const XalanDOMString& base)
{
return URISupport::getURLFromString(
urlString,
base,
getMemoryManager());
}
XalanDOMString&
StylesheetConstructionContextDefault::getURLStringFromString(
const XalanDOMString& urlString,
const XalanDOMString& base,
XalanDOMString& theResult)
{
URISupport::getURLStringFromString(
urlString,
base,
theResult);
return theResult;
}
const XalanDOMString&
StylesheetConstructionContextDefault::getXSLTNamespaceURI() const
{
return XSLTEngineImpl::getXSLNameSpaceURL();
}
XPath*
StylesheetConstructionContextDefault::createMatchPattern(
const Locator* locator,
const XalanDOMString& str,
const PrefixResolver& resolver,
bool allowVariableReferences,
bool allowKeyFunction)
{
XPath* const xpath = m_xpathFactory.create();
// Note that we use the current locator from the
// processing stack, and not the locator passed in.
// This is because the locator on the stack is active,
// during construction, while the locator passed in
// will be used at run-time.
m_xpathProcessor->initMatchPattern(
*xpath,
*this,
str,
resolver,
getLocatorFromStack(),
allowVariableReferences,
allowKeyFunction);
xpath->setInStylesheet(true);
xpath->setLocator(locator);
return xpath;
}
XPath*
StylesheetConstructionContextDefault::createMatchPattern(
const Locator* locator,
const XalanDOMChar* str,
const PrefixResolver& resolver,
bool allowVariableReferences,
bool allowKeyFunction)
{
assert(str != 0);
m_tempBuffer.assign(str);
return createMatchPattern(
locator,
m_tempBuffer,
resolver,
allowVariableReferences,
allowKeyFunction);
}
XPath*
StylesheetConstructionContextDefault::createXPath(
const Locator* locator,
const XalanDOMString& str,
const PrefixResolver& resolver,
bool allowVariableReferences,
bool allowKeyFunction)
{
XPath* const xpath = m_xpathFactory.create();
// Note that we use the current locator from the
// processing stack, and not the locator passed in.
// This is because the locator on the stack is active,
// during construction, while the locator passed in
// will be used at run-time.
m_xpathProcessor->initXPath(
*xpath,
*this,
str,
resolver,
getLocatorFromStack(),
allowVariableReferences,
allowKeyFunction);
xpath->setInStylesheet(true);
xpath->setLocator(locator);
return xpath;
}
XPath*
StylesheetConstructionContextDefault::createXPath(
const Locator* locator,
const XalanDOMChar* str,
const PrefixResolver& resolver,
bool allowVariableReferences,
bool allowKeyFunction)
{
assert(str != 0);
m_tempBuffer.assign(str);
return createXPath(
locator,
m_tempBuffer,
resolver,
allowVariableReferences,
allowKeyFunction);
}
XPath*
StylesheetConstructionContextDefault::createXPath(
const Locator* locator,
const XalanDOMChar* str,
XalanDOMString::size_type len,
const PrefixResolver& resolver,
bool allowVariableReferences,
bool allowKeyFunction)
{
assert(str != 0);
m_tempBuffer.assign(str, len);
return createXPath(
locator,
m_tempBuffer,
resolver,
allowVariableReferences,
allowKeyFunction);
}
const Locator*
StylesheetConstructionContextDefault::getLocatorFromStack() const
{
return m_processor.getLocatorFromStack();
}
void
StylesheetConstructionContextDefault::pushLocatorOnStack(const Locator* locator)
{
m_processor.pushLocatorOnStack(locator);
}
void
StylesheetConstructionContextDefault::popLocatorStack()
{
m_processor.popLocatorStack();
}
const XalanDOMString&
StylesheetConstructionContextDefault::getXalanXSLNameSpaceURL() const
{
return XSLTEngineImpl::getXalanXSLNameSpaceURL();
}
XalanDocument*
StylesheetConstructionContextDefault::parseXML(
const XalanDOMString& urlString,
DocumentHandler* docHandler,
XalanDocument* docToRegister,
ErrorHandler* theErrorHandler)
{
return m_processor.parseXML(
urlString,
docHandler,
docToRegister,
theErrorHandler);
}
bool
StylesheetConstructionContextDefault::isXMLSpaceAttribute(
const XalanDOMChar* theAttributeName,
const Stylesheet& theStylesheet,
const Locator* theLocator)
{
assert(theAttributeName != 0);
m_scratchQName.set(
theAttributeName,
theStylesheet.getNamespaces(),
theLocator,
true);
return m_spaceAttrQName == m_scratchQName;
}
bool
StylesheetConstructionContextDefault::isXSLUseAttributeSetsAttribute(
const XalanDOMChar* theAttributeName,
const Stylesheet& theStylesheet,
const Locator* theLocator)
{
assert(theAttributeName != 0);
m_scratchQName.set(
theAttributeName,
theStylesheet.getNamespaces(),
theLocator,
true);
return m_useAttributeSetsQName == m_scratchQName;
}
bool
StylesheetConstructionContextDefault::isValidQName(
const XalanDOMChar* theName,
const Stylesheet& theStylesheet,
const Locator* theLocator)
{
assert(theName != 0);
m_scratchQName.set(
theName,
theStylesheet.getNamespaces(),
theLocator,
false);
return m_scratchQName.isValid();
}
template <class Type>
class CreateElementFunctor
{
public:
Type*
operator()(
MemoryManager& theManager,
StylesheetConstructionContext& constructionContext,
Stylesheet& stylesheetTree,
const AttributeListType& atts,
XalanFileLoc lineNumber,
XalanFileLoc columnNumber)
{
Type* theResult;
return XalanConstruct(
theManager,
theResult,
constructionContext,
stylesheetTree,
atts,
lineNumber,
columnNumber);
}
};
ElemTemplateElement*
StylesheetConstructionContextDefault::createElement(
int token,
Stylesheet& stylesheetTree,
const AttributeListType& atts,
const Locator* locator)
{
const XalanFileLoc lineNumber =
XalanLocator::getLineNumber(locator);
const XalanFileLoc columnNumber =
XalanLocator::getColumnNumber(locator);
ElemTemplateElement* theElement = 0;
switch(token)
{
case ELEMNAME_APPLY_IMPORTS:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemApplyImport>() (
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_APPLY_TEMPLATES:
return m_elemApplyTemplatesAllocator.create(
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_ATTRIBUTE:
return m_elemAttributeAllocator.create(
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_ATTRIBUTE_SET:
return m_elemAttributeSetAllocator.create(
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_CALL_TEMPLATE:
return m_elemCallTemplateAllocator.create(
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_CHOOSE:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemChoose>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_COMMENT:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemComment>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_COPY:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemCopy>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_COPY_OF:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemCopyOf>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_DECIMAL_FORMAT:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemDecimalFormat>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_ELEMENT:
return m_elemElementAllocator.create(
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_FALLBACK:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemFallback>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_FOR_EACH:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemForEach>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_IF:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemIf>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_MESSAGE:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemMessage>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_NUMBER:
m_allocatedElements.push_back(0);
theElement = ElemNumber::create(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber,
stylesheetTree.getStylesheetRoot().getNextElemNumberID());
break;
case ELEMNAME_OTHERWISE:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemOtherwise>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_PARAM:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemParam>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_PI:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemPI>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_SORT:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemSort>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_TEMPLATE:
return m_elemTemplateAllocator.create(
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_VALUE_OF:
return m_elemValueOfAllocator.create(
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_VARIABLE:
return m_elemVariableAllocator.create(
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_WITH_PARAM:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemWithParam>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
case ELEMNAME_WHEN:
m_allocatedElements.push_back(0);
theElement = CreateElementFunctor<ElemWhen>()(
getMemoryManager(),
*this,
stylesheetTree,
atts,
lineNumber,
columnNumber);
break;
default:
{
const GetCachedString theGuard1(*this);
const GetCachedString theGuard2(*this);
problem(
eXSLTProcessor,
eError,
XalanMessageLoader::getMessage(
theGuard1.get(),
XalanMessages::UnknownXSLTToken_1Param,
NumberToDOMString(
token,
theGuard2.get())),
locator,
0);
}
break;
};
assert(theElement != 0 && m_allocatedElements.back() == 0);
m_allocatedElements.back() = theElement;
return theElement;
}
ElemTemplateElement*
StylesheetConstructionContextDefault::createElement(
int token,
Stylesheet& stylesheetTree,
const XalanDOMChar* name,
const AttributeListType& atts,
const Locator* locator)
{
const XalanFileLoc lineNumber =
XalanLocator::getLineNumber(locator);
const XalanFileLoc columnNumber =
XalanLocator::getColumnNumber(locator);
ElemTemplateElement* theElement = 0;
if (token == ELEMNAME_LITERAL_RESULT)
{
theElement = m_elemLiteralResultAllocator.create(
*this,
stylesheetTree,
name,
atts,
lineNumber,
columnNumber);
}
else if (token == ELEMNAME_FORWARD_COMPATIBLE)
{
m_allocatedElements.push_back(0);
theElement = ElemForwardCompatible::create(
getMemoryManager(),
*this,
stylesheetTree,
name,
atts,
lineNumber,
columnNumber);
m_allocatedElements.back() = theElement;
}
else
{
const GetCachedString theGuard1(*this);
const GetCachedString theGuard2(*this);
problem(
eXSLTProcessor,
eError,
XalanMessageLoader::getMessage(
theGuard1.get(),
XalanMessages::UnknownXSLTToken_1Param,
NumberToDOMString(
token,
theGuard2.get())),
locator,
0);
}
return theElement;
}
ElemTemplateElement*
StylesheetConstructionContextDefault::createElement(
Stylesheet& stylesheetTree,
const XalanDOMChar* name,
const AttributeListType& atts,
ExtensionNSHandler& handler,
const Locator* locator)
{
m_allocatedElements.push_back(0);
m_allocatedElements.back() = ElemExtensionCall::create(
getMemoryManager(),
*this,
stylesheetTree,
name,
atts,
XalanLocator::getLineNumber(locator),
XalanLocator::getColumnNumber(locator),
handler);
return m_allocatedElements.back();
}
ElemTemplateElement*
StylesheetConstructionContextDefault::createElement(
Stylesheet& stylesheetTree,
const XalanDOMChar* chars,
XalanDOMString::size_type length,
bool preserveSpace,
bool disableOutputEscaping,
const Locator* locator)
{
return m_elemTextLiteralAllocator.create(
*this,
stylesheetTree,
XalanLocator::getLineNumber(locator),
XalanLocator::getColumnNumber(locator),
chars,
0,
length,
preserveSpace,
disableOutputEscaping);
}
const XalanMatchPatternData*
StylesheetConstructionContextDefault::createXalanMatchPatternData(
const ElemTemplate& theTemplate,
size_type thePosition,
const XalanDOMString& theTargetString,
const XPath& theMatchPattern,
const XalanDOMString& thePatternString,
XPath::eMatchScore thePriority)
{
return m_matchPatternDataAllocator.create(
theTemplate,
thePosition,
theTargetString,
theMatchPattern,
thePatternString,
thePriority);
}
StylesheetConstructionContextDefault::eElementToken
StylesheetConstructionContextDefault::getElementToken(const XalanDOMString& name) const
{
return getElementNameToken(name);
}
StylesheetConstructionContextDefault::eElementToken
StylesheetConstructionContextDefault::getElementNameToken(const XalanDOMString& name)
{
// Find the entity, if any...
const ElementTokenTableEntry* theFirst = s_elementTokenTable;
const ElementTokenTableEntry* theLast = &s_elementTokenTableLast;
while(theFirst <= theLast)
{
const ElementTokenTableEntry* const
theCurrent = theFirst + (theLast - theFirst) / 2;
const int theResult =
compareIgnoreCaseASCII(name, theCurrent->m_name);
if (theResult < 0)
{
theLast = theCurrent - 1;
}
else if (theResult > 0)
{
theFirst = theCurrent + 1;
}
else
{
return theCurrent->m_token;
}
}
return s_elementTokenTableDummy.m_token;
}
double
StylesheetConstructionContextDefault::getXSLTVersionSupported() const
{
return 1.0L;
}
const XalanDOMString&
StylesheetConstructionContextDefault::getPooledString(const XalanDOMString& theString)
{
return m_stringPool.get(theString);
}
const XalanDOMString&
StylesheetConstructionContextDefault::getPooledString(
const XalanDOMChar* theString,
XalanDOMString::size_type theLength)
{
return m_stringPool.get(theString, theLength);
}
XalanDOMString&
StylesheetConstructionContextDefault::getCachedString()
{
return m_stringCache.get();
}
bool
StylesheetConstructionContextDefault::releaseCachedString(XalanDOMString& theString)
{
return m_stringCache.release(theString);
}
XalanDOMChar*
StylesheetConstructionContextDefault::allocateXalanDOMCharVector(XalanDOMString::size_type theLength)
{
return m_xalanDOMCharVectorAllocator.allocate(theLength);
}
XalanDOMChar*
StylesheetConstructionContextDefault::allocateXalanDOMCharVector(
const XalanDOMChar* theString,
XalanDOMString::size_type theLength,
bool fTerminate)
{
assert(theString != 0);
const XalanDOMString::size_type theActualLength =
theLength == XalanDOMString::npos ?
XalanDOMString::length(theString) :
theLength;
XalanDOMChar* theVector =
m_xalanDOMCharVectorAllocator.allocate(
fTerminate == true ? theActualLength + 1 : theActualLength);
XalanDOMChar* const theEnd =
XalanCopy(
theString,
theString + theActualLength,
theVector);
if (fTerminate == true)
{
*theEnd = XalanDOMChar(0);
}
return theVector;
}
const AVT*
StylesheetConstructionContextDefault::createAVT(
const Locator* locator,
const XalanDOMChar* name,
const XalanDOMChar* stringedValue,
const PrefixResolver& resolver)
{
return m_avtAllocator.create(
*this,
locator,
name,
stringedValue,
resolver);
}
const AVTPart*
StylesheetConstructionContextDefault::createAVTPart(
const XalanDOMChar* theString,
XalanDOMString::size_type theLength)
{
return m_avtPartSimpleAllocator.create(
*this,
theString,
theLength);
}
const AVTPart*
StylesheetConstructionContextDefault::createAVTPart(
const Locator* locator,
const XalanDOMChar* str,
XalanDOMString::size_type len,
const PrefixResolver& resolver)
{
const XPath* const xpath =
createXPath(
locator,
str,
len,
resolver);
assert(xpath != 0);
return m_avtPartXPathAllocator.create(xpath);
}
const AVT**
StylesheetConstructionContextDefault::allocateAVTPointerVector(size_type theLength)
{
return doAllocateAVTPointerVector(theLength);
}
const AVTPart**
StylesheetConstructionContextDefault::allocateAVTPartPointerVector(size_type theLength)
{
return doAllocateAVTPartPointerVector(theLength);
}
const XalanQName*
StylesheetConstructionContextDefault::createXalanQName(
const XalanDOMString& qname,
const NamespacesStackType& namespaces,
const Locator* locator,
bool fUseDefault)
{
return m_xalanQNameByValueAllocator.create(
qname,
namespaces,
locator,
fUseDefault);
}
const XalanQName*
StylesheetConstructionContextDefault::createXalanQName(
const XalanDOMChar* qname,
const NamespacesStackType& namespaces,
const Locator* locator,
bool fUseDefault)
{
return m_xalanQNameByValueAllocator.create(
qname,
namespaces,
locator,
fUseDefault);
}
const XalanQName**
StylesheetConstructionContextDefault::tokenizeQNames(
size_type& count,
const XalanDOMChar* qnameTokens,
const NamespacesStackType& namespaces,
const Locator* locator,
bool fUseDefault)
{
assert(qnameTokens != 0);
StringTokenizer tokenizer(qnameTokens);
count = tokenizer.countTokens();
if (count == 0)
{
return 0;
}
else
{
const XalanQName** theResult =
doAllocateXalanQNamePointerVector(count);
assert(theResult != 0);
const GetCachedString theGuard(*this);
XalanDOMString& qname = theGuard.get();
size_type theCurrentIndex = 0;
while(tokenizer.hasMoreTokens())
{
tokenizer.nextToken(qname);
assert(qname.empty() == false);
theResult[theCurrentIndex++] =
m_xalanQNameByValueAllocator.create(
qname,
namespaces,
locator,
fUseDefault);
}
assert(theCurrentIndex == count);
return theResult;
}
}
const XalanDOMChar StylesheetConstructionContextDefault::s_if[] =
{
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_f,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_key[] =
{
XalanUnicode::charLetter_k,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_y,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_copy[] =
{
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_y,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_sort[] =
{
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_text[] =
{
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_x,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_when[] =
{
XalanUnicode::charLetter_w,
XalanUnicode::charLetter_h,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_n,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_empty[] =
{
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_y,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_param[] =
{
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_m,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_choose[] =
{
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_h,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_import[] =
{
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_number[] =
{
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_r,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_output[] =
{
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_comment[] =
{
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_copyOf[] =
{
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_y,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_f,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_element[] =
{
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_include[] =
{
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_d,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_message[] =
{
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_g,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_fallback[] =
{
XalanUnicode::charLetter_f,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_k,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_forEach[] =
{
XalanUnicode::charLetter_f,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_r,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_h,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_template[] =
{
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_valueOf[] =
{
XalanUnicode::charLetter_v,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_e,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_f,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_variable[] =
{
XalanUnicode::charLetter_v,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_attribute[] =
{
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_otherwise[] =
{
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_h,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_w,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_transform[] =
{
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_f,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_m,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_stylesheet[] =
{
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_y,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_h,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_withParam[] =
{
XalanUnicode::charLetter_w,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_h,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_m,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_stripSpace[] =
{
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_p,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_applyImports[] =
{
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_y,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_s,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_attributeSet[] =
{
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_callTemplate[] =
{
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_l,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_decimalFormat[] =
{
XalanUnicode::charLetter_d,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_l,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_f,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_preserveSpace[] =
{
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_v,
XalanUnicode::charLetter_e,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_applyTemplates[] =
{
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_y,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_s,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_namespaceAlias[] =
{
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_e,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_s,
0
};
const XalanDOMChar StylesheetConstructionContextDefault::s_processingInstruction[] =
{
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_g,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_n,
0
};
const StylesheetConstructionContextDefault::ElementTokenTableEntry StylesheetConstructionContextDefault::s_elementTokenTable[] =
{
{
s_if,
ELEMNAME_IF
},
{
s_key,
ELEMNAME_KEY
},
{
s_copy,
ELEMNAME_COPY
},
{
s_sort,
ELEMNAME_SORT
},
{
s_text,
ELEMNAME_TEXT
},
{
s_when,
ELEMNAME_WHEN
},
{
s_empty,
ELEMNAME_EMPTY
},
{
s_param,
ELEMNAME_PARAM
},
{
s_choose,
ELEMNAME_CHOOSE
},
{
s_import,
ELEMNAME_IMPORT
},
{
s_number,
ELEMNAME_NUMBER
},
{
s_output,
ELEMNAME_OUTPUT
},
{
s_comment,
ELEMNAME_COMMENT
},
{
s_copyOf,
ELEMNAME_COPY_OF
},
{
s_element,
ELEMNAME_ELEMENT
},
{
s_include,
ELEMNAME_INCLUDE
},
{
s_message,
ELEMNAME_MESSAGE
},
{
s_fallback,
ELEMNAME_FALLBACK
},
{
s_forEach,
ELEMNAME_FOR_EACH
},
{
s_template,
ELEMNAME_TEMPLATE
},
{
s_valueOf,
ELEMNAME_VALUE_OF
},
{
s_variable,
ELEMNAME_VARIABLE
},
{
s_attribute,
ELEMNAME_ATTRIBUTE
},
{
s_otherwise,
ELEMNAME_OTHERWISE
},
{
s_transform,
ELEMNAME_STYLESHEET
},
{
s_stylesheet,
ELEMNAME_STYLESHEET
},
{
s_withParam,
ELEMNAME_WITH_PARAM
},
{
s_stripSpace,
ELEMNAME_STRIP_SPACE
},
{
s_applyImports,
ELEMNAME_APPLY_IMPORTS
},
{
s_attributeSet,
ELEMNAME_ATTRIBUTE_SET
},
{
s_callTemplate,
ELEMNAME_CALL_TEMPLATE
},
{
s_decimalFormat,
ELEMNAME_DECIMAL_FORMAT
},
{
s_preserveSpace,
ELEMNAME_PRESERVE_SPACE
},
{
s_applyTemplates,
ELEMNAME_APPLY_TEMPLATES
},
{
s_namespaceAlias,
ELEMNAME_NAMESPACE_ALIAS
},
{
s_processingInstruction,
ELEMNAME_PI
},
// This must be the last one...
{
0,
ELEMNAME_UNDEFINED
}
};
const XalanSize_t StylesheetConstructionContextDefault::s_elementTokenTableSize =
sizeof(s_elementTokenTable) / sizeof(s_elementTokenTable[0]);
const StylesheetConstructionContextDefault::ElementTokenTableEntry& StylesheetConstructionContextDefault::s_elementTokenTableLast =
StylesheetConstructionContextDefault::s_elementTokenTable[s_elementTokenTableSize - 2];
const StylesheetConstructionContextDefault::ElementTokenTableEntry& StylesheetConstructionContextDefault::s_elementTokenTableDummy =
StylesheetConstructionContextDefault::s_elementTokenTable[s_elementTokenTableSize - 1];
}