net.sf.saxon.trans
Class KeyManager

java.lang.Object
  extended bynet.sf.saxon.trans.KeyManager
All Implemented Interfaces:
java.io.Serializable

public class KeyManager
extends java.lang.Object
implements java.io.Serializable

KeyManager manages the set of key definitions in a stylesheet, and the indexes associated with these key definitions. It handles xsl:sort-key as well as xsl:key definitions.

The memory management in this class is subtle, with extensive use of weak references. The idea is that an index should continue to exist in memory so long as both the compiled stylesheet and the source document exist in memory: if either is removed, the index should go too. The document itself holds no reference to the index. The compiled stylesheet (which owns the KeyManager) holds a weak reference to the index. The index, of course, holds strong references to the nodes in the document. The Controller holds a strong reference to the list of indexes used for each document, so that indexes remain in memory for the duration of a transformation even if the documents themselves are garbage collected.

Potentially there is a need for more than one index for a given key name, depending on the primitive type of the value provided to the key() function. An index is built corresponding to the type of the requested value; if subsequently the key() function is called with the same name and a different type of value, then a new index is built.

See Also:
Serialized Form

Constructor Summary
KeyManager(Configuration config)
          create a KeyManager and initialise variables
 
Method Summary
 void addKeyDefinition(int fingerprint, KeyDefinition keydef, NamePool namePool)
          Register a key definition.
 java.util.List getKeyDefinitions(int fingerprint)
          Get all the key definitions that match a particular fingerprint
 SequenceIterator selectByKey(int fingerprint, DocumentInfo doc, AtomicValue value, XPathContext context)
          Get the nodes with a given key value
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

KeyManager

public KeyManager(Configuration config)
create a KeyManager and initialise variables

Method Detail

addKeyDefinition

public void addKeyDefinition(int fingerprint,
                             KeyDefinition keydef,
                             NamePool namePool)
                      throws javax.xml.transform.TransformerConfigurationException
Register a key definition. Note that multiple key definitions with the same name are allowed

Parameters:
fingerprint - Integer representing the name of the key
keydef - The details of the key's definition
namePool -
Throws:
javax.xml.transform.TransformerConfigurationException

getKeyDefinitions

public java.util.List getKeyDefinitions(int fingerprint)
Get all the key definitions that match a particular fingerprint

Parameters:
fingerprint - The fingerprint of the name of the required key
Returns:
The key definition of the named key if there is one, or null otherwise.

selectByKey

public SequenceIterator selectByKey(int fingerprint,
                                    DocumentInfo doc,
                                    AtomicValue value,
                                    XPathContext context)
                             throws XPathException
Get the nodes with a given key value

Parameters:
fingerprint - The fingerprint of the name of the required key
doc - The source document in question
value - The required key value
context - The dynamic context, needed only the first time when the key is being built
Returns:
an enumeration of nodes, always in document order
Throws:
XPathException