1+ /*
2+ * #%L
3+ * JSR-223-compliant Kotlin scripting language plugin.
4+ * %%
5+ * Copyright (C) 2016 - 2019 Board of Regents of the University of
6+ * Wisconsin-Madison.
7+ * %%
8+ * Redistribution and use in source and binary forms, with or without
9+ * modification, are permitted provided that the following conditions are met:
10+ *
11+ * 1. Redistributions of source code must retain the above copyright notice,
12+ * this list of conditions and the following disclaimer.
13+ * 2. Redistributions in binary form must reproduce the above copyright notice,
14+ * this list of conditions and the following disclaimer in the documentation
15+ * and/or other materials provided with the distribution.
16+ *
17+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
21+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27+ * POSSIBILITY OF SUCH DAMAGE.
28+ * #L%
29+ */
30+ package org.scijava.plugins.scripting.kotlin
31+
32+ import org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineFactoryBase
33+ import org.scijava.plugin.Plugin
34+ import org.scijava.script.AdaptedScriptLanguage
35+ import org.scijava.script.ScriptLanguage
36+ import java.io.Reader
37+ import javax.script.*
38+
39+ /* *
40+ * A SciJava [ScriptLanguage] for Kotlin.
41+ *
42+ * @author Curtis Rueden
43+ * @author Philipp Hanslovsky
44+ * @see ScriptEngine
45+ */
46+ @Plugin(type = ScriptLanguage ::class , name = " Kotlin" )
47+ class KotlinScriptLanguage : AdaptedScriptLanguage (Factory ()) {
48+ // NB: The wrapped ScriptEngineFactory does not include Kotlin in its list.
49+ override fun getNames () = listOf (" kotlin" , " Kotlin" )
50+
51+ // NB: The wrapped ScriptEngineFactory does not include .kt in its list.
52+ override fun getExtensions () = listOf (" kt" , " kts" )
53+
54+ class Factory : KotlinJsr223JvmScriptEngineFactoryBase () {
55+ override fun getScriptEngine (): ScriptEngine {
56+ return SynchronizedScriptEngine (ScriptEngineManager ().getEngineByExtension(" kts" ))
57+ }
58+ }
59+
60+ class SynchronizedScriptEngine (private val delegate : ScriptEngine ) : ScriptEngine {
61+ @Synchronized
62+ @Throws(ScriptException ::class )
63+ override fun eval (s : String , scriptContext : ScriptContext ): Any? = delegate.eval(s, scriptContext)
64+
65+ @Synchronized
66+ @Throws(ScriptException ::class )
67+ override fun eval (reader : Reader , scriptContext : ScriptContext ): Any? = delegate.eval(reader, scriptContext)
68+
69+ @Synchronized
70+ @Throws(ScriptException ::class )
71+ override fun eval (s : String ): Any? = delegate.eval(s)
72+
73+ @Synchronized
74+ @Throws(ScriptException ::class )
75+ override fun eval (reader : Reader ): Any? = delegate.eval(reader)
76+
77+ @Synchronized
78+ @Throws(ScriptException ::class )
79+ override fun eval (s : String , bindings : Bindings ): Any? = delegate.eval(s, bindings)
80+
81+ @Synchronized
82+ @Throws(ScriptException ::class )
83+ override fun eval (reader : Reader , bindings : Bindings ): Any? = delegate.eval(reader, bindings)
84+
85+ @Synchronized
86+ override fun put (s : String , o : Any ) = delegate.put(s, o)
87+
88+ @Synchronized
89+ override fun get (s : String ): Any? = delegate[s]
90+
91+ @Synchronized
92+ override fun getBindings (i : Int ): Bindings ? = delegate.getBindings(i)
93+
94+ @Synchronized
95+ override fun setBindings (bindings : Bindings , i : Int ) = delegate.setBindings(bindings, i)
96+
97+ @Synchronized
98+ override fun createBindings (): Bindings = delegate.createBindings()
99+
100+ @Synchronized
101+ override fun getContext (): ScriptContext = delegate.context
102+
103+ @Synchronized
104+ override fun setContext (scriptContext : ScriptContext ) {
105+ delegate.context = scriptContext
106+ }
107+
108+ @Synchronized
109+ override fun getFactory (): ScriptEngineFactory = delegate.factory
110+ }
111+ }
0 commit comments