AttributeNode.java
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 (instanceof String) {
47     value = new StringValue((Stringv);
48       else if (instanceof Boolean) {
49     value = BooleanValue.get(((Booleanv).booleanValue());
50       else if (instanceof Integer) {
51     value = Int64Value.makeIntegerValue((Integerv);
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 - ((AttributeNodeother).id);
75     }
76 }