Class AttributeCollector
- java.lang.Object
-
- com.ctc.wstx.sr.AttributeCollector
-
public final class AttributeCollector extends java.lang.Object
Shared base class that defines API stream reader uses to communicate with the attribute collector implementation, independent of whether it's operating in namespace-aware or non-namespace modes. Collector class is used to build up attribute lists; for the most part will just hold references to few specializedTextBuilder
s that are used to create efficient semi-shared value Strings.
-
-
Field Summary
Fields Modifier and Type Field Description protected static int
EXP_ATTR_COUNT
Expected typical maximum number of attributes for any element; chosen to minimize need to resize, while trying not to waste space.protected static int
EXP_NS_COUNT
(package private) static int
INT_SPACE
protected static int
LONG_ATTR_LIST_LEN
Threshold value that indicates minimum length for lists instances that need a Map structure, for fast attribute access by fully-qualified name.protected int
mAttrCount
Actual number of attributes collected, including attributes added via default values.protected int
mAttrHashSize
Size of hash area inmAttrMap
; generally at least 20% more than number of attributes (mAttrCount
).protected Attribute[]
mAttributes
Array of attributes collected for this element.protected int[]
mAttrMap
Encoding of a data structure that contains mapping from attribute names to attribute index in main attribute name arrays.protected int
mAttrSpillEnd
Pointer to int slot right after last spill entr, inmAttrMap
array.protected boolean
mDefaultNsDeclared
Flag to indicate whether the default namespace has already been declared for the current element.protected int
mMaxAttributeSize
protected int
mMaxAttributesPerElement
private TextBuilder
mNamespaceBuilder
TextBuilder into which values of namespace URIs are added (including URI for the default namespace, if one defined).protected Attribute[]
mNamespaces
Array of namespace declaration attributes collected for this element; not used in non-namespace-aware modeprotected int
mNonDefCount
Number of attribute values actually parsed, not including ones created via default value expansion.protected int
mNsCount
Number of valid namespace declarations inmNamespaces
.protected TextBuilder
mValueBuilder
TextBuilder into which values of all attributes are appended to, including default valued ones (defaults are added after explicit ones).protected int
mXmlIdAttrIndex
Index of "xml:id" attribute, if one exists for the current element;XMLID_IX_NONE
if none.protected java.lang.String
mXmlIdLocalName
protected java.lang.String
mXmlIdPrefix
protected static InternCache
sInternCache
protected static int
XMLID_IX_DISABLED
This value is used to indicate that we shouldn't keep track of index of xml:id attribute -- generally done when Xml:id support is disabledprotected static int
XMLID_IX_NONE
-
Constructor Summary
Constructors Modifier Constructor Description protected
AttributeCollector(ReaderConfig cfg, boolean nsAware)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description int
addDefaultAttribute(java.lang.String localName, java.lang.String uri, java.lang.String prefix, java.lang.String value)
Method called by validator to insert an attribute that has a default value and wasn't yet included in collector's attribute set.protected void
allocBuffers()
Method called to initialize buffers that need not be immediately initializedElemAttrs
buildAttrOb()
Method needed by event creating code, to build a non-transient attribute container, to use with XMLEvent objects (specifically implementation of StartElement event).private static boolean
checkExpand(org.codehaus.stax2.typed.TypedArrayDecoder tad)
Internal method used to see if we can expand the buffer that the array decoder has.byte[]
decodeBinary(int index, org.codehaus.stax2.typed.Base64Variant v, org.codehaus.stax2.ri.typed.CharArrayBase64Decoder dec, InputProblemReporter rep)
void
decodeValue(int index, org.codehaus.stax2.typed.TypedValueDecoder tvd)
Method called to decode the whole attribute value as a single typed value.int
decodeValues(int index, org.codehaus.stax2.typed.TypedArrayDecoder tad, InputProblemReporter rep)
Method called to decode the attribute value that consists of zero or more space-separated tokens.private static int
decodeValues(org.codehaus.stax2.typed.TypedArrayDecoder tad, InputProblemReporter rep, char[] buf, int ptr, int end)
int
findIndex(java.lang.String localName)
int
findIndex(java.lang.String nsURI, java.lang.String localName)
TextBuilder
getAttrBuilder(java.lang.String attrPrefix, java.lang.String attrLocalName)
Low-level accessor method that attribute validation code may call for certain types of attributes; generally only for id and idref/idrefs attributes.int
getCount()
TextBuilder
getDefaultNsBuilder()
java.lang.String
getLocalName(int index)
int
getMaxAttributesPerElement()
TextBuilder
getNsBuilder(java.lang.String prefix)
protected int
getNsCount()
java.lang.String
getNsPrefix(int index)
java.lang.String
getNsURI(int index)
java.lang.String
getPrefix(int index)
javax.xml.namespace.QName
getQName(int index)
protected char[]
getSharedValueBuffer()
int
getSpecifiedCount()
java.lang.String
getURI(int index)
java.lang.String
getValue(int index)
Note: the main reason this method is defined at this level, and made final, is performance.java.lang.String
getValue(java.lang.String nsURI, java.lang.String localName)
java.lang.String
getValueByLocalName(java.lang.String localName)
Specialized version in which namespace information is completely ignored.protected int
getValueStartOffset(int index)
Method for getting start pointer within shared value buffer for given attribute.int
getXmlIdAttrIndex()
boolean
hasDefaultNs()
private void
initHashArea()
Method called to ensure hash area will be properly set up in cases where initially no room was needed, but default attribute(s) is being added.boolean
isSpecified(int index)
void
normalizeSpacesInValue(int index)
Method that can be called to force space normalization (remove leading/trailing spaces, replace non-spaces white space with spaces, collapse spaces to one) on specified attribute.void
reset()
Method called to allow reusing of collector, usually right before starting collecting attributes for a new start tag.protected Attribute
resolveNamespaceDecl(int index, boolean internURI)
Method called to resolve and initialize specified collected namespace declarationint
resolveNamespaces(InputProblemReporter rep, StringVector ns)
Method called to resolve namespace URIs from attribute prefixes.void
setMaxAttributesPerElement(int maxAttributesPerElement)
void
setNormalizedValue(int index, java.lang.String value)
Low-level mutator method that attribute validation code may call for certain types of attributes, when it wants to handle the whole validation and normalization process by itself.private int[]
spillAttr(java.lang.String uri, java.lang.String name, int[] map, int currIndex, int spillIndex, int hash, int hashCount)
protected void
throwDupAttr(InputProblemReporter rep, int index)
Method that can be used to get the specified attribute value, by getting it written using Writer passed in.protected void
throwIndex(int index)
protected void
validateAttribute(int index, org.codehaus.stax2.validation.XMLValidator vld)
void
writeAttribute(int index, XmlWriter xw)
Deprecated.Since 5.0.3void
writeAttribute(int index, XmlWriter xw, org.codehaus.stax2.validation.XMLValidator validator)
Method that basically serializes the specified (read-in) attribute using Writers provided.
-
-
-
Field Detail
-
INT_SPACE
static final int INT_SPACE
- See Also:
- Constant Field Values
-
LONG_ATTR_LIST_LEN
protected static final int LONG_ATTR_LIST_LEN
Threshold value that indicates minimum length for lists instances that need a Map structure, for fast attribute access by fully-qualified name.- See Also:
- Constant Field Values
-
EXP_ATTR_COUNT
protected static final int EXP_ATTR_COUNT
Expected typical maximum number of attributes for any element; chosen to minimize need to resize, while trying not to waste space. Dynamically grown; better not to set too high to avoid excessive overhead for small attribute-less documents.- See Also:
- Constant Field Values
-
EXP_NS_COUNT
protected static final int EXP_NS_COUNT
- See Also:
- Constant Field Values
-
XMLID_IX_DISABLED
protected static final int XMLID_IX_DISABLED
This value is used to indicate that we shouldn't keep track of index of xml:id attribute -- generally done when Xml:id support is disabled- See Also:
- Constant Field Values
-
XMLID_IX_NONE
protected static final int XMLID_IX_NONE
- See Also:
- Constant Field Values
-
sInternCache
protected static final InternCache sInternCache
-
mXmlIdPrefix
protected final java.lang.String mXmlIdPrefix
-
mXmlIdLocalName
protected final java.lang.String mXmlIdLocalName
-
mAttributes
protected Attribute[] mAttributes
Array of attributes collected for this element.
-
mAttrCount
protected int mAttrCount
Actual number of attributes collected, including attributes added via default values.
-
mNonDefCount
protected int mNonDefCount
Number of attribute values actually parsed, not including ones created via default value expansion. Equal to or less thanmAttrCount
.
-
mNamespaces
protected Attribute[] mNamespaces
Array of namespace declaration attributes collected for this element; not used in non-namespace-aware mode
-
mNsCount
protected int mNsCount
Number of valid namespace declarations inmNamespaces
.
-
mDefaultNsDeclared
protected boolean mDefaultNsDeclared
Flag to indicate whether the default namespace has already been declared for the current element.
-
mXmlIdAttrIndex
protected int mXmlIdAttrIndex
Index of "xml:id" attribute, if one exists for the current element;XMLID_IX_NONE
if none.
-
mValueBuilder
protected TextBuilder mValueBuilder
TextBuilder into which values of all attributes are appended to, including default valued ones (defaults are added after explicit ones). Constructed lazily, if and when needed (not needed for short attribute-less docs)
-
mNamespaceBuilder
private final TextBuilder mNamespaceBuilder
TextBuilder into which values of namespace URIs are added (including URI for the default namespace, if one defined).
-
mAttrMap
protected int[] mAttrMap
Encoding of a data structure that contains mapping from attribute names to attribute index in main attribute name arrays.Data structure contains two separate areas; main hash area (with size
mAttrHashSize
), and remaining spillover area that follows hash area up until (but not including)mAttrSpillEnd
index. Main hash area only contains indexes (index+1; 0 signifying empty slot) to actual attributes; spillover area has both hash and index for any spilled entry. Spilled entries are simply stored in order added, and need to be searched using linear search. In case of both primary hash hits and spills, eventual comparison with the local name needs to be done with actual name array.
-
mAttrHashSize
protected int mAttrHashSize
Size of hash area inmAttrMap
; generally at least 20% more than number of attributes (mAttrCount
).
-
mAttrSpillEnd
protected int mAttrSpillEnd
Pointer to int slot right after last spill entr, inmAttrMap
array.
-
mMaxAttributesPerElement
protected int mMaxAttributesPerElement
-
mMaxAttributeSize
protected int mMaxAttributeSize
-
-
Constructor Detail
-
AttributeCollector
protected AttributeCollector(ReaderConfig cfg, boolean nsAware)
-
-
Method Detail
-
reset
public void reset()
Method called to allow reusing of collector, usually right before starting collecting attributes for a new start tag.Note: public only so that it can be called by unit tests.
-
normalizeSpacesInValue
public void normalizeSpacesInValue(int index)
Method that can be called to force space normalization (remove leading/trailing spaces, replace non-spaces white space with spaces, collapse spaces to one) on specified attribute. Currently called byInputElementStack
to force normalization of Xml:id attribute
-
getNsCount
protected int getNsCount()
- Returns:
- Number of namespace declarations collected, including possible default namespace declaration
-
hasDefaultNs
public boolean hasDefaultNs()
-
getCount
public final int getCount()
-
getSpecifiedCount
public int getSpecifiedCount()
- Returns:
- Number of attributes that were explicitly specified; may be less than the total count due to attributes created using attribute default values
-
getNsPrefix
public java.lang.String getNsPrefix(int index)
-
getNsURI
public java.lang.String getNsURI(int index)
-
getPrefix
public java.lang.String getPrefix(int index)
-
getLocalName
public java.lang.String getLocalName(int index)
-
getURI
public java.lang.String getURI(int index)
-
getQName
public javax.xml.namespace.QName getQName(int index)
-
getValue
public final java.lang.String getValue(int index)
Note: the main reason this method is defined at this level, and made final, is performance. JIT may be able to fully inline this method, even when reference is via this base class. This is important since this is likely to be the most often called method of the collector instances.
-
getValue
public java.lang.String getValue(java.lang.String nsURI, java.lang.String localName)
-
getValueByLocalName
public java.lang.String getValueByLocalName(java.lang.String localName)
Specialized version in which namespace information is completely ignored.- Since:
- 5.2
-
getMaxAttributesPerElement
public int getMaxAttributesPerElement()
-
setMaxAttributesPerElement
public void setMaxAttributesPerElement(int maxAttributesPerElement)
-
findIndex
public int findIndex(java.lang.String localName)
-
findIndex
public int findIndex(java.lang.String nsURI, java.lang.String localName)
-
isSpecified
public final boolean isSpecified(int index)
-
getXmlIdAttrIndex
public final int getXmlIdAttrIndex()
-
decodeValue
public final void decodeValue(int index, org.codehaus.stax2.typed.TypedValueDecoder tvd) throws java.lang.IllegalArgumentException
Method called to decode the whole attribute value as a single typed value. Decoding is done using the decoder provided.- Throws:
java.lang.IllegalArgumentException
-
decodeValues
public final int decodeValues(int index, org.codehaus.stax2.typed.TypedArrayDecoder tad, InputProblemReporter rep) throws javax.xml.stream.XMLStreamException
Method called to decode the attribute value that consists of zero or more space-separated tokens. Decoding is done using the decoder provided.- Returns:
- Number of tokens decoded
- Throws:
javax.xml.stream.XMLStreamException
-
decodeBinary
public final byte[] decodeBinary(int index, org.codehaus.stax2.typed.Base64Variant v, org.codehaus.stax2.ri.typed.CharArrayBase64Decoder dec, InputProblemReporter rep) throws javax.xml.stream.XMLStreamException
- Throws:
javax.xml.stream.XMLStreamException
-
decodeValues
private static final int decodeValues(org.codehaus.stax2.typed.TypedArrayDecoder tad, InputProblemReporter rep, char[] buf, int ptr, int end) throws javax.xml.stream.XMLStreamException
- Throws:
javax.xml.stream.XMLStreamException
-
checkExpand
private static final boolean checkExpand(org.codehaus.stax2.typed.TypedArrayDecoder tad)
Internal method used to see if we can expand the buffer that the array decoder has. Bit messy, but simpler than having separately typed instances; and called rarely so that performance downside of instanceof is irrelevant.
-
getValueStartOffset
protected int getValueStartOffset(int index)
Method for getting start pointer within shared value buffer for given attribute. It is also the same as end pointer for preceding attribute, if any.
-
getSharedValueBuffer
protected char[] getSharedValueBuffer()
-
resolveNamespaceDecl
protected Attribute resolveNamespaceDecl(int index, boolean internURI)
Method called to resolve and initialize specified collected namespace declaration- Returns:
- Attribute that contains specified namespace declaration
-
buildAttrOb
public ElemAttrs buildAttrOb()
Method needed by event creating code, to build a non-transient attribute container, to use with XMLEvent objects (specifically implementation of StartElement event).
-
validateAttribute
protected void validateAttribute(int index, org.codehaus.stax2.validation.XMLValidator vld) throws javax.xml.stream.XMLStreamException
- Throws:
javax.xml.stream.XMLStreamException
-
getAttrBuilder
public final TextBuilder getAttrBuilder(java.lang.String attrPrefix, java.lang.String attrLocalName) throws javax.xml.stream.XMLStreamException
Low-level accessor method that attribute validation code may call for certain types of attributes; generally only for id and idref/idrefs attributes. It returns the underlying 'raw' attribute value buffer for direct access.- Throws:
javax.xml.stream.XMLStreamException
-
addDefaultAttribute
public int addDefaultAttribute(java.lang.String localName, java.lang.String uri, java.lang.String prefix, java.lang.String value) throws javax.xml.stream.XMLStreamException
Method called by validator to insert an attribute that has a default value and wasn't yet included in collector's attribute set.- Returns:
- Index of the newly added attribute, if added; -1 to indicate this was a duplicate
- Throws:
javax.xml.stream.XMLStreamException
-
setNormalizedValue
public final void setNormalizedValue(int index, java.lang.String value)
Low-level mutator method that attribute validation code may call for certain types of attributes, when it wants to handle the whole validation and normalization process by itself. It is generally only called for id and idref/idrefs attributes, as those values are usually normalized.
-
getDefaultNsBuilder
public TextBuilder getDefaultNsBuilder() throws javax.xml.stream.XMLStreamException
- Returns:
- null if the default namespace URI has been already declared for the current element; TextBuilder to add URI to if not.
- Throws:
javax.xml.stream.XMLStreamException
-
getNsBuilder
public TextBuilder getNsBuilder(java.lang.String prefix) throws javax.xml.stream.XMLStreamException
- Returns:
- null if prefix has been already declared; TextBuilder to add value to if not.
- Throws:
javax.xml.stream.XMLStreamException
-
resolveNamespaces
public int resolveNamespaces(InputProblemReporter rep, StringVector ns) throws javax.xml.stream.XMLStreamException
Method called to resolve namespace URIs from attribute prefixes.Note: public only so that it can be called by unit tests.
- Parameters:
rep
- Reporter to use for reporting well-formedness problemsns
- Namespace prefix/URI mappings active for this element- Returns:
- Index of xml:id attribute, if any, -1 if not
- Throws:
javax.xml.stream.XMLStreamException
-
throwIndex
protected void throwIndex(int index)
-
writeAttribute
@Deprecated public void writeAttribute(int index, XmlWriter xw) throws java.io.IOException, javax.xml.stream.XMLStreamException
Deprecated.Since 5.0.3- Throws:
java.io.IOException
javax.xml.stream.XMLStreamException
-
writeAttribute
public void writeAttribute(int index, XmlWriter xw, org.codehaus.stax2.validation.XMLValidator validator) throws java.io.IOException, javax.xml.stream.XMLStreamException
Method that basically serializes the specified (read-in) attribute using Writers provided. Serialization is done by writing out (fully-qualified) name of the attribute, followed by the equals sign and quoted value.- Throws:
java.io.IOException
javax.xml.stream.XMLStreamException
-
allocBuffers
protected final void allocBuffers()
Method called to initialize buffers that need not be immediately initialized
-
spillAttr
private int[] spillAttr(java.lang.String uri, java.lang.String name, int[] map, int currIndex, int spillIndex, int hash, int hashCount)
- Returns:
- Null, if attribute is a duplicate (to indicate error); map itself, or resized version, otherwise.
-
initHashArea
private void initHashArea()
Method called to ensure hash area will be properly set up in cases where initially no room was needed, but default attribute(s) is being added.
-
throwDupAttr
protected void throwDupAttr(InputProblemReporter rep, int index) throws javax.xml.stream.XMLStreamException
Method that can be used to get the specified attribute value, by getting it written using Writer passed in. Can potentially save one String allocation, since no (temporary) Strings need to be created.- Throws:
javax.xml.stream.XMLStreamException
-
-