1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
package com.jclark.xsl.dom;
import com.jclark.xsl.om.*;
import java.net.URL;
abstract class NodeBase implements Node {
final org.w3c.dom.Node domNode;
int level;
private int childIndex;
ContainerNode parent;
RootNode root;
NodeBase(org.w3c.dom.Node domNode) {
this.domNode = domNode;
childIndex = 0;
level = 0;
}
NodeBase(org.w3c.dom.Node domNode, ContainerNode parent, int childIndex) {
this.domNode = domNode;
this.parent = parent;
this.root = parent.root;
this.childIndex = childIndex;
this.level = parent.level + 1;
}
public Node getParent() {
return parent;
}
public String getGeneratedId() {
return parent.getGeneratedId() + "." + Integer.toString(childIndex);
}
public int compareTo(Node node) {
NodeBase other = (NodeBase)node;
if (root == other.root)
return compare(this, other);
return root.compareRootTo(other.root);
}
private static final int compare(NodeBase node1, NodeBase node2) {
int level1 = node1.level;
int level2 = node2.level;
int levelDiff = level1 - level2;
while (level1 > level2) {
node1 = node1.parent;
level1--;
}
while (level2 > level1) {
node2 = node2.parent;
level2--;
}
int ret = compareSameLevel(node1, node2);
if (ret != 0)
return ret;
return levelDiff;
}
private static final int compareSameLevel(NodeBase node1, NodeBase node2) {
if (node1.level == 0)
return 0;
if (node1.domNode.equals(node2.domNode))
return 0;
int ret = compareSameLevel(node1.parent, node2.parent);
if (ret != 0)
return ret;
return node1.childIndex - node2.childIndex;
}
public String getData() {
return null;
}
public Name getName() {
return null;
}
public String getAttributeValue(Name name) {
return null;
}
public Node getAttribute(Name name) {
return null;
}
public Node getElementWithId(String id) {
return root.getElementWithId(id);
}
public boolean isId(String id) {
return root.isId(domNode, id);
}
public NamespacePrefixMap getNamespacePrefixMap() {
return parent.getNamespacePrefixMap();
}
public String getUnparsedEntityURI(String name) {
return root.getUnparsedEntityURI(name);
}
public SafeNodeIterator getChildren() {
return NullNodeIterator.getInstance();
}
public SafeNodeIterator getAttributes() {
return NullNodeIterator.getInstance();
}
public URL getURL() {
return root.getURL();
}
public int getLineNumber() {
return -1;
}
public SafeNodeIterator getFollowingSiblings() {
SafeNodeIterator iter = new SiblingNodeIterator(parent, childIndex, domNode);
iter.next();
return iter;
}
public boolean equals(Object obj) {
if (obj == null)
return false;
if (!(obj instanceof NodeBase))
return false;
return ((NodeBase)obj).domNode.equals(domNode);
}
public Node getRoot() {
return root;
}
}
|