/* * 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(XALANSOURCETREEDOCUMENT_HEADER_GUARD_1357924680) #define XALANSOURCETREEDOCUMENT_HEADER_GUARD_1357924680 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace XERCES_CPP_NAMESPACE { class Attributes; class AttributeList; } namespace XALAN_CPP_NAMESPACE { typedef xercesc::Attributes AttributesType; typedef xercesc::AttributeList AttributeListType; class PrefixResolver; class XalanSourceTreeAttr; class XALAN_XALANSOURCETREE_EXPORT XalanSourceTreeDocument : public XalanDocument { public: typedef XalanArrayAllocator AttributesArrayAllocatorType; typedef XalanMap< const XalanDOMChar*, XalanSourceTreeElement*> ElementByIDMapType; typedef XalanMap< XalanDOMString, XalanDOMString> UnparsedEntityURIMapType; /** * Perform static initialization. See class XalanSourceTreeInit. */ static void initialize(MemoryManager& theManager); /** * Perform static shut down. See class XalanSourceTreeInit. */ static void terminate(); enum { eDefaultAttributeAllocatorBlockSize = 100, eDefaultAttributeNSAllocatorBlockSize = 50, eDefaultCommentAllocatorBlockSize = 10, eDefaultElementAllocatorBlockSize = 100, eDefaultElementNSAllocatorBlockSize = 100, eDefaultPIAllocatorBlockSize = 10, eDefaultTextAllocatorBlockSize = 100, eDefaultTextIWSAllocatorBlockSize = 100, eDefaultNamesStringPoolBlockSize = XalanDOMStringPool::eDefaultBlockSize, eDefaultNamesStringPoolBucketCount = XalanDOMStringPool::eDefaultBucketCount, eDefaultNamesStringPoolBucketSize = XalanDOMStringPool::eDefaultBucketSize, eDefaultValuesStringPoolBlockSize = XalanDOMStringPool::eDefaultBlockSize, eDefaultValuesStringPoolBucketCount = 997, eDefaultValuesStringPoolBucketSize = XalanDOMStringPool::eDefaultBucketSize }; typedef XalanSourceTreeAttributeAllocator::size_type allocator_size_type; typedef XalanDOMStringPool::block_size_type block_size_type; typedef XalanDOMStringPool::bucket_count_type bucket_count_type; typedef XalanDOMStringPool::bucket_size_type bucket_size_type; /** * * Constructor for XalanSourceTreeDocument. * * @param fPoolAllText If false, text node data that is not whitespace will not be pooled. * @param theNamesStringPoolBlockSize The block size for allocating strings in the name pool * @param theNamesStringPoolBucketCount The number of buckets for allocating strings in the name pool * @param theNamesStringPoolBucketSize The bucket size for allocating strings in the name pool * @param theValuesStringPoolBlockSize The block size for allocating strings in the values pool * @param theValuesStringPoolBucketCount The number of buckets for allocating strings in the values pool * @param theValuesStringPoolBucketSize The bucket size for allocating strings in the values pool * */ XalanSourceTreeDocument( MemoryManager& theManager, bool fPoolAllText = s_poolAllTextNodes, block_size_type theNamesStringPoolBlockSize = eDefaultNamesStringPoolBlockSize, bucket_count_type theNamesStringPoolBucketCount = eDefaultNamesStringPoolBucketCount, bucket_size_type theNamesStringPoolBucketSize = eDefaultNamesStringPoolBucketSize, block_size_type theValuesStringPoolBlockSize = eDefaultValuesStringPoolBlockSize, bucket_count_type theValuesStringPoolBucketCount = eDefaultValuesStringPoolBucketCount, bucket_size_type theValuesStringPoolBucketSize = eDefaultValuesStringPoolBucketSize); static XalanSourceTreeDocument* create( MemoryManager& theManager, bool fPoolAllText = s_poolAllTextNodes, block_size_type theNamesStringPoolBlockSize = eDefaultNamesStringPoolBlockSize, bucket_count_type theNamesStringPoolBucketCount = eDefaultNamesStringPoolBucketCount, bucket_size_type theNamesStringPoolBucketSize = eDefaultNamesStringPoolBucketSize, block_size_type theValuesStringPoolBlockSize = eDefaultValuesStringPoolBlockSize, bucket_count_type theValuesStringPoolBucketCount = eDefaultValuesStringPoolBucketCount, bucket_size_type theValuesStringPoolBucketSize = eDefaultValuesStringPoolBucketSize); /** * * Constructor for XalanSourceTreeDocument. * * @param theAttributeBlockSize The block size for allocating attribute nodes * @param theAttributeNSBlockSize The block size for allocating attribute NS nodes * @param theCommentBlockSize The block size for allocating comment nodes * @param theElementBlockSize The block size for allocating element nodes * @param theElementNSBlockSize The block size for allocating element nodes * @param theTextBlockSize The block size for allocating text nodes, * @param theTextIWSBlockSize The block size for allocating text IWS nodes, * @param fPoolAllText If false, text node data that is not whitespace will not be pooled. * */ XalanSourceTreeDocument( MemoryManager& theManager, allocator_size_type theAttributeBlockSize, allocator_size_type theAttributeNSBlockSize, allocator_size_type theCommentBlockSize, allocator_size_type theElementBlockSize, allocator_size_type theElementNSBlockSize, allocator_size_type thePIBlockSize, allocator_size_type theTextBlockSize, allocator_size_type theTextIWSBlockSize, bool fPoolAllText = s_poolAllTextNodes); virtual ~XalanSourceTreeDocument(); // These interfaces are inherited from XalanNode... virtual const XalanDOMString& getNodeName() const; virtual const XalanDOMString& getNodeValue() const; virtual NodeType getNodeType() const; virtual XalanNode* getParentNode() const; virtual const XalanNodeList* getChildNodes() const; virtual XalanNode* getFirstChild() const; virtual XalanNode* getLastChild() const; virtual XalanNode* getPreviousSibling() const; virtual XalanNode* getNextSibling() const; virtual const XalanNamedNodeMap* getAttributes() const; virtual XalanDocument* getOwnerDocument() const; virtual const XalanDOMString& getNamespaceURI() const; virtual const XalanDOMString& getPrefix() const; virtual const XalanDOMString& getLocalName() const; virtual bool isIndexed() const; virtual IndexType getIndex() const; virtual XalanElement* getDocumentElement() const; virtual XalanElement* getElementById(const XalanDOMString& elementId) const; // Interfaces not inherited from XalanDocument... static bool getPoolAllTextNodes() { return s_poolAllTextNodes; } static void setPoolAllTextNodes(bool fPool) { s_poolAllTextNodes = fPool; } XalanSourceTreeElement* createElementNode( const XalanDOMChar* name, const AttributeListType& attrs, XalanNode* theParentNode = 0, XalanNode* thePreviousSibling = 0, XalanNode* theNextSibling = 0, bool fAddXMLNamespaceAttribute = false); XalanSourceTreeElement* createElementNode( const XalanDOMChar* uri, const XalanDOMChar* localname, const XalanDOMChar* qname, const AttributesType& attrs, XalanNode* theParentNode = 0, XalanNode* thePreviousSibling = 0, XalanNode* theNextSibling = 0, bool fAddXMLNamespaceAttribute = false); XalanSourceTreeElement* createElementNode( const XalanDOMChar* tagName, const AttributeListType& attrs, const PrefixResolver& thePrefixResolver, XalanNode* theParentNode = 0, XalanNode* thePreviousSibling = 0, XalanNode* theNextSibling = 0, bool fAddXMLNamespaceAttribute = false); XalanSourceTreeElement* createElementNode( const XalanDOMChar* name, const AttributesType& attrs, XalanNode* theParentNode = 0, XalanNode* thePreviousSibling = 0, XalanNode* theNextSibling = 0, bool fAddXMLNamespaceAttribute = false); XalanSourceTreeComment* createCommentNode( const XalanDOMChar* data, XalanDOMString::size_type length, XalanNode* theParentNode = 0, XalanNode* thePreviousSibling = 0, XalanNode* theNextSibling = 0); XalanSourceTreeProcessingInstruction* createProcessingInstructionNode( const XalanDOMChar* target, const XalanDOMChar* data, XalanNode* theParentNode = 0, XalanNode* thePreviousSibling = 0, XalanNode* theNextSibling = 0); XalanSourceTreeText* createTextNode( const XalanDOMChar* chars, XalanDOMString::size_type length, XalanNode* theParentNode = 0, XalanNode* thePreviousSibling = 0, XalanNode* theNextSibling = 0); XalanSourceTreeText* createTextIWSNode( const XalanDOMChar* chars, XalanDOMString::size_type length, XalanNode* theParentNode = 0, XalanNode* thePreviousSibling = 0, XalanNode* theNextSibling = 0); void unparsedEntityDeclaration( const XalanDOMChar* name, const XalanDOMChar* publicId, const XalanDOMChar* systemId, const XalanDOMChar* notationName); const XalanDOMString& getUnparsedEntityURI(const XalanDOMString& theName) const; // Child node setters... void appendChildNode(XalanSourceTreeComment* theChild); void appendChildNode(XalanSourceTreeElement* theChild); void appendChildNode(XalanSourceTreeProcessingInstruction* theChild); private: MemoryManager& getMemoryManager() { return m_stringBuffer.getMemoryManager(); } // Helper functions... XalanSourceTreeAttr* createAttribute( const XalanDOMChar* theName, const XalanDOMChar* theValue, XalanSourceTreeElement* theOwnerElement, const PrefixResolver& thePrefixResolver); XalanSourceTreeAttr* createAttribute( const XalanDOMChar* theName, const XalanDOMChar* theValue, XalanSourceTreeElement* theOwnerElement); size_t createAttributes( XalanSourceTreeAttr** theAttributeVector, const AttributeListType& attrs, size_t theStartIndex, XalanSourceTreeElement* theOwnerElement, bool fCreateNamespaces, const PrefixResolver* thePrefixResolver = 0); XalanSourceTreeElement* createElementNode( const XalanDOMChar* theTagName, XalanSourceTreeAttr** theAttributeVector, XalanSize_t theAttributeCount, XalanNode* theParentNode, XalanNode* thePreviousSibling, XalanNode* theNextSibling, const PrefixResolver& thePrefixResolver); size_t createAttributes( XalanSourceTreeAttr** theAttributeVector, const AttributesType& theAttributes, size_t theStartIndex, XalanSourceTreeElement* theOwnerElement, bool fCreateNamespaces); void createAttributes( const AttributesType& theAttributes, XalanSourceTreeAttr** theAttributeVector, XalanSourceTreeElement* theOwnerElement, bool fAddXMLNamespaceAttribute); const XalanDOMString& getTextNodeString( const XalanDOMChar* chars, XalanDOMString::size_type length); const XalanDOMString* getNamespaceForPrefix( const XalanDOMChar* theName, const PrefixResolver& thePrefixResolver, XalanDOMString& thePrefix, bool fUseDefault, const XalanDOMChar** theLocalName = 0); // Not implemented... XalanSourceTreeDocument(const XalanSourceTreeDocument& theSource); XalanSourceTreeDocument& operator=(const XalanSourceTreeDocument& theRHS); bool operator==(const XalanSourceTreeDocument& theRHS) const; // Data members... XalanNode* m_firstChild; XalanSourceTreeElement* m_documentElement; XalanSourceTreeAttributeAllocator m_attributeAllocator; XalanSourceTreeAttributeNSAllocator m_attributeNSAllocator; XalanSourceTreeCommentAllocator m_commentAllocator; XalanSourceTreeElementAAllocator m_elementAAllocator; XalanSourceTreeElementANSAllocator m_elementANSAllocator; XalanSourceTreeElementNAAllocator m_elementNAAllocator; XalanSourceTreeElementNANSAllocator m_elementNANSAllocator; XalanSourceTreeProcessingInstructionAllocator m_piAllocator; XalanSourceTreeTextAllocator m_textAllocator; XalanSourceTreeTextIWSAllocator m_textIWSAllocator; XalanDOMStringPool m_namesStringPool; XalanDOMStringPool m_valuesStringPool; AttributesArrayAllocatorType m_attributesVector; IndexType m_nextIndexValue; const bool m_poolAllText; ElementByIDMapType m_elementsByID; UnparsedEntityURIMapType m_unparsedEntityURIs; XalanDOMStringAllocator m_nonPooledStrings; XalanDOMString m_stringBuffer; static const XalanDOMString& s_nameString; static bool s_poolAllTextNodes; }; } #endif // !defined(XALANSOURCETREEDOCUMENT_HEADER_GUARD_1357924680)