01 package net.sourceforge.pmd.lang.ast.xpath.saxon;
02
03 import net.sf.saxon.om.NodeInfo;
04 import net.sf.saxon.om.SequenceIterator;
05 import net.sf.saxon.trans.XPathException;
06 import net.sf.saxon.type.Type;
07 import net.sf.saxon.value.BooleanValue;
08 import net.sf.saxon.value.Int64Value;
09 import net.sf.saxon.value.StringValue;
10 import net.sf.saxon.value.Value;
11 import net.sourceforge.pmd.lang.ast.xpath.Attribute;
12
13 /**
14 * A Saxon OM Attribute node for an AST Node Attribute.
15 */
16 public class AttributeNode extends AbstractNodeInfo {
17 protected final Attribute attribute;
18 protected final int id;
19 protected Value value;
20
21 public AttributeNode(Attribute attribute, int id) {
22 this.attribute = attribute;
23 this.id = id;
24 }
25
26 @Override
27 public int getNodeKind() {
28 return Type.ATTRIBUTE;
29 }
30
31 @Override
32 public String getLocalPart() {
33 return attribute.getName();
34 }
35
36 @Override
37 public String getURI() {
38 return "";
39 }
40
41 @Override
42 public Value atomize() throws XPathException {
43 if (value == null) {
44 Object v = attribute.getValue();
45 // TODO Need to handle the full range of types, is there something Saxon can do to help?
46 if (v instanceof String) {
47 value = new StringValue((String) v);
48 } else if (v instanceof Boolean) {
49 value = BooleanValue.get(((Boolean) v).booleanValue());
50 } else if (v instanceof Integer) {
51 value = Int64Value.makeIntegerValue((Integer) v);
52 } else if (v == null) {
53 // Ok
54 } else {
55 throw new RuntimeException("Unable to create ValueRepresentaton for attribute value: " + v
56 + " of type " + v.getClass());
57 }
58 }
59 return value;
60 }
61
62 @Override
63 public CharSequence getStringValueCS() {
64 return attribute.getStringValue();
65 }
66
67 @Override
68 public SequenceIterator getTypedValue() throws XPathException {
69 return atomize().iterate();
70 }
71
72 @Override
73 public int compareOrder(NodeInfo other) {
74 return Integer.signum(this.id - ((AttributeNode) other).id);
75 }
76 }
|