/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.ast.xpath.saxon;
import net.sourceforge.pmd.lang.ast.xpath.Attribute;
import net.sf.saxon.om.NodeInfo;
import net.sf.saxon.om.SequenceIterator;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.type.Type;
import net.sf.saxon.value.BooleanValue;
import net.sf.saxon.value.EmptySequence;
import net.sf.saxon.value.Int64Value;
import net.sf.saxon.value.StringValue;
import net.sf.saxon.value.Value;
/**
* A Saxon OM Attribute node for an AST Node Attribute.
*/
public class AttributeNode extends AbstractNodeInfo {
protected final Attribute attribute;
protected final int id;
protected Value value;
public AttributeNode(Attribute attribute, int id) {
this.attribute = attribute;
this.id = id;
}
@Override
public int getNodeKind() {
return Type.ATTRIBUTE;
}
@Override
public String getLocalPart() {
return attribute.getName();
}
@Override
public String getURI() {
return "";
}
@Override
public Value atomize() throws XPathException {
if (value == null) {
Object v = attribute.getValue();
// TODO Need to handle the full range of types, is there something
// Saxon can do to help?
if (v instanceof String) {
value = new StringValue((String) v);
} else if (v instanceof Boolean) {
value = BooleanValue.get(((Boolean) v).booleanValue());
} else if (v instanceof Integer) {
value = Int64Value.makeIntegerValue((Integer) v);
} else if (v == null) {
value = EmptySequence.getInstance();
} else {
throw new RuntimeException(
"Unable to create ValueRepresentaton for attribute value: " + v + " of type " + v.getClass());
}
}
return value;
}
@Override
public CharSequence getStringValueCS() {
return attribute.getStringValue();
}
@Override
public SequenceIterator getTypedValue() throws XPathException {
return atomize().iterate();
}
@Override
public int compareOrder(NodeInfo other) {
return Integer.signum(this.id - ((AttributeNode) other).id);
}
}