blob: 5a628f352156099fab0f753905d13e82ac703d3b [file] [log] [blame]
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
* Licensed 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(STYLESHEETCONSTRUCTIONCONTEXTDEFAULT_HEADER_GUARD_1357924680)
#define STYLESHEETCONSTRUCTIONCONTEXTDEFAULT_HEADER_GUARD_1357924680
// Base include file. Must be first.
#include <xalanc/XSLT/XSLTDefinitions.hpp>
#include <xalanc/Include/XalanVector.hpp>
#include <xalanc/PlatformSupport/ArenaAllocator.hpp>
#include <xalanc/PlatformSupport/XalanArrayAllocator.hpp>
#include <xalanc/PlatformSupport/XalanDOMStringPool.hpp>
#if defined(XALAN_AUTO_PTR_REQUIRES_DEFINITION) || (XALAN_ALLINONE_BUILD_DLL)
#include <xalanc/XPath/XPathProcessor.hpp>
#endif
#include <xalanc/Include/XalanAutoPtr.hpp>
#include <xalanc/PlatformSupport/XalanDOMStringCache.hpp>
#include <xalanc/XPath/XalanQNameByReference.hpp>
#include <xalanc/XPath/XalanQNameByValue.hpp>
#include <xalanc/XPath/XalanQNameByValueAllocator.hpp>
// Base class header file...
#include <xalanc/XSLT/StylesheetConstructionContext.hpp>
#include <xalanc/XSLT/AVT.hpp>
#include <xalanc/XSLT/XalanAVTAllocator.hpp>
#include <xalanc/XSLT/AVTPartSimple.hpp>
#include <xalanc/XSLT/XalanAVTPartSimpleAllocator.hpp>
#include <xalanc/XSLT/AVTPartXPath.hpp>
#include <xalanc/XSLT/XalanAVTPartXPathAllocator.hpp>
#include <xalanc/XSLT/XalanElemApplyTemplatesAllocator.hpp>
#include <xalanc/XSLT/XalanElemAttributeAllocator.hpp>
#include <xalanc/XSLT/XalanElemAttributeSetAllocator.hpp>
#include <xalanc/XSLT/XalanElemCallTemplateAllocator.hpp>
#include <xalanc/XSLT/XalanElemElementAllocator.hpp>
#include <xalanc/XSLT/XalanElemLiteralResultAllocator.hpp>
#include <xalanc/XSLT/XalanElemTemplateAllocator.hpp>
#include <xalanc/XSLT/XalanElemTextLiteralAllocator.hpp>
#include <xalanc/XSLT/XalanElemValueOfAllocator.hpp>
#include <xalanc/XSLT/XalanElemVariableAllocator.hpp>
#include "xalanc/XSLT/XalanMatchPatternDataAllocator.hpp"
XALAN_CPP_NAMESPACE_BEGIN
class XPathEnvSupport;
class XPathFactory;
class XPathProcessor;
class XSLTEngineImpl;
/**
*
* An default implementation of an abtract class which provides support for
* constructing the internal representation of a stylesheet.
*
*/
class XALAN_XSLT_EXPORT StylesheetConstructionContextDefault : public StylesheetConstructionContext
{
public:
typedef XalanArrayAllocator<XalanDOMChar> XalanDOMCharVectorAllocatorType;
typedef XalanArrayAllocator<const void*> PointerVectorAllocatorType;
typedef XalanDOMCharVectorAllocatorType::size_type VectorAllocatorSizeType;
// Default size for vector allocation.
enum {
eDefaultXalanDOMCharVectorBlockSize = 1024,
eDefaultAVTBlockSize = 128,
eDefaultAVTPartSimpleBlockSize = 128,
eDefaultAVTPartXPathBlockSize = 128,
eDefaultXalanQNameByValueBlockSize = 32,
eDefaultPointerVectorBlockSize = 512,
eDefaultElemApplyTemplatesBlockSize = 10,
eDefaultElemAttributeBlockSize = 10,
eDefaultElemAttributeSetBlockSize = 10,
eDefaultElemCallTemplateBlockSize = 10,
eDefaultElemElementBlockSize = 10,
eDefaultElemLiteralResultBlockSize = 20,
eDefaultElemTemplateBlockSize = 10,
eDefaultElemTextLiteralBlockSize = 20,
eDefaultElemValueOfBlockSize = 10,
eDefaultElemVariableBlockSize = 10,
eDefaultMatchPatternDataBlockSize = 10 };
/*
* Construct an instance. If the stylesheet(s) constructed is/are meant to be reused (a.k.a. "compiled"),
* the XObjectFactory and XPathFactory instance must exist for the lifetime of the construction context
* and, therefore, for the lifetime of the stylesheet(s). Otherwise, XObject and XPath instance will be
* destroyed when the corresponding factories are destryed, leaving pointers to destroyed objects in the.
* stylesheet(s).
*
* @param processor a reference to an XSLTEngineImpl instance. Used for error reporting.
* @param xpathFactory a reference to an XPathFactory instance. See comments above for important details.
* @param theXalanDOMCharVectorAllocatorBlockSize The block size to use for allocating vectors of XalanDOMChars
* @param theAVTAllocatorBlockSize The block size to use for allocating AVT instances.
* @param theAVTPartSimpleAllocatorBlockSize The block size to use for allocating AVTPartSimple instances.
* @param theAVTPartXPathAllocatorBlockSize The block size to use for allocating AVTPartXPath instances.
* @param theXalanQNameByValueAllocatorBlockSize The block size to use for allocating XalanQNameByValue instances.
* @param thePointerVectorAllocatorBlockSize The block size to use for allocating vectors of pointers.
*/
StylesheetConstructionContextDefault(
XSLTEngineImpl& processor,
XPathFactory& xpathFactory,
VectorAllocatorSizeType theXalanDOMCharVectorAllocatorBlockSize = eDefaultXalanDOMCharVectorBlockSize,
XalanAVTAllocator::size_type theAVTAllocatorBlockSize = eDefaultAVTBlockSize,
XalanAVTPartSimpleAllocator::size_type theAVTPartSimpleAllocatorBlockSize = eDefaultAVTPartSimpleBlockSize,
XalanAVTPartXPathAllocator::size_type theAVTPartXPathAllocatorBlockSize = eDefaultAVTPartXPathBlockSize,
XalanQNameByValueAllocator::size_type theXalanQNameByValueAllocatorBlockSize = eDefaultXalanQNameByValueBlockSize,
VectorAllocatorSizeType thePointerVectorAllocatorBlockSize = eDefaultPointerVectorBlockSize);
virtual
~StylesheetConstructionContextDefault();
virtual void
error(
const XalanDOMString& msg,
const XalanNode* sourceNode = 0,
const ElemTemplateElement* styleNode = 0) const;
virtual void
error(
const XalanDOMString& msg,
const XalanNode* sourceNode,
const LocatorType* locator) const;
virtual void
warn(
const XalanDOMString& msg,
const XalanNode* sourceNode = 0,
const ElemTemplateElement* styleNode = 0) const;
virtual void
warn(
const XalanDOMString& msg,
const XalanNode* sourceNode,
const LocatorType* locator) const;
virtual void
message(
const XalanDOMString& msg,
const XalanNode* sourceNode = 0,
const ElemTemplateElement* styleNode = 0) const;
virtual void
message(
const XalanDOMString& msg,
const XalanNode* sourceNode,
const LocatorType* locator) const;
// These interfaces are inherited from StylesheetConstructionContext...
virtual void
reset();
virtual StylesheetRoot*
create(const XalanDOMString& theBaseIdentifier);
virtual StylesheetRoot*
create(const XSLTInputSource& theInputSource);
virtual Stylesheet*
create(
StylesheetRoot& theStylesheetRoot,
const XalanDOMString& theBaseIdentifier);
virtual void
destroy(StylesheetRoot* theStylesheetRoot);
virtual URLAutoPtrType
getURLFromString(const XalanDOMString& urlString);
virtual XalanDOMString
getURLStringFromString(const XalanDOMString& urlString);
virtual URLAutoPtrType
getURLFromString(
const XalanDOMString& urlString,
const XalanDOMString& base);
virtual XalanDOMString
getURLStringFromString(
const XalanDOMString& urlString,
const XalanDOMString& base);
virtual const XalanDOMString&
getXSLTNamespaceURI() const;
virtual XPath*
createMatchPattern(
const LocatorType* locator,
const XalanDOMString& str,
const PrefixResolver& resolver);
virtual XPath*
createMatchPattern(
const LocatorType* locator,
const XalanDOMChar* str,
const PrefixResolver& resolver);
virtual XPath*
createXPath(
const LocatorType* locator,
const XalanDOMString& str,
const PrefixResolver& resolver);
virtual XPath*
createXPath(
const LocatorType* locator,
const XalanDOMChar* str,
XalanDOMString::size_type len,
const PrefixResolver& resolver);
virtual XPath*
createXPath(
const LocatorType* locator,
const XalanDOMChar* str,
const PrefixResolver& resolver);
virtual const LocatorType*
getLocatorFromStack() const;
virtual void
pushLocatorOnStack(const LocatorType* locator);
virtual void
popLocatorStack();
virtual const XalanDOMString&
getXalanXSLNameSpaceURL() const;
virtual XalanDocument*
parseXML(
const XalanDOMString& urlString,
DocumentHandlerType* docHandler,
XalanDocument* docToRegister);
virtual bool
isXMLSpaceAttribute(
const XalanDOMChar* theAttributeName,
const Stylesheet& theStylesheet,
const LocatorType* theLocator = 0);
virtual bool
isXSLUseAttributeSetsAttribute(
const XalanDOMChar* theAttributeName,
const Stylesheet& theStylesheet,
const LocatorType* theLocator = 0);
virtual bool
isValidQName(
const XalanDOMChar* theName,
const Stylesheet& theStylesheet,
const LocatorType* theLocator = 0);
virtual eElementToken
getElementToken(const XalanDOMString& name) const;
virtual double
getXSLTVersionSupported() const;
virtual const XalanDOMString&
getPooledString(const XalanDOMString& theString);
virtual const XalanDOMString&
getPooledString(
const XalanDOMChar* theString,
XalanDOMString::size_type theLength = XalanDOMString::npos);
virtual XalanDOMString&
getCachedString();
virtual bool
releaseCachedString(XalanDOMString& theString);
virtual XalanDOMChar*
allocateXalanDOMCharVector(XalanDOMString::size_type theLength);
virtual XalanDOMChar*
allocateXalanDOMCharVector(
const XalanDOMChar* theString,
XalanDOMString::size_type theLength = XalanDOMString::npos,
bool fTerminate = true);
virtual const AVT*
createAVT(
const LocatorType* locator,
const XalanDOMChar* name,
const XalanDOMChar* stringedValue,
const PrefixResolver& resolver);
virtual const AVTPart*
createAVTPart(
const XalanDOMChar* theString,
XalanDOMString::size_type theLength = XalanDOMString::npos);
virtual const AVTPart*
createAVTPart(
const LocatorType* locator,
const XalanDOMChar* str,
XalanDOMString::size_type len,
const PrefixResolver& resolver);
virtual const AVT**
allocateAVTPointerVector(size_type theLength);
virtual const AVTPart**
allocateAVTPartPointerVector(size_type theLength);
virtual const XalanQName*
createXalanQName(
const XalanDOMString& qname,
const NamespacesStackType& namespaces,
const LocatorType* locator = 0,
bool fUseDefault = false);
virtual const XalanQName*
createXalanQName(
const XalanDOMChar* qname,
const NamespacesStackType& namespaces,
const LocatorType* locator = 0,
bool fUseDefault = false);
virtual const XalanQName**
tokenizeQNames(
size_type& count,
const XalanDOMChar* qnameTokens,
const NamespacesStackType& namespaces,
const LocatorType* locator = 0,
bool fUseDefault = false);
virtual ElemTemplateElement*
createElement(
int token,
Stylesheet& stylesheetTree,
const AttributeListType& atts,
const LocatorType* locator = 0);
virtual ElemTemplateElement*
createElement(
int token,
Stylesheet& stylesheetTree,
const XalanDOMChar* name,
const AttributeListType& atts,
const LocatorType* locator = 0);
virtual ElemTemplateElement*
createElement(
Stylesheet& stylesheetTree,
const XalanDOMChar* chars,
XalanDOMString::size_type length,
bool preserveSpace,
bool disableOutputEscaping,
const LocatorType* locator = 0);
virtual ElemTemplateElement*
createElement(
Stylesheet& stylesheetTree,
const XalanDOMChar* name,
const AttributeListType& atts,
ExtensionNSHandler& handler,
const LocatorType* locator = 0);
virtual const XalanMatchPatternData*
createXalanMatchPatternData(
const ElemTemplate& theTemplate,
size_type thePosition,
const XalanDOMString& theTargetString,
const XPath& theMatchPattern,
const XalanDOMString& thePatternString,
XPath::eMatchScore thePriority);
static eElementToken
getElementNameToken(const XalanDOMString& name);
typedef XalanVector<StylesheetRoot*> StylesheetVectorType;
typedef XalanVector<ElemTemplateElement*> ElemTemplateElementVectorType;
private:
const AVT**
doAllocateAVTPointerVector(size_type theSize)
{
assert(sizeof(AVT**) == sizeof(PointerVectorAllocatorType::value_type));
#if defined(XALAN_OLD_STYLE_CASTS)
return (const AVT**)m_pointerVectorAllocator.allocate(theSize);
#else
return reinterpret_cast<const AVT**>(m_pointerVectorAllocator.allocate(theSize));
#endif
}
const AVTPart**
doAllocateAVTPartPointerVector(size_type theSize)
{
assert(sizeof(AVTPart**) == sizeof(PointerVectorAllocatorType::value_type));
#if defined(XALAN_OLD_STYLE_CASTS)
return (const AVTPart**)m_pointerVectorAllocator.allocate(theSize);
#else
return reinterpret_cast<const AVTPart**>(m_pointerVectorAllocator.allocate(theSize));
#endif
}
const XalanQName**
doAllocateXalanQNamePointerVector(size_type theSize)
{
assert(sizeof(XalanQName**) == sizeof(PointerVectorAllocatorType::value_type));
#if defined(XALAN_OLD_STYLE_CASTS)
return (const XalanQName**)m_pointerVectorAllocator.allocate(theSize);
#else
return reinterpret_cast<const XalanQName**>(m_pointerVectorAllocator.allocate(theSize));
#endif
}
XSLTEngineImpl& m_processor;
XPathFactory& m_xpathFactory;
typedef XalanAutoPtr<XPathProcessor> XPathProcessAutoPtr;
XPathProcessAutoPtr m_xpathProcessor;
StylesheetVectorType m_stylesheets;
XalanDOMStringPool m_stringPool;
XalanDOMCharVectorAllocatorType m_xalanDOMCharVectorAllocator;
mutable XalanDOMString m_tempBuffer;
XalanQNameByValue m_scratchQName;
XalanDOMStringCache m_stringCache;
XalanAVTAllocator m_avtAllocator;
XalanAVTPartSimpleAllocator m_avtPartSimpleAllocator;
XalanAVTPartXPathAllocator m_avtPartXPathAllocator;
XalanQNameByValueAllocator m_xalanQNameByValueAllocator;
const XalanQNameByReference m_useAttributeSetsQName;
PointerVectorAllocatorType m_pointerVectorAllocator;
ElemTemplateElementVectorType m_allocatedElements;
XalanElemApplyTemplatesAllocator m_elemApplyTemplatesAllocator;
XalanElemAttributeAllocator m_elemAttributeAllocator;
XalanElemAttributeSetAllocator m_elemAttributeSetAllocator;
XalanElemCallTemplateAllocator m_elemCallTemplateAllocator;
XalanElemElementAllocator m_elemElementAllocator;
XalanElemLiteralResultAllocator m_elemLiteralResultAllocator;
XalanElemTemplateAllocator m_elemTemplateAllocator;
XalanElemTextLiteralAllocator m_elemTextLiteralAllocator;
XalanElemValueOfAllocator m_elemValueOfAllocator;
XalanElemVariableAllocator m_elemVariableAllocator;
XalanMatchPatternDataAllocator m_matchPatternDataAllocator;
const XalanQNameByReference m_spaceAttrQName;
// Static strings for stylesheet compilation...
// The string "if"
static const XalanDOMChar s_if[];
// The string "key"
static const XalanDOMChar s_key[];
// The string "copy"
static const XalanDOMChar s_copy[];
// The string "sort"
static const XalanDOMChar s_sort[];
// The string "text"
static const XalanDOMChar s_text[];
// The string "when"
static const XalanDOMChar s_when[];
// The string "empty"
static const XalanDOMChar s_empty[];
// The string "param"
static const XalanDOMChar s_param[];
// The string "choose"
static const XalanDOMChar s_choose[];
// The string "import"
static const XalanDOMChar s_import[];
// The string "number"
static const XalanDOMChar s_number[];
// The string "output"
static const XalanDOMChar s_output[];
// The string "comment"
static const XalanDOMChar s_comment[];
// The string "copy-of"
static const XalanDOMChar s_copyOf[];
// The string "element"
static const XalanDOMChar s_element[];
// The string "include"
static const XalanDOMChar s_include[];
// The string "message"
static const XalanDOMChar s_message[];
// The string "fallback"
static const XalanDOMChar s_fallback[];
// The string "for-each"
static const XalanDOMChar s_forEach[];
// The string "template"
static const XalanDOMChar s_template[];
// The string "value-of"
static const XalanDOMChar s_valueOf[];
// The string "variable"
static const XalanDOMChar s_variable[];
// The string "attribute"
static const XalanDOMChar s_attribute[];
// The string "otherwise"
static const XalanDOMChar s_otherwise[];
// The string "transform"
static const XalanDOMChar s_transform[];
// The string "stylesheet"
static const XalanDOMChar s_stylesheet[];
// The string "with-param"
static const XalanDOMChar s_withParam[];
// The string "strip-space"
static const XalanDOMChar s_stripSpace[];
// The string "apply-imports"
static const XalanDOMChar s_applyImports[];
// The string "attribute-set"
static const XalanDOMChar s_attributeSet[];
// The string "call-template"
static const XalanDOMChar s_callTemplate[];
// The string "decimal-format"
static const XalanDOMChar s_decimalFormat[];
// The string "preserve-space"
static const XalanDOMChar s_preserveSpace[];
// The string "apply-templates"
static const XalanDOMChar s_applyTemplates[];
// The string "namespace-alias"
static const XalanDOMChar s_namespaceAlias[];
// The string "processing-instruction"
static const XalanDOMChar s_processingInstruction[];
// A struct for an array that maps stylesheet element names
// to int tokens.
struct ElementTokenTableEntry
{
const XalanDOMChar* m_name;
eElementToken m_token;
};
static const ElementTokenTableEntry s_elementTokenTable[];
static const unsigned int s_elementTokenTableSize;
static const ElementTokenTableEntry& s_elementTokenTableLast;
static const ElementTokenTableEntry& s_elementTokenTableDummy;
};
XALAN_CPP_NAMESPACE_END
#endif // STYLESHEETCONSTRUCTIONCONTEXTDEFAULT_HEADER_GUARD_1357924680