org.gvsig.expressionevaluator#4867.diff

JoaquĆ­n del Cerro Murciano, 05/08/2018 05:56 PM

Download (40.9 KB)

View differences:

org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/Code.java (copia de trabajo)
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
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/CodeBuilder.java (copia de trabajo)
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);
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/Compiler.java (copia de trabajo)
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
}
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/ExpressionEvaluator.java (copia de trabajo)
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
}
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/Interpreter.java (copia de trabajo)
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
}
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/LexicalAnalyzer.java (copia de trabajo)
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
}
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/MutableSymbolTable.java (copia de trabajo)
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
}
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/SymbolTable.java (copia de trabajo)
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
}
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/AbstractLexicalAnalyzer.java (copia de trabajo)
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;
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultCodeBuilder.java (copia de trabajo)
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

  
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultCompiler.java (copia de trabajo)
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() ) {
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultExpressionEvaluatorManager.java (copia de trabajo)
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 {
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultInterpreter.java (copia de trabajo)
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
                }
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultSymbolTable.java (copia de trabajo)
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
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultToken.java (copia de trabajo)
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
}
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/SQLLexicalAnalyzer.java (copia de trabajo)
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();
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/SQLSymbolTable.java (copia de trabajo)
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);
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/integration/DefaultEvaluatorFactory.java (copia de trabajo)
1
package org.gvsig.integration;
1
package org.gvsig.expressionevaluator.integration;
2 2

  
3 3
import org.gvsig.expressionevaluator.ExpressionEvaluator;
4 4
import org.gvsig.fmap.dal.EvaluatorFactory;
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/integration/DefaultExpressionEvaluator.java (copia de trabajo)
1
package org.gvsig.integration;
1
package org.gvsig.expressionevaluator.integration;
2 2

  
3 3
import java.util.ArrayList;
4
import java.util.HashSet;
4 5
import java.util.List;
6
import java.util.Set;
5 7
import org.gvsig.expressionevaluator.Code;
6 8
import org.gvsig.expressionevaluator.Interpreter;
7 9
import org.gvsig.expressionevaluator.LexicalAnalyzer;
......
17 19
import org.gvsig.tools.evaluator.AbstractEvaluator;
18 20
import org.gvsig.tools.evaluator.EvaluatorData;
19 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;
20 27

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

  
23 30
    private static class DescriptionAdapter implements Description {
24 31

  
......
73 80
    private Description[] availableOperators;
74 81
    private Description[] availableFunctions;
75 82
    private Double accuracy;
76
        
77 83

  
78 84
    public DefaultExpressionEvaluator() {
79 85
        super();
......
122 128
    }
123 129

  
124 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
125 154
    public Description[] getAvailableOperators() {
126 155
        if( availableOperators==null ) {
127 156
            List<Description> l = new ArrayList<>();
......
209 238
    public void setAccuracy(Double accuracy) {
210 239
        this.accuracy = accuracy;
211 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

  
212 273
}
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/integration/EvaluatorDataAdapter.java (copia de trabajo)
1 1

  
2
package org.gvsig.integration;
2
package org.gvsig.expressionevaluator.integration;
3 3

  
4 4
import java.util.Iterator;
5 5
import org.gvsig.expressionevaluator.Function;
......
26 26
    }
27 27

  
28 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
29 35
    public boolean exists(String name) {
30 36
        if( data.hasDataValue(name) ) {
31 37
            return true;
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/integration/DefaultEvaluatorFactory.java (nonexistent)
1
package org.gvsig.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
}
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/integration/DefaultExpressionEvaluator.java (nonexistent)
1
package org.gvsig.integration;
2

  
3
import java.util.ArrayList;
4
import java.util.List;
5
import org.gvsig.expressionevaluator.Code;
6
import org.gvsig.expressionevaluator.Interpreter;
7
import org.gvsig.expressionevaluator.LexicalAnalyzer;
8
import org.gvsig.expressionevaluator.SymbolTable;
9
import org.gvsig.expressionevaluator.Compiler;
10
import org.gvsig.expressionevaluator.ExpressionEvaluator;
11
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
12
import org.gvsig.expressionevaluator.Function;
13
import org.gvsig.expressionevaluator.impl.DefaultCompiler;
14
import org.gvsig.expressionevaluator.impl.DefaultInterpreter;
15
import org.gvsig.expressionevaluator.impl.SQLLexicalAnalyzer;
16
import org.gvsig.expressionevaluator.impl.SQLSymbolTable;
17
import org.gvsig.tools.evaluator.AbstractEvaluator;
18
import org.gvsig.tools.evaluator.EvaluatorData;
19
import org.gvsig.tools.evaluator.EvaluatorException;
20

  
21
public class DefaultExpressionEvaluator extends AbstractEvaluator implements ExpressionEvaluator {
22

  
23
    private static class DescriptionAdapter implements Description {
24

  
25
        Function function;
26
        
27
        public DescriptionAdapter(Function function) {
28
            this.function = function;
29
        }
30
        
31
        @Override
32
        public String getName() {
33
            return this.function.name();
34
        }
35

  
36
        @Override
37
        public String getDescription() {
38
            return this.function.description();
39
        }
40

  
41
        @Override
42
        public String getTemplate() {
43
            return this.function.template();
44
        }
45

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

  
78
    public DefaultExpressionEvaluator() {
79
        super();
80
        this.accuracy = ExpressionEvaluatorLocator.getManager().getAccuracy();
81
    }
82

  
83
    @Override
84
    public Code getCode() {
85
        return this.code;
86
    }
87

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

  
119
    @Override
120
    public String getName() {
121
        return "Genereric expression";
122
    }
123

  
124
    @Override
125
    public Description[] getAvailableOperators() {
126
        if( availableOperators==null ) {
127
            List<Description> l = new ArrayList<>();
128
            for( Function function : symbolTable) {
129
                if( function.isOperator() ) {
130
                    l.add(new DescriptionAdapter(function));
131
                }
132
            }
133
            this.availableOperators = l.toArray(new Description[l.size()]);
134
        }
135
        return availableOperators;
136
    }
137
    
138
    @Override
139
    public Description[] getAvailableFunctions() {
140
        if( availableFunctions==null ) {
141
            List<Description> l = new ArrayList<>();
142
            for( Function function : symbolTable) {
143
                if( !function.isOperator() ) {
144
                    l.add(new DescriptionAdapter(function));
145
                }
146
            }
147
            this.availableFunctions = l.toArray(new Description[l.size()]);
148
        }
149
        return availableFunctions;
150
    }
151
    
152
    @Override
153
    public SymbolTable getSymbolTable() {
154
        return symbolTable;
155
    }
156

  
157
    @Override
158
    public void setSymbolTable(SymbolTable symbolTable) {
159
        this.symbolTable = symbolTable;
160
    }
161

  
162
    @Override
163
    public LexicalAnalyzer getLexer() {
164
        return lexer;
165
    }
166

  
167
    @Override
168
    public void setLexer(LexicalAnalyzer lexer) {
169
        this.lexer = lexer;
170
    }
171

  
172
    @Override
173
    public Compiler getCompiler() {
174
        return compiler;
175
    }
176

  
177
    @Override
178
    public void setCompiler(Compiler compiler) {
179
        this.compiler = compiler;
180
    }
181

  
182
    @Override
183
    public Interpreter getInterpreter() {
184
        return interpreter;
185
    }
186

  
187
    @Override
188
    public void setInterpreter(Interpreter interpreter) {
189
        this.interpreter = interpreter;
190
    }
191

  
192
    @Override
193
    public String getSource() {
194
        return source;
195
    }
196

  
197
    @Override
198
    public void setSource(String source) {
199
        this.source = source;
200
        this.code = null;
201
    }
202
    
203
    @Override
204
    public Double getAccuracy() {
205
        return this.accuracy;
206
    }
207
    
208
    @Override
209
    public void setAccuracy(Double accuracy) {
210
        this.accuracy = accuracy;
211
    }
212
}
org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/integration/EvaluatorDataAdapter.java (nonexistent)
1

  
2
package org.gvsig.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
    public boolean exists(String name) {
30
        if( data.hasDataValue(name) ) {
31
            return true;
32
        }
33
        if( data.hasContextValue(name) ) {
34
            return true;
35
        }
36
        return symbolTable.exists(name);
37
    }
38

  
39
    @Override
40
    public Object value(String name) {
41
        if( data.hasDataValue(name) ) {
42
            return data.getDataValue(name);
43
        }
44
        if( data.hasContextValue(name) ) {
45
            return data.getContextValue(name);
46
        }
47
        return symbolTable.value(name);
48
    }
49

  
50
    @Override
51
    public Iterator<String> itervars() {
52
        return null;
53
    }
54

  
55
    @Override
56
    public Iterator<Function> iterfuncs() {
57
        return symbolTable.iterfuncs();
58
    }
59

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

  
65
}