1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.jxpath.ri.compiler;
19
20 import java.util.Collections;
21 import java.util.Iterator;
22 import java.util.Locale;
23
24 import org.apache.commons.jxpath.NodeSet;
25 import org.apache.commons.jxpath.Pointer;
26 import org.apache.commons.jxpath.ri.EvalContext;
27 import org.apache.commons.jxpath.ri.QName;
28 import org.apache.commons.jxpath.ri.model.NodePointer;
29 import org.apache.commons.jxpath.util.ValueUtils;
30
31
32
33
34
35 public abstract class Expression {
36
37
38
39
40 public static class PointerIterator implements Iterator {
41
42 private final Iterator iterator;
43 private final QName qname;
44 private final Locale locale;
45
46
47
48
49
50
51
52
53
54
55 @Deprecated
56 public PointerIterator(final Iterator it, final QName qname, final Locale locale) {
57 this.iterator = it;
58 this.qname = qname;
59 this.locale = locale;
60 }
61
62 @Override
63 public boolean hasNext() {
64 return iterator.hasNext();
65 }
66
67 @Override
68 public Object next() {
69 final Object o = iterator.next();
70 return o instanceof Pointer ? o : NodePointer.newNodePointer(qname, o, locale);
71 }
72
73
74
75
76 @Override
77 public void remove() {
78 throw new UnsupportedOperationException();
79 }
80 }
81
82
83
84
85 public static class ValueIterator implements Iterator {
86
87 private final Iterator iterator;
88
89
90
91
92
93
94 public ValueIterator(final Iterator it) {
95 this.iterator = it;
96 }
97
98 @Override
99 public boolean hasNext() {
100 return iterator.hasNext();
101 }
102
103 @Override
104 public Object next() {
105 final Object o = iterator.next();
106 return o instanceof Pointer ? ((Pointer) o).getValue() : o;
107 }
108
109
110
111
112 @Override
113 public void remove() {
114 throw new UnsupportedOperationException();
115 }
116 }
117
118
119 protected static final Double ZERO = Double.valueOf(0);
120
121 protected static final Double ONE = Double.valueOf(1);
122
123 protected static final Double NOT_A_NUMBER = Double.valueOf(Double.NaN);
124 private boolean contextDependencyKnown;
125 private boolean contextDependent;
126
127
128
129
130 public Expression() {
131
132 }
133
134
135
136
137
138
139
140 public abstract Object compute(EvalContext context);
141
142
143
144
145
146
147 public abstract boolean computeContextDependent();
148
149
150
151
152
153
154
155 public abstract Object computeValue(EvalContext context);
156
157
158
159
160
161
162 public synchronized boolean isContextDependent() {
163 if (!contextDependencyKnown) {
164 contextDependent = computeContextDependent();
165 contextDependencyKnown = true;
166 }
167 return contextDependent;
168 }
169
170
171
172
173
174
175
176 public Iterator iterate(final EvalContext context) {
177 final Object result = compute(context);
178 if (result instanceof EvalContext) {
179 return new ValueIterator((EvalContext) result);
180 }
181 if (result instanceof NodeSet) {
182 return new ValueIterator(((NodeSet) result).getPointers().iterator());
183 }
184 return ValueUtils.iterate(result);
185 }
186
187
188
189
190
191
192
193 public Iterator iteratePointers(final EvalContext context) {
194 final Object result = compute(context);
195 if (result == null) {
196 return Collections.EMPTY_LIST.iterator();
197 }
198 if (result instanceof EvalContext) {
199 return (EvalContext) result;
200 }
201 if (result instanceof NodeSet) {
202 return new PointerIterator(((NodeSet) result).getPointers().iterator(), new QName(null, "value"),
203 context.getRootContext().getCurrentNodePointer().getLocale());
204 }
205 return new PointerIterator(ValueUtils.iterate(result), new QName(null, "value"), context.getRootContext().getCurrentNodePointer().getLocale());
206 }
207 }