net.sf.saxon.om

Class NamePool

public class NamePool extends Object implements Serializable

An object representing a collection of XML names, each containing a Namespace URI, a Namespace prefix, and a local name; plus a collection of namespaces, each consisting of a prefix/URI pair.

The equivalence betweem names depends only on the URI and the local name. The prefix is retained for documentary purposes only: it is useful when reconstructing a document to use prefixes that the user is familiar with.

The NamePool eliminates duplicate names if they have the same prefix, uri, and local part. It retains duplicates if they have different prefixes

Author: Michael H. Kay

Nested Class Summary
static classNamePool.NamePoolLimitException
Field Summary
static intFP_MASK
FP_MASK is a mask used to obtain a fingerprint from a nameCode.
NamePool.NameEntry[]hashslots
static intMAX_PREFIXES_PER_URI
String[]prefixes
String[][]prefixesForUri
shortprefixesUsed
String[]uris
shorturisUsed
Constructor Summary
NamePool()
Method Summary
intallocate(String prefix, String uri, String localName)
Allocate a name from the pool, or a new Name if there is not a matching one there
intallocate(String prefix, short uriCode, String localName)
Allocate a name from the pool, or a new Name if there is not a matching one there
intallocateClarkName(String expandedName)
Allocate a fingerprint given a Clark Name
shortallocateCodeForURI(String uri)
Allocate the uri code for a given URI; create one if not found
intallocateLexicalQName(CharSequence qname, boolean useDefault, NamespaceResolver resolver, NameChecker checker)
Get the nameCode for a lexical QName, given a namespace resolver.
intallocateNamespaceCode(String prefix, String uri)
Allocate the namespace code for a namespace prefix/URI pair.
intallocateNamespaceCode(int namecode)
Allocate a namespace code for the prefix/URI of a given namecode
voiddiagnosticDump()
Diagnostic print of the namepool contents.
StringgetClarkName(int nameCode)
Get the Clark form of a name, given its name code or fingerprint
ObjectgetClientData(Class key)
Retrieve client data on behalf of a user of the namepool
shortgetCodeForPrefix(String prefix)
Get the prefix code for a given Prefix
shortgetCodeForURI(String uri)
Get the uri code for a given URI
static NamePoolgetDefaultNamePool()
Get the singular default NamePool
StringgetDisplayName(int nameCode)
Get the display form of a name (the QName), given its name code or fingerprint
intgetFingerprint(String uri, String localName)
Get a fingerprint for the name with a given uri and local name.
intgetFingerprintForExpandedName(String expandedName)
Get fingerprint for expanded name in {uri}local format
StringgetLocalName(int nameCode)
Get the local part of a name, given its name code or fingerprint
intgetNamespaceCode(String prefix, String uri)
Get the existing namespace code for a namespace prefix/URI pair.
intgetNamespaceCode(int namecode)
Allocate a namespace code for a given namecode
StringgetPrefix(int nameCode)
Get the prefix part of a name, given its name code or fingerprint
StringgetPrefixFromNamespaceCode(int code)
Get the namespace prefix from a namespace code.
StringgetPrefixWithIndex(short uriCode, int index)
Get a prefix among all the prefixes used with a given URI, given its index
TypeHierarchygetTypeHierarchy()
Get the TypeHierarchy
StringgetURI(int nameCode)
Get the namespace-URI of a name, given its name code or fingerprint
shortgetURICode(int nameCode)
Get the URI code of a name, given its name code or fingerprint
StringgetURIFromNamespaceCode(int code)
Get the namespace URI from a namespace code.
StringgetURIFromURICode(short code)
Get the namespace URI from a URI code.
static String[]parseClarkName(String expandedName)
Parse a Clark-format expanded name, returning the URI and local name
voidsetClientData(Class key, Object value)
Save client data on behalf of a user of the namepool
static voidsetDefaultNamePool(NamePool pool)
Set the default NamePool (used after loading a compiled stylesheet)
voidstatistics()
Statistics summarizing the namepool contents.
StringsuggestPrefixForURI(String URI)
Suggest a prefix for a given URI.

Field Detail

FP_MASK

public static final int FP_MASK
FP_MASK is a mask used to obtain a fingerprint from a nameCode. Given a nameCode nc, the fingerprint is nc & NamePool.FP_MASK. (In practice, Saxon code often uses the literal constant 0xfffff.) The difference between a nameCode is that a nameCode contains information about the prefix of a name, the fingerprint depends only on the namespace URI and local name. Note that the "null" nameCode (-1) does not produce the "null" fingerprint (also -1) when this mask is applied.

hashslots

NamePool.NameEntry[] hashslots

MAX_PREFIXES_PER_URI

public static final int MAX_PREFIXES_PER_URI

prefixes

String[] prefixes

prefixesForUri

String[][] prefixesForUri

prefixesUsed

short prefixesUsed

uris

String[] uris

urisUsed

short urisUsed

Constructor Detail

NamePool

public NamePool()

Method Detail

allocate

public int allocate(String prefix, String uri, String localName)
Allocate a name from the pool, or a new Name if there is not a matching one there

Parameters: prefix uri - the namespace URI. The null URI is represented as an empty string. localName

Returns: an integer (the "namecode") identifying the name within the namepool. The Name itself may be retrieved using the getName(int) method

allocate

public int allocate(String prefix, short uriCode, String localName)
Allocate a name from the pool, or a new Name if there is not a matching one there

Parameters: prefix - the namespace prefix uriCode - the code of the URI localName - the local part of the QName

Returns: an integer (the "namecode") identifying the name within the namepool.

allocateClarkName

public int allocateClarkName(String expandedName)
Allocate a fingerprint given a Clark Name

allocateCodeForURI

public short allocateCodeForURI(String uri)
Allocate the uri code for a given URI; create one if not found

allocateLexicalQName

public int allocateLexicalQName(CharSequence qname, boolean useDefault, NamespaceResolver resolver, NameChecker checker)
Get the nameCode for a lexical QName, given a namespace resolver.

Parameters: qname the lexical QName. useDefault if true, an absent prefix is resolved by the NamespaceResolver to the namespace URI assigned to the prefix "". If false, an absent prefix is interpreted as meaning the name is in no namespace. checker NameChecker used to check names against the XML 1.0 or 1.1 specification

Returns: the corresponding nameCode

Throws: net.sf.saxon.trans.DynamicError if the string is not a valid lexical QName or if the namespace prefix has not been declared*

allocateNamespaceCode

public int allocateNamespaceCode(String prefix, String uri)
Allocate the namespace code for a namespace prefix/URI pair. Create it if not already present

Parameters: prefix the namespace prefix uri the namespace URI

Returns: an integer code identifying the namespace. The namespace code identifies both the prefix and the URI.

allocateNamespaceCode

public int allocateNamespaceCode(int namecode)
Allocate a namespace code for the prefix/URI of a given namecode

Parameters: namecode a code identifying an expanded QName, e.g. of an element or attribute

Returns: a code identifying the namespace used in the given name. The namespace code identifies both the prefix and the URI.

diagnosticDump

public void diagnosticDump()
Diagnostic print of the namepool contents.

getClarkName

public String getClarkName(int nameCode)
Get the Clark form of a name, given its name code or fingerprint

Returns: the local name if the name is in the null namespace, or "{uri}local" otherwise. The name is always interned.

getClientData

public Object getClientData(Class key)
Retrieve client data on behalf of a user of the namepool

getCodeForPrefix

public short getCodeForPrefix(String prefix)
Get the prefix code for a given Prefix

Returns: -1 if not found

getCodeForURI

public short getCodeForURI(String uri)
Get the uri code for a given URI

Returns: -1 if not present in the name pool

getDefaultNamePool

public static NamePool getDefaultNamePool()
Get the singular default NamePool

getDisplayName

public String getDisplayName(int nameCode)
Get the display form of a name (the QName), given its name code or fingerprint

getFingerprint

public int getFingerprint(String uri, String localName)
Get a fingerprint for the name with a given uri and local name. These must be present in the NamePool. The fingerprint has the property that if two fingerprint are the same, the names are the same (ie. same local name and same URI).

Returns: -1 if not found

getFingerprintForExpandedName

public int getFingerprintForExpandedName(String expandedName)
Get fingerprint for expanded name in {uri}local format

getLocalName

public String getLocalName(int nameCode)
Get the local part of a name, given its name code or fingerprint

getNamespaceCode

public int getNamespaceCode(String prefix, String uri)
Get the existing namespace code for a namespace prefix/URI pair.

Returns: -1 if there is none present

getNamespaceCode

public int getNamespaceCode(int namecode)
Allocate a namespace code for a given namecode

Parameters: namecode a code identifying an expanded QName, e.g. of an element or attribute

Returns: a code identifying the namespace used in the given name. The namespace code identifies both the prefix and the URI. Return -1 if no namespace code has been allocated (in this case the caller should call allocateNamespaceCode() to get one).

getPrefix

public String getPrefix(int nameCode)
Get the prefix part of a name, given its name code or fingerprint

getPrefixFromNamespaceCode

public String getPrefixFromNamespaceCode(int code)
Get the namespace prefix from a namespace code.

getPrefixWithIndex

public String getPrefixWithIndex(short uriCode, int index)
Get a prefix among all the prefixes used with a given URI, given its index

Returns: the prefix with the given index. If the index is 0, the prefix is always "".

getTypeHierarchy

public final TypeHierarchy getTypeHierarchy()
Get the TypeHierarchy

getURI

public String getURI(int nameCode)
Get the namespace-URI of a name, given its name code or fingerprint

getURICode

public short getURICode(int nameCode)
Get the URI code of a name, given its name code or fingerprint

getURIFromNamespaceCode

public String getURIFromNamespaceCode(int code)
Get the namespace URI from a namespace code.

getURIFromURICode

public String getURIFromURICode(short code)
Get the namespace URI from a URI code.

parseClarkName

public static String[] parseClarkName(String expandedName)
Parse a Clark-format expanded name, returning the URI and local name

setClientData

public void setClientData(Class key, Object value)
Save client data on behalf of a user of the namepool

setDefaultNamePool

public static void setDefaultNamePool(NamePool pool)
Set the default NamePool (used after loading a compiled stylesheet)

statistics

public void statistics()
Statistics summarizing the namepool contents. This method outputs summary statistical information to System.err

suggestPrefixForURI

public String suggestPrefixForURI(String URI)
Suggest a prefix for a given URI. If there are several, it's undefined which one is returned. If there are no prefixes registered for this URI, return null.