Package com.ctc.wstx.util
Class ElementIdMap
java.lang.Object
com.ctc.wstx.util.ElementIdMap
This class is a specialized type-safe linked hash map used for
storing
ElementId instances. ElementId instances
represent both id definitions (values of element attributes that
have type ID in DTD), and references (values of element attributes
of type IDREF and IDREFS). These definitions and references are
stored for the purpose of verifying
that all referenced id values are defined, and that none are defined
more than once.
Note: there are 2 somewhat distinct usage modes, by DTDValidator and by MSV-based validators. DTDs pass raw character arrays, whereas MSV-based validators operate on Strings. This is the main reason for 2 distinct sets of methods.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected static final intDefault initial table size; set so that usually it need not be expanded.protected static final intLet's use 80% fill factor...protected final intSeed mixed into the per-character hash, to defend against collision attacks crafted from attribute values.protected ElementIdprotected static final intprotected intMask used to get index from hash values; equal tomBuckets.length - 1, when mBuckets.length is a power of two.protected intCurrent size (number of entries); needed to know if and when rehash.protected intLimit that indicates maximum size this instance can hold before it needs to be expanded and rehashed.protected ElementId[]Actual hash table areaprotected ElementId -
Constructor Summary
ConstructorsConstructorDescriptionElementIdMap(int initialSize) This constructor is mainly used for testing, as it can be sized appropriately to test rehashing etc. -
Method Summary
Modifier and TypeMethodDescriptionaddDefined(char[] buffer, int start, int len, int hash, Location loc, PrefixedName elemName, PrefixedName attrName) Method called when an id definition is encountered.addDefined(String idStr, Location loc, PrefixedName elemName, PrefixedName attrName) addReferenced(char[] buffer, int start, int len, int hash, Location loc, PrefixedName elemName, PrefixedName attrName) Method called when a reference to id is encountered.addReferenced(String idStr, Location loc, PrefixedName elemName, PrefixedName attrName) static intcalcHash(char[] buffer, int start, int len) Deprecated.since 7.2; retained for binary compatibility.static intcalcHash(char[] buffer, int start, int len, int seed) Implementation of a hashing method for variable length Strings.static intDeprecated.since 7.2; retained for binary compatibility.static intintReturns the random seed that callers must fold into per-character hash computation for keys looked up in this table.private voidrehash()Method called when size (number of entries) of symbol table grows so big that load factor is exceeded.
-
Field Details
-
DEFAULT_SIZE
protected static final int DEFAULT_SIZEDefault initial table size; set so that usually it need not be expanded.- See Also:
-
MIN_SIZE
protected static final int MIN_SIZE- See Also:
-
FILL_PCT
protected static final int FILL_PCTLet's use 80% fill factor...- See Also:
-
mTable
Actual hash table area -
mSize
protected int mSizeCurrent size (number of entries); needed to know if and when rehash. -
mSizeThreshold
protected int mSizeThresholdLimit that indicates maximum size this instance can hold before it needs to be expanded and rehashed. Calculated using fill factor passed in to constructor. -
mIndexMask
protected int mIndexMaskMask used to get index from hash values; equal tomBuckets.length - 1, when mBuckets.length is a power of two. -
mHead
-
mTail
-
mHashSeed
protected final int mHashSeedSeed mixed into the per-character hash, to defend against collision attacks crafted from attribute values. See issue #12.
-
-
Constructor Details
-
ElementIdMap
public ElementIdMap() -
ElementIdMap
public ElementIdMap(int initialSize) This constructor is mainly used for testing, as it can be sized appropriately to test rehashing etc.
-
-
Method Details
-
getHashSeed
public int getHashSeed()Returns the random seed that callers must fold into per-character hash computation for keys looked up in this table. -
getFirstUndefined
-
addReferenced
public ElementId addReferenced(char[] buffer, int start, int len, int hash, Location loc, PrefixedName elemName, PrefixedName attrName) Method called when a reference to id is encountered. If so, need to check if specified id entry (ref or definiton) exists; and if not, to add a reference marker. -
addReferenced
public ElementId addReferenced(String idStr, Location loc, PrefixedName elemName, PrefixedName attrName) -
addDefined
public ElementId addDefined(char[] buffer, int start, int len, int hash, Location loc, PrefixedName elemName, PrefixedName attrName) Method called when an id definition is encountered. If so, need to check if specified id entry (ref or definiton) exists. If not, need to add the definition marker. If it does exist, need to 'upgrade it', if it was a reference marker; otherwise need to just return the old entry, and expect caller to check for dups and report the error. -
addDefined
public ElementId addDefined(String idStr, Location loc, PrefixedName elemName, PrefixedName attrName) -
calcHash
public static int calcHash(char[] buffer, int start, int len, int seed) Implementation of a hashing method for variable length Strings. Most of the time intention is that this calculation is done by caller during parsing, not here; however, sometimes it needs to be done for parsed "String" too.Seed and finalizer match
SymbolTable.calcHash(char[], int, int, int), so attacker- chosen names cannot land in the same bucket without knowing the table's per-instance seed.- Parameters:
len- Length of String; has to be at least 1 (caller guarantees this pre-condition)seed- Per-table seed obtained fromgetHashSeed()
-
calcHash
-
calcHash
Deprecated.since 7.2; retained for binary compatibility. UsecalcHash(char[], int, int, int)withgetHashSeed(). -
calcHash
Deprecated.since 7.2; retained for binary compatibility. UsecalcHash(String, int)withgetHashSeed(). -
rehash
private void rehash()Method called when size (number of entries) of symbol table grows so big that load factor is exceeded. Since size has to remain power of two, arrays will then always be doubled. Main work is really redistributing old entries into new String/Bucket entries.
-