package client.net.sf.saxon.ce.dom;
import client.net.sf.saxon.ce.Configuration;
import client.net.sf.saxon.ce.event.Receiver;
import client.net.sf.saxon.ce.om.*;
import client.net.sf.saxon.ce.pattern.NodeTest;
import client.net.sf.saxon.ce.trans.XPathException;
import client.net.sf.saxon.ce.tree.iter.AxisIterator;
import client.net.sf.saxon.ce.tree.iter.EmptyIterator;
import client.net.sf.saxon.ce.tree.iter.PrependIterator;
import client.net.sf.saxon.ce.tree.iter.SingleNodeIterator;
import client.net.sf.saxon.ce.tree.util.FastStringBuffer;
import client.net.sf.saxon.ce.tree.util.Navigator;
import client.net.sf.saxon.ce.type.Type;
import client.net.sf.saxon.ce.value.AtomicValue;
import client.net.sf.saxon.ce.value.UntypedAtomicValue;
/**
* An attribute node in the DOM - may be XML or HTML
*/
public class HTMLAttributeNode implements NodeInfo {
private HTMLNodeWrapper element;
private String name;
private String value;
private int fingerprint;
private String uri;
private String prefix;
public HTMLAttributeNode(HTMLNodeWrapper element, String name, String prefix, String uri, String value) {
this.element = element;
this.name = name;
this.prefix = prefix;
this.uri = uri;
this.value = value;
this.fingerprint = element.getNamePool().allocate(prefix, uri, name);
}
public int getNodeKind() {
return Type.ATTRIBUTE;
}
public boolean isSameNodeInfo(NodeInfo other) {
return other instanceof HTMLAttributeNode &&
element.isSameNodeInfo(((HTMLAttributeNode)other).element) &&
name.equals(((HTMLAttributeNode)other).name);
}
public String getSystemId() {
return element.getSystemId();
}
public String getBaseURI() {
return element.getBaseURI();
}
public int getLineNumber() {
return element.getLineNumber();
}
public int compareOrder(NodeInfo other) {
if (other instanceof HTMLAttributeNode) {
if (element.isSameNodeInfo(((HTMLAttributeNode)other).element)) {
return Integer.signum(fingerprint -((HTMLAttributeNode)other).fingerprint);
} else {
return element.compareOrder(((HTMLAttributeNode)other).element);
}
}
if (other.isSameNodeInfo(element)) {
return +1;
}
return element.compareOrder(other);
}
public String getStringValue() {
return value;
}
public int getNameCode() {
return fingerprint;
}
public int getFingerprint() {
return fingerprint;
}
public String getLocalPart() {
return name;
}
public String getURI() {
return uri;
}
public String getDisplayName() {
return (prefix.length() == 0)? name : prefix + ':' + name;
}
public String getPrefix() {
return prefix;
}
public Configuration getConfiguration() {
return element.getConfiguration();
}
public NamePool getNamePool() {
return element.getNamePool();
}
public int getTypeAnnotation() {
return StandardNames.XS_UNTYPED_ATOMIC;
}
public NodeInfo getParent() {
return element;
}
public AxisIterator iterateAxis(byte axisNumber) {
switch (axisNumber) {
case Axis.ANCESTOR:
return element.iterateAxis(Axis.ANCESTOR_OR_SELF);
case Axis.ANCESTOR_OR_SELF:
return new PrependIterator(this, element.iterateAxis(Axis.ANCESTOR_OR_SELF));
case Axis.ATTRIBUTE:
return EmptyIterator.getInstance();
case Axis.CHILD:
return EmptyIterator.getInstance();
case Axis.DESCENDANT:
return EmptyIterator.getInstance();
case Axis.DESCENDANT_OR_SELF:
return SingleNodeIterator.makeIterator(this);
case Axis.FOLLOWING:
return new Navigator.FollowingEnumeration(this);
case Axis.FOLLOWING_SIBLING:
return EmptyIterator.getInstance();
case Axis.NAMESPACE:
return EmptyIterator.getInstance();
case Axis.PARENT:
return SingleNodeIterator.makeIterator(element);
case Axis.PRECEDING:
return new Navigator.PrecedingEnumeration(this, false);
case Axis.PRECEDING_SIBLING:
return EmptyIterator.getInstance();
case Axis.SELF:
return SingleNodeIterator.makeIterator(this);
case Axis.PRECEDING_OR_ANCESTOR:
return new Navigator.PrecedingEnumeration(this, true);
default:
throw new IllegalArgumentException("Unknown axis number " + axisNumber);
}
}
public AxisIterator iterateAxis(byte axisNumber, NodeTest nodeTest) {
return new Navigator.AxisFilter(iterateAxis(axisNumber), nodeTest);
}
public NodeInfo getRoot() {
return element.getRoot();
}
public DocumentInfo getDocumentRoot() {
return element.getDocumentRoot();
}
public boolean hasChildNodes() {
return false;
}
public void generateId(FastStringBuffer buffer) {
element.generateId(buffer);
buffer.append(""+name.hashCode());
}
public int getDocumentNumber() {
return element.getDocumentNumber();
}
public void copy(Receiver out, int copyOptions) throws XPathException {
out.attribute(fingerprint, value);
}
public NamespaceBinding[] getDeclaredNamespaces(NamespaceBinding[] buffer) {
return NamespaceBinding.EMPTY_ARRAY;
}
public CharSequence getStringValueCS() {
return value;
}
public AtomicValue getTypedValue() {
return new UntypedAtomicValue(value);
}
}
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public License, v. 2.0.