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

History | View | Annotate | Download (9.72 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
        @Override
157
        public void add(Code arg) {
158
            this.args.add(arg);
159
        }
160

    
161
        @Override
162
        public Iterator<Code> iterator() {
163
            return this.args.iterator();
164
        }
165

    
166
        @Override
167
        public Code get(int n) {
168
            return this.args.get(n);
169
        }
170

    
171
        @Override
172
        public void accept(Visitor visitor) throws BaseException {
173
            for( Code arg : this.args ) {
174
                visitor.visit(arg);
175
            }
176
        }
177

    
178
        @Override
179
        public String toString() {
180
            if( args != null ) {
181
                StringBuilder builder = new StringBuilder();
182
                boolean skipcoma = true;
183
                for( Code arg : args ) {
184
                    if( skipcoma ) {
185
                        skipcoma = false;
186
                    } else {
187
                        builder.append(", ");
188
                    }
189
                    builder.append(arg.toString());
190
                }
191
                return builder.toString();
192
            }
193
            return "";
194
        }
195

    
196
    }
197

    
198
    public class BaseCaller extends BaseCode implements Caller {
199

    
200
        private final String name;
201
        private final Arguments args;
202
        private Function function;
203
        private final int type;
204

    
205
        public BaseCaller(String name, int type, Arguments args) {
206
            this.name = name;
207
            this.args = args;
208
            this.type = type;
209
            this.function = null;
210
        }
211

    
212
        @Override
213
        public int code() {
214
            return CALLER;
215
        }
216

    
217
        @Override
218
        public Object call(Interpreter interpreter, Object[] args) throws Exception {
219
            return this.function.call(interpreter, args);
220
        }
221

    
222
        @Override
223
        public String name() {
224
            return this.name;
225
        }
226

    
227
        @Override
228
        public Function function() {
229
            return this.function;
230
        }
231

    
232
        @Override
233
        public Function function(Function function) {
234
            this.function = function;
235
            return this.function;
236
        }
237

    
238
        @Override
239
        public Code.Caller.Arguments args() {
240
            return this.args;
241
        }
242

    
243
        @Override
244
        public int type() {
245
            return this.type;
246
        }
247

    
248
        @Override
249
        public void accept(Visitor visitor) throws BaseException {
250
            visitor.visit(this);
251
            this.args.accept(visitor);
252
        }
253

    
254
        @Override
255
        public String toString() {
256
            StringBuilder builder = new StringBuilder();
257
            builder.append(this.name());
258
            builder.append("(");
259
            if( this.args()!=null ) {
260
                builder.append(this.args().toString());
261
            }
262
            builder.append(")");
263
            return builder.toString();
264
        }
265

    
266
    }
267

    
268
    @Override
269
    public Constant constant(Object value) {
270
        return new BaseConstant(value);
271
    }
272

    
273
    @Override
274
    public Identifier identifier(String name) {
275
        return new BaseIdentifier(name);
276
    }
277

    
278
    @Override
279
    public Caller.Arguments args() {
280
        return new BaseArguments();
281
    }
282

    
283
    @Override
284
    public Caller function(String name, int type, Arguments args) {
285
        return new BaseCaller(name, type, args);
286
    }
287

    
288
    @Override
289
    public Caller function(String name, Arguments args) {
290
        return function(name, Caller.FUNCTION, args);
291
    }
292

    
293
    @Override
294
    public Caller operator(String name, Code arg1) {
295
        Arguments args = args();
296
        args.add(arg1);
297
        return function(name, Caller.UNARY_OPERATOR, args);
298
    }
299

    
300
    @Override
301
    public Caller operator(String name, Code arg1, Code arg2) {
302
        Arguments args = args();
303
        args.add(arg1);
304
        args.add(arg2);
305
        return function(name, Caller.BINARY_OPERATOR, args);
306
    }
307

    
308
    @Override
309
    public Code not(Code op1) {
310
        return operator("not", op1);
311
    }
312

    
313
    @Override
314
    public Code add(Code op1, Code op2) {
315
        return operator("+", op1, op2);
316
    }
317

    
318
    @Override
319
    public Code subst(Code op1, Code op2) {
320
        return operator("-", op1, op2);
321
    }
322

    
323
    @Override
324
    public Code mult(Code op1, Code op2) {
325
        return operator("*", op1, op2);
326
    }
327

    
328
    @Override
329
    public Code div(Code op1, Code op2) {
330
        return operator("/", op1, op2);
331
    }
332

    
333
    @Override
334
    public Code mod(Code op1, Code op2) {
335
        return operator("%", op1, op2);
336
    }
337

    
338
    @Override
339
    public Code or(Code op1, Code op2) {
340
        return operator("or", op1, op2);
341
    }
342

    
343
    @Override
344
    public Code and(Code op1, Code op2) {
345
        return operator("and", op1, op2);
346
    }
347

    
348
    @Override
349
    public Code like(Code op1, Code op2) {
350
        return operator("like", op1, op2);
351
    }
352

    
353
    @Override
354
    public Code ilike(Code op1, Code op2) {
355
        return operator("ilike", op1, op2);
356
    }
357

    
358
    @Override
359
    public Code lt(Code op1, Code op2) {
360
        return operator("<", op1, op2);
361
    }
362

    
363
    @Override
364
    public Code gt(Code op1, Code op2) {
365
        return operator(">", op1, op2);
366
    }
367

    
368
    @Override
369
    public Code le(Code op1, Code op2) {
370
        return operator("<=", op1, op2);
371
    }
372

    
373
    @Override
374
    public Code ge(Code op1, Code op2) {
375
        return operator(">=", op1, op2);
376
    }
377

    
378
    @Override
379
    public Code eq(Code op1, Code op2) {
380
        return operator("=", op1, op2);
381
    }
382

    
383
    @Override
384
    public Code ne(Code op1, Code op2) {
385
        return operator("<>", op1, op2);
386
    }
387

    
388
    @Override
389
    public Code is(Code op1, Code op2) {
390
        return operator("is", op1, op2);
391
    }
392

    
393
}