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 / DefaultExpression.java @ 45789

History | View | Annotate | Download (9.36 KB)

1
package org.gvsig.expressionevaluator.impl;
2

    
3
import java.lang.ref.WeakReference;
4
import java.util.Objects;
5
import javax.json.JsonObject;
6
import org.apache.commons.lang3.StringUtils;
7
import org.gvsig.expressionevaluator.Code;
8
import org.gvsig.expressionevaluator.Compiler;
9
import org.gvsig.expressionevaluator.Expression;
10
import org.gvsig.expressionevaluator.ExpressionEvaluator;
11
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
12
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
13
import org.gvsig.expressionevaluator.ExpressionUtils;
14
import org.gvsig.expressionevaluator.Interpreter;
15
import org.gvsig.expressionevaluator.Optimizer;
16
import org.gvsig.expressionevaluator.SymbolTable;
17
import org.gvsig.json.Json;
18
import org.gvsig.json.JsonManager;
19
import org.gvsig.json.JsonObjectBuilder;
20
import org.gvsig.json.SupportToJson;
21
import org.gvsig.tools.ToolsLocator;
22
import org.gvsig.tools.dynobject.DynStruct;
23
import org.gvsig.tools.evaluator.Evaluator;
24
import org.gvsig.tools.persistence.PersistenceManager;
25
import org.gvsig.tools.persistence.PersistentState;
26
import org.gvsig.tools.persistence.exception.PersistenceException;
27
import org.gvsig.tools.script.ScriptManager;
28
import org.gvsig.tools.util.LabeledValue;
29

    
30
/**
31
 *
32
 * @author jjdelcerro
33
 */
34
public class DefaultExpression implements Expression, LabeledValue<Expression> {
35

    
36
    private String phrase = null;
37

    
38
    private Code code = null;
39
    private Interpreter interpreter;
40
    private boolean hasNotBeenOptimized = true;
41
    private SymbolTable mySymbolTable = null;
42
    private WeakReference<SymbolTable> lastSymbolTable = null;    
43
    private boolean useBracketsForIdentifiers = false;
44
    protected ExpressionEvaluatorManager manager;
45

    
46
    public DefaultExpression() {
47
        this(ExpressionEvaluatorLocator.getExpressionEvaluatorManager());
48
    }
49

    
50
    public DefaultExpression(ExpressionEvaluatorManager manager) {
51
        this.manager = manager;
52
    }
53
    
54
    @Override
55
    public String getLabel() {
56
        return StringUtils.abbreviate(
57
                StringUtils.normalizeSpace(this.getPhrase()),
58
                35
59
        );
60
    }
61

    
62
    @Override
63
    public Expression getValue() {
64
        return this;
65
    }
66

    
67
    @Override
68
    public boolean equals(Object obj) {
69
        if( obj == null || !(obj instanceof Expression) ) {
70
            return false;
71
        }
72
        String this_s = this.toJSON();
73
        String other_s = ((Expression)obj).toJSON();
74
        return this_s.equals(other_s);
75
    }
76

    
77
    @Override
78
    public int hashCode() {
79
        String this_s = this.toJSON();
80
        return Objects.hashCode(this_s);
81
    }
82
    
83
    @Override
84
    public SymbolTable getSymbolTable() {
85
        if( this.mySymbolTable==null ) {
86
            this.mySymbolTable = ExpressionUtils.createSymbolTable();
87
        }
88
        return this.mySymbolTable;
89
    }
90

    
91
    @Override
92
    public String getPhrase() {
93
        return this.phrase;
94
    }
95

    
96
    @Override
97
    public boolean isPhraseEmpty() {
98
        return StringUtils.isBlank(this.phrase);
99
    }
100

    
101
    @Override
102
    public boolean isEmpty() {
103
        if( !StringUtils.isBlank(this.phrase) ) {
104
            return false;
105
        }
106
        return true;
107
    }
108

    
109
    @Override
110
    public Expression setPhrase(String phrase) {
111
        this.phrase = phrase;
112
        this.code = null;
113
        this.hasNotBeenOptimized = true;
114
        return this;
115
    }
116

    
117
    @Override
118
    public void clear() {
119
        this.phrase = null;
120
        this.code = null;
121
        this.interpreter = null;
122
        this.hasNotBeenOptimized = true;
123
    }
124

    
125
    @Override
126
    public Code getCode() {
127
        if (this.code == null) {
128
            Compiler compiler = this.manager.createCompiler();
129
            compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(
130
                    this.useBracketsForIdentifiers
131
            );
132
            this.code = compiler.compileExpression(this.phrase);
133
        }
134
        return code;
135
    }
136

    
137
    @Override
138
    public void setSQLCompatible(boolean sqlCompatible) {
139
        this.getInterpreter().setSQLCompatible(sqlCompatible);
140
    }
141

    
142
    @Override
143
    public boolean isSQLCompatible() {
144
        return this.getInterpreter().isSQLCompatible();
145
    }
146

    
147
    private Interpreter getInterpreter() {
148
        if (this.interpreter == null) {
149
            this.interpreter = this.manager.createInterpreter();
150
        }
151
        return this.interpreter;
152
    }
153
    
154
    @Override
155
    public Object execute(SymbolTable symbolTable) {
156
        if (this.interpreter == null) {
157
            this.interpreter = this.manager.createInterpreter();
158
        }
159
        boolean added = false;
160
        if( symbolTable!=null ) {
161
            added = this.getSymbolTable().addSymbolTable(symbolTable);
162
            if( this.lastSymbolTable==null ) {
163
                this.lastSymbolTable = new WeakReference<>(symbolTable);            
164
            } else if( this.lastSymbolTable.get()!=symbolTable ) {
165
                this.link(this.getSymbolTable());
166
                this.hasNotBeenOptimized = true;            
167
            }
168
        }
169
        try {
170
            this.interpreter.setSymbolTable(this.getSymbolTable());
171
            if( this.hasNotBeenOptimized  ) {
172
                try {
173
                    Optimizer optimizer = this.manager.createOptimizer();
174
                    optimizer.setSymbolTable(this.getSymbolTable());
175
                    this.code = optimizer.optimize(this.getCode());
176
                } catch(Throwable th) {
177
                    // Si no es capaz de optimizar la expresion no, peta y la
178
                    // ejecuta tal cual.
179
                }
180
                this.hasNotBeenOptimized = false;
181
            }
182
            Object x = this.interpreter.run(this.getCode());
183

    
184
            return x;
185
        } finally {
186
            if( added ) {
187
                this.getSymbolTable().removeSymbolTable(symbolTable);
188
            }
189
        }
190
    }
191

    
192
    @Override
193
    public void link(SymbolTable symbolTable) {
194
        if (this.interpreter == null) {
195
            this.interpreter = this.manager.createInterpreter();
196
        }
197
        this.lastSymbolTable = new WeakReference<>(symbolTable);            
198
        this.interpreter.setSymbolTable(symbolTable);
199
        if( this.hasNotBeenOptimized  ) {
200
            Optimizer optimizer = new DefaultOptimizer(this.manager, symbolTable);
201
            this.code = optimizer.optimize(this.getCode());
202
            this.hasNotBeenOptimized = false;
203
        }
204
        this.interpreter.link(this.getCode());
205
    }
206

    
207
    @Override
208
    public void saveToState(PersistentState state) throws PersistenceException {
209
        state.set("phrase", this.phrase);
210
    }
211

    
212
    @Override
213
    public void loadFromState(PersistentState state) throws PersistenceException {
214
        ScriptManager scriptManager = ToolsLocator.getScriptManager();
215

    
216
        this.clear();
217
        
218
        this.phrase = state.getString("phrase");
219
    }
220

    
221
    public static void registerPersistence() {
222
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
223
        if (manager.getDefinition("Expression") == null) {
224
            DynStruct definition = manager.addDefinition(DefaultExpression.class,
225
                    "Expression", "Expression persistence definition", null, null);
226
            definition.addDynFieldString("phrase").setMandatory(false);
227
        }
228
    }
229

    
230
    @Override
231
    public JsonObject toJson() {
232
        return this.toJsonBuilder().build();
233
    }
234

    
235
    @Override
236
    public JsonObjectBuilder toJsonBuilder() {
237
        JsonObjectBuilder builder = Json.createObjectBuilder();
238
        builder.add_class(this);
239
        builder.add("phrase", this.phrase);
240
        return builder;
241
    }
242
    
243
    @Override
244
    public void fromJson(JsonObject values) {
245
        this.clear();
246
        if( values.containsKey("phrase") ) {
247
            this.phrase = values.getString("phrase");
248
        }
249
    }
250
    
251
    @Deprecated
252
    @Override
253
    public String toJSON() {
254
        return toJson().toString();
255
    }
256

    
257
    @Deprecated
258
    @Override
259
    public void fromJSON(String json) {
260
        this.fromJson(Json.createObject(json));
261
    }
262

    
263
    @Override
264
    public String toString() {
265
        return this.toJson().toString();
266
    }
267

    
268
    @Override
269
    public Expression clone() throws CloneNotSupportedException {
270
        Expression other = (Expression) super.clone();
271
        other.fromJSON(this.toJSON());
272
        return other;
273
    }
274

    
275
    @Override
276
    public void setUseBracketsForIdentifiers(boolean useBracketsForIdentifiers) {
277
        this.useBracketsForIdentifiers = useBracketsForIdentifiers;
278
    }
279
    
280
    @Override
281
    public boolean getUseBracketsForIdentifiers() {
282
        return this.useBracketsForIdentifiers;
283
    }
284

    
285
    @Override
286
    public Evaluator toEvaluator() {
287
        ExpressionEvaluator evaluator = this.manager.createExpressionEvaluator(this);
288
        return evaluator;
289
    }
290
    
291
    public static void selfRegister() {
292
        Json.registerSerializer(new TheJsonSerializer());
293
    }
294
    
295
    private static class TheJsonSerializer implements JsonManager.JsonSerializer {
296
        
297
        public TheJsonSerializer() {            
298
        }
299

    
300
        @Override
301
        public Class getObjectClass() {
302
            return DefaultExpression.class;
303
        }
304

    
305
        @Override
306
        public Object toObject(JsonObject json) {
307
            DefaultExpression o = new DefaultExpression();
308
            o.fromJson(json);
309
            return o;
310
        }
311

    
312
        @Override
313
        public JsonObjectBuilder toJsonBuilder(Object value) {
314
            return ((SupportToJson)value).toJsonBuilder();
315
        }
316
        
317
    }
318

    
319

    
320

    
321
}