You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Ate Douma (JIRA)" <ji...@apache.org> on 2016/01/02 16:10:39 UTC

[jira] [Updated] (SCXML-245) Reimplement Nashorn Javascript context binding

     [ https://issues.apache.org/jira/browse/SCXML-245?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ate Douma updated SCXML-245:
----------------------------
    Description: 
The current Javascript context binding can be drastically improved and simplified by using a binding which only delegates to the SCXML context it wraps, and not (also) another binding and/or the Nashorn Global binding.

The SCXML context will be bound to the ScriptEngine.GLOBAL_SCOPE and for the ScriptEngine.ENGINE_SCOPE the default Nashorn binding will be used, which thereby will also hold and maps to the Nashorn Global itself.
Javascript script execution can add/modify new or 'shadowed' variables into the Nashorn Global, these need to be copied/merged back into the SCXML context after execution.

A separate ScriptContext will now be used for each JSEvaluator, to be shared/reused across invocations. JSEvaluator instances therefore must be and only can be used for a single SCXML instance (btw: like with the GroovyEvaluator).

As the Nashorn Global cannot be serialized, modifications made from within Javascript execution to the Global objects themselves (e.g. bind extra properties/functions) will NOT be retained after serialization, and likewise creating Javascript objects and 'returning' them to (using within) the SCXML context will likewise NOT be serializable.
Javscript based SCXML instance serialization therefore is limited within these constraints! 

To support the SCXML requirements for protected system variables, the Javascript Global will be initialized before first access with specific "init_global.js" script, loaded as classpath resource,
which will bind these protected SCXML system properties into the Javscript Global state, as well as the required SCXML In() predicate function.
Note that this uses the ECMAScript Object.bindProperties function, which is NOT (yet) implemented by the Mozilla Rhino engine, which thus cannot be used anymore, not even as optional extra dependency! 
The Javascript engine itself, as the init_global.js script resource, is now created statically only once and reused across all SCXML instances, which might give a performance improvement as well. 

  was:
The current Javascript context binding can be drastically improved and simplified by using a binding which only delegates to the SCXML context it wraps, and not (also) another binding and/or the Nashorn Global binding.

This way, all Javascript context binding changes only will end up in the SCXML context and the Nashorn Global can remain (and should be) 'untouched'. 
This is largely similar to how the Groovy context binding works.
The Nashorn Global binding will be the only 'exception' to this: the new JSBinding will keep that one variable (with key "nashorn.global) separate, not storing it in the SCXML context itself.
This will also simplify the SCXML context serialization (as the Nashorn Global is NOT serializable).

Pre-requisite is that for each SCXML document+JSEvaluator only a single script engine will be used and all script/condition evaluations are using the same Nashorn Global. Which actually will give a performance improvement as well.

The only 'limitation' will be that Nashorn Global modifications (like modifications made to Javscript global objects like Object) will also NOT be stored in the SCXML context, and therefore not be serialized either.
But then, those weren't serializable to begin with, so this is an intrinsic limitation of using the Javascript engine anyway.
Meaning: when using the Javascript engine, global modifications cannot and won't be serialized.
However, as a single and separate engine will be used ('attached') for each SCXML instance, and (therefore) share a single Nashorn Global, as long as the SCXML instance doesn't need to be (de)serialized, using global modifications should just 'work' within the context of that single SCXML instance execution.   



> Reimplement Nashorn Javascript context binding 
> -----------------------------------------------
>
>                 Key: SCXML-245
>                 URL: https://issues.apache.org/jira/browse/SCXML-245
>             Project: Commons SCXML
>          Issue Type: Improvement
>            Reporter: Ate Douma
>            Assignee: Ate Douma
>             Fix For: 2.0
>
>
> The current Javascript context binding can be drastically improved and simplified by using a binding which only delegates to the SCXML context it wraps, and not (also) another binding and/or the Nashorn Global binding.
> The SCXML context will be bound to the ScriptEngine.GLOBAL_SCOPE and for the ScriptEngine.ENGINE_SCOPE the default Nashorn binding will be used, which thereby will also hold and maps to the Nashorn Global itself.
> Javascript script execution can add/modify new or 'shadowed' variables into the Nashorn Global, these need to be copied/merged back into the SCXML context after execution.
> A separate ScriptContext will now be used for each JSEvaluator, to be shared/reused across invocations. JSEvaluator instances therefore must be and only can be used for a single SCXML instance (btw: like with the GroovyEvaluator).
> As the Nashorn Global cannot be serialized, modifications made from within Javascript execution to the Global objects themselves (e.g. bind extra properties/functions) will NOT be retained after serialization, and likewise creating Javascript objects and 'returning' them to (using within) the SCXML context will likewise NOT be serializable.
> Javscript based SCXML instance serialization therefore is limited within these constraints! 
> To support the SCXML requirements for protected system variables, the Javascript Global will be initialized before first access with specific "init_global.js" script, loaded as classpath resource,
> which will bind these protected SCXML system properties into the Javscript Global state, as well as the required SCXML In() predicate function.
> Note that this uses the ECMAScript Object.bindProperties function, which is NOT (yet) implemented by the Mozilla Rhino engine, which thus cannot be used anymore, not even as optional extra dependency! 
> The Javascript engine itself, as the init_global.js script resource, is now created statically only once and reused across all SCXML instances, which might give a performance improvement as well. 



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)