Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / main / java / org / gvsig / fmap / dal / impl / expressionevaluator / DefaultFeatureExpressionEvaluator.java @ 47198

History | View | Annotate | Download (10.8 KB)

1
package org.gvsig.fmap.dal.impl.expressionevaluator;
2

    
3
import java.util.ArrayList;
4
import java.util.HashSet;
5
import java.util.List;
6
import java.util.Objects;
7
import java.util.Set;
8
import javax.json.JsonObject;
9
import org.apache.commons.lang3.StringUtils;
10
import org.apache.commons.lang3.builder.ToStringBuilder;
11
import org.gvsig.expressionevaluator.Code;
12
import org.gvsig.expressionevaluator.Code.Callable;
13
import org.gvsig.expressionevaluator.SymbolTable;
14
import org.gvsig.expressionevaluator.Expression;
15
import org.gvsig.expressionevaluator.ExpressionBuilder;
16
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
17
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
18
import org.gvsig.expressionevaluator.Function;
19
import org.gvsig.expressionevaluator.impl.symboltable.FeatureSymbolTableImpl;
20
import org.gvsig.expressionevaluator.ExpressionEvaluator;
21
import org.gvsig.expressionevaluator.impl.DefaultExpression;
22
import org.gvsig.expressionevaluator.spi.BaseExpressionEvaluator;
23
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
24
import org.gvsig.fmap.dal.feature.Feature;
25
import org.gvsig.json.Json;
26
import org.gvsig.json.JsonObjectBuilder;
27
import org.gvsig.tools.ToolsLocator;
28
import org.gvsig.tools.dynobject.DynStruct;
29
import org.gvsig.tools.evaluator.AbstractEvaluator;
30
import org.gvsig.tools.evaluator.Evaluator;
31
import org.gvsig.tools.evaluator.EvaluatorData;
32
import org.gvsig.tools.evaluator.EvaluatorException;
33
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
34
import org.gvsig.tools.exception.BaseException;
35
import org.gvsig.tools.lang.Cloneable;
36
import org.gvsig.tools.persistence.PersistenceManager;
37
import org.gvsig.tools.persistence.PersistentState;
38
import org.gvsig.tools.persistence.exception.PersistenceException;
39
import org.slf4j.Logger;
40
import org.slf4j.LoggerFactory;
41

    
42
@SuppressWarnings("UseSpecificCatch")
43
public class DefaultFeatureExpressionEvaluator
44
        extends AbstractEvaluator
45
        implements ExpressionEvaluator, Cloneable {
46

    
47
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureExpressionEvaluator.class);
48
    private String storeName;
49

    
50
    private static class DescriptionAdapter implements Description {
51

    
52
        Function function;
53

    
54
        public DescriptionAdapter(Function function) {
55
            this.function = function;
56
        }
57

    
58
        @Override
59
        public String getName() {
60
            return this.function.name();
61
        }
62

    
63
        @Override
64
        public String getDescription() {
65
            return this.function.description();
66
        }
67

    
68
        @Override
69
        public String getTemplate() {
70
            return this.function.template();
71
        }
72

    
73
        @Override
74
        public int getDataTypeCategories() {
75
            switch (this.function.group()) {
76
                case Function.GROUP_STRING:
77
                    return Description.DATATYPE_CATEGORY_STRING;
78
                case Function.GROUP_BOOLEAN:
79
                    return Description.DATATYPE_CATEGORY_BOOLEAN;
80
                case Function.GROUP_DATETIME:
81
                    return Description.DATATYPE_CATEGORY_DATETIME;
82
                case Function.GROUP_NUMERIC:
83
                    return Description.DATATYPE_CATEGORY_NUMBER;
84
                case Function.GROUP_OGC:
85
                    return Description.DATATYPE_CATEGORY_ALL;
86
                default:
87
                    return Description.DATATYPE_CATEGORY_ALL;
88
            }
89
        }
90

    
91
    }
92

    
93
    private FeatureSymbolTable featureSymbolTable;
94
    private SymbolTable symbolTable;
95
    private Expression expression;
96
    private Description[] availableOperators;
97
    private Description[] availableFunctions;
98

    
99
    public DefaultFeatureExpressionEvaluator() {
100
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
101
        this.symbolTable = manager.createSymbolTable();
102
        this.featureSymbolTable = new FeatureSymbolTableImpl();
103
        this.symbolTable.addSymbolTable(this.featureSymbolTable);
104
        this.availableOperators = null;
105
        this.availableFunctions = null;
106
    }
107

    
108
    public DefaultFeatureExpressionEvaluator(String source) {
109
        this(null, source);
110
    }
111

    
112
    public DefaultFeatureExpressionEvaluator(String storeName, String source) {
113
        this();
114
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
115
        this.expression = manager.createExpression();
116
        this.expression.setPhrase(source);
117
        this.storeName = storeName;
118
    }
119

    
120
    public DefaultFeatureExpressionEvaluator(Expression expression) {
121
        this(null, expression);
122
    }
123

    
124
    public DefaultFeatureExpressionEvaluator(String storeName, Expression expression) {
125
        this();
126
        this.expression = expression;
127
        this.storeName = storeName;
128

    
129
    }
130

    
131
    @Override
132
    public String getName() {
133
        return "Genereric expression";
134
    }
135

    
136
    @Override
137
    public String getDescription() {
138
        return this.expression.getPhrase();
139
    }
140

    
141
    @Override
142
    public String getSQL() {
143
        return this.expression.getPhrase();
144
    }
145

    
146
    @Override
147
    public Expression toExpression() {
148
        return expression;
149
    }
150

    
151
    @Override
152
    public SymbolTable toSymbolTable() {
153
        return this.symbolTable;
154
    }
155

    
156
    @Override
157
    public Object evaluate(EvaluatorData data) throws EvaluatorException {
158
        this.featureSymbolTable.setFeature((Feature) data);
159
        Object v = this.expression.execute(this.symbolTable);
160
        return v;
161
    }
162

    
163
    @Override
164
    public EvaluatorFieldsInfo getFieldsInfo() {
165
        final Set<String> names = new HashSet<>();
166
        try {
167
            this.expression.getCode().accept((Object code) -> {
168
                if (code instanceof Code.Identifier) {
169
                    Code.Identifier identifier = (Code.Identifier) code;
170
                    if (!StringUtils.equalsIgnoreCase(storeName, identifier.name())) {
171
                        names.add(identifier.name());
172
                    }
173
                } else if (code instanceof Code.Callable) {
174
                    Callable callable = (Callable) code;
175
                    if (callable.name().equals(ExpressionBuilder.FUNCTION_GETATTR)) {
176
                        Code p0 = callable.parameters().get(0);
177
                        if (!(p0 instanceof Code.Identifier)) {
178
                            return;
179
                        }
180
                        if (!StringUtils.equalsIgnoreCase(storeName, ((Code.Identifier) p0).name())) {
181
                            return;
182
                        }
183
                        Code p1 = callable.parameters().get(1);
184
                        if (!(p1 instanceof Code.Constant)) {
185
                            return;
186
                        }
187
                        String s = Objects.toString(((Code.Constant) p1).value(), null);
188
                        if (s != null) {
189
                            names.add(s);
190
                        }
191
                    }
192
                }
193
            });
194
            EvaluatorFieldsInfo info = new EvaluatorFieldsInfo();
195
            for (String name : names) {
196
                info.addFieldValue(name);
197
            }
198
            return info;
199
        } catch (BaseException ex) {
200
            throw new RuntimeException("Can't calculate fields information.", ex);
201
        }
202
    }
203

    
204
    @Override
205
    public Description[] getAvailableOperators() {
206
        if (availableOperators == null) {
207
            List<Description> l = new ArrayList<>();
208
            for (Function function : toSymbolTable()) {
209
                if (function.isOperator()) {
210
                    l.add(new DescriptionAdapter(function));
211
                }
212
            }
213
            this.availableOperators = l.toArray(new Description[l.size()]);
214
        }
215
        return availableOperators;
216
    }
217

    
218
    @Override
219
    public Description[] getAvailableFunctions() {
220
        if (availableFunctions == null) {
221
            List<Description> l = new ArrayList<>();
222
            for (Function function : toSymbolTable()) {
223
                if (!function.isOperator()) {
224
                    l.add(new DescriptionAdapter(function));
225
                }
226
            }
227
            this.availableFunctions = l.toArray(new Description[l.size()]);
228
        }
229
        return availableFunctions;
230
    }
231

    
232
    @Override
233
    public Evaluator clone() throws CloneNotSupportedException {
234
        DefaultFeatureExpressionEvaluator other = (DefaultFeatureExpressionEvaluator) super.clone();
235
        other.expression = this.expression.clone();
236
        other.availableFunctions = null;
237
        other.availableOperators = null;
238

    
239
        if (this.featureSymbolTable != null) {
240
            other.featureSymbolTable = this.featureSymbolTable.clone();
241
        }
242
        if (this.symbolTable != null) {
243
            other.symbolTable = this.symbolTable.clone();
244
        }
245
        return other;
246
    }
247

    
248
    @Override
249
    public void saveToState(PersistentState ps) throws PersistenceException {
250
        ps.set("expression", expression);
251
    }
252

    
253
    @Override
254
    public void loadFromState(PersistentState state) throws PersistenceException {
255
        this.expression = (Expression) state.get("expression");
256
    }
257

    
258
    public static void registerPersistence() {
259
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
260
        if (manager.getDefinition("DefaultFeatureExpressionEvaluator") == null) {
261
            DynStruct definition = manager.addDefinition(DefaultFeatureExpressionEvaluator.class,
262
                    "DefaultFeatureExpressionEvaluator", "DefaultFeatureExpressionEvaluator persistence definition", null, null);
263
            definition.addDynFieldObject("expression").setClassOfValue(DefaultExpression.class).setMandatory(false);
264
        }
265
    }
266

    
267
    @Override
268
    public void addSymbolTable(SymbolTable symbolTable) {
269
        if (symbolTable != null) {
270
            this.symbolTable.addSymbolTable(symbolTable);
271
        }
272
    }
273

    
274
    @Override
275
    public void fromJson(JsonObject json) {
276
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
277
        this.symbolTable = manager.createSymbolTable();
278
        this.featureSymbolTable = new FeatureSymbolTableImpl();
279
        this.symbolTable.addSymbolTable(this.featureSymbolTable);
280
        this.availableOperators = null;
281
        this.availableFunctions = null;
282
        this.expression = (Expression) Json.toObject(json, "expression");
283
    }
284

    
285
    @Override
286
    public JsonObjectBuilder toJsonBuilder() {
287
        JsonObjectBuilder state = Json.createObjectBuilder();
288
        state.add("expression", this.expression);
289
        return state;
290
    }
291
    
292
    @Override
293
    public String toString() {
294
        try {
295
            ToStringBuilder builder = new ToStringBuilder(this);
296
            builder.append("storeName", this.storeName);
297
            builder.append("expression", this.expression, true);
298
            builder.append("symbolTable", this.symbolTable);
299
            return builder.toString();
300
        } catch (Exception e) {
301
            return super.toString();
302
        }
303
    }
304
}