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

    
3
import java.io.InputStream;
4
import java.io.StringWriter;
5
import java.net.URI;
6
import java.net.URL;
7
import org.gvsig.expressionevaluator.Grammar;
8
import org.gvsig.expressionevaluator.GrammarFactory;
9
import java.util.Collection;
10
import java.util.HashMap;
11
import java.util.Map;
12
import java.util.Objects;
13
import org.apache.commons.io.FilenameUtils;
14
import org.apache.commons.io.IOUtils;
15
import org.apache.commons.lang3.ArrayUtils;
16
import org.apache.commons.lang3.StringUtils;
17
import org.gvsig.expressionevaluator.Bookmarks;
18
import org.gvsig.expressionevaluator.Code;
19
import org.gvsig.expressionevaluator.CodeBuilder;
20
import org.gvsig.expressionevaluator.Expression;
21
import org.gvsig.expressionevaluator.ExpressionBuilder;
22
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
23
import org.gvsig.expressionevaluator.Interpreter;
24
import org.gvsig.expressionevaluator.LexicalAnalyzer;
25
import org.gvsig.expressionevaluator.MutableSymbolTable;
26
import org.gvsig.expressionevaluator.Optimizer;
27
import org.gvsig.expressionevaluator.SymbolTable;
28
import org.gvsig.expressionevaluator.SymbolTableFactory;
29
import org.gvsig.expressionevaluator.Compiler;
30
import org.gvsig.expressionevaluator.GrammarSet;
31
import org.gvsig.expressionevaluator.History;
32
import org.gvsig.expressionevaluator.impl.javascripting.CosaScriptEngineFactory;
33
import org.gvsig.tools.script.Script;
34
import org.slf4j.Logger;
35
import org.slf4j.LoggerFactory;
36

    
37

    
38
@SuppressWarnings("UseSpecificCatch")
39
public class DefaultExpressionEvaluatorManager implements ExpressionEvaluatorManager {
40

    
41
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultExpressionEvaluatorManager.class);
42
    
43
    private Double accuracy;
44
    private final Map<String,SymbolTableFactory>symbolTableFactories;
45
    private final Map<String,GrammarFactory> grammarFactories;
46
    private Bookmarks bookmarks;
47
    private History history;
48

    
49
    public DefaultExpressionEvaluatorManager() {
50
        this.symbolTableFactories = new HashMap<>();
51
        this.grammarFactories = new HashMap<>();
52
    }
53

    
54
    @Override
55
    public SymbolTable getSymbolTable(String name) {
56
        if( name == null ) {
57
            return null;
58
        }
59
        SymbolTableFactory factory = this.symbolTableFactories.get(name.toUpperCase());
60
        if( factory == null ) {
61
            return null;
62
        }
63
        return factory.create();
64
    }
65

    
66
    @Override
67
    public Collection<SymbolTableFactory> getSymbolTableFactories() {
68
        return this.symbolTableFactories.values();
69
    }
70

    
71
    @Override
72
    public final void registerSymbolTable(SymbolTableFactory factory) {
73
        if( factory == null ) {
74
            throw new IllegalArgumentException("factory can't be null");
75
        }
76
        this.symbolTableFactories.put(factory.getName().toUpperCase(),factory);
77
    }
78

    
79
    @Override
80
    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
    
87
    @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
    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
    public Code compile(String source) {
142
        Compiler compiler = this.createCompiler();
143
        return compiler.compileExpression(source);
144
    }
145

    
146
    @Override
147
    public Code compile(LexicalAnalyzer lex, String source) {
148
        Compiler compiler = this.createCompiler();
149
        compiler.setLexicalAnalyzer(lex);
150
        return compiler.compileExpression(source);
151
    }
152

    
153
    @Override
154
    public Code optimize(SymbolTable symbolTable, Code code) {
155
        Optimizer optimizer = this.createOptimizer();
156
        return optimizer.optimize(symbolTable, code);
157
    }
158

    
159
    @Override
160
    public MutableSymbolTable createSymbolTable() {
161
        DefaultSymbolTable theSymbolTable = new DefaultSymbolTable();
162
        return theSymbolTable;
163
    }
164
    
165
    public void populateSymbolTable(SymbolTable aSymbolTable) {
166
        for (SymbolTableFactory factory : this.getSymbolTableFactories() ) {
167
            if( factory.isAutoload() ) {
168
                SymbolTable symbolTable = factory.create();
169
                aSymbolTable.addSymbolTable(symbolTable);
170
            }
171
        }
172
    }
173
    
174
    @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
        DefaultCompiler compiler = new DefaultCompiler();
187
        this.populateGrammars(compiler);
188
        return  compiler;
189
    }
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

    
206
    @Override
207
    public Expression createExpression() {
208
        DefaultExpression e = new DefaultExpression();
209
        return e;
210
    }
211

    
212
    @Override
213
    public ExpressionBuilder createExpressionBuilder() {
214
        ExpressionBuilder x = new DefaultExpressionBuilder();
215
        return x;
216
    }
217

    
218
    @Override
219
    public Optimizer createOptimizer() {
220
        Optimizer x = new DefaultOptimizer();
221
        return x;
222
    }
223

    
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
                Grammar grammar = factory.create();
242
                grammarSet.add(grammar);
243
            }
244
        }
245
    }
246

    
247
    @Override
248
    public Grammar createGrammar(String name) {
249
        DefaultGrammar grammar = new DefaultGrammar(name);
250
        return grammar;
251
    }
252
    
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
    
269
    @Override
270
    public Script createScript(String name, String code, String languaje) {
271
        SimpleScript sc = new SimpleScript(this.createInterpreter(), name, code);
272
        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
        return this.createScript(name, code, CosaScriptEngineFactory.LANGUAGE_NAME);
296
    }
297
            
298
}
299