View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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   * Unwraps Optional/Reference/AtomicReference on public and key methods.
29   */
30  public class OptionalArithmetic extends JexlArithmetic {
31      public OptionalArithmetic(boolean astrict) {
32          super(astrict);
33      }
34  
35      /**
36       * Dereferences an Optional, a Reference or an AtomicReference, leave other as is.
37       * @param ref the reference
38       * @return the referenced object
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 }