1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.jxpath.ri.axes;
19
20 import org.apache.commons.jxpath.ri.Compiler;
21 import org.apache.commons.jxpath.ri.EvalContext;
22 import org.apache.commons.jxpath.ri.QName;
23 import org.apache.commons.jxpath.ri.compiler.NodeNameTest;
24 import org.apache.commons.jxpath.ri.compiler.NodeTest;
25 import org.apache.commons.jxpath.ri.compiler.NodeTypeTest;
26 import org.apache.commons.jxpath.ri.model.NodeIterator;
27 import org.apache.commons.jxpath.ri.model.NodePointer;
28
29
30
31
32 public class AttributeContext extends EvalContext {
33
34 private static final QName WILDCARD = new QName(null, "*");
35 private final NodeTest nodeTest;
36 private boolean setStarted;
37 private NodeIterator iterator;
38 private NodePointer currentNodePointer;
39
40
41
42
43
44
45
46 public AttributeContext(final EvalContext parentContext, final NodeTest nodeTest) {
47 super(parentContext);
48 this.nodeTest = nodeTest;
49 }
50
51 @Override
52 public NodePointer getCurrentNodePointer() {
53 return currentNodePointer;
54 }
55
56 @Override
57 public boolean nextNode() {
58 super.setPosition(getCurrentPosition() + 1);
59 if (!setStarted) {
60 setStarted = true;
61 QName qName;
62 if (nodeTest instanceof NodeNameTest) {
63 qName = ((NodeNameTest) nodeTest).getNodeName();
64 } else if (nodeTest instanceof NodeTypeTest && ((NodeTypeTest) nodeTest).getNodeType() == Compiler.NODE_TYPE_NODE) {
65 qName = WILDCARD;
66 } else {
67 iterator = null;
68 return false;
69 }
70 iterator = parentContext.getCurrentNodePointer().attributeIterator(qName);
71 }
72 if (iterator == null) {
73 return false;
74 }
75 if (!iterator.setPosition(iterator.getPosition() + 1)) {
76 return false;
77 }
78 currentNodePointer = iterator.getNodePointer();
79 return true;
80 }
81
82 @Override
83 public void reset() {
84 setStarted = false;
85 iterator = null;
86 super.reset();
87 }
88
89 @Override
90 public boolean setPosition(final int position) {
91 if (position < getCurrentPosition()) {
92 reset();
93 }
94 while (getCurrentPosition() < position) {
95 if (!nextNode()) {
96 return false;
97 }
98 }
99 return true;
100 }
101 }