Package org.exolab.adaptx.xml
Class IDIndexer
java.lang.Object
org.exolab.adaptx.xml.IDIndexer
A utility class which helps overcome some DOM 1.0 deficiencies.
- Version:
- $Revision: 3633 $ $Date: 2003-03-01 08:38:44 +0100 (Sat, 01 Mar 2003) $
- Author:
- Keith Visco
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
addIdAttribute
(String attrName, String appliesTo) Adds the given attribute name as an ID attribute.void
addIdReference
(String id, XPathNode node) Associates the given Id with the given ElementgetElementById
(XPathNode root, String id) Determines the document order of a given node.
-
Constructor Details
-
IDIndexer
public IDIndexer()Creates a new DOMHelper
-
-
Method Details
-
addIdAttribute
Adds the given attribute name as an ID attribute.- Parameters:
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
Associates the given Id with the given Element- Parameters:
id
- the Id to associate with the given Elementelement
- the element which the Id maps to
-
getElementById
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.- Parameters:
root
- the "root" XPathNode to search withinid
- the Id of the element to return- Returns:
- the element XPathNode that is associated with the given Id, or null if no XPathNode was found
- See Also:
-
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.
-