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

History | View | Annotate | Download (10.1 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 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
import org.gvsig.expressionevaluator.Interpreter;
19
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
//        @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

    
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
        @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
    }
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
        @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
    }
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
            for( Code arg : this.args ) {
173
                visitor.visit(arg);
174
            }
175
        }
176

    
177
        @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
    }
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
        public Object call(Interpreter interpreter, Object[] args) throws Exception {
218
            return this.function.call(interpreter, args);
219
        }
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
        @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
    }
266

    
267
    @Override
268
    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
    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
        ((BaseArguments)args).add(arg1);
304
        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
        ((BaseArguments)args).add(arg1);
311
        ((BaseArguments)args).add(arg2);
312
        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
    public Code regexp(Code op1, Code op2) {
367
        return operator("~", op1, op2);
368
    }
369

    
370
    @Override
371
    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
}