Revision 43809

View differences:

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/SQLLexicalAnalyzer.java
1 1
package org.gvsig.expressionevaluator.impl;
2 2

  
3
import org.gvsig.expressionevaluator.LexicalAnalyzer;
4

  
3 5
public class SQLLexicalAnalyzer extends AbstractLexicalAnalyzer {
4 6

  
5 7
    public SQLLexicalAnalyzer(String source) {
......
23 25
    }
24 26

  
25 27
    @Override
28
    public LexicalAnalyzer clone() throws CloneNotSupportedException {
29
        // As this implementation does not add state to the abstract class, we 
30
        // just call the super class.
31
        SQLLexicalAnalyzer other = (SQLLexicalAnalyzer) super.clone();
32

  
33
        return other;
34
    }
35

  
36
    
37
    @Override
26 38
    protected Token getToken() {
27 39
        skipblanks();
28 40
        char ch = getch();
......
88 100
            }
89 101
            ungetch();
90 102
            parseNumber();
91
            token.literal = "+" + token.literal;
103
            token.setLiteral("+" + token.getLiteral());
92 104
            return token;
93 105
        case '-':
94 106
            ch = getch();
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/DefaultInterpreter.java
75 75
    private SymbolTable symbolTable = null;
76 76
    private Double accuracy;
77 77
    private Code currentCode;
78
    private final Cache cache;
78
    private Cache cache;
79 79

  
80 80
    public DefaultInterpreter() {
81
        this.symbolTable = SQLSymbolTable.getInstance();
82 81
        this.cache = new DefaultCache();
83 82
    }
84 83

  
85 84
    @Override
85
    public Interpreter clone() throws CloneNotSupportedException {
86
        DefaultInterpreter other = (DefaultInterpreter) super.clone();
87
        other.cache = new DefaultCache();
88
        if( this.symbolTable!=null ) {
89
            other.symbolTable = this.symbolTable.clone();
90
        }
91
        
92
        return other;
93
    }
94
            
95
    @Override
86 96
    public Cache getCache() {
87 97
        return this.cache;
88 98
    }
......
94 104

  
95 105
    @Override
96 106
    public SymbolTable getSymbolTable() {
107
        if( this.symbolTable==null ) {
108
            this.symbolTable = SQLSymbolTable.getInstance();
109
        }
97 110
        return this.symbolTable;
98 111
    }
99 112
    @Override
......
124 137
        if( code instanceof Caller ) {
125 138
            Caller caller = (Caller) code;
126 139
            if( caller.function() == null ) {
127
                caller.function(this.symbolTable.function(caller.name()));
140
                caller.function(this.getSymbolTable().function(caller.name()));
128 141
            }
129 142
            if( caller.args() != null ) {
130 143
                for( Code arg : caller.args() ) {
......
144 157

  
145 158
        case Code.IDENTIFIER:
146 159
            String name = ((Identifier) code).name();
147
            if( !symbolTable.exists(name) ) {
160
            if( !this.getSymbolTable().exists(name) ) {
148 161
                throw new RuntimeException("Variable '" + name + "' not found.");
149 162
            }
150
            value = symbolTable.value(name);
163
            value = this.getSymbolTable().value(name);
151 164
            break;
152 165

  
153 166
        case Code.CALLER:
154 167
            Caller caller = (Caller) code;
155 168
            Function function = caller.function();
156 169
            if( function == null ) {
157
                function = this.symbolTable.function(caller.name());
170
                function = this.getSymbolTable().function(caller.name());
158 171
                if( function == null ) {
159 172
                    throw new RuntimeException("Function '" + caller.name() + "' not found.");
160 173
                }
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/AbstractLexicalAnalyzer.java
7 7
import java.util.Locale;
8 8
import java.util.Map;
9 9
import java.util.Stack;
10
import org.gvsig.tools.lang.Cloneable;
10 11

  
11 12
public abstract class AbstractLexicalAnalyzer implements LexicalAnalyzer {
12 13

  
13
    protected class Buffer {
14
    protected class Buffer implements Cloneable {
14 15

  
15 16
        StringBuilder builder;
16 17

  
......
18 19
            this.builder = new StringBuilder();
19 20
        }
20 21

  
22
        @Override
23
        public Buffer clone() throws CloneNotSupportedException {
24
            Buffer other = (Buffer) super.clone(); 
25
            other.builder = new StringBuilder(builder);
26
            return other;
27
        }
28

  
21 29
        public void clear() {
22 30
            builder.delete(0, builder.length());
23 31
        }
......
38 46

  
39 47
    protected static final char EOF = 0;
40 48
    
41
    private final NumberFormat nf;
42
    private final ParsePosition nfPos;
43
    private final Stack<Integer> states;
49
    private NumberFormat nf;
50
    private ParsePosition nfPos;
51
    private Stack<Integer> states;
44 52
    private String source;
45 53
    private int position;
46 54

  
47
    protected final Buffer buffer;
48
    protected final DefaultToken token;
49
    protected final Map<String, Integer> tokens;
55
    protected Buffer buffer;
56
    protected DefaultToken token;
57
    protected Map<String, Integer> tokens;
50 58

  
51 59
    public AbstractLexicalAnalyzer(String source) {
52 60
        this.position = 0;
......
66 74
    }
67 75

  
68 76
    @Override
77
    public LexicalAnalyzer clone() throws CloneNotSupportedException {
78
        AbstractLexicalAnalyzer other = (AbstractLexicalAnalyzer) super.clone();
79
        other.nf = NumberFormat.getInstance(Locale.UK);
80
        other.nfPos = new ParsePosition(0);
81
        other.buffer = buffer.clone();
82
        other.token = (DefaultToken) token.clone();
83
        other.states = new Stack<>();
84
        other.states.addAll(states);
85
        other.tokens = new HashMap<>(tokens);
86
        return other;
87
    }
88
    
89
    @Override
69 90
    public void setSource(String source) {
70 91
        this.source = source;
71 92
        this.position = 0;
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/SQLSymbolTable.java
224 224
        addFunction(new STYFunction());
225 225
        addFunction(new STZFunction());
226 226
    }
227

  
228
    @Override
229
    @SuppressWarnings("CloneDoesntCallSuperClone")
230
    public SymbolTable clone() throws CloneNotSupportedException {
231
        // SQLSymbolTable is singleton and immutable, so we just return 
232
        // the same instance.
233
        return this;
234
    }
227 235
    
228 236
    private void addFunction(Function function) {
229 237
        this.functions.put(function.name().toLowerCase(), function);
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/DefaultCompiler.java
21 21
    }
22 22

  
23 23
    @Override
24
    public Compiler clone() throws CloneNotSupportedException {
25
        DefaultCompiler other = (DefaultCompiler) super.clone();
26
        other.lexer = lexer.clone();
27
        other.codeBuilder = codeBuilder.clone();
28
        
29
        return other;
30
    }
31

  
32
    @Override
24 33
    public void setLexicalAnalyzer(LexicalAnalyzer lexer) {
25 34
        this.lexer = lexer;
26 35
    }
......
29 38
    public void setCodeBuilder(CodeBuilder codeBuilder) {
30 39
        this.codeBuilder = codeBuilder;
31 40
    }
41

  
32 42
    @Override
43
    public CodeBuilder getCodeBuilder() {
44
        return this.codeBuilder;
45
    }
46
    
47
    @Override
33 48
    public Code compileExpression(String expression) {
34 49
        this.lexer.setSource(expression);
35 50
        return parseExpression();
......
255 270
                if( args == null ) {
256 271
                    args = codeBuilder.args();
257 272
                }
258
                args.add(arg);
273
                ((DefaultCodeBuilder.BaseArguments)args).add(arg);
259 274
            }
260 275
            Token next = lexer.look();
261 276
            switch( next.getType() ) {
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/DefaultExpressionEvaluatorManager.java
10 10
import org.gvsig.expressionevaluator.MutableSymbolTable;
11 11
import org.gvsig.expressionevaluator.SymbolTable;
12 12
import org.gvsig.fmap.dal.EvaluatorFactory;
13
import org.gvsig.integration.DefaultEvaluatorFactory;
14
import org.gvsig.integration.DefaultExpressionEvaluator;
13
import org.gvsig.expressionevaluator.integration.DefaultEvaluatorFactory;
14
import org.gvsig.expressionevaluator.integration.DefaultExpressionEvaluator;
15 15

  
16 16

  
17 17
public class DefaultExpressionEvaluatorManager implements ExpressionEvaluatorManager {
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/DefaultSymbolTable.java
11 11

  
12 12
public class DefaultSymbolTable implements MutableSymbolTable {
13 13

  
14
    private SymbolTable symbolTable;
15
    private final Map<String,Object> vars;
16
    private final Map<String,Function> functions;
14
    private SymbolTable delegatedSymbolTable;
15
    private Map<String,Object> vars;
16
    private Map<String,Function> functions;
17 17
    
18
    public DefaultSymbolTable(SymbolTable symbolTable) {
19
        this.symbolTable = symbolTable;
18
    public DefaultSymbolTable(SymbolTable delegatedSymbolTable) {
19
        this.delegatedSymbolTable = delegatedSymbolTable;
20 20
        this.vars = new HashMap<>();
21 21
        this.functions = new HashMap<>();
22 22
    }
......
24 24
    public DefaultSymbolTable() {
25 25
        this(null);
26 26
    }
27

  
28
    @Override
29
    public MutableSymbolTable clone() throws CloneNotSupportedException {
30
        DefaultSymbolTable other = (DefaultSymbolTable) super.clone();
31
        if( this.delegatedSymbolTable!=null ) {
32
            other.delegatedSymbolTable = this.delegatedSymbolTable.clone();
33
        }
34
        other.vars = new HashMap<>(vars);
35
        other.functions = new HashMap<>(functions);
36
        return other;
37
    }
27 38
    
28 39
    @Override
29 40
    public void addVar(String name, Object value) {
......
38 49
    @Override
39 50
    public Function function(String name) {
40 51
        Function fn = this.functions.get(name);
41
        if( fn == null && this.symbolTable != null ) {
42
            fn = this.symbolTable.function(name);
52
        if( fn == null && this.delegatedSymbolTable != null ) {
53
            fn = this.delegatedSymbolTable.function(name);
43 54
        }
44 55
        return fn;
45 56
    }
......
48 59
    public boolean exists(String name) {
49 60
        boolean e = this.vars.containsKey(name);
50 61
        if( !e ) {
51
            e = this.symbolTable.exists(name);
62
            e = this.delegatedSymbolTable.exists(name);
52 63
        }
53 64
        return e;
54 65
    }
......
58 69
        if( this.vars.containsKey(name) ) {
59 70
            return this.vars.get(name);
60 71
        }
61
        return this.symbolTable.value(name);
72
        return this.delegatedSymbolTable.value(name);
62 73
    }
63 74

  
64 75
    @Override
65 76
    public void setSymbolTable(SymbolTable symbolTable) {
66
        this.symbolTable = symbolTable;
77
        this.delegatedSymbolTable = symbolTable;
67 78
    }
68 79

  
69 80
    @Override
70 81
    public SymbolTable getSymbolTable() {
71
        return this.symbolTable;
82
        return this.delegatedSymbolTable;
72 83
    }
73 84

  
74 85
    @Override
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/DefaultToken.java
2 2

  
3 3
import org.gvsig.expressionevaluator.LexicalAnalyzer.Token;
4 4

  
5

  
6 5
public class DefaultToken implements Token {
7 6

  
8 7
    private int type;
9
    String literal;
8
    private String literal;
10 9
    private Object value;
11 10

  
12 11
    public DefaultToken() {
13 12
    }
14 13

  
14
    @Override
15
    public Token clone() throws CloneNotSupportedException {
16
        // We will assume that the properties of the class are immutable, so 
17
        // it would suffice to call the super class.
18
        DefaultToken other = (DefaultToken) super.clone(); 
19
        return other;
20
    }
21

  
22
    
23
    @Override
15 24
    public void set(int type, String literal) {
16 25
        this.set(type, literal, literal);
17 26
    }
18 27

  
28
    @Override
19 29
    public void set(int type, String literal, Object value) {
20 30
        this.literal = literal;
21 31
        this.type = type;
22 32
        this.value = value;
23 33
    }
24 34

  
35
    @Override
25 36
    public int getType() {
26 37
        return type;
27 38
    }
28 39

  
40
    @Override
29 41
    public Object getValue() {
30 42
        return value;
31 43
    }
32 44

  
45
    @Override
33 46
    public String getLiteral() {
34 47
        return literal;
35 48
    }
36 49
    
50
    public void setLiteral(String literal) {
51
        this.literal = literal;
52
    }
53
    
37 54
}
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
153 153
            return this.args.size();
154 154
        }
155 155

  
156
        @Override
157 156
        public void add(Code arg) {
158 157
            this.args.add(arg);
159 158
        }
......
266 265
    }
267 266

  
268 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
269 276
    public Constant constant(Object value) {
270 277
        return new BaseConstant(value);
271 278
    }
......
293 300
    @Override
294 301
    public Caller operator(String name, Code arg1) {
295 302
        Arguments args = args();
296
        args.add(arg1);
303
        ((BaseArguments)args).add(arg1);
297 304
        return function(name, Caller.UNARY_OPERATOR, args);
298 305
    }
299 306

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

  
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/integration/DefaultExpressionEvaluator.java
1
package org.gvsig.expressionevaluator.integration;
2

  
3
import java.util.ArrayList;
4
import java.util.HashSet;
5
import java.util.List;
6
import java.util.Set;
7
import org.gvsig.expressionevaluator.Code;
8
import org.gvsig.expressionevaluator.Interpreter;
9
import org.gvsig.expressionevaluator.LexicalAnalyzer;
10
import org.gvsig.expressionevaluator.SymbolTable;
11
import org.gvsig.expressionevaluator.Compiler;
12
import org.gvsig.expressionevaluator.ExpressionEvaluator;
13
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
14
import org.gvsig.expressionevaluator.Function;
15
import org.gvsig.expressionevaluator.impl.DefaultCompiler;
16
import org.gvsig.expressionevaluator.impl.DefaultInterpreter;
17
import org.gvsig.expressionevaluator.impl.SQLLexicalAnalyzer;
18
import org.gvsig.expressionevaluator.impl.SQLSymbolTable;
19
import org.gvsig.tools.evaluator.AbstractEvaluator;
20
import org.gvsig.tools.evaluator.EvaluatorData;
21
import org.gvsig.tools.evaluator.EvaluatorException;
22
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
23
import org.gvsig.tools.exception.BaseException;
24
import org.gvsig.tools.visitor.VisitCanceledException;
25
import org.gvsig.tools.visitor.Visitor;
26
import org.gvsig.tools.lang.Cloneable;
27

  
28
public class DefaultExpressionEvaluator extends AbstractEvaluator implements ExpressionEvaluator, Cloneable {
29

  
30
    private static class DescriptionAdapter implements Description {
31

  
32
        Function function;
33
        
34
        public DescriptionAdapter(Function function) {
35
            this.function = function;
36
        }
37
        
38
        @Override
39
        public String getName() {
40
            return this.function.name();
41
        }
42

  
43
        @Override
44
        public String getDescription() {
45
            return this.function.description();
46
        }
47

  
48
        @Override
49
        public String getTemplate() {
50
            return this.function.template();
51
        }
52

  
53
        @Override
54
        public int getDataTypeCategories() {
55
            switch(this.function.group()) {
56
            case Function.GROUP_STRING:
57
                return Description.DATATYPE_CATEGORY_STRING;
58
            case Function.GROUP_BOOLEAN:
59
                return Description.DATATYPE_CATEGORY_BOOLEAN;
60
            case Function.GROUP_DATETIME:
61
                return Description.DATATYPE_CATEGORY_DATETIME;
62
            case Function.GROUP_NUMERIC:
63
                return Description.DATATYPE_CATEGORY_NUMBER;
64
            case Function.GROUP_OGC:
65
                return Description.DATATYPE_CATEGORY_ALL;
66
            default:
67
                return Description.DATATYPE_CATEGORY_ALL;
68
            }
69
        }
70
        
71
    } 
72
        
73
    private EvaluatorDataAdapter evaluatorData;
74
    private SymbolTable symbolTable;
75
    private LexicalAnalyzer lexer;
76
    private Compiler compiler;
77
    private Interpreter interpreter;
78
    private Code code;
79
    private String source;
80
    private Description[] availableOperators;
81
    private Description[] availableFunctions;
82
    private Double accuracy;
83

  
84
    public DefaultExpressionEvaluator() {
85
        super();
86
        this.accuracy = ExpressionEvaluatorLocator.getManager().getAccuracy();
87
    }
88

  
89
    @Override
90
    public Code getCode() {
91
        return this.code;
92
    }
93

  
94
    @Override
95
    public void compile() {
96
        if( this.symbolTable == null ) {
97
            this.symbolTable = SQLSymbolTable.getInstance();
98
        }
99
        if( this.lexer == null ) {
100
            this.lexer = new SQLLexicalAnalyzer();
101
        }
102
        if( this.compiler == null ) {
103
            this.compiler = new DefaultCompiler();
104
            this.compiler.setLexicalAnalyzer(lexer);
105
        }        
106
        if( this.interpreter == null ) {
107
            this.interpreter = new DefaultInterpreter();
108
        }
109
        this.evaluatorData = new EvaluatorDataAdapter(symbolTable);
110
        this.interpreter.setAccuracy(this.accuracy); 
111
        this.interpreter.setSymbolTable(this.evaluatorData);
112
        this.code = this.compiler.compileExpression(source);
113
    }
114
    
115
    @Override
116
    public Object evaluate(EvaluatorData data) throws EvaluatorException {
117
        if( this.code == null ) {
118
            this.compile();
119
        }
120
        this.evaluatorData.setData(data);
121
        Object v = this.interpreter.run(code);
122
        return v;
123
    }
124

  
125
    @Override
126
    public String getName() {
127
        return "Genereric expression";
128
    }
129

  
130
    @Override
131
    public EvaluatorFieldsInfo getFieldsInfo() {
132
        final Set<String> names = new HashSet<>();        
133
        try {
134
            this.code.accept(new Visitor() {
135
                @Override
136
                public void visit(Object code) throws VisitCanceledException, BaseException {
137
                    if( code instanceof Code.Identifier ) {
138
                        Code.Identifier identifier = (Code.Identifier) code;
139
                        names.add(identifier.name());
140
                    }
141
                }
142
            });
143
            EvaluatorFieldsInfo info = new EvaluatorFieldsInfo();
144
            for (String name : names) {
145
                info.addFieldValue(name);
146
            }
147
            return info;
148
        } catch (BaseException ex) {
149
            throw new RuntimeException("Can't calculate fields information.", ex);
150
        }
151
    }
152

  
153
    @Override
154
    public Description[] getAvailableOperators() {
155
        if( availableOperators==null ) {
156
            List<Description> l = new ArrayList<>();
157
            for( Function function : symbolTable) {
158
                if( function.isOperator() ) {
159
                    l.add(new DescriptionAdapter(function));
160
                }
161
            }
162
            this.availableOperators = l.toArray(new Description[l.size()]);
163
        }
164
        return availableOperators;
165
    }
166
    
167
    @Override
168
    public Description[] getAvailableFunctions() {
169
        if( availableFunctions==null ) {
170
            List<Description> l = new ArrayList<>();
171
            for( Function function : symbolTable) {
172
                if( !function.isOperator() ) {
173
                    l.add(new DescriptionAdapter(function));
174
                }
175
            }
176
            this.availableFunctions = l.toArray(new Description[l.size()]);
177
        }
178
        return availableFunctions;
179
    }
180
    
181
    @Override
182
    public SymbolTable getSymbolTable() {
183
        return symbolTable;
184
    }
185

  
186
    @Override
187
    public void setSymbolTable(SymbolTable symbolTable) {
188
        this.symbolTable = symbolTable;
189
    }
190

  
191
    @Override
192
    public LexicalAnalyzer getLexer() {
193
        return lexer;
194
    }
195

  
196
    @Override
197
    public void setLexer(LexicalAnalyzer lexer) {
198
        this.lexer = lexer;
199
    }
200

  
201
    @Override
202
    public Compiler getCompiler() {
203
        return compiler;
204
    }
205

  
206
    @Override
207
    public void setCompiler(Compiler compiler) {
208
        this.compiler = compiler;
209
    }
210

  
211
    @Override
212
    public Interpreter getInterpreter() {
213
        return interpreter;
214
    }
215

  
216
    @Override
217
    public void setInterpreter(Interpreter interpreter) {
218
        this.interpreter = interpreter;
219
    }
220

  
221
    @Override
222
    public String getSource() {
223
        return source;
224
    }
225

  
226
    @Override
227
    public void setSource(String source) {
228
        this.source = source;
229
        this.code = null;
230
    }
231
    
232
    @Override
233
    public Double getAccuracy() {
234
        return this.accuracy;
235
    }
236
    
237
    @Override
238
    public void setAccuracy(Double accuracy) {
239
        this.accuracy = accuracy;
240
    }
241

  
242
    @Override
243
    public ExpressionEvaluator clone() throws CloneNotSupportedException {
244
        DefaultExpressionEvaluator other = (DefaultExpressionEvaluator) super.clone();
245
        other.code = this.code;
246
        other.source = this.source;
247
        other.accuracy = this.accuracy;
248
        other.availableFunctions = null;
249
        other.availableOperators = null;
250

  
251
        if( this.symbolTable!=null ) {
252
            other.symbolTable = this.symbolTable.clone();
253
        }
254
        if( this.lexer!=null ) {
255
            other.lexer = this.lexer.clone();
256
        }
257
        if( this.evaluatorData!=null ) {
258
            // evaluatorData don't support clone.
259
            other.evaluatorData = new EvaluatorDataAdapter(other.symbolTable);
260
        }
261
        if( this.compiler!=null ) {
262
            other.compiler = this.compiler.clone();
263
            other.compiler.setLexicalAnalyzer(other.lexer);
264
        }
265
        if( this.interpreter!=null ) {
266
            other.interpreter = this.interpreter.clone();
267
            other.interpreter.setAccuracy(this.accuracy);
268
            other.interpreter.setSymbolTable(other.symbolTable);
269
        }
270
        return other;
271
    }
272

  
273
}
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/integration/EvaluatorDataAdapter.java
1

  
2
package org.gvsig.expressionevaluator.integration;
3

  
4
import java.util.Iterator;
5
import org.gvsig.expressionevaluator.Function;
6
import org.gvsig.expressionevaluator.SymbolTable;
7
import org.gvsig.tools.evaluator.EvaluatorData;
8

  
9

  
10
public class EvaluatorDataAdapter implements SymbolTable {
11

  
12
    private EvaluatorData data;
13
    private final SymbolTable symbolTable;
14

  
15
    EvaluatorDataAdapter(SymbolTable symbolTable) {
16
        this.symbolTable = symbolTable;
17
    }
18

  
19
    public void setData(EvaluatorData data) {
20
        this.data = data;
21
    }
22

  
23
    @Override
24
    public Function function(String name) {
25
        return symbolTable.function(name);
26
    }
27

  
28
    @Override
29
    @SuppressWarnings("CloneDoesntCallSuperClone")
30
    public SymbolTable clone() throws CloneNotSupportedException {
31
        throw new CloneNotSupportedException("This class can't be cloned.");
32
    }
33
    
34
    @Override
35
    public boolean exists(String name) {
36
        if( data.hasDataValue(name) ) {
37
            return true;
38
        }
39
        if( data.hasContextValue(name) ) {
40
            return true;
41
        }
42
        return symbolTable.exists(name);
43
    }
44

  
45
    @Override
46
    public Object value(String name) {
47
        if( data.hasDataValue(name) ) {
48
            return data.getDataValue(name);
49
        }
50
        if( data.hasContextValue(name) ) {
51
            return data.getContextValue(name);
52
        }
53
        return symbolTable.value(name);
54
    }
55

  
56
    @Override
57
    public Iterator<String> itervars() {
58
        return null;
59
    }
60

  
61
    @Override
62
    public Iterator<Function> iterfuncs() {
63
        return symbolTable.iterfuncs();
64
    }
65

  
66
    @Override
67
    public Iterator<Function> iterator() {
68
        return symbolTable.iterfuncs();
69
    }
70

  
71
}
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/integration/DefaultEvaluatorFactory.java
1
package org.gvsig.expressionevaluator.integration;
2

  
3
import org.gvsig.expressionevaluator.ExpressionEvaluator;
4
import org.gvsig.fmap.dal.EvaluatorFactory;
5
import org.gvsig.tools.evaluator.Evaluator;
6

  
7

  
8
public class DefaultEvaluatorFactory implements EvaluatorFactory {
9

  
10
    @Override
11
    public Evaluator createEvaluator(String expression) {
12
        ExpressionEvaluator evaluator = new DefaultExpressionEvaluator();
13
        evaluator.setSource(expression);
14
        return evaluator;
15
    }
16

  
17
    @Override
18
    public String getName() {
19
        return "SQL expression evaluator";
20
    }
21
    
22
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/SymbolTable.java
2 2

  
3 3
import java.util.Iterator;
4 4

  
5
public interface SymbolTable extends Iterable<Function>{
5
import org.gvsig.tools.lang.Cloneable;
6 6

  
7
public interface SymbolTable extends Iterable<Function>, Cloneable {
8

  
7 9
    public Function function(String name);
8 10
    
9 11
    public boolean exists(String name);
......
13 15
    public Iterator<String> itervars();
14 16
    
15 17
    public Iterator<Function> iterfuncs();
18

  
19
    @Override
20
    public SymbolTable clone() throws CloneNotSupportedException;
21
    
22
    
16 23
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/CodeBuilder.java
5 5
import org.gvsig.expressionevaluator.Code.Constant;
6 6
import org.gvsig.expressionevaluator.Code.Identifier;
7 7

  
8
public interface CodeBuilder {
9
        
8
import org.gvsig.tools.lang.Cloneable;
9

  
10
public interface CodeBuilder extends Cloneable {
11

  
12
    @Override
13
    public CodeBuilder clone() throws CloneNotSupportedException;    
14
    
10 15
    Constant constant(Object value);
11 16

  
12 17
    Identifier identifier(String name);
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/ExpressionEvaluator.java
1 1
package org.gvsig.expressionevaluator;
2 2

  
3 3
import org.gvsig.tools.evaluator.EvaluatorWithDescriptions;
4
import org.gvsig.tools.lang.Cloneable;
4 5

  
5
public interface ExpressionEvaluator extends EvaluatorWithDescriptions {
6
public interface ExpressionEvaluator extends EvaluatorWithDescriptions, Cloneable  {
6 7

  
7 8
    public void compile();
8 9

  
......
31 32
    public Double getAccuracy();
32 33
    
33 34
    public void setAccuracy(Double accuracy);     
35

  
36
    @Override
37
    public ExpressionEvaluator clone() throws CloneNotSupportedException;
34 38
    
39
    
40
    
35 41
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/Interpreter.java
1 1
package org.gvsig.expressionevaluator;
2 2

  
3
public interface Interpreter {
3
import org.gvsig.tools.lang.Cloneable;
4 4

  
5
public interface Interpreter extends Cloneable {
6

  
5 7
    public interface Cache {
6 8
        
7 9
        public Object get(Object context, Object key);
......
28 30
    public Code getCurrentCode();
29 31
    
30 32
    public Cache getCache();
33

  
34
    @Override
35
    public Interpreter clone() throws CloneNotSupportedException;
36
    
37
    
31 38
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/LexicalAnalyzer.java
1 1
package org.gvsig.expressionevaluator;
2 2

  
3
public interface LexicalAnalyzer {
4 3

  
5
    public interface Token {
4
import org.gvsig.tools.lang.Cloneable;
6 5

  
6

  
7
public interface LexicalAnalyzer extends Cloneable {
8

  
9
    public interface Token extends Cloneable {
10

  
7 11
        public static final int EOF = -1;
8 12
        public static final int IDENTIFIER = 0;
9 13
        public static final int STRING_LITERAL = 1;
......
37 41
        public static final int PARENTHESIS_CLOSE = 31;
38 42
        public static final int COMA = 32;
39 43

  
44
        @Override
45
        public Token clone() throws CloneNotSupportedException;
46
        
40 47
        public void set(int type, String literal);
41 48

  
42 49
        public void set(int type, String literal, Object value);
......
55 62

  
56 63
    public Token next();
57 64

  
65
    @Override
66
    public LexicalAnalyzer clone() throws CloneNotSupportedException;
67

  
68
    
58 69
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/MutableSymbolTable.java
14 14
    public void removeVar(String name);
15 15
    
16 16
    public void removeFunction(String name);
17
    
18
    @Override
19
    public MutableSymbolTable clone() throws CloneNotSupportedException;
17 20
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/Code.java
27 27

  
28 28
        public interface Arguments extends Iterable<Code>, Visitable {
29 29

  
30
            public void add(Code arg);
31

  
32 30
            public int count();
33 31

  
34 32
            @Override
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/Compiler.java
1 1
package org.gvsig.expressionevaluator;
2 2

  
3
import org.gvsig.tools.lang.Cloneable;
3 4

  
4
public interface Compiler {
5
public interface Compiler extends Cloneable {
5 6
    
6 7
    public void setLexicalAnalyzer(LexicalAnalyzer lex);
7 8
    
8 9
    public void setCodeBuilder(CodeBuilder codeBuilder);
9 10
    
11
    public CodeBuilder getCodeBuilder();
12
    
10 13
    public Code compileExpression(String expression);
11 14

  
15
    @Override
16
    public Compiler clone() throws CloneNotSupportedException;
17

  
18
    
12 19
}

Also available in: Unified diff