2525import java .util .HashMap ;
2626import java .util .List ;
2727import java .util .Map ;
28+ import javax .script .Bindings ;
29+ import javax .script .ScriptContext ;
2830import javax .script .ScriptEngine ;
2931
3032import org .scijava .Context ;
4042 */
4143public class ScijavaEvaluator implements Evaluator {
4244
45+ private static final String DEFAULT_LANGUAGE = "groovy" ;
46+
4347 @ Parameter
4448 private LogService log ;
4549
@@ -52,8 +56,9 @@ public class ScijavaEvaluator implements Evaluator {
5256 @ Parameter
5357 Context context ;
5458
55- private Map <String , ScriptEngine > scriptEngines ;
56- private Map <String , ScriptLanguage > scriptLanguages ;
59+ private final Map <String , ScriptEngine > scriptEngines ;
60+ private final Map <String , ScriptLanguage > scriptLanguages ;
61+ private String languageName ;
5762
5863 protected String shellId ;
5964 protected String sessionId ;
@@ -66,6 +71,8 @@ public ScijavaEvaluator(Context context, String shellId, String sessionId, Strin
6671
6772 this .scriptEngines = new HashMap <>();
6873 this .scriptLanguages = new HashMap <>();
74+
75+ this .languageName = DEFAULT_LANGUAGE ;
6976 }
7077
7178 @ Override
@@ -97,14 +104,10 @@ public void startWorker() {
97104 @ Override
98105 public void evaluate (SimpleEvaluationObject seo , String code ) {
99106
100- String languageName = "groovy" ;
101- this .addLanguage (languageName );
107+ code = this .setLanguage (code );
102108
103- Worker worker = new Worker (this .context ,
104- this .scriptEngines .get (languageName ),
105- this .scriptLanguages .get (languageName ));
106-
107- worker .setup (seo , code );
109+ Worker worker = new Worker (this .context , this .scriptEngines , this .scriptLanguages );
110+ worker .setup (seo , code , this .languageName );
108111 this .threadService .queue (worker );
109112 }
110113
@@ -123,14 +126,50 @@ private void addLanguage(String languageName) {
123126 }
124127
125128 if (!this .scriptLanguages .keySet ().contains (languageName )) {
126- this .scriptLanguages .put (languageName , scriptService .getLanguageByName (languageName ));
127- }
128-
129- if (!this .scriptEngines .keySet ().contains (languageName )) {
130- this .scriptEngines .put (languageName , this .scriptLanguages .get (languageName ).getScriptEngine ());
129+
130+ Bindings bindings = null ;
131+ if (!this .scriptEngines .isEmpty ()) {
132+ String firstLanguage = this .scriptEngines .keySet ().iterator ().next ();
133+ bindings = this .scriptEngines .get (firstLanguage ).getBindings (ScriptContext .ENGINE_SCOPE );
134+ }
135+
136+ log .info ("Script Language for '" + languageName + "' found." );
137+ ScriptLanguage scriptLanguage = scriptService .getLanguageByName (languageName );
138+ this .scriptLanguages .put (languageName , scriptLanguage );
139+
140+ ScriptEngine engine = this .scriptLanguages .get (languageName ).getScriptEngine ();
141+ this .scriptEngines .put (languageName , engine );
142+
143+ // Not implemented yet
144+ //engine.setBindings(this.bindings, ScriptContext.ENGINE_SCOPE);
145+ if (bindings != null ) {
146+ this .initBindings (bindings , engine , scriptLanguage );
147+ }
148+
131149 }
132150
133151 log .debug ("Script Language found for '" + languageName + "'" );
134152 }
135153
154+ private String setLanguage (String code ) {
155+ if (code .startsWith ("#!" )) {
156+ this .languageName = code .substring (2 , code .indexOf (System .getProperty ("line.separator" ))).trim ();
157+
158+ // Return the code string without the first line
159+ code = code .substring (code .indexOf (System .getProperty ("line.separator" )) + 1 );
160+ }
161+
162+ this .addLanguage (this .languageName );
163+ return code ;
164+ }
165+
166+ private void initBindings (Bindings bindings , ScriptEngine scriptEngine , ScriptLanguage scriptLanguage ) {
167+
168+ Bindings currentBindings = scriptEngine .getBindings (ScriptContext .ENGINE_SCOPE );
169+ bindings .keySet ().forEach ((String key ) -> {
170+ currentBindings .put (key , scriptLanguage .decode (bindings .get (key )));
171+ });
172+
173+ }
174+
136175}
0 commit comments