Categories:
Audio (13)
Biotech (29)
Bytecode (36)
Database (77)
Framework (7)
Game (7)
General (507)
Graphics (53)
I/O (35)
IDE (2)
JAR Tools (102)
JavaBeans (21)
JDBC (121)
JDK (426)
JSP (20)
Logging (108)
Mail (58)
Messaging (8)
Network (84)
PDF (97)
Report (7)
Scripting (84)
Security (32)
Server (121)
Servlet (26)
SOAP (24)
Testing (54)
Web (15)
XML (322)
Collections:
Other Resources:
Woodstox 6.4.0 - Source Code Files
Woodstox 6.4.0 Source Code Files are provided at the Woodstox GitHub Website.
You can download them from the "src/main/java" folder.
You can also browse Woodstox Source Code files below:
✍: FYIcenter
⏎ com/ctc/wstx/sr/ElemAttrs.java
package com.ctc.wstx.sr;
import javax.xml.namespace.QName;
/**
* Container class that is constructed with enough raw attribute information,
* to be able to lazily construct full attribute objects, to be accessed
* via Iterator, or fully-qualified name.
*<p>
* Implementation note: code for using Map-like structure is unfortunately
* cut'n pasted from {@link AttributeCollector}. Problem
* with refactoring is that it's 90% the same code, but not 100%.
*<p>
* Although instances of this class are constructed by stream readers,
* it is actually used by element event objects.
*/
public final class ElemAttrs
{
//private final static int OFFSET_LOCAL_NAME = 0;
private final static int OFFSET_NS_URI = 1;
//private final static int OFFSET_NS_PREFIX = 2;
//private final static int OFFSET_VALUE = 3;
/**
* Array that contains 4 Strings for each attribute;
* localName, URI, prefix, value. Can be used to lazily construct
* structure(s) needed to return Iterator for accessing all
* attributes.
*/
private final String[] mRawAttrs;
/**
* Raw offset (in <code>mRawAttrs</code>) of the first attribute
* instance that was created through default value expansion.
*/
private final int mDefaultOffset;
/*
//////////////////////////////////////////////////////////////
// Information that defines "Map-like" data structure used for
// quick access to attribute values by fully-qualified name
// (only used for "long" lists)
//////////////////////////////////////////////////////////////
*/
// // // For full explanation, see source for AttributeCollector
private final int[] mAttrMap;
private final int mAttrHashSize;
private final int mAttrSpillEnd;
/**
* Method called to create "short" attribute list; list that has
* only few entries, and can thus be searched for attributes using
* linear search, without using any kind of Map structure.
*<p>
* Currently the limit is 4 attributes; 1, 2 or 3 attribute lists are
* considered short, 4 or more 'long'.
*
* @param rawAttrs Array that contains 4 Strings for each attribute;
* localName, URI, prefix, value. Can be used to lazily construct
* structure(s) needed to return Iterator for accessing all
* attributes.
* @param defOffset Index of the first default attribute, if any;
* number of all attributes if none
*/
public ElemAttrs(String[] rawAttrs, int defOffset)
{
mRawAttrs = rawAttrs;
mAttrMap = null;
mAttrHashSize = 0;
mAttrSpillEnd = 0;
mDefaultOffset = (defOffset << 2);
}
/**
* Method called to create "long" attribute list; list that has
* a few entries, and efficient access by fully-qualified name should
* not be done by linear search.
*
* @param rawAttrs Array that contains 4 Strings for each attribute;
* localName, URI, prefix, value. Can be used to lazily construct
* structure(s) needed to return Iterator for accessing all
* attributes.
*/
public ElemAttrs(String[] rawAttrs, int defOffset,
int[] attrMap, int hashSize, int spillEnd)
{
mRawAttrs = rawAttrs;
mDefaultOffset = (defOffset << 2);
mAttrMap = attrMap;
mAttrHashSize = hashSize;
mAttrSpillEnd = spillEnd;
}
/*
////////////////////////////////////////////////////
// Public API
////////////////////////////////////////////////////
*/
public String[] getRawAttrs() {
return mRawAttrs;
}
public int findIndex(QName name)
{
// Do we have a Map to do lookup against?
if (mAttrMap != null) { // yup
return findMapIndex(name.getNamespaceURI(), name.getLocalPart());
}
// Nope, linear search:
String ln = name.getLocalPart();
String uri = name.getNamespaceURI();
boolean defaultNs = (uri == null || uri.length() == 0);
String[] raw = mRawAttrs;
for (int i = 0, len = raw.length; i < len; i += 4) {
if (!ln.equals(raw[i])) {
continue;
}
String thisUri = raw[i+OFFSET_NS_URI]; // lgtm [java/index-out-of-bounds]
if (defaultNs) {
if (thisUri == null || thisUri.length() == 0) {
return i;
}
} else { // non-default NS
if (thisUri != null &&
(thisUri == uri || thisUri.equals(uri))) {
return i;
}
}
}
return -1;
}
public int getFirstDefaultOffset() {
return mDefaultOffset;
}
public boolean isDefault(int ix) {
return (ix >= mDefaultOffset);
}
/*
////////////////////////////////////////////////////
// Internal methods
////////////////////////////////////////////////////
*/
/**
*<p>
* Note: this method is very similar to
* {@link com.ctc.wstx.sr.AttributeCollector#getAttrValue}; basically
* most of it was cut'n pasted. Would be nice to refactor, but it's
* bit hard to do that since data structures are not 100% identical
* (mostly attribute storage, not Map structure itself).
*/
private final int findMapIndex(String nsURI, String localName)
{
// Primary hit?
int hash = localName.hashCode();
if (nsURI == null) {
nsURI = ""; // just to simplify comparisons -- array contains nulls
} else if (nsURI.length() > 0) {
hash ^= nsURI.hashCode();
}
int ix = mAttrMap[hash & (mAttrHashSize - 1)];
if (ix == 0) { // nothing in here; no spills either
return -1;
}
// Index is "one off" (since 0 indicates 'null), 4 Strings per attr
ix = (ix - 1) << 2;
// Is primary candidate match?
String[] raw = mRawAttrs;
String thisName = raw[ix];
/* Equality first, since although equals() checks that too, it's
* very likely to match (if interning Strings), and we can save
* a method call.
*/
if (thisName == localName || thisName.equals(localName)) {
String thisURI = raw[ix+OFFSET_NS_URI];
if (thisURI == nsURI) {
return ix;
}
if (thisURI == null) {
if (nsURI.length() == 0) {
return ix;
}
} else if (thisURI.equals(nsURI)) {
return ix;
}
}
/* Nope, need to traverse spill list, which has 2 entries for
* each spilled attribute id; first for hash value, second index.
*/
for (int i = mAttrHashSize, len = mAttrSpillEnd; i < len; i += 2) {
if (mAttrMap[i] != hash) {
continue;
}
/* Note: spill indexes are not off-by-one, since there's no need
* to mask 0
*/
ix = mAttrMap[i+1] << 2; // ... but there are 4 Strings for each attr
thisName = raw[ix];
if (thisName == localName || thisName.equals(localName)) {
String thisURI = raw[ix+1];
if (thisURI == nsURI) {
return ix;
}
if (thisURI == null) {
if (nsURI.length() == 0) {
return ix;
}
} else if (thisURI.equals(nsURI)) {
return ix;
}
}
}
return -1;
}
}
⏎ com/ctc/wstx/sr/ElemAttrs.java
Or download all of them as a single archive file:
File name: woodstox-core-6.4.0-fyi.zip File size: 552992 bytes Release date: 2022-10-25 Download
⇒ woodstox-core-6.4.0.jar - Woodstox Core 6.4.0
⇐ What Is Woodstox XML Processing
2023-01-29, ≈61🔥, 0💬
Popular Posts:
JDK 11 jdk.internal.JVM Stat.jmod is the JMOD file for JDK 11 Internal Jvmstat module. JDK 11 Intern...
What is jxl.jar 2.6.12? jxl.jar 2.6.12 is the JAR file for Java Excel API 2.6.12, which is a Java li...
JDK 11 jdk.crypto.mscapi.jmod is the JMOD file for JDK 11 Crypto MSCAPI module. JDK 11 Crypto MSCAPI...
JDK 17 jdk.compiler.jmod is the JMOD file for JDK 17 Compiler tool, which can be invoked by the "jav...
Java Architecture for XML Binding (JAXB) is a Java API that allows Java developers to map Java class...