View Javadoc
1   /*
2    *    Copyright 2009-2023 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       https://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
15   */
16  package org.apache.ibatis.scripting.xmltags;
17  
18  import java.lang.reflect.Array;
19  import java.math.BigDecimal;
20  import java.util.ArrayList;
21  import java.util.List;
22  import java.util.Map;
23  
24  import org.apache.ibatis.builder.BuilderException;
25  
26  /**
27   * @author Clinton Begin
28   */
29  public class ExpressionEvaluator {
30  
31    public boolean evaluateBoolean(String expression, Object parameterObject) {
32      Object value = OgnlCache.getValue(expression, parameterObject);
33      if (value instanceof Boolean) {
34        return (Boolean) value;
35      }
36      if (value instanceof Number) {
37        return new BigDecimal(String.valueOf(value)).compareTo(BigDecimal.ZERO) != 0;
38      }
39      return value != null;
40    }
41  
42    /**
43     * @deprecated Since 3.5.9, use the {@link #evaluateIterable(String, Object, boolean)}.
44     */
45    @Deprecated
46    public Iterable<?> evaluateIterable(String expression, Object parameterObject) {
47      return evaluateIterable(expression, parameterObject, false);
48    }
49  
50    /**
51     * @since 3.5.9
52     */
53    public Iterable<?> evaluateIterable(String expression, Object parameterObject, boolean nullable) {
54      Object value = OgnlCache.getValue(expression, parameterObject);
55      if (value == null) {
56        if (nullable) {
57          return null;
58        }
59        throw new BuilderException("The expression '" + expression + "' evaluated to a null value.");
60      }
61      if (value instanceof Iterable) {
62        return (Iterable<?>) value;
63      }
64      if (value.getClass().isArray()) {
65        // the array may be primitive, so Arrays.asList() may throw
66        // a ClassCastException (issue 209). Do the work manually
67        // Curse primitives! :) (JGB)
68        int size = Array.getLength(value);
69        List<Object> answer = new ArrayList<>();
70        for (int i = 0; i < size; i++) {
71          Object o = Array.get(value, i);
72          answer.add(o);
73        }
74        return answer;
75      }
76      if (value instanceof Map) {
77        return ((Map) value).entrySet();
78      }
79      throw new BuilderException(
80          "Error evaluating expression '" + expression + "'.  Return value (" + value + ") was not iterable.");
81    }
82  
83  }