svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.lib / org.gvsig.expressionevaluator.lib.impl / src / main / java / org / gvsig / expressionevaluator / impl / DefaultCodeBuilder.java @ 43809
History | View | Annotate | Download (10.1 KB)
1 | 43512 | jjdelcerro | package org.gvsig.expressionevaluator.impl; |
---|---|---|---|
2 | |||
3 | import java.util.ArrayList; |
||
4 | import java.util.Iterator; |
||
5 | import java.util.List; |
||
6 | 43519 | jjdelcerro | import org.apache.commons.lang3.StringUtils; |
7 | 43512 | jjdelcerro | import org.gvsig.expressionevaluator.Code; |
8 | import static org.gvsig.expressionevaluator.Code.CALLER; |
||
9 | import static org.gvsig.expressionevaluator.Code.CONSTANT; |
||
10 | import org.gvsig.expressionevaluator.Code.Caller; |
||
11 | import org.gvsig.expressionevaluator.Code.Caller.Arguments; |
||
12 | import org.gvsig.expressionevaluator.Code.Constant; |
||
13 | import static org.gvsig.expressionevaluator.Code.IDENTIFIER; |
||
14 | import org.gvsig.expressionevaluator.Code.Identifier; |
||
15 | import static org.gvsig.expressionevaluator.Code.UNDEFINED; |
||
16 | import org.gvsig.expressionevaluator.CodeBuilder; |
||
17 | import org.gvsig.expressionevaluator.Function; |
||
18 | 43521 | jjdelcerro | import org.gvsig.expressionevaluator.Interpreter; |
19 | 43512 | jjdelcerro | import org.gvsig.tools.exception.BaseException; |
20 | import org.gvsig.tools.visitor.Visitor; |
||
21 | |||
22 | public class DefaultCodeBuilder implements CodeBuilder { |
||
23 | |||
24 | public class BaseCode implements Code { |
||
25 | |||
26 | @Override
|
||
27 | public int code() { |
||
28 | return UNDEFINED;
|
||
29 | } |
||
30 | |||
31 | 43521 | jjdelcerro | // @Override
|
32 | // public String toString() {
|
||
33 | // return this.toString(this);
|
||
34 | // }
|
||
35 | //
|
||
36 | // private String toString(Code code) {
|
||
37 | // StringBuilder builder = new StringBuilder();
|
||
38 | // switch( code.code() ) {
|
||
39 | // case CONSTANT: {
|
||
40 | // Object value = ((Constant) code).value();
|
||
41 | // if( value instanceof CharSequence ) {
|
||
42 | // value = StringUtils.wrap(value.toString(), "'");
|
||
43 | // }
|
||
44 | // builder.append(value);
|
||
45 | // }
|
||
46 | // break;
|
||
47 | //
|
||
48 | // case IDENTIFIER:
|
||
49 | // builder.append(((Identifier) code).name());
|
||
50 | // break;
|
||
51 | //
|
||
52 | // case CALLER:
|
||
53 | // Caller caller = (Caller) code;
|
||
54 | // builder.append(caller.name());
|
||
55 | // builder.append("(");
|
||
56 | // if( caller.args() != null ) {
|
||
57 | // boolean skipcoma = true;
|
||
58 | // for( Code arg : caller.args() ) {
|
||
59 | // if( skipcoma ) {
|
||
60 | // skipcoma = false;
|
||
61 | // } else {
|
||
62 | // builder.append(", ");
|
||
63 | // }
|
||
64 | // builder.append(toString(arg));
|
||
65 | // }
|
||
66 | // }
|
||
67 | // builder.append(")");
|
||
68 | // break;
|
||
69 | // }
|
||
70 | // return builder.toString();
|
||
71 | // }
|
||
72 | 43512 | jjdelcerro | |
73 | @Override
|
||
74 | public void accept(Visitor visitor) throws BaseException { |
||
75 | visitor.visit(this);
|
||
76 | } |
||
77 | |||
78 | } |
||
79 | |||
80 | class BaseConstant extends BaseCode implements Constant { |
||
81 | |||
82 | private final Object value; |
||
83 | |||
84 | public BaseConstant(Object value) { |
||
85 | this.value = value;
|
||
86 | } |
||
87 | |||
88 | @Override
|
||
89 | public int code() { |
||
90 | return CONSTANT;
|
||
91 | } |
||
92 | |||
93 | @Override
|
||
94 | public Object value() { |
||
95 | return this.value; |
||
96 | } |
||
97 | |||
98 | 43521 | jjdelcerro | @Override
|
99 | public String toString() { |
||
100 | StringBuilder builder = new StringBuilder(); |
||
101 | Object v = this.value(); |
||
102 | if( v instanceof CharSequence ) { |
||
103 | v = StringUtils.wrap(v.toString(), "'");
|
||
104 | } |
||
105 | builder.append(v); |
||
106 | return builder.toString();
|
||
107 | } |
||
108 | |||
109 | 43512 | jjdelcerro | } |
110 | |||
111 | public class BaseIdentifier extends BaseCode implements Identifier { |
||
112 | |||
113 | String name;
|
||
114 | |||
115 | public BaseIdentifier(String name) { |
||
116 | this.name = name;
|
||
117 | } |
||
118 | |||
119 | @Override
|
||
120 | public int code() { |
||
121 | return IDENTIFIER;
|
||
122 | } |
||
123 | |||
124 | @Override
|
||
125 | public String name() { |
||
126 | return this.name; |
||
127 | } |
||
128 | |||
129 | 43521 | jjdelcerro | @Override
|
130 | public String toString() { |
||
131 | StringBuilder builder = new StringBuilder(); |
||
132 | builder.append("[");
|
||
133 | builder.append(this.name());
|
||
134 | builder.append("]");
|
||
135 | return builder.toString();
|
||
136 | } |
||
137 | |||
138 | 43512 | jjdelcerro | } |
139 | |||
140 | public class BaseArguments implements Arguments { |
||
141 | |||
142 | private final List<Code> args; |
||
143 | |||
144 | public BaseArguments() {
|
||
145 | this.args = new ArrayList<>(); |
||
146 | } |
||
147 | |||
148 | @Override
|
||
149 | public int count() { |
||
150 | if( args == null ) { |
||
151 | return 0; |
||
152 | } |
||
153 | return this.args.size(); |
||
154 | } |
||
155 | |||
156 | public void add(Code arg) { |
||
157 | this.args.add(arg);
|
||
158 | } |
||
159 | |||
160 | @Override
|
||
161 | public Iterator<Code> iterator() { |
||
162 | return this.args.iterator(); |
||
163 | } |
||
164 | |||
165 | @Override
|
||
166 | public Code get(int n) { |
||
167 | return this.args.get(n); |
||
168 | } |
||
169 | |||
170 | @Override
|
||
171 | public void accept(Visitor visitor) throws BaseException { |
||
172 | 43521 | jjdelcerro | for( Code arg : this.args ) { |
173 | 43512 | jjdelcerro | visitor.visit(arg); |
174 | } |
||
175 | } |
||
176 | |||
177 | 43521 | jjdelcerro | @Override
|
178 | public String toString() { |
||
179 | if( args != null ) { |
||
180 | StringBuilder builder = new StringBuilder(); |
||
181 | boolean skipcoma = true; |
||
182 | for( Code arg : args ) {
|
||
183 | if( skipcoma ) {
|
||
184 | skipcoma = false;
|
||
185 | } else {
|
||
186 | builder.append(", ");
|
||
187 | } |
||
188 | builder.append(arg.toString()); |
||
189 | } |
||
190 | return builder.toString();
|
||
191 | } |
||
192 | return ""; |
||
193 | } |
||
194 | |||
195 | 43512 | jjdelcerro | } |
196 | |||
197 | public class BaseCaller extends BaseCode implements Caller { |
||
198 | |||
199 | private final String name; |
||
200 | private final Arguments args; |
||
201 | private Function function;
|
||
202 | private final int type; |
||
203 | |||
204 | public BaseCaller(String name, int type, Arguments args) { |
||
205 | this.name = name;
|
||
206 | this.args = args;
|
||
207 | this.type = type;
|
||
208 | this.function = null; |
||
209 | } |
||
210 | |||
211 | @Override
|
||
212 | public int code() { |
||
213 | return CALLER;
|
||
214 | } |
||
215 | |||
216 | @Override
|
||
217 | 43521 | jjdelcerro | public Object call(Interpreter interpreter, Object[] args) throws Exception { |
218 | return this.function.call(interpreter, args); |
||
219 | 43512 | jjdelcerro | } |
220 | |||
221 | @Override
|
||
222 | public String name() { |
||
223 | return this.name; |
||
224 | } |
||
225 | |||
226 | @Override
|
||
227 | public Function function() {
|
||
228 | return this.function; |
||
229 | } |
||
230 | |||
231 | @Override
|
||
232 | public Function function(Function function) {
|
||
233 | this.function = function;
|
||
234 | return this.function; |
||
235 | } |
||
236 | |||
237 | @Override
|
||
238 | public Code.Caller.Arguments args() {
|
||
239 | return this.args; |
||
240 | } |
||
241 | |||
242 | @Override
|
||
243 | public int type() { |
||
244 | return this.type; |
||
245 | } |
||
246 | |||
247 | @Override
|
||
248 | public void accept(Visitor visitor) throws BaseException { |
||
249 | visitor.visit(this);
|
||
250 | this.args.accept(visitor);
|
||
251 | } |
||
252 | |||
253 | 43521 | jjdelcerro | @Override
|
254 | public String toString() { |
||
255 | StringBuilder builder = new StringBuilder(); |
||
256 | builder.append(this.name());
|
||
257 | builder.append("(");
|
||
258 | if( this.args()!=null ) { |
||
259 | builder.append(this.args().toString());
|
||
260 | } |
||
261 | builder.append(")");
|
||
262 | return builder.toString();
|
||
263 | } |
||
264 | |||
265 | 43512 | jjdelcerro | } |
266 | |||
267 | @Override
|
||
268 | 43809 | jjdelcerro | public CodeBuilder clone() throws CloneNotSupportedException { |
269 | // This implementation of CodeBuilder does not maintain state, so
|
||
270 | // we only call the super class.
|
||
271 | DefaultCodeBuilder other = (DefaultCodeBuilder) super.clone();
|
||
272 | return other;
|
||
273 | } |
||
274 | |||
275 | @Override
|
||
276 | 43512 | jjdelcerro | public Constant constant(Object value) { |
277 | return new BaseConstant(value); |
||
278 | } |
||
279 | |||
280 | @Override
|
||
281 | public Identifier identifier(String name) { |
||
282 | return new BaseIdentifier(name); |
||
283 | } |
||
284 | |||
285 | @Override
|
||
286 | public Caller.Arguments args() {
|
||
287 | return new BaseArguments(); |
||
288 | } |
||
289 | |||
290 | @Override
|
||
291 | public Caller function(String name, int type, Arguments args) { |
||
292 | return new BaseCaller(name, type, args); |
||
293 | } |
||
294 | |||
295 | @Override
|
||
296 | public Caller function(String name, Arguments args) { |
||
297 | return function(name, Caller.FUNCTION, args);
|
||
298 | } |
||
299 | |||
300 | @Override
|
||
301 | public Caller operator(String name, Code arg1) { |
||
302 | Arguments args = args(); |
||
303 | 43809 | jjdelcerro | ((BaseArguments)args).add(arg1); |
304 | 43512 | jjdelcerro | return function(name, Caller.UNARY_OPERATOR, args);
|
305 | } |
||
306 | |||
307 | @Override
|
||
308 | public Caller operator(String name, Code arg1, Code arg2) { |
||
309 | Arguments args = args(); |
||
310 | 43809 | jjdelcerro | ((BaseArguments)args).add(arg1); |
311 | ((BaseArguments)args).add(arg2); |
||
312 | 43512 | jjdelcerro | return function(name, Caller.BINARY_OPERATOR, args);
|
313 | } |
||
314 | |||
315 | @Override
|
||
316 | public Code not(Code op1) {
|
||
317 | return operator("not", op1); |
||
318 | } |
||
319 | |||
320 | @Override
|
||
321 | public Code add(Code op1, Code op2) {
|
||
322 | return operator("+", op1, op2); |
||
323 | } |
||
324 | |||
325 | @Override
|
||
326 | public Code subst(Code op1, Code op2) {
|
||
327 | return operator("-", op1, op2); |
||
328 | } |
||
329 | |||
330 | @Override
|
||
331 | public Code mult(Code op1, Code op2) {
|
||
332 | return operator("*", op1, op2); |
||
333 | } |
||
334 | |||
335 | @Override
|
||
336 | public Code div(Code op1, Code op2) {
|
||
337 | return operator("/", op1, op2); |
||
338 | } |
||
339 | |||
340 | @Override
|
||
341 | public Code mod(Code op1, Code op2) {
|
||
342 | return operator("%", op1, op2); |
||
343 | } |
||
344 | |||
345 | @Override
|
||
346 | public Code or(Code op1, Code op2) {
|
||
347 | return operator("or", op1, op2); |
||
348 | } |
||
349 | |||
350 | @Override
|
||
351 | public Code and(Code op1, Code op2) {
|
||
352 | return operator("and", op1, op2); |
||
353 | } |
||
354 | |||
355 | @Override
|
||
356 | public Code like(Code op1, Code op2) {
|
||
357 | return operator("like", op1, op2); |
||
358 | } |
||
359 | |||
360 | @Override
|
||
361 | public Code ilike(Code op1, Code op2) {
|
||
362 | return operator("ilike", op1, op2); |
||
363 | } |
||
364 | |||
365 | @Override
|
||
366 | 43532 | jjdelcerro | public Code regexp(Code op1, Code op2) {
|
367 | return operator("~", op1, op2); |
||
368 | } |
||
369 | |||
370 | @Override
|
||
371 | 43512 | jjdelcerro | public Code lt(Code op1, Code op2) {
|
372 | return operator("<", op1, op2); |
||
373 | } |
||
374 | |||
375 | @Override
|
||
376 | public Code gt(Code op1, Code op2) {
|
||
377 | return operator(">", op1, op2); |
||
378 | } |
||
379 | |||
380 | @Override
|
||
381 | public Code le(Code op1, Code op2) {
|
||
382 | return operator("<=", op1, op2); |
||
383 | } |
||
384 | |||
385 | @Override
|
||
386 | public Code ge(Code op1, Code op2) {
|
||
387 | return operator(">=", op1, op2); |
||
388 | } |
||
389 | |||
390 | @Override
|
||
391 | public Code eq(Code op1, Code op2) {
|
||
392 | return operator("=", op1, op2); |
||
393 | } |
||
394 | |||
395 | @Override
|
||
396 | public Code ne(Code op1, Code op2) {
|
||
397 | return operator("<>", op1, op2); |
||
398 | } |
||
399 | |||
400 | @Override
|
||
401 | public Code is(Code op1, Code op2) {
|
||
402 | return operator("is", op1, op2); |
||
403 | } |
||
404 | |||
405 | } |