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

View differences:

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