1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.jexl3.jexl342;
18
19 import org.apache.commons.jexl3.JexlArithmetic;
20
21 import java.lang.ref.Reference;
22 import java.math.BigDecimal;
23 import java.math.BigInteger;
24 import java.util.Optional;
25 import java.util.concurrent.atomic.AtomicReference;
26
27
28
29
30 public class OptionalArithmetic extends JexlArithmetic {
31 public OptionalArithmetic(boolean astrict) {
32 super(astrict);
33 }
34
35
36
37
38
39
40 protected Object star(Object ref) {
41 if (ref instanceof Optional<?>) {
42 Optional<?> o = (Optional<?>) ref;
43 return o.orElse(null);
44 }
45 if (ref instanceof Reference<?>) {
46 Optional<?> r = (Optional<?>) ref;
47 return r.get();
48 }
49 if (ref instanceof AtomicReference<?>) {
50 AtomicReference<?> r = (AtomicReference<?>) ref;
51 return r.get();
52 }
53 return ref;
54 }
55
56 @Override
57 public Object controlReturn(Object returned) {
58 return star(returned);
59 }
60 @Override
61 protected boolean isNullOperand(Object val) {
62 return super.isNullOperand(star(val));
63 }
64
65 @Override
66 public boolean toBoolean(final Object val) {
67 return super.toBoolean(star(val));
68 }
69
70 @Override
71 public String toString(final Object val) {
72 return super.toString(star(val));
73 }
74
75 @Override
76 public int toInteger(final Object val) {
77 return super.toInteger(star(val));
78 }
79
80 @Override
81 public long toLong(final Object val) {
82 return super.toLong(star(val));
83 }
84
85 @Override
86 public double toDouble(final Object val) {
87 return super.toDouble(star(val));
88 }
89
90 @Override
91 public BigInteger toBigInteger(final Object val) {
92 return super.toBigInteger(star(val));
93 }
94
95 @Override
96 public BigDecimal toBigDecimal(final Object val) {
97 return super.toBigDecimal(star(val));
98 }
99
100 @Override
101 public Integer size(final Object object, final Integer def) {
102 return super.size(star(object), def);
103 }
104
105 @Override
106 public Boolean empty(Object o) {
107 return super.empty(star(o));
108 }
109
110 @Override
111 public Boolean isEmpty(final Object object, final Boolean def) {
112 return super.isEmpty(star(object), def);
113 }
114
115 @Override
116 public Object positivize(Object o) {
117 return super.positivize(star(o));
118 }
119
120 @Override
121 public Object negate(Object o) {
122 return super.negate(star(o));
123 }
124
125 @Override
126 public Object complement(Object o) {
127 return super.complement(star(o));
128 }
129
130 @Override
131 public Boolean contains(Object lhs, Object rhs) {
132 return super.contains(star(lhs), star(rhs));
133 }
134
135 @Override
136 public Object add(Object lhs, Object rhs) {
137 return super.add(star(lhs), star(rhs));
138 }
139
140 @Override
141 public Object subtract(Object lhs, Object rhs) {
142 return super.subtract(star(lhs), star(rhs));
143 }
144
145 @Override
146 public Object multiply(Object lhs, Object rhs) {
147 return super.multiply(star(lhs), star(rhs));
148 }
149
150 @Override
151 public Object divide(Object lhs, Object rhs) {
152 return super.divide(star(lhs), star(rhs));
153 }
154
155 @Override
156 public Object mod(Object lhs, Object rhs) {
157 return super.mod(star(lhs), star(rhs));
158 }
159
160 @Override
161 public Object and(final Object left, final Object right) { return super.and(star(left), star(right)); }
162
163 @Override
164 public Object or(final Object left, final Object right) { return super.or(star(left), star(right)); }
165
166 @Override
167 public Object xor(final Object left, final Object right) { return super.xor(star(left), star(right)); }
168
169 @Override
170 public Object shiftLeft(final Object left, final Object right) { return super.shiftLeft(star(left), star(right)); }
171
172 @Override
173 public Object shiftRight(final Object left, final Object right) { return super.shiftRight(star(left), star(right)); }
174
175 @Override
176 public Object shiftRightUnsigned(final Object left, final Object right) { return super.shiftRightUnsigned(star(left), star(right)); }
177
178 @Override
179 public Boolean startsWith(final Object left, final Object right) {
180 return super.startsWith(star(left), star(right));
181 }
182
183 @Override
184 public Boolean endsWith(final Object left, final Object right) {
185 return super.endsWith(star(left), star(right));
186 }
187
188 @Override
189 public boolean equals(final Object left, final Object right) {
190 return equals(star(left), star(right));
191 }
192
193 @Override
194 public boolean greaterThan(final Object left, final Object right) {
195 return greaterThan(star(left), star(right));
196 }
197
198 @Override
199 public boolean greaterThanOrEqual(final Object left, final Object right) {
200 return greaterThanOrEqual(star(left), star(right));
201 }
202
203 @Override
204 public boolean lessThan(final Object left, final Object right) {
205 return lessThan(star(left), star(right));
206 }
207
208 @Override
209 public boolean lessThanOrEqual(final Object left, final Object right) {
210 return lessThanOrEqual(star(left), star(right));
211 }
212
213 @Override
214 public boolean narrowArguments(final Object[] args) {
215 boolean narrowed = false;
216 if (args != null) {
217 for (int a = 0; a < args.length; ++a) {
218 final Object arg = args[a];
219 Object sarg = star(arg);
220 if (sarg != arg) {
221 narrowed = true;
222 }
223 if (arg instanceof Number) {
224 final Number narg = (Number) arg;
225 final Number narrow = narrow(narg);
226 if (!narg.equals(narrow)) {
227 args[a] = narrow;
228 narrowed = true;
229 }
230 }
231 }
232 }
233 return narrowed;
234 }
235
236 @Override
237 public ArrayBuilder arrayBuilder(final int size) {
238 return new org.apache.commons.jexl3.internal.ArrayBuilder(size) {
239 @Override
240 public void add(Object value) {
241 super.add(star(value));
242 }
243 };
244 }
245
246 @Override
247 public SetBuilder setBuilder(final int size) {
248 return new org.apache.commons.jexl3.internal.SetBuilder(size) {
249 @Override
250 public void add(Object value) {
251 super.add(star(value));
252 }
253 };
254 }
255
256 @Override
257 public MapBuilder mapBuilder(final int size) {
258 return new org.apache.commons.jexl3.internal.MapBuilder(size) {
259 @Override
260 public void put(Object key, Object value) {
261 super.put(key, star(value));
262 }
263 };
264 }
265 }