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 / DefaultExpressionEvaluatorManager.java @ 44389

History | View | Annotate | Download (9.29 KB)

1 43521 jjdelcerro
package org.gvsig.expressionevaluator.impl;
2
3 44339 jjdelcerro
import java.io.InputStream;
4 44389 jjdelcerro
import java.io.StringWriter;
5 44339 jjdelcerro
import java.net.URI;
6
import java.net.URL;
7 44139 jjdelcerro
import org.gvsig.expressionevaluator.Grammar;
8
import org.gvsig.expressionevaluator.GrammarFactory;
9 43983 jjdelcerro
import java.util.Collection;
10 43939 jjdelcerro
import java.util.HashMap;
11
import java.util.Map;
12 44389 jjdelcerro
import java.util.Objects;
13 44339 jjdelcerro
import org.apache.commons.io.FilenameUtils;
14
import org.apache.commons.io.IOUtils;
15 44389 jjdelcerro
import org.apache.commons.lang3.ArrayUtils;
16
import org.apache.commons.lang3.StringUtils;
17 44263 jjdelcerro
import org.gvsig.expressionevaluator.Bookmarks;
18 43521 jjdelcerro
import org.gvsig.expressionevaluator.Code;
19
import org.gvsig.expressionevaluator.CodeBuilder;
20 43983 jjdelcerro
import org.gvsig.expressionevaluator.Expression;
21 44006 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionBuilder;
22 43521 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
23
import org.gvsig.expressionevaluator.Interpreter;
24
import org.gvsig.expressionevaluator.LexicalAnalyzer;
25
import org.gvsig.expressionevaluator.MutableSymbolTable;
26 44009 jjdelcerro
import org.gvsig.expressionevaluator.Optimizer;
27 43521 jjdelcerro
import org.gvsig.expressionevaluator.SymbolTable;
28 44126 jjdelcerro
import org.gvsig.expressionevaluator.SymbolTableFactory;
29 44139 jjdelcerro
import org.gvsig.expressionevaluator.Compiler;
30
import org.gvsig.expressionevaluator.GrammarSet;
31 44263 jjdelcerro
import org.gvsig.expressionevaluator.History;
32 44389 jjdelcerro
import org.gvsig.expressionevaluator.impl.javascripting.CosaScriptEngineFactory;
33 44339 jjdelcerro
import org.gvsig.tools.script.Script;
34 44006 jjdelcerro
import org.slf4j.Logger;
35
import org.slf4j.LoggerFactory;
36 43521 jjdelcerro
37
38 44339 jjdelcerro
@SuppressWarnings("UseSpecificCatch")
39 43521 jjdelcerro
public class DefaultExpressionEvaluatorManager implements ExpressionEvaluatorManager {
40
41 44006 jjdelcerro
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultExpressionEvaluatorManager.class);
42
43 43521 jjdelcerro
    private Double accuracy;
44 44126 jjdelcerro
    private final Map<String,SymbolTableFactory>symbolTableFactories;
45 44139 jjdelcerro
    private final Map<String,GrammarFactory> grammarFactories;
46 44263 jjdelcerro
    private Bookmarks bookmarks;
47
    private History history;
48 43521 jjdelcerro
49
    public DefaultExpressionEvaluatorManager() {
50 44126 jjdelcerro
        this.symbolTableFactories = new HashMap<>();
51 44139 jjdelcerro
        this.grammarFactories = new HashMap<>();
52 43939 jjdelcerro
    }
53
54 43521 jjdelcerro
    @Override
55 43983 jjdelcerro
    public SymbolTable getSymbolTable(String name) {
56 44126 jjdelcerro
        if( name == null ) {
57
            return null;
58
        }
59
        SymbolTableFactory factory = this.symbolTableFactories.get(name.toUpperCase());
60
        if( factory == null ) {
61
            return null;
62
        }
63 44389 jjdelcerro
        return factory.create();
64 43939 jjdelcerro
    }
65
66
    @Override
67 44126 jjdelcerro
    public Collection<SymbolTableFactory> getSymbolTableFactories() {
68
        return this.symbolTableFactories.values();
69 43939 jjdelcerro
    }
70
71
    @Override
72 44126 jjdelcerro
    public final void registerSymbolTable(SymbolTableFactory factory) {
73
        if( factory == null ) {
74
            throw new IllegalArgumentException("factory can't be null");
75 44006 jjdelcerro
        }
76 44126 jjdelcerro
        this.symbolTableFactories.put(factory.getName().toUpperCase(),factory);
77 43939 jjdelcerro
    }
78 43987 jjdelcerro
79 43939 jjdelcerro
    @Override
80 43521 jjdelcerro
    public Object evaluate(String source) {
81
        DefaultInterpreter interpreter = new DefaultInterpreter();
82
        DefaultCompiler compiler = new DefaultCompiler();
83
        Code code = compiler.compileExpression(source);
84
        return interpreter.run(code);
85
    }
86 44389 jjdelcerro
87 43521 jjdelcerro
    @Override
88
    public Object evaluate(SymbolTable symbolTable, String source) {
89
        DefaultInterpreter interpreter = new DefaultInterpreter();
90
        DefaultCompiler compiler = new DefaultCompiler();
91
        Code code = compiler.compileExpression(source);
92
        interpreter.setSymbolTable(symbolTable);
93
        return interpreter.run(code);
94
    }
95
96
    @Override
97
    public Object evaluate(SymbolTable symbolTable, Code code) {
98
        DefaultInterpreter interpreter = new DefaultInterpreter();
99
        interpreter.setSymbolTable(symbolTable);
100
        return interpreter.run(code);
101
    }
102
103
    @Override
104 44389 jjdelcerro
    public String evaluatePage(String source) {
105
        return evaluatePage(null, source);
106
    }
107
108
    @Override
109
    public String evaluatePage(SymbolTable symbolTable, String source) {
110
        String[] sources = StringUtils.substringsBetween(source, "<%", "%>");
111
        if( ArrayUtils.isEmpty(sources) ) {
112
            return source;
113
        }
114
        String[] values = new String[sources.length];
115
116
        DefaultInterpreter interpreter = new DefaultInterpreter();
117
        if( symbolTable!=null ) {
118
            interpreter.setSymbolTable(symbolTable);
119
        }
120
        StringWriter writer = new StringWriter();
121
        interpreter.setWriter(writer);
122
        DefaultCompiler compiler = new DefaultCompiler();
123
        for (int i = 0; i < sources.length; i++) {
124
            String theSource = sources[i];
125
            if( StringUtils.startsWith(theSource, "=") ) {
126
                Code code = compiler.compileExpression(theSource.substring(1));
127
                Object value = interpreter.run(code);
128
                values[i] = Objects.toString(value, "");
129
            } else {
130
                Code code = compiler.compileExpression(theSource.substring(1));
131
                writer.getBuffer().setLength(0);
132
                interpreter.run(code);
133
                values[i] = writer.toString();
134
            }
135
        }
136
        String output = StringUtils.replaceEach(source, sources, values);
137
        return output;
138
    }
139
140
    @Override
141 43521 jjdelcerro
    public Code compile(String source) {
142 44139 jjdelcerro
        Compiler compiler = this.createCompiler();
143 43521 jjdelcerro
        return compiler.compileExpression(source);
144
    }
145
146
    @Override
147
    public Code compile(LexicalAnalyzer lex, String source) {
148 44139 jjdelcerro
        Compiler compiler = this.createCompiler();
149 43521 jjdelcerro
        compiler.setLexicalAnalyzer(lex);
150
        return compiler.compileExpression(source);
151
    }
152
153
    @Override
154 44019 jjdelcerro
    public Code optimize(SymbolTable symbolTable, Code code) {
155
        Optimizer optimizer = this.createOptimizer();
156
        return optimizer.optimize(symbolTable, code);
157
    }
158
159
    @Override
160 43521 jjdelcerro
    public MutableSymbolTable createSymbolTable() {
161 43987 jjdelcerro
        DefaultSymbolTable theSymbolTable = new DefaultSymbolTable();
162
        return theSymbolTable;
163 43521 jjdelcerro
    }
164 43939 jjdelcerro
165 43987 jjdelcerro
    public void populateSymbolTable(SymbolTable aSymbolTable) {
166 44126 jjdelcerro
        for (SymbolTableFactory factory : this.getSymbolTableFactories() ) {
167
            if( factory.isAutoload() ) {
168 44389 jjdelcerro
                SymbolTable symbolTable = factory.create();
169 43987 jjdelcerro
                aSymbolTable.addSymbolTable(symbolTable);
170
            }
171
        }
172
    }
173
174 43521 jjdelcerro
    @Override
175
    public LexicalAnalyzer createLexicalAnalyzer() {
176
        return new SQLLexicalAnalyzer();
177
    }
178
179
    @Override
180
    public CodeBuilder createCodeBuilder() {
181
        return new DefaultCodeBuilder();
182
    }
183
184
    @Override
185
    public Compiler createCompiler() {
186 44139 jjdelcerro
        DefaultCompiler compiler = new DefaultCompiler();
187
        this.populateGrammars(compiler);
188
        return  compiler;
189 43521 jjdelcerro
    }
190
191
    @Override
192
    public Interpreter createInterpreter() {
193
        return new DefaultInterpreter();
194
    }
195
196
    @Override
197
    public Double getAccuracy() {
198
        return this.accuracy;
199
    }
200
201
    @Override
202
    public void setAccuracy(Double accuracy) {
203
        this.accuracy = accuracy;
204
    }
205 43983 jjdelcerro
206
    @Override
207
    public Expression createExpression() {
208
        DefaultExpression e = new DefaultExpression();
209
        return e;
210
    }
211 44006 jjdelcerro
212
    @Override
213
    public ExpressionBuilder createExpressionBuilder() {
214
        ExpressionBuilder x = new DefaultExpressionBuilder();
215
        return x;
216
    }
217 44009 jjdelcerro
218
    @Override
219
    public Optimizer createOptimizer() {
220
        Optimizer x = new DefaultOptimizer();
221
        return x;
222
    }
223 44139 jjdelcerro
224
    @Override
225
    public void registerGrammar(GrammarFactory factory) {
226
        if( factory==null ) {
227
            throw new IllegalArgumentException("factory can't be null");
228
        }
229
        this.grammarFactories.put(factory.getName(), factory);
230
    }
231
232
    @Override
233
    public Collection<GrammarFactory> getGrammarFactories() {
234
        return this.grammarFactories.values();
235
    }
236
237
    public void populateGrammars(Compiler compiler) {
238
        GrammarSet grammarSet = compiler.getGrammars();
239
        for (GrammarFactory factory : this.getGrammarFactories() ) {
240
            if( factory.isAutoload() ) {
241 44389 jjdelcerro
                Grammar grammar = factory.create();
242 44139 jjdelcerro
                grammarSet.add(grammar);
243
            }
244
        }
245
    }
246
247 44263 jjdelcerro
    @Override
248 44139 jjdelcerro
    public Grammar createGrammar(String name) {
249
        DefaultGrammar grammar = new DefaultGrammar(name);
250
        return grammar;
251
    }
252 44263 jjdelcerro
253
    @Override
254
    public Bookmarks getBookmarks() {
255
        if( this.bookmarks==null ) {
256
            this.bookmarks = new DefaultBookmarks();
257
        }
258
        return this.bookmarks;
259
    }
260
261
    @Override
262
    public History getHistory() {
263
        if( this.history==null ) {
264
            this.history = new DefaultHistory(20);
265
        }
266
        return this.history;
267
    }
268 44339 jjdelcerro
269
    @Override
270
    public Script createScript(String name, String code, String languaje) {
271 44389 jjdelcerro
        SimpleScript sc = new SimpleScript(this.createInterpreter(), name, code);
272 44339 jjdelcerro
        return sc;
273
    }
274
275
    @Override
276
    public Script locateScript(String name) {
277
        return null;
278
    }
279
280
    @Override
281
    public Script loadScript(URI location) {
282
        InputStream is = null;
283
        String code = null;
284
        String name = null;
285
        try {
286
            URL url = location.toURL();
287
            is = url.openStream();
288
            code = IOUtils.toString(is);
289
            name = FilenameUtils.getBaseName(location.getPath());
290
        } catch(Exception ex) {
291
            return null;
292
        } finally {
293
            IOUtils.closeQuietly(is);
294
        }
295 44389 jjdelcerro
        return this.createScript(name, code, CosaScriptEngineFactory.LANGUAGE_NAME);
296 44339 jjdelcerro
    }
297
298 43521 jjdelcerro
}