Concurring with Matt, this sounds like a potential opportunity for a
scripted Processor implementation specific to Kotlin.

Regards,
David Handermann

On Mon, Nov 7, 2022 at 1:11 PM Matt Burgess <mattyb...@apache.org> wrote:

> Mike,
>
> As an alternative it might be worth looking into a processor
> specifically for Kotlin like we have with ExecuteGroovyScript (EGS).
> ExecuteGroovyScript doesn't use JSR-223 and instead goes right for the
> GroovyShell. This allows for cool things like Groovy-specific idioms
> and helpful "meta-capabilities" such as redirect I/O to/from FlowFile
> objects. Depending on how they've done their entry point(s), an
> ExecuteKotlinScript processor could leverage compiled scripts without
> needing the JSR-223 impl, as well as adding some Kotlin-ness to the
> scripting capabilities. I hesitate to suggest this for any of the
> other scripting languages but as Kotlin becomes more popular and given
> its tight integration with the JVM (vs Jython for example), that might
> be the way to go.
>
> Regards,
> Matt
>
>
> On Sun, Nov 6, 2022 at 6:16 PM Mike Thomsen <mikerthom...@gmail.com>
> wrote:
> >
> > I finally chased down the behavior differences that I found and
> > discussed with Matt in the previous PR. Kotlin's got very promising
> > (long term) JSR223 support but with a few caveats in the short term:
> >
> > 1. Its ScriptEngine does not support ScriptEngine#get properly, so any
> > component that uses get(String) to fetch an object defined in a script
> > won't work with Kotlin (ex InvokeScriptedProcessor).
> > 2. Invocable vs Compilable have very different behaviors WRT bindings.
> > 3. Until Kotlin's JSR223 engine matures, we'd probably need to limit
> > it to ExecuteScript with extra documentation explaining that it
> > doesn't behave quite as expected.
> >
> > What I figured out, and it makes sense given how Kotlin works, is that
> > bindings cannot be used to provide dynamic injection of variables. So
> > just calling "session" as an implied ProcessSession won't work. You
> > have to do something like this:
> >
> > val session = bindings["session"] as ProcessSession
> >
> > Either on your own or in a setup block for every script.
> >
> > I feel like there's value here, but wanted to throw it out there to
> > other devs before going down the process of finalizing the
> > ExecuteScript support and starting to exclude it from the other
> > components.
> >
> > On a side note, we might want to add an InvokeCompiledScript processor
> > that's like InvokeScriptedProcessor but is designed for Kotlin, JRuby
> > and Groovy which work really well with taking scripts down to Java
> > byte code and working with streamlined fat jars. Could be another
> > angle on simplifying deployments of scripts and script-like
> > components.
> >
> > Thanks,
> >
> > Mike
>

Reply via email to