Class DTMManagerDefault
%REVIEW% There is currently a reentrancy issue, since the finalizer for XRTreeFrag (which runs
in the GC thread) wants to call DTMManager.release(), and may do so at the same time that the
main transformation thread is accessing the manager. Our current solution is to make most of the
manager's methods synchronized
. Early tests suggest that doing so is not causing a
significant performance hit in Xalan. However, it should be noted that there is a possible
alternative solution: rewrite release() so it merely posts a request for release onto a
threadsafe queue, and explicitly process that queue on an infrequent basis during main-thread
activity (eg, when getDTM() is invoked). The downside of that solution would be a greater delay
before the DTM's storage is actually released for reuse.
-
Field Summary
Modifier and TypeFieldDescriptionprotected DTM[]
Map from DTM identifier numbers to DTM objects that this manager manages.Fields inherited from class org.loboevolution.apache.xml.dtm.DTMManager
IDENT_DTM_DEFAULT, IDENT_DTM_NODE_BITS, IDENT_MAX_DTMS, IDENT_NODE_DEFAULT
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
Add a DTM to the DTM table.createDTMIterator
(int whatToShow, DTMFilter filter, boolean entityReferenceExpansion) Create a newDTMIterator
based only on a whatToShow and a DTMFilter.createDTMIterator
(Object xpathCompiler, int pos) createDTMIterator
(String xpathString, PrefixResolver presolver) getDTM
(int nodeHandle) Get the instance of DTM that "owns" a node handle.Get an instance of a DTM, loaded with the content from the specified source.int
getDTMHandleFromNode
(Node node) Given a W3C DOM node, try and return a DTM handle.int
Methods inherited from class org.loboevolution.apache.xml.dtm.DTMManager
newInstance
-
Field Details
-
m_dtms
Map from DTM identifier numbers to DTM objects that this manager manages. One DTM may have several prefix numbers, if extended node indexing is in use; in that case, m_dtm_offsets[] will used to control which prefix maps to which section of the DTM.This array grows as necessary; see addDTM().
This array grows as necessary; see addDTM(). Growth is uncommon... but access needs to be blindingly fast since it's used in node addressing.
-
-
Constructor Details
-
DTMManagerDefault
public DTMManagerDefault()Constructor DTMManagerDefault
-
-
Method Details
-
addDTM
Add a DTM to the DTM table.- Parameters:
dtm
- Should be a valid reference to a DTM.id
- Integer DTM ID to be bound to this DTM.offset
- Integer addressing offset. The internal DTM Node ID is obtained by adding this offset to the node-number field of the public DTM Handle. For the first DTM ID accessing each DTM, this is 0; for overflow addressing it will be a multiple of 1<<IDENT_DTM_NODE_BITS.
-
getFirstFreeDTMID
public int getFirstFreeDTMID()- Returns:
- the first free DTM ID available. %OPT% Linear search is inefficient!
-
getDTM
Description copied from class:DTMManager
Get an instance of a DTM, loaded with the content from the specified source. If the unique flag is true, a new instance will always be returned. Otherwise it is up to the DTMManager to return a new instance or an instance that it already created and may be being used by someone else.(More parameters may eventually need to be added for error handling and entity resolution, and to better control selection of implementations.)
- Specified by:
getDTM
in classDTMManager
- Parameters:
source
- the specification of the source object, which may be null, in which case it is assumed that node construction will take by some other means.unique
- true if the returned DTM must be unique, probably because it is going to be mutated.incremental
- true if the DTM should be built incrementally, if possible.doIndexing
- true if the caller considers it worth it to use indexing schemes.- Returns:
- a non-null DTM reference.
-
getDTMHandleFromNode
Given a W3C DOM node, try and return a DTM handle. Note: calling this may be non-optimal.- Specified by:
getDTMHandleFromNode
in classDTMManager
- Parameters:
node
- Non-null reference to a DOM node.- Returns:
- a valid DTM handle.
-
getDTM
Get the instance of DTM that "owns" a node handle.- Specified by:
getDTM
in classDTMManager
- Parameters:
nodeHandle
- the nodeHandle.- Returns:
- a non-null DTM reference.
-
createDTMIterator
public DTMIterator createDTMIterator(int whatToShow, DTMFilter filter, boolean entityReferenceExpansion) Create a newDTMIterator
based only on a whatToShow and a DTMFilter. The traversal semantics are defined as the descendant access.Note that DTMIterators may not be an exact match to DOM NodeIterators. They are initialized and used in much the same way as a NodeIterator, but their response to document mutation is not currently defined.
- Specified by:
createDTMIterator
in classDTMManager
- Parameters:
whatToShow
- This flag specifies which node types may appear in the logical view of the tree presented by the iterator. See the description ofNodeFilter
for the set of possibleSHOW_
values.These flags can be combined usingOR
.filter
- TheNodeFilter
to be used with thisDTMFilter
, ornull
to indicate no filter.entityReferenceExpansion
- The value of this flag determines whether entity reference nodes are expanded.- Returns:
- The newly created
DTMIterator
.
-
createDTMIterator
- Specified by:
createDTMIterator
in classDTMManager
- Parameters:
xpathString
- Must be a valid string expressing a LocationPath or a UnionExpr.presolver
- An object that can resolve prefixes to namespace URLs.- Returns:
- The newly created
DTMIterator
.
-
createDTMIterator
- Specified by:
createDTMIterator
in classDTMManager
- Parameters:
xpathCompiler
- ??? Somehow we need to pass in a subpart of the expression. I hate to do this with strings, since the larger expression has already been parsed.pos
- The position in the expression.- Returns:
- The newly created
DTMIterator
.
-
getExpandedNameTable
- Returns:
- the expanded name table.
NEEDSDOC @param dtm
NEEDSDOC ($objectName$) @return
-