org.exolab.adaptx.xml
Class IDIndexer
java.lang.Object
org.exolab.adaptx.xml.IDIndexer
public class IDIndexer
extends java.lang.Object
A utility class which helps overcome some DOM 1.0 deficiencies.
$Revision: 3633 $ $Date: 2003-03-01 02:38:44 -0500 (Sat, 01 Mar 2003) $
IDIndexer
public IDIndexer()
Creates a new DOMHelper
addIdAttribute
public void addIdAttribute(String attrName,
String appliesTo)
Adds the given attribute name as an ID attribute.
attrName
- the name of the attribute to treat as an Id.appliesTo
- the element that this ID attribute appliesTo,
"*" may be used to indicate all Elements.
addIdReference
public void addIdReference(String id,
XPathNode node)
Associates the given Id with the given Element
id
- the Id to associate with the given Element
getElementById
public XPathNode getElementById(XPathNode root,
String id)
Determines the document order of a given node.
Document Order is defined by
the document order of the parent of the given node and
the childNumber of the given Node.
The document order for a Document node is 0.
root
- the "root" XPathNode to search withinid
- the Id of the element to return
- the element XPathNode that is associated with the given Id,
or null if no XPathNode was found
org.exolab.adaptx.xpath.ExprContext
public int[] getDocumentOrder(Node node) {
int[] order = null;
if (node == null) {
order = new int[1];
order[0] = -1;
return order;
}
//-- check cache
//-- * due to bugs in XML4J 1.1.x (2.x works fine)
//-- * we need to use the System.identityHash to
//-- * create a unique key. The problem is Attr nodes
//-- * with the same name, generate the same hash code.
Object key = createKey(node);
order = (int[]) documentOrders.get(key);
if (order != null) return order;
Node parent = null;
//-- calculate document order
if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
// Use parent's document order for attributes
parent = getParentNode((Attr)node);
if (parent == null) {
// int[3] {0 = document, 0 = att-list, att-number}
order = new int[3];
order[0] = 0;
order[1] = 0;
order[2] = childNumber(node);
}
else {
int[] porder = getDocumentOrder(parent);
order = new int[porder.length+2];
for (int i = 0; i < porder.length; i++)
order[i] = porder[i];
order[order.length-2] = 0; //-- signal att-list
order[order.length-1] = childNumber(node);
}
}
else if (node.getNodeType() == Node.DOCUMENT_NODE) {
order = new int[1];
order[0] = 0;
}
else {
//-- get parent's document order
parent = getParentNode(node);
int[] porder = getDocumentOrder(getParentNode(node));
order = new int[porder.length+1];
for (int i = 0; i < porder.length; i++)
order[i] = porder[i];
order[order.length-1] = childNumber(node);
}
//-- add to cache
documentOrders.put(key,order);
return order;
} //-- getDocumentOrder
/**
Returns the element XPathNode that is associated with the given Id.