Statistics
| Revision:

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 @ 44009

History | View | Annotate | Download (10.8 KB)

1
package org.gvsig.expressionevaluator.impl;
2

    
3
import java.util.ArrayList;
4
import java.util.Iterator;
5
import java.util.List;
6
import org.apache.commons.lang3.StringUtils;
7
import org.gvsig.expressionevaluator.Code;
8
import static org.gvsig.expressionevaluator.Code.CALLER;
9
import static org.gvsig.expressionevaluator.Code.CONSTANT;
10
import static org.gvsig.expressionevaluator.Code.IDENTIFIER;
11
import static org.gvsig.expressionevaluator.Code.UNDEFINED;
12
import org.gvsig.expressionevaluator.Code.Caller;
13
import org.gvsig.expressionevaluator.Code.Caller.Arguments;
14
import org.gvsig.expressionevaluator.Code.Constant;
15
import org.gvsig.expressionevaluator.Code.Identifier;
16
import org.gvsig.expressionevaluator.Code.Method;
17
import org.gvsig.expressionevaluator.CodeBuilder;
18
import org.gvsig.expressionevaluator.Function;
19
import org.gvsig.expressionevaluator.Interpreter;
20
import org.gvsig.fmap.geom.Geometry;
21
import org.gvsig.tools.exception.BaseException;
22
import org.gvsig.tools.visitor.Visitor;
23

    
24
@SuppressWarnings("UseSpecificCatch")
25
    public class DefaultCodeBuilder implements CodeBuilder {
26

    
27
    public class BaseCode implements Code {
28

    
29
        @Override
30
        public int code() {
31
            return UNDEFINED;
32
        }
33

    
34
        @Override
35
        public void accept(Visitor visitor) throws BaseException {
36
            visitor.visit(this);
37
        }
38

    
39
    }
40

    
41
    class BaseConstant extends BaseCode implements Constant {
42

    
43
        private final Object value;
44

    
45
        public BaseConstant(Object value) {
46
            this.value = value;
47
        }
48

    
49
        @Override
50
        public int code() {
51
            return CONSTANT;
52
        }
53

    
54
        @Override
55
        public Object value() {
56
            return this.value;
57
        }
58

    
59
        @Override
60
        public String toString() {
61
            StringBuilder builder = new StringBuilder();
62
            Object v = this.value();
63
            if( v instanceof CharSequence ) {
64
                v = StringUtils.wrap(v.toString(), "'");
65
                builder.append(v);
66
                
67
            } else if( v instanceof Geometry ) {
68
                try {
69
                    builder.append("'");
70
                    builder.append(((Geometry) v).convertToWKT());
71
                    builder.append("'::geometry");
72
                } catch (Exception ex) {
73
                    builder.append("'UNKNOW'::geometry");
74
                }
75
                
76
            } else {
77
                builder.append(v);
78
            }
79
            return builder.toString();
80
        }
81

    
82
    }
83

    
84
    public class BaseIdentifier extends BaseCode implements Identifier {
85

    
86
        String name;
87

    
88
        public BaseIdentifier(String name) {
89
            this.name = name;
90
        }
91

    
92
        @Override
93
        public int code() {
94
            return IDENTIFIER;
95
        }
96

    
97
        @Override
98
        public String name() {
99
            return this.name;
100
        }
101

    
102
        @Override
103
        public String toString() {
104
            StringBuilder builder = new StringBuilder();
105
            builder.append("\"");
106
            builder.append(this.name());
107
            builder.append("\"");
108
            return builder.toString();
109
        }
110

    
111
    }
112

    
113
    public class BaseArguments implements Arguments {
114

    
115
        private final List<Code> args;
116

    
117
        public BaseArguments() {
118
            this.args = new ArrayList<>();
119
        }
120

    
121
        @Override
122
        public int count() {
123
            if( args == null ) {
124
                return 0;
125
            }
126
            return this.args.size();
127
        }
128

    
129
        public void add(Code arg) {
130
            this.args.add(arg);
131
        }
132

    
133
        @Override
134
        public Iterator<Code> iterator() {
135
            return this.args.iterator();
136
        }
137

    
138
        @Override
139
        public Code get(int n) {
140
            return this.args.get(n);
141
        }
142

    
143
        @Override
144
        public void accept(Visitor visitor) throws BaseException {
145
            for( Code arg : this.args ) {
146
                visitor.visit(arg);
147
            }
148
        }
149

    
150
        @Override
151
        public String toString() {
152
            if( args != null ) {
153
                StringBuilder builder = new StringBuilder();
154
                boolean skipcoma = true;
155
                for( Code arg : args ) {
156
                    if( skipcoma ) {
157
                        skipcoma = false;
158
                    } else {
159
                        builder.append(", ");
160
                    }
161
                    builder.append(arg.toString());
162
                }
163
                return builder.toString();
164
            }
165
            return "";
166
        }
167

    
168
    }
169

    
170
    public class BaseCaller extends BaseCode implements Caller {
171

    
172
        private final String name;
173
        private final Arguments args;
174
        private Function function;
175
        private final int type;
176

    
177
        public BaseCaller(String name, int type, Arguments args) {
178
            this.name = name;
179
            this.args = args;
180
            this.type = type;
181
            this.function = null;
182
        }
183

    
184
        @Override
185
        public int code() {
186
            return CALLER;
187
        }
188

    
189
        @Override
190
        public Object call(Interpreter interpreter, Object[] args) throws Exception {
191
            return this.function.call(interpreter, args);
192
        }
193

    
194
        @Override
195
        public String name() {
196
            return this.name;
197
        }
198

    
199
        @Override
200
        public Function function() {
201
            return this.function;
202
        }
203

    
204
        @Override
205
        public Function function(Function function) {
206
            this.function = function;
207
            return this.function;
208
        }
209

    
210
        @Override
211
        public Code.Caller.Arguments args() {
212
            return this.args;
213
        }
214

    
215
        @Override
216
        public int type() {
217
            return this.type;
218
        }
219

    
220
        @Override
221
        public void accept(Visitor visitor) throws BaseException {
222
            visitor.visit(this);
223
            this.args.accept(visitor);
224
        }
225

    
226
        @Override
227
        public String toString() {
228
            StringBuilder builder = new StringBuilder();
229
            builder.append(this.name());
230
            builder.append("(");
231
            if( this.args()!=null ) {
232
                builder.append(this.args().toString());
233
            }
234
            builder.append(")");
235
            return builder.toString();
236
        }
237

    
238
    }
239

    
240
    public class BaseMethod extends BaseCaller implements Method {
241

    
242
        private final Code obj;
243
        private final String methodname;
244
        
245
        public BaseMethod(Code obj, String methodname, Arguments args) {
246
            super(methodname, FUNCTION, args);
247
            this.obj = obj;
248
            this.methodname = methodname;
249
        }
250

    
251
        @Override
252
        public int code() {
253
            return METHOD;
254
        }
255
        
256
        @Override
257
        public String methodname() {
258
            return this.methodname;
259
        }
260

    
261
        @Override
262
        public Code obj() {
263
            return this.obj;
264
        }
265

    
266
        @Override
267
        public String toString() {
268
            StringBuilder builder = new StringBuilder();
269
            builder.append(this.obj.toString());
270
            builder.append("->");
271
            builder.append(this.methodname());
272
            builder.append("(");
273
            if( this.args()!=null ) {
274
                builder.append(this.args().toString());
275
            }
276
            builder.append(")");
277
            return builder.toString();
278
        }
279
    }    
280
    
281
    @Override
282
    public CodeBuilder clone() throws CloneNotSupportedException {
283
        // This implementation of CodeBuilder does not maintain state, so 
284
        // we only call the super class.
285
        DefaultCodeBuilder other = (DefaultCodeBuilder) super.clone();
286
        return other;
287
    }
288

    
289
    @Override
290
    public Constant constant(Object value) {
291
        return new BaseConstant(value);
292
    }
293

    
294
    @Override
295
    public Identifier identifier(String name) {
296
        return new BaseIdentifier(name);
297
    }
298

    
299
    @Override
300
    public Caller.Arguments args() {
301
        return new BaseArguments();
302
    }
303

    
304
    @Override
305
    public Caller function(String name, int type, Arguments args) {
306
        return new BaseCaller(name, type, args);
307
    }
308

    
309
    @Override
310
    public Caller function(String name, Arguments args) {
311
        return function(name, Caller.FUNCTION, args);
312
    }
313
    
314
    @Override
315
    public Code method(Code obj, String methodname, Arguments methodargs) {
316
        Method m = new BaseMethod(obj, methodname, methodargs);
317
        return m;
318
    }
319
    
320
    @Override
321
    public Caller operator(String name, Code arg1) {
322
        Arguments args = args();
323
        ((BaseArguments)args).add(arg1);
324
        return function(name, Caller.UNARY_OPERATOR, args);
325
    }
326

    
327
    @Override
328
    public Caller operator(String name, Code arg1, Code arg2) {
329
        Arguments args = args();
330
        ((BaseArguments)args).add(arg1);
331
        ((BaseArguments)args).add(arg2);
332
        return function(name, Caller.BINARY_OPERATOR, args);
333
    }
334

    
335
    @Override
336
    public Code not(Code op1) {
337
        return operator("not", op1);
338
    }
339

    
340
    @Override
341
    public Code add(Code op1, Code op2) {
342
        return operator("+", op1, op2);
343
    }
344

    
345
    @Override
346
    public Code subst(Code op1, Code op2) {
347
        return operator("-", op1, op2);
348
    }
349

    
350
    @Override
351
    public Code mult(Code op1, Code op2) {
352
        return operator("*", op1, op2);
353
    }
354

    
355
    @Override
356
    public Code div(Code op1, Code op2) {
357
        return operator("/", op1, op2);
358
    }
359

    
360
    @Override
361
    public Code mod(Code op1, Code op2) {
362
        return operator("%", op1, op2);
363
    }
364

    
365
    @Override
366
    public Code or(Code op1, Code op2) {
367
        return operator("or", op1, op2);
368
    }
369

    
370
    @Override
371
    public Code and(Code op1, Code op2) {
372
        return operator("and", op1, op2);
373
    }
374

    
375
    @Override
376
    public Code like(Code op1, Code op2) {
377
        return operator("like", op1, op2);
378
    }
379

    
380
    @Override
381
    public Code ilike(Code op1, Code op2) {
382
        return operator("ilike", op1, op2);
383
    }
384

    
385
    @Override
386
    public Code regexp(Code op1, Code op2) {
387
        return operator("~", op1, op2);
388
    }
389

    
390
    @Override
391
    public Code lt(Code op1, Code op2) {
392
        return operator("<", op1, op2);
393
    }
394

    
395
    @Override
396
    public Code gt(Code op1, Code op2) {
397
        return operator(">", op1, op2);
398
    }
399

    
400
    @Override
401
    public Code le(Code op1, Code op2) {
402
        return operator("<=", op1, op2);
403
    }
404

    
405
    @Override
406
    public Code ge(Code op1, Code op2) {
407
        return operator(">=", op1, op2);
408
    }
409

    
410
    @Override
411
    public Code eq(Code op1, Code op2) {
412
        return operator("=", op1, op2);
413
    }
414

    
415
    @Override
416
    public Code ne(Code op1, Code op2) {
417
        return operator("<>", op1, op2);
418
    }
419

    
420
    @Override
421
    public Code is(Code op1, Code op2) {
422
        return operator("is", op1, op2);
423
    }
424

    
425
    @Override
426
    public Code getattr(Code obj, String attrname) {
427
        Arguments args = args();
428
        ((BaseArguments)args).add(obj);
429
        ((BaseArguments)args).add(constant(attrname));
430
        return function("getattr", args);
431
    }    
432

    
433
}