APIdia Launch Partner
Top Description Fields Constructors Methods
com.sun.org.apache.xml.internal.dtm.ref.sax2dtm

public Class SAX2RTFDTM

extends SAX2DTM
Class Inheritance
Imports
com.sun.org.apache.xml.internal.dtm.DTM, .DTMManager, .DTMWSFilter, com.sun.org.apache.xml.internal.utils.IntStack, .IntVector, .StringVector, .XMLStringFactory, java.util.Vector, javax.xml.transform.Source, org.xml.sax.SAXException

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.

Field Summary

Modifier and TypeField and Description
private static final boolean
DEBUG

Hides com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM.DEBUG.

Set true to monitor SAX events and similar diagnostic info.
private int
m_currentDocumentNode

Most recently started Document, or null if the DTM is empty.

pack-priv int
m_emptyCharsCount

Tail-pruning mark: initial number of characters in use

pack-priv int
m_emptyDataCount

Tail-pruning mark: initial number of data items in use

pack-priv int
m_emptyDataQNCount

Tail-pruning mark: default initial number of dataOrQName slots in use

pack-priv int
m_emptyNodeCount

Tail-pruning mark: initial number of nodes in use

pack-priv int
m_emptyNSDeclSetCount

Tail-pruning mark: initial number of namespace declaration sets

pack-priv int
m_emptyNSDeclSetElemsCount

Tail-pruning mark: initial number of namespace declaration elements

pack-priv IntStack
mark_char_size

Tail-pruning mark: Number of size-of-data fields in use

pack-priv IntStack
mark_data_size

Tail-pruning mark: Number of data items in use

pack-priv IntStack
mark_doq_size

Tail-pruning mark: Number of dataOrQName slots in use

pack-priv IntStack
mark_nsdeclelem_size

Tail-pruning mark: Number of naespace declaration elements in use %REVIEW% I don't think number of NS sets is ever different from number of NS elements.

pack-priv IntStack
mark_nsdeclset_size

Tail-pruning mark: Number of namespace declaration sets in use %REVIEW% I don't think number of NS sets is ever different from number of NS elements.

pack-priv IntStack
mark_size

Tail-pruning mark: Number of nodes in use

Inherited from com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM:
m_charsm_coalescedTextTypem_contextIndexesm_datam_dataOrQNamem_endDocumentOccuredm_idAttributesm_insideDTDm_locatorm_parentsm_pastFirstElementm_prefixMappingsm_previousm_sourceColumnm_sourceLinem_sourceSystemIdm_textPendingStartm_textTypem_useSourceLocationPropertym_valuesOrPrefixesm_walker

Constructor Summary

AccessConstructor and Description
public
SAX2RTFDTM(DTMManager mgr, Source source, int dtmIdentity, DTMWSFilter whiteSpaceFilter, XMLStringFactory xstringfactory, boolean doIndexing)

Method Summary

Modifier and TypeMethod and Description
protected int

Returns:

int Node identifier of the root of this DTM tree
_documentRoot
(int
the id of the starting node.
nodeIdentifier
)

Given a node identifier, find the owning document node.

public void
public int

Returns:

int Node handle of Document node, or null if this DTM does not contain an "active" document.
getDocument
()

Overrides com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase.getDocument.

Implements com.sun.org.apache.xml.internal.dtm.DTM.getDocument.

Given a DTM, find the owning document node.

public int

Returns:

int Node handle of owning document
getDocumentRoot
(int
the id of the node.
nodeHandle
)

Overrides com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase.getDocumentRoot.

Implements com.sun.org.apache.xml.internal.dtm.DTM.getDocumentRoot.

Given a node handle, find the owning document node, using DTM semantics (Document owns itself) rather than DOM semantics (Document has no owner).

public boolean
isTreeIncomplete()

Returns: true if a DTM tree is currently under construction.

public boolean

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.
popRewindMark
()

"Tail-pruning" support for RTFs.

public void
pushRewindMark()

"Tail-pruning" support for RTFs.

public void
startDocument()

Overrides com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM.startDocument.

Implements org.xml.sax.ContentHandler.startDocument.

Receive notification of the beginning of a new RTF document.

Inherited from com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM:
_dataOrQNameaddNewDTMIDaddNodeattributeDeclcharacterscharactersFlushclearCoRoutineclearCoRoutinecommentdeclAlreadyDeclareddispatchCharactersEventsdispatchToEventselementDeclendCDATAendDTDendElementendEntityendPrefixMappingerrorexternalEntityDeclfatalErrorgetAttributeNodegetContentHandlergetDeclHandlergetDocumentTypeDeclarationPublicIdentifiergetDocumentTypeDeclarationSystemIdentifiergetDTDHandlergetElementByIdgetEntityResolvergetErrorHandlergetFixedNamesgetIdForNamespacegetLexicalHandlergetLocalNamegetNamespaceURIgetNamespaceURIgetNextNodeIdentitygetNodeNamegetNodeNameXgetNodeValuegetNumberOfNodesgetPrefixgetPrefixgetSourceLocatorForgetStringValuegetUnparsedEntityURIignorableWhitespaceinternalEntityDeclisAttributeSpecifiedisWhitespacemigrateToneedsTwoThreadsnextNodenotationDeclprocessingInstructionresolveEntitysetDocumentLocatorsetIDAttributesetIncrementalSAXSourcesetPropertysetSourceLocationsetUseSourceLocationskippedEntitystartCDATAstartDTDstartElementstartEntitystartPrefixMappingunparsedEntityDeclwarning

Field Detail

DEBUGback to summary
private static final boolean DEBUG

Hides com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM.DEBUG.

Set true to monitor SAX events and similar diagnostic info.

m_currentDocumentNodeback to summary
private int m_currentDocumentNode

Most recently started Document, or null if the DTM is empty.

m_emptyCharsCountback to summary
pack-priv int m_emptyCharsCount

Tail-pruning mark: initial number of characters in use

m_emptyDataCountback to summary
pack-priv int m_emptyDataCount

Tail-pruning mark: initial number of data items in use

m_emptyDataQNCountback to summary
pack-priv int m_emptyDataQNCount

Tail-pruning mark: default initial number of dataOrQName slots in use

m_emptyNodeCountback to summary
pack-priv int m_emptyNodeCount

Tail-pruning mark: initial number of nodes in use

m_emptyNSDeclSetCountback to summary
pack-priv int m_emptyNSDeclSetCount

Tail-pruning mark: initial number of namespace declaration sets

m_emptyNSDeclSetElemsCountback to summary
pack-priv int m_emptyNSDeclSetElemsCount

Tail-pruning mark: initial number of namespace declaration elements

mark_char_sizeback to summary
pack-priv IntStack mark_char_size

Tail-pruning mark: Number of size-of-data fields in use

mark_data_sizeback to summary
pack-priv IntStack mark_data_size

Tail-pruning mark: Number of data items in use

mark_doq_sizeback to summary
pack-priv IntStack mark_doq_size

Tail-pruning mark: Number of dataOrQName slots in use

mark_nsdeclelem_sizeback to summary
pack-priv IntStack mark_nsdeclelem_size

Tail-pruning mark: Number of naespace declaration elements in use %REVIEW% I don't think number of NS sets is ever different from number of NS elements. We can probabably reduce these to a single stack and save some storage.

mark_nsdeclset_sizeback to summary
pack-priv IntStack mark_nsdeclset_size

Tail-pruning mark: Number of namespace declaration sets in use %REVIEW% I don't think number of NS sets is ever different from number of NS elements. We can probabably reduce these to a single stack and save some storage.

mark_sizeback to summary
pack-priv IntStack mark_size

Tail-pruning mark: Number of nodes in use

Constructor Detail

SAX2RTFDTMback to summary
public SAX2RTFDTM(DTMManager mgr, Source source, int dtmIdentity, DTMWSFilter whiteSpaceFilter, XMLStringFactory xstringfactory, boolean doIndexing)

Method Detail

_documentRootback to summary
protected int _documentRoot(int nodeIdentifier)

Given a node identifier, find the owning document node. Unlike the DOM, this considers the owningDocument of a Document to be itself. Note that in shared DTMs this may not be zero.

Parameters
nodeIdentifier:int

the id of the starting node.

Returns:int

int Node identifier of the root of this DTM tree

endDocumentback to summary
public void endDocument() throws SAXException

Overrides com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM.endDocument.

Implements org.xml.sax.ContentHandler.endDocument.

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).

Exceptions
SAXException:
Any SAX exception, possibly wrapping another exception.
See Also
org.xml.sax.ContentHandler#endDocument
getDocumentback to summary
public int getDocument()

Overrides com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase.getDocument.

Implements com.sun.org.apache.xml.internal.dtm.DTM.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

int Node handle of Document node, or null if this DTM does not contain an "active" document.

getDocumentRootback to summary
public int getDocumentRoot(int nodeHandle)

Overrides com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase.getDocumentRoot.

Implements com.sun.org.apache.xml.internal.dtm.DTM.getDocumentRoot.

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:int

the id of the node.

Returns:int

int Node handle of owning document

isTreeIncompleteback to summary
public boolean isTreeIncomplete()
Returns:boolean

true if a DTM tree is currently under construction.

popRewindMarkback to summary
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:boolean

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.

pushRewindMarkback to summary
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...

startDocumentback to summary
public void startDocument() throws SAXException

Overrides com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM.startDocument.

Implements org.xml.sax.ContentHandler.startDocument.

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.

Exceptions
SAXException:
Any SAX exception, possibly wrapping another exception.
See Also
org.xml.sax.ContentHandler#startDocument