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
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
}