org.apache.xml.dtm.ref.sax2dtm
Class  SAX2RTFDTM
java.lang.Object
  |
  +--org.apache.xml.dtm.ref.DTMDefaultBase
        |
        +--org.apache.xml.dtm.ref.DTMDefaultBaseTraversers
              |
              +--org.apache.xml.dtm.ref.DTMDefaultBaseIterators
                    |
                    +--org.apache.xml.dtm.ref.sax2dtm.SAX2DTM
                          |
                          +--org.apache.xml.dtm.ref.sax2dtm.SAX2RTFDTM
- public class SAX2RTFDTM
- extends SAX2DTM
  
This is a subclass of SAX2DTM which has been modified to meet the needs of
 Result Tree Frameworks (RTFs). The differences are:
 1) Multiple XML trees may be appended to the single DTM. This means
 that the root node of each document is _not_ node 0. Some code has
 had to be deoptimized to support this mode of operation, and an
 explicit mechanism for obtaining the Node Handle of the root node
 has been provided.
 2) A stack of these documents is maintained, allowing us to "tail-prune" the
 most recently added trees off the end of the DTM as stylesheet elements 
 (and thus variable contexts) are exited.
 PLEASE NOTE that this class may be _heavily_ dependent upon the
 internals of the SAX2DTM superclass, and must be maintained in
 parallel with that code.  Arguably, they should be conditionals
 within a single class... but they have deen separated for
 performance reasons. (In fact, one could even argue about which is
 the superclass and which is the subclass; the current arrangement
 is as much about preserving stability of existing code during
 development as anything else.)
 
 %REVIEW% In fact, since the differences are so minor, I think it
 may be possible/practical to fold them back into the base
 SAX2DTM. Consider that as a future code-size optimization.
| Inner classes inherited from class org.apache.xml.dtm.ref.DTMDefaultBaseIterators | 
DTMDefaultBaseIterators.AncestorIterator,  
DTMDefaultBaseIterators.AttributeIterator,  
DTMDefaultBaseIterators.ChildrenIterator,  
DTMDefaultBaseIterators.DescendantIterator,  
DTMDefaultBaseIterators.FollowingIterator,  
DTMDefaultBaseIterators.FollowingSiblingIterator,  
DTMDefaultBaseIterators.InternalAxisIteratorBase,  
DTMDefaultBaseIterators.NamespaceAttributeIterator,  
DTMDefaultBaseIterators.NamespaceChildrenIterator,  
DTMDefaultBaseIterators.NamespaceIterator,  
DTMDefaultBaseIterators.NthDescendantIterator,  
DTMDefaultBaseIterators.ParentIterator,  
DTMDefaultBaseIterators.PrecedingIterator,  
DTMDefaultBaseIterators.PrecedingSiblingIterator,  
DTMDefaultBaseIterators.RootIterator,  
DTMDefaultBaseIterators.SingletonIterator,  
DTMDefaultBaseIterators.TypedAncestorIterator,  
DTMDefaultBaseIterators.TypedAttributeIterator,  
DTMDefaultBaseIterators.TypedChildrenIterator,  
DTMDefaultBaseIterators.TypedDescendantIterator,  
DTMDefaultBaseIterators.TypedFollowingIterator,  
DTMDefaultBaseIterators.TypedFollowingSiblingIterator,  
DTMDefaultBaseIterators.TypedNamespaceIterator,  
DTMDefaultBaseIterators.TypedPrecedingIterator,  
DTMDefaultBaseIterators.TypedPrecedingSiblingIterator,  
DTMDefaultBaseIterators.TypedRootIterator,  
DTMDefaultBaseIterators.TypedSingletonIterator | 
 
 
 
| 
Method Summary | 
 void | 
endDocument()
 
          Receive notification of the end of the document. | 
 int | 
getDocument()
 
          Given a DTM, find the owning document node. | 
 int | 
getDocumentRoot(int nodeHandle)
 
          Given a node handle, find the owning document node, using DTM semantics
 (Document owns itself) rather than DOM semantics (Document has no owner). | 
 boolean | 
isTreeIncomplete()
 
            | 
 boolean | 
popRewindMark()
 
          "Tail-pruning" support for RTFs. | 
 void | 
pushRewindMark()
 
          "Tail-pruning" support for RTFs. | 
 void | 
startDocument()
 
          Receive notification of the beginning of a new RTF document. | 
 
| Methods inherited from class org.apache.xml.dtm.ref.sax2dtm.SAX2DTM | 
attributeDecl, 
characters, 
clearCoRoutine, 
clearCoRoutine, 
comment, 
dispatchCharactersEvents, 
dispatchToEvents, 
elementDecl, 
endCDATA, 
endDTD, 
endElement, 
endEntity, 
endPrefixMapping, 
error, 
externalEntityDecl, 
fatalError, 
getAttributeNode, 
getContentHandler, 
getDeclHandler, 
getDocumentTypeDeclarationPublicIdentifier, 
getDocumentTypeDeclarationSystemIdentifier, 
getDTDHandler, 
getElementById, 
getEntityResolver, 
getErrorHandler, 
getFixedNames, 
getIdForNamespace, 
getLexicalHandler, 
getLocalName, 
getNamespaceURI, 
getNamespaceURI, 
getNodeName, 
getNodeNameX, 
getNodeValue, 
getNumberOfNodes, 
getPrefix, 
getPrefix, 
getSourceLocatorFor, 
getStringValue, 
getUnparsedEntityURI, 
ignorableWhitespace, 
internalEntityDecl, 
isAttributeSpecified, 
isWhitespace, 
migrateTo, 
needsTwoThreads, 
notationDecl, 
processingInstruction, 
resolveEntity, 
setDocumentLocator, 
setIDAttribute, 
setIncrementalSAXSource, 
setProperty, 
setUseSourceLocation, 
skippedEntity, 
startCDATA, 
startDTD, 
startElement, 
startEntity, 
startPrefixMapping, 
unparsedEntityDecl, 
warning | 
 
 
 
| Methods inherited from class org.apache.xml.dtm.ref.DTMDefaultBase | 
appendChild, 
appendTextChild, 
documentRegistration, 
documentRelease, 
dumpDTM, 
dumpNode, 
getDocumentAllDeclarationsProcessed, 
getDocumentBaseURI, 
getDocumentEncoding, 
getDocumentStandalone, 
getDocumentSystemIdentifier, 
getDocumentVersion, 
getDTMIDs, 
getExpandedTypeID, 
getExpandedTypeID, 
getFirstAttribute, 
getFirstChild, 
getFirstNamespaceNode, 
getLastChild, 
getLevel, 
getLocalNameFromExpandedNameID, 
getManager, 
getNamespaceFromExpandedNameID, 
getNamespaceType, 
getNextAttribute, 
getNextNamespaceNode, 
getNextSibling, 
getNode, 
getNodeHandle, 
getNodeIdent, 
getNodeType, 
getOwnerDocument, 
getParent, 
getPreviousSibling, 
getStringValueChunk, 
getStringValueChunkCount, 
getTypedFirstChild, 
getTypedNextSibling, 
hasChildNodes, 
isCharacterElementContentWhitespace, 
isDocumentAllDeclarationsProcessed, 
isNodeAfter, 
isSupported, 
makeNodeHandle, 
makeNodeIdentity, 
setDocumentBaseURI, 
setFeature, 
supportsPreStripping | 
 
| Methods inherited from class java.lang.Object | 
equals, 
getClass, 
hashCode, 
notify, 
notifyAll, 
toString, 
wait, 
wait, 
wait | 
 
SAX2RTFDTM
public SAX2RTFDTM(DTMManager mgr,
                  Source source,
                  int dtmIdentity,
                  DTMWSFilter whiteSpaceFilter,
                  XMLStringFactory xstringfactory,
                  boolean doIndexing)
getDocument
public int getDocument()
- Given a DTM, find the owning document node. In the case of
 SAX2RTFDTM, which may contain multiple documents, this returns
 the most recently started document, or null if the DTM is
 empty or no document is currently under construction.
 %REVIEW% Should we continue to report the most recent after
 construction has ended? I think not, given that it may have been
 tail-pruned.
- Returns:
 - int Node handle of Document node, or null if this DTM does not
  contain an "active" document.
 - Overrides:
 - getDocument in class DTMDefaultBase
 
 
 
getDocumentRoot
public int getDocumentRoot(int nodeHandle)
- Given a node handle, find the owning document node, using DTM semantics
 (Document owns itself) rather than DOM semantics (Document has no owner).
 (I'm counting on the fact that getOwnerDocument() is implemented on top
 of this call, in the superclass, to avoid having to rewrite that one.
 Be careful if that code changes!)
- Parameters:
 nodeHandle - the id of the node.- Returns:
 - int Node handle of owning document
 - Overrides:
 - getDocumentRoot in class DTMDefaultBase
 
 
 
startDocument
public void startDocument()
                   throws SAXException
- Receive notification of the beginning of a new RTF document.
 %REVIEW% Y'know, this isn't all that much of a deoptimization. We
 might want to consider folding the start/endDocument changes back
 into the main SAX2DTM so we don't have to expose so many fields
 (even as Protected) and carry the additional code.
- Throws:
 - SAXException - Any SAX exception, possibly
            wrapping another exception.
 - Overrides:
 - startDocument in class SAX2DTM
 - See Also: 
 ContentHandler.startDocument()
 
 
endDocument
public void endDocument()
                 throws SAXException
- Receive notification of the end of the document.
 %REVIEW% Y'know, this isn't all that much of a deoptimization. We
 might want to consider folding the start/endDocument changes back
 into the main SAX2DTM so we don't have to expose so many fields
 (even as Protected).
- Throws:
 - SAXException - Any SAX exception, possibly
            wrapping another exception.
 - Overrides:
 - endDocument in class SAX2DTM
 - See Also: 
 ContentHandler.endDocument()
 
 
pushRewindMark
public void pushRewindMark()
- "Tail-pruning" support for RTFs.
 This function pushes information about the current size of the
 DTM's data structures onto a stack, for use by popRewindMark()
 (which see).
 %REVIEW% I have no idea how to rewind m_elemIndexes. However,
 RTFs will not be indexed, so I can simply panic if that case
 arises. Hey, it works...
 
popRewindMark
public boolean popRewindMark()
- "Tail-pruning" support for RTFs.
 This function pops the information previously saved by
 pushRewindMark (which see) and uses it to discard all nodes added
 to the DTM after that time. We expect that this will allow us to
 reuse storage more effectively.
 This is _not_ intended to be called while a document is still being
 constructed -- only between endDocument and the next startDocument
 %REVIEW% WARNING: This is the first use of some of the truncation
 methods.  If Xalan blows up after this is called, that's a likely
 place to check.
 %REVIEW% Our original design for DTMs permitted them to share
 string pools.  If there any risk that this might be happening, we
 can _not_ rewind and recover the string storage. One solution
 might to assert that DTMs used for RTFs Must Not take advantage
 of that feature, but this seems excessively fragile. Another, much
 less attractive, would be to just let them leak... Nah.
- Returns:
 - true if and only if the pop completely emptied the
 RTF. That response is used when determining how to unspool
 RTF-started-while-RTF-open situations.
 
 
 
isTreeIncomplete
public boolean isTreeIncomplete()
- Returns:
 - true if a DTM tree is currently under construction.
 
 
Copyright © 2006 Apache XML Project. All Rights Reserved.