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.parser;
18  
19  import org.apache.commons.jexl3.JexlArithmetic;
20  import org.apache.commons.jexl3.JexlOperator;
21  import org.apache.commons.jexl3.internal.ScriptVisitor;
22  
23  /**
24   * Checks if node is an operator node.
25   **/
26  class OperatorController extends ScriptVisitor {
27      static final OperatorController INSTANCE  = new OperatorController();
28  
29      /**
30       * Checks whether an operator is strict for a given arithmetic.
31       * @param node the node which should delegate to an operator
32       * @return true if node points to a (null-unsafe) operator
33       */
34      boolean isStrict(final JexlArithmetic arithmetic, final JexlNode node) {
35          if (arithmetic.isStrict()) {
36              final Object ctl = node.jjtAccept(this, arithmetic);
37              if (ctl instanceof JexlOperator) {
38                  final JexlOperator operator = (JexlOperator) ctl;
39                  return arithmetic.isStrict(operator);
40              }
41          }
42          return false;
43      }
44  
45      @Override
46      protected JexlOperator visitNode(final JexlNode node, final Object data) {
47          return null;
48      }
49  
50      @Override
51      protected JexlOperator visit(final ASTNotNode node, final Object data) {
52          return JexlOperator.NOT;
53      }
54  
55      @Override
56      protected JexlOperator visit(final ASTAddNode node, final Object data) {
57          return JexlOperator.ADD;
58      }
59  
60      @Override
61      protected JexlOperator visit(final ASTSetAddNode node, final Object data) {
62          return JexlOperator.SELF_ADD;
63      }
64  
65      @Override
66      protected JexlOperator visit(final ASTMulNode node, final Object data) {
67          return JexlOperator.MULTIPLY;
68      }
69  
70      @Override
71      protected JexlOperator visit(final ASTSetMultNode node, final Object data) {
72          return JexlOperator.SELF_MULTIPLY;
73      }
74  
75      @Override
76      protected JexlOperator visit(final ASTModNode node, final Object data) {
77          return JexlOperator.MOD;
78      }
79  
80      @Override
81      protected JexlOperator visit(final ASTSetModNode node, final Object data) {
82          return JexlOperator.SELF_MOD;
83      }
84  
85      @Override
86      protected JexlOperator visit(final ASTDivNode node, final Object data) {
87          return JexlOperator.DIVIDE;
88      }
89  
90      @Override
91      protected JexlOperator visit(final ASTSetDivNode node, final Object data) {
92          return JexlOperator.SELF_DIVIDE;
93      }
94  
95      @Override
96      protected JexlOperator visit(final ASTBitwiseAndNode node, final Object data) {
97          return JexlOperator.AND;
98      }
99  
100     @Override
101     protected JexlOperator visit(final ASTSetAndNode node, final Object data) {
102         return JexlOperator.SELF_AND;
103     }
104 
105     @Override
106     protected JexlOperator visit(final ASTBitwiseOrNode node, final Object data) {
107         return JexlOperator.OR;
108     }
109 
110     @Override
111     protected JexlOperator visit(final ASTSetOrNode node, final Object data) {
112         return JexlOperator.SELF_OR;
113     }
114 
115     @Override
116     protected JexlOperator visit(final ASTBitwiseXorNode node, final Object data) {
117         return JexlOperator.XOR;
118     }
119 
120     @Override
121     protected JexlOperator visit(final ASTSetXorNode node, final Object data) {
122         return JexlOperator.SELF_OR;
123     }
124 
125     @Override
126     protected JexlOperator visit(final ASTBitwiseComplNode node, final Object data) {
127         return JexlOperator.COMPLEMENT;
128     }
129 
130     @Override
131     protected JexlOperator visit(final ASTSubNode node, final Object data) {
132         return JexlOperator.SUBTRACT;
133     }
134 
135     @Override
136     protected JexlOperator visit(final ASTSetSubNode node, final Object data) {
137         return JexlOperator.SELF_SUBTRACT;
138     }
139 
140     @Override
141     protected JexlOperator visit(final ASTEQNode node, final Object data) {
142         return JexlOperator.EQ;
143     }
144 
145     @Override
146     protected JexlOperator visit(final ASTNENode node, final Object data) {
147         return JexlOperator.EQ;
148     }
149 
150     @Override
151     protected JexlOperator visit(final ASTGTNode node, final Object data) {
152         return JexlOperator.GT;
153     }
154 
155     @Override
156     protected JexlOperator visit(final ASTGENode node, final Object data) {
157         return JexlOperator.GTE;
158     }
159 
160     @Override
161     protected JexlOperator visit(final ASTLTNode node, final Object data) {
162         return JexlOperator.LT;
163     }
164 
165     @Override
166     protected JexlOperator visit(final ASTLENode node, final Object data) {
167         return JexlOperator.LTE;
168     }
169 
170     @Override
171     protected JexlOperator visit(final ASTSWNode node, final Object data) {
172         return JexlOperator.STARTSWITH;
173     }
174 
175     @Override
176     protected JexlOperator visit(final ASTNSWNode node, final Object data) {
177         return JexlOperator.STARTSWITH;
178     }
179 
180     @Override
181     protected JexlOperator visit(final ASTEWNode node, final Object data) {
182         return JexlOperator.ENDSWITH;
183     }
184 
185     @Override
186     protected JexlOperator visit(final ASTNEWNode node, final Object data) {
187         return JexlOperator.ENDSWITH;
188     }
189 
190     @Override
191     protected JexlOperator visit(final ASTERNode node, final Object data) {
192         return JexlOperator.CONTAINS;
193     }
194 
195     @Override
196     protected JexlOperator visit(final ASTNRNode node, final Object data) {
197         return JexlOperator.CONTAINS;
198     }
199 }