1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 package org.jaxen.expr;
49
50 import java.util.ArrayList;
51 import java.util.Collections;
52 import java.util.Iterator;
53 import java.util.LinkedList;
54 import java.util.List;
55
56 import org.jaxen.Context;
57 import org.jaxen.ContextSupport;
58 import org.jaxen.JaxenException;
59
60 abstract class DefaultLocationPath extends DefaultExpr implements LocationPath
61 {
62 private List steps;
63
64 /***
65 * Create a new empty location path.
66 */
67 DefaultLocationPath()
68 {
69 this.steps = new LinkedList();
70 }
71
72 public void addStep(Step step)
73 {
74 getSteps().add(step);
75 }
76
77 public List getSteps()
78 {
79 return this.steps;
80 }
81
82 public Expr simplify()
83 {
84 Iterator stepIter = getSteps().iterator();
85 Step eachStep = null;
86 while (stepIter.hasNext())
87 {
88 eachStep = (Step) stepIter.next();
89 eachStep.simplify();
90 }
91 return this;
92 }
93
94 public String getText()
95 {
96 StringBuffer buf = new StringBuffer();
97 Iterator stepIter = getSteps().iterator();
98 while (stepIter.hasNext())
99 {
100 buf.append(((Step) stepIter.next()).getText());
101 if (stepIter.hasNext())
102 {
103 buf.append("/");
104 }
105 }
106 return buf.toString();
107 }
108
109 public String toString()
110 {
111 StringBuffer buf = new StringBuffer();
112 Iterator stepIter = getSteps().iterator();
113 while (stepIter.hasNext())
114 {
115 buf.append(stepIter.next().toString());
116 if (stepIter.hasNext())
117 {
118 buf.append("/");
119 }
120 }
121 return buf.toString();
122 }
123
124 public boolean isAbsolute()
125 {
126 return false;
127 }
128
129 public Object evaluate(Context context) throws JaxenException
130 {
131 List nodeSet = context.getNodeSet();
132 List contextNodeSet = new ArrayList(nodeSet);
133 ContextSupport support = context.getContextSupport();
134 Context stepContext = new Context(support);
135 Iterator stepIter = getSteps().iterator();
136 while ( stepIter.hasNext() )
137 {
138 Step eachStep = (Step) stepIter.next();
139 stepContext.setNodeSet(contextNodeSet);
140 contextNodeSet = eachStep.evaluate(stepContext);
141
142 if (isReverseAxis(eachStep)) {
143 Collections.reverse(contextNodeSet);
144 }
145 }
146
147 if (getSteps().size() > 1) {
148 Collections.sort(contextNodeSet, new NodeComparator(support.getNavigator()));
149 }
150
151 return contextNodeSet;
152 }
153
154 private boolean isReverseAxis(Step step) {
155
156 int axis = step.getAxis();
157 return axis == org.jaxen.saxpath.Axis.PRECEDING
158 || axis == org.jaxen.saxpath.Axis.PRECEDING_SIBLING
159 || axis == org.jaxen.saxpath.Axis.ANCESTOR
160 || axis == org.jaxen.saxpath.Axis.ANCESTOR_OR_SELF;
161 }
162
163 }
164