1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.commons.jxpath.ri.axes;
17
18 import org.apache.commons.jxpath.ri.EvalContext;
19 import org.apache.commons.jxpath.ri.compiler.NodeTest;
20 import org.apache.commons.jxpath.ri.model.NodePointer;
21
22 /***
23 * EvalContext that walks the "parent::" axis.
24 *
25 * @author Dmitri Plotnikov
26 * @version $Revision: 1.15 $ $Date: 2004/03/25 03:49:50 $
27 */
28 public class ParentContext extends EvalContext {
29 private NodeTest nodeTest;
30 private boolean setStarted = false;
31 private NodePointer currentNodePointer;
32
33 public ParentContext(EvalContext parentContext, NodeTest nodeTest) {
34 super(parentContext);
35 this.nodeTest = nodeTest;
36 }
37
38 public NodePointer getCurrentNodePointer() {
39 return currentNodePointer;
40 }
41
42 public int getCurrentPosition() {
43 return 1;
44 }
45
46 public int getDocumentOrder() {
47 return -1;
48 }
49
50 public void reset() {
51 super.reset();
52 setStarted = false;
53 }
54
55 public boolean setPosition(int position) {
56 super.setPosition(position);
57 return position == 1;
58 }
59
60 public boolean nextNode() {
61
62 if (setStarted) {
63 return false;
64 }
65 setStarted = true;
66 NodePointer thisLocation = parentContext.getCurrentNodePointer();
67 currentNodePointer = thisLocation.getImmediateParentPointer();
68 while (currentNodePointer != null
69 && currentNodePointer.isContainer()) {
70 currentNodePointer = currentNodePointer.getImmediateParentPointer();
71 }
72 if (currentNodePointer != null
73 && currentNodePointer.testNode(nodeTest)) {
74 position++;
75 return true;
76 }
77 return false;
78 }
79 }