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

History | View | Annotate | Download (4.23 KB)

1 44389 jjdelcerro
package org.gvsig.expressionevaluator.impl.javascripting;
2
3
import java.io.IOException;
4
import java.io.Reader;
5
import java.io.Writer;
6
import java.util.List;
7
import javax.script.AbstractScriptEngine;
8
import javax.script.Bindings;
9
import javax.script.Compilable;
10
import javax.script.CompiledScript;
11
import javax.script.Invocable;
12
import javax.script.ScriptContext;
13
import javax.script.ScriptEngine;
14
import javax.script.ScriptEngineFactory;
15
import javax.script.ScriptException;
16
import javax.script.SimpleScriptContext;
17
import org.apache.commons.io.IOUtils;
18
import org.apache.commons.lang3.StringUtils;
19
import org.gvsig.expressionevaluator.Code;
20
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
21
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
22
import org.gvsig.expressionevaluator.ExpressionRuntimeException;
23
import org.gvsig.expressionevaluator.Interpreter;
24
import org.gvsig.expressionevaluator.MutableSymbolTable;
25
26
/**
27
 *
28
 * @author jjdelcerro
29
 */
30
public class CosaScriptEngine
31
        extends AbstractScriptEngine
32
        implements ScriptEngine, Compilable, Invocable
33
    {
34
35
    private class MyContextScript extends SimpleScriptContext {
36
37
        public MyContextScript() {
38
            engineScope = new SymbolTableToBindingsAdapter(symbolTable);
39
        }
40
41
        @Override
42
        public void setWriter(Writer writer) {
43
            super.setWriter(writer);
44
            interpreter.setWriter(writer);
45
        }
46
47
        @Override
48
        public void setErrorWriter(Writer writer) {
49
            super.setErrorWriter(writer);
50
        }
51
    }
52
53
    private final ScriptEngineFactory factory;
54
    private final MutableSymbolTable symbolTable;
55
    private final Interpreter interpreter;
56
    private final ExpressionEvaluatorManager manager;
57
58
    public CosaScriptEngine(ScriptEngineFactory factory) {
59
        this.factory = factory;
60
        this.manager = ExpressionEvaluatorLocator.getManager();
61
        this.symbolTable = manager.createSymbolTable();
62
        this.interpreter = manager.createInterpreter();
63
        this.interpreter.setSymbolTable(this.symbolTable);
64
        this.context = new MyContextScript();
65
    }
66
67
    @Override
68
    public ScriptEngineFactory getFactory() {
69
       return this.factory;
70
    }
71
72
73
    @Override
74
    public Object eval(String source, ScriptContext context) throws ScriptException {
75
        CompiledScript script = this.compile(source);
76
        Object x = script.eval(context);
77
        return x;
78
    }
79
80
    @Override
81
    public Object eval(Reader source, ScriptContext context) throws ScriptException {
82
        CompiledScript script = this.compile(source);
83
        Object x = script.eval(context);
84
        return x;
85
    }
86
87
    @Override
88
    public Bindings createBindings() {
89
        return new SymbolTableToBindingsAdapter(symbolTable);
90
    }
91
92
    @Override
93
    public CompiledScript compile(String script) throws ScriptException {
94
        Code code = this.manager.compile(script);
95
        CosaCompiledScript x = new CosaCompiledScript(this, code);
96
        return x;
97
    }
98
99
    @Override
100
    public CompiledScript compile(Reader script) throws ScriptException {
101
        List<String> lines;
102
        try {
103
            lines = IOUtils.readLines(script);
104
        } catch (IOException ex) {
105
            throw new ScriptException(ex);
106
        }
107
        String source = StringUtils.join(lines, "\n");
108
        return this.compile(source);
109
    }
110
111
    @Override
112
    public Object invokeMethod(Object thiz, String name, Object... args) throws ScriptException, NoSuchMethodException {
113
        throw new UnsupportedOperationException("Not supported yet.");
114
    }
115
116
    @Override
117
    public Object invokeFunction(String name, Object... args) throws ScriptException, NoSuchMethodException {
118
        if( !this.interpreter.hasFunction(name) ) {
119
            throw new NoSuchMethodException(name);
120
        }
121
        try {
122
            return this.interpreter.call(name, args);
123
        } catch (Exception ex) {
124
            throw new ExpressionRuntimeException(this.interpreter.getCurrentCode(),"Error calling funcion '"+name+"'.", ex);
125
        }
126
    }
127
128
    @Override
129
    public <T> T getInterface(Class<T> clasz) {
130
        return null;
131
    }
132
133
    @Override
134
    public <T> T getInterface(Object thiz, Class<T> clasz) {
135
        return null;
136
    }
137
138
}