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.EvalContext;
21 import org.apache.commons.jxpath.ri.compiler.NodeTest;
22 import org.apache.commons.jxpath.ri.model.NodePointer;
23
24
25
26
27 public class ParentContext extends EvalContext {
28
29 private final NodeTest nodeTest;
30 private boolean setStarted;
31 private NodePointer currentNodePointer;
32
33
34
35
36
37
38
39 public ParentContext(final EvalContext parentContext, final NodeTest nodeTest) {
40 super(parentContext);
41 this.nodeTest = nodeTest;
42 }
43
44 @Override
45 public NodePointer getCurrentNodePointer() {
46 return currentNodePointer;
47 }
48
49 @Override
50 public int getCurrentPosition() {
51 return 1;
52 }
53
54 @Override
55 public int getDocumentOrder() {
56 return -1;
57 }
58
59 @Override
60 public boolean nextNode() {
61
62 if (setStarted) {
63 return false;
64 }
65 setStarted = true;
66 final NodePointer thisLocation = parentContext.getCurrentNodePointer();
67 currentNodePointer = thisLocation.getImmediateParentPointer();
68 while (currentNodePointer != null && currentNodePointer.isContainer()) {
69 currentNodePointer = currentNodePointer.getImmediateParentPointer();
70 }
71 if (currentNodePointer != null && currentNodePointer.testNode(nodeTest)) {
72 position++;
73 return true;
74 }
75 return false;
76 }
77
78 @Override
79 public void reset() {
80 super.reset();
81 setStarted = false;
82 }
83
84 @Override
85 public boolean setPosition(final int position) {
86 super.setPosition(position);
87 return position == 1;
88 }
89 }