Revision 44198 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
DefaultCodeBuilder.java | ||
---|---|---|
10 | 10 |
import static org.gvsig.expressionevaluator.Code.CONSTANT; |
11 | 11 |
import static org.gvsig.expressionevaluator.Code.IDENTIFIER; |
12 | 12 |
import static org.gvsig.expressionevaluator.Code.UNDEFINED; |
13 |
import static org.gvsig.expressionevaluator.Code.CODES; |
|
13 | 14 |
import org.gvsig.expressionevaluator.Code.Caller; |
14 | 15 |
import org.gvsig.expressionevaluator.Code.Constant; |
16 |
import static org.gvsig.expressionevaluator.Code.EMPTY_FORMATTER; |
|
15 | 17 |
import org.gvsig.expressionevaluator.Code.Identifier; |
16 | 18 |
import org.gvsig.expressionevaluator.Code.Method; |
17 | 19 |
import org.gvsig.expressionevaluator.CodeBuilder; |
18 | 20 |
import org.gvsig.expressionevaluator.Codes; |
21 |
import org.gvsig.expressionevaluator.ExpressionBuilder; |
|
22 |
import org.gvsig.expressionevaluator.ExpressionBuilder.Value; |
|
23 |
import org.gvsig.expressionevaluator.ExpressionUtils; |
|
24 |
import org.gvsig.expressionevaluator.Formatter; |
|
19 | 25 |
import org.gvsig.expressionevaluator.Function; |
20 | 26 |
import org.gvsig.expressionevaluator.Interpreter; |
27 |
import org.gvsig.expressionevaluator.SymbolTable; |
|
21 | 28 |
import org.gvsig.expressionevaluator.impl.function.operator.AddOperator; |
22 | 29 |
import org.gvsig.expressionevaluator.impl.function.operator.AndOperator; |
23 | 30 |
import org.gvsig.expressionevaluator.impl.function.operator.ConcatOperator; |
... | ... | |
45 | 52 |
import org.gvsig.tools.visitor.Visitor; |
46 | 53 |
|
47 | 54 |
@SuppressWarnings("UseSpecificCatch") |
48 |
public class DefaultCodeBuilder implements CodeBuilder {
|
|
55 |
public class DefaultCodeBuilder implements CodeBuilder { |
|
49 | 56 |
|
50 |
public class BaseCode implements Code { |
|
57 |
public abstract class BaseCode implements Code {
|
|
51 | 58 |
|
52 | 59 |
@Override |
53 | 60 |
public int code() { |
... | ... | |
59 | 66 |
visitor.visit(this); |
60 | 67 |
} |
61 | 68 |
|
69 |
@Override |
|
70 |
public Value toValue(ExpressionBuilder builder) { |
|
71 |
return null; |
|
72 |
} |
|
73 |
|
|
74 |
@Override |
|
75 |
public Value toValue() { |
|
76 |
ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder(); |
|
77 |
return this.toValue(builder); |
|
78 |
} |
|
79 |
|
|
80 |
@Override |
|
81 |
public void link(SymbolTable symbolTable) { |
|
82 |
if( this.code() == Code.CALLER ) { |
|
83 |
Caller caller = (Caller) this; |
|
84 |
if( caller.function() == null ) { |
|
85 |
caller.function(symbolTable.function(caller.name())); |
|
86 |
} |
|
87 |
if( caller.parameters() != null ) { |
|
88 |
for( Code arg : caller.parameters() ) { |
|
89 |
arg.link(symbolTable); |
|
90 |
} |
|
91 |
} |
|
92 |
} |
|
93 |
} |
|
62 | 94 |
} |
63 | 95 |
|
64 | 96 |
class BaseConstant extends BaseCode implements Constant { |
... | ... | |
80 | 112 |
} |
81 | 113 |
|
82 | 114 |
@Override |
115 |
public Value toValue(ExpressionBuilder builder) { |
|
116 |
return builder.constant(this.value); |
|
117 |
} |
|
118 |
|
|
119 |
@Override |
|
83 | 120 |
public String toString() { |
121 |
return this.toString(EMPTY_FORMATTER); |
|
122 |
} |
|
123 |
|
|
124 |
@Override |
|
125 |
public String toString(Formatter<Code> formatter) { |
|
126 |
if( formatter.canApply(this) ) { |
|
127 |
return formatter.format(this); |
|
128 |
} |
|
84 | 129 |
StringBuilder builder = new StringBuilder(); |
85 | 130 |
Object v = this.value(); |
86 | 131 |
if( v == null ) { |
... | ... | |
89 | 134 |
if( StringUtils.isEmpty((CharSequence)v) ) { |
90 | 135 |
builder.append("''"); |
91 | 136 |
} else { |
92 |
v = StringUtils.wrap(v.toString(), "'");
|
|
137 |
v = "'" + StringUtils.replace(v.toString(), "'", "''") + "'";
|
|
93 | 138 |
builder.append(v); |
94 | 139 |
} |
95 | 140 |
|
... | ... | |
150 | 195 |
|
151 | 196 |
public class BaseIdentifier extends BaseCode implements Identifier, RecursionControlSupport { |
152 | 197 |
|
153 |
private String name; |
|
154 |
private RecursionSupport recursionSupport; |
|
198 |
private final String name;
|
|
199 |
private final RecursionSupport recursionSupport;
|
|
155 | 200 |
|
156 | 201 |
public BaseIdentifier(String name) { |
157 | 202 |
this.name = name; |
... | ... | |
169 | 214 |
} |
170 | 215 |
|
171 | 216 |
@Override |
217 |
public Value toValue(ExpressionBuilder builder) { |
|
218 |
return builder.variable(this.name); |
|
219 |
} |
|
220 |
|
|
221 |
@Override |
|
172 | 222 |
public String toString() { |
223 |
return this.toString(EMPTY_FORMATTER); |
|
224 |
} |
|
225 |
|
|
226 |
@Override |
|
227 |
public String toString(Formatter<Code> formatter) { |
|
228 |
if( formatter.canApply(this) ) { |
|
229 |
return formatter.format(this); |
|
230 |
} |
|
173 | 231 |
StringBuilder builder = new StringBuilder(); |
174 | 232 |
builder.append("\""); |
175 | 233 |
builder.append(this.name()); |
... | ... | |
203 | 261 |
} |
204 | 262 |
|
205 | 263 |
@Override |
264 |
public int code() { |
|
265 |
return CODES; |
|
266 |
} |
|
267 |
|
|
268 |
@Override |
|
206 | 269 |
public int size() { |
207 | 270 |
if( codes == null ) { |
208 | 271 |
return 0; |
... | ... | |
243 | 306 |
|
244 | 307 |
@Override |
245 | 308 |
public String toString() { |
309 |
return this.toString(EMPTY_FORMATTER); |
|
310 |
} |
|
311 |
|
|
312 |
@Override |
|
313 |
public Value toValue(ExpressionBuilder builder) { |
|
314 |
throw new UnsupportedOperationException(); |
|
315 |
} |
|
316 |
|
|
317 |
@Override |
|
318 |
public Value toValue() { |
|
319 |
throw new UnsupportedOperationException(); |
|
320 |
} |
|
321 |
|
|
322 |
@Override |
|
323 |
public String toString(Formatter<Code> formatter) { |
|
324 |
if( formatter.canApply(this) ) { |
|
325 |
return formatter.format(this); |
|
326 |
} |
|
246 | 327 |
if( codes != null ) { |
247 | 328 |
StringBuilder builder = new StringBuilder(); |
248 | 329 |
boolean skipcoma = true; |
... | ... | |
255 | 336 |
} else { |
256 | 337 |
builder.append(", "); |
257 | 338 |
} |
258 |
builder.append(code.toString()); |
|
339 |
builder.append(code.toString(formatter));
|
|
259 | 340 |
} |
260 | 341 |
return builder.toString(); |
261 | 342 |
} |
262 | 343 |
return ""; |
263 | 344 |
} |
264 | 345 |
|
346 |
@Override |
|
347 |
public void link(SymbolTable symbolTable) { |
|
348 |
for (Code code : this.codes) { |
|
349 |
code.link(symbolTable); |
|
350 |
} |
|
351 |
} |
|
352 |
|
|
265 | 353 |
} |
266 | 354 |
|
267 | 355 |
public class BaseCaller extends BaseCode implements Caller, RecursionControlSupport { |
... | ... | |
270 | 358 |
private final Codes args; |
271 | 359 |
private Function function; |
272 | 360 |
private final int type; |
273 |
private RecursionSupport recursionSupport; |
|
361 |
private final RecursionSupport recursionSupport;
|
|
274 | 362 |
|
275 | 363 |
public BaseCaller(String name, int type, Codes args) { |
276 | 364 |
this.name = name; |
... | ... | |
307 | 395 |
} |
308 | 396 |
|
309 | 397 |
@Override |
310 |
public Codes args() {
|
|
398 |
public Codes parameters() {
|
|
311 | 399 |
return this.args; |
312 | 400 |
} |
313 | 401 |
|
... | ... | |
325 | 413 |
} |
326 | 414 |
|
327 | 415 |
@Override |
416 |
public Value toValue(ExpressionBuilder builder) { |
|
417 |
switch(this.type) { |
|
418 |
case UNARY_OPERATOR: |
|
419 |
return builder.function( |
|
420 |
NegOperator.NAME.equalsIgnoreCase(this.name())? |
|
421 |
"-" : |
|
422 |
this.name(), |
|
423 |
this.parameters().get(0).toValue(builder) |
|
424 |
); |
|
425 |
case BINARY_OPERATOR: |
|
426 |
return builder.binaryOperator( |
|
427 |
this.name(), |
|
428 |
this.parameters().get(0).toValue(builder), |
|
429 |
this.parameters().get(1).toValue(builder) |
|
430 |
); |
|
431 |
case FUNCTION: |
|
432 |
default: |
|
433 |
ExpressionBuilder.Function f = builder.function(this.name()); |
|
434 |
if( this.parameters()!=null ) { |
|
435 |
for (Code parameter : this.parameters()) { |
|
436 |
f.parameter(parameter.toValue(builder)); |
|
437 |
} |
|
438 |
|
|
439 |
} |
|
440 |
return f; |
|
441 |
|
|
442 |
} |
|
443 |
} |
|
444 |
|
|
445 |
@Override |
|
328 | 446 |
public String toString() { |
447 |
return this.toString(EMPTY_FORMATTER); |
|
448 |
} |
|
449 |
|
|
450 |
@Override |
|
451 |
public String toString(Formatter<Code> formatter) { |
|
452 |
if( formatter.canApply(this) ) { |
|
453 |
return formatter.format(this); |
|
454 |
} |
|
329 | 455 |
StringBuilder builder = new StringBuilder(); |
330 |
builder.append(this.name()); |
|
331 |
builder.append("("); |
|
332 |
if( this.args()!=null ) { |
|
333 |
builder.append(this.args().toString()); |
|
456 |
switch(this.type) { |
|
457 |
case UNARY_OPERATOR: |
|
458 |
if( NegOperator.NAME.equalsIgnoreCase(this.name()) ) { |
|
459 |
builder.append("-"); |
|
460 |
} else { |
|
461 |
builder.append(this.name()); |
|
462 |
} |
|
463 |
builder.append("("); |
|
464 |
builder.append(this.parameters().get(0).toString(formatter)); |
|
465 |
builder.append(")"); |
|
466 |
break; |
|
467 |
case BINARY_OPERATOR: |
|
468 |
builder.append("("); |
|
469 |
builder.append(this.parameters().get(0).toString(formatter)); |
|
470 |
builder.append(" "); |
|
471 |
builder.append(this.name()); |
|
472 |
builder.append(" "); |
|
473 |
builder.append(this.parameters().get(1).toString(formatter)); |
|
474 |
builder.append(")"); |
|
475 |
break; |
|
476 |
case FUNCTION: |
|
477 |
default: |
|
478 |
builder.append(this.name()); |
|
479 |
builder.append("("); |
|
480 |
if( this.parameters()!=null ) { |
|
481 |
builder.append(this.parameters().toString(formatter)); |
|
482 |
} |
|
483 |
builder.append(")"); |
|
334 | 484 |
} |
335 |
builder.append(")"); |
|
336 | 485 |
return builder.toString(); |
337 | 486 |
} |
338 | 487 |
|
... | ... | |
380 | 529 |
|
381 | 530 |
@Override |
382 | 531 |
public String toString() { |
532 |
return this.toString(EMPTY_FORMATTER); |
|
533 |
} |
|
534 |
|
|
535 |
@Override |
|
536 |
public Value toValue(ExpressionBuilder builder) { |
|
537 |
ExpressionBuilder.Method m = builder.method(this.obj.toValue(builder), this.methodname); |
|
538 |
if( this.parameters()!=null ) { |
|
539 |
for (Code parameter : this.parameters()) { |
|
540 |
m.parameter(parameter.toValue(builder)); |
|
541 |
} |
|
542 |
} |
|
543 |
return m; |
|
544 |
} |
|
545 |
|
|
546 |
@Override |
|
547 |
public String toString(Formatter<Code> formatter) { |
|
548 |
if( formatter.canApply(this) ) { |
|
549 |
return formatter.format(this); |
|
550 |
} |
|
383 | 551 |
StringBuilder builder = new StringBuilder(); |
384 |
builder.append(this.obj.toString()); |
|
552 |
builder.append(this.obj.toString(formatter));
|
|
385 | 553 |
builder.append("->"); |
386 | 554 |
builder.append(this.methodname()); |
387 | 555 |
builder.append("("); |
388 |
if( this.args()!=null ) {
|
|
389 |
builder.append(this.args().toString());
|
|
556 |
if( this.parameters()!=null ) {
|
|
557 |
builder.append(this.parameters().toString(formatter));
|
|
390 | 558 |
} |
391 | 559 |
builder.append(")"); |
392 | 560 |
return builder.toString(); |
... | ... | |
446 | 614 |
args.add(arg2); |
447 | 615 |
return function(name, Caller.BINARY_OPERATOR, args); |
448 | 616 |
} |
449 |
|
|
617 |
|
|
450 | 618 |
@Override |
451 | 619 |
public Code not(Code op1) { |
452 | 620 |
return operator(NotOperator.NAME, op1); |
... | ... | |
564 | 732 |
} |
565 | 733 |
|
566 | 734 |
|
735 |
|
|
567 | 736 |
} |
Also available in: Unified diff