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