As the zip-archive attachment got stripped, for a brief time the zip-archive 
can be fetched from
<https://www.dropbox.com/s/l4uesrwm0iw5vb9/testcaseFXMLLoaderScriptEngines.zip?dl=0>.

---rony

On 21.11.2019 15:29, Rony G. Flatscher wrote:
> On 15.11.2019 16:08, Rony G. Flatscher wrote:
>> On 14.11.2019 22:57, Kevin Rushforth wrote:
>>> On 11/14/2019 10:12 AM, Rony G. Flatscher wrote:
>>>> On 14.11.2019 16:34, Rony G. Flatscher wrote:
>>>>> On 13.11.2019 19:50, Kevin Rushforth wrote:
>>>>>> On 11/13/2019 9:42 AM, Rony G. Flatscher wrote:
>>>> ... cut ...
>>>>>>> To reproduce the testcase one would need ooRexx and the Java bridge 
>>>>>>> BSF4ooRexx (all
>>>>>>> opensource) for
>>>>>>> which I could come up with a zip-archive (assuming binaries within 
>>>>>>> should be 64-bit) and a
>>>>>>> script to
>>>>>>> set up the environment either for Windows, Linux or MacOS, whatever you 
>>>>>>> advise. Would that be
>>>>>>> o.k.?
>>>>>> We prefer not to rely on third-party libraries for test cases. In any 
>>>>>> case we would not be able to
>>>>>> use that for a regression test / unit test.
>>>> If test units really seem to be important in this particular case, one 
>>>> possibility would be to
>>>> create a minimalistic ScriptEngine implementation in pure Java just for 
>>>> the sole purpose to allow
>>>> the creation of a test unit that is able to assert that FXMLLoader puts 
>>>> the ScriptEngine.ARGV and
>>>> ScriptEngine.FILENAME entries into the ENGINE_SCOPE Bindings. E.g. having 
>>>> the ScriptEngine's eval()
>>>> methods return the ScriptContext at invocation time in order to allow 
>>>> inspection of the Bindings.
>>>> This way it would become also possible to write in addition test units 
>>>> that also check whether all
>>>> FXML elements that carry a fx:id are really placed into the GLOBAL_SCOPE 
>>>> Bindings.
>>> Something like that seems reasonable, and would avoid a dependence on 
>>> Nashorn, which in addition
>>> to having all the problems you mentioned, is deprecated for removal.
>>>
>>>> However,
>>> Did you have something more to add?
>> No, sorry for that. Rewrote my e-mail and had sent it too early by mistake 
>> and without noticing.
>>
>> Will study all the procedures and create a testcase to be submitted at 
>> <https://bugreport.java.com/>
>> as per your advice (and will report back under this thread once submitted). 
>> The testcase would use
>> an artificial ScriptEngine implementation that could be used for testunit 
>> testing as well. This
>> might take a while due to other obligations that I will have to meet during 
>> the next few days.
>>
>> ---rony
> O.K., so came up with a test case that contains an artificial script engine 
> implementation for
> logging the eval() invocations together with the scripts to execute and the 
> ScriptContext
> ENGINE_SCOPE and GLOBAL_SCOPE Bindings at the time of the invocation. (It is 
> meant to be also usable
> for creating script engine related test units for Java script hosts.)
>
> Packaged the source and binaries of that script engine as jar file that one 
> merely needs to put on
> the CLASSPATH or add as a module.
>
> An updated FXMLLoader patch suggesting a fix is included as well. This 
> version appends the line
> number to the file name if the script to be evaluated is embedded in the 
> fxml-file, such that in
> case of an error it becomes possible to quickly find it in larger fxml files.
>
> With the zip-archive done I went to the Oracle Java Bug Database and just 
> entered a bug report at
> <https://bugreport.java.com/bugreport/submit_start.do> got the internal "ID : 
> 9062887".
>
> As it was not possible to attach/upload the zip-archive at this point, I will 
> attach the zip-archive
> (contains all sources and binaries) to this e-mail. The contained 
> <readme.txt> reads:
>
>     Testcase that demonstrates that FXMLLoader does not set [1]
>     ScriptEngine.FILENAME and [2] ScriptEngine.ARGV entries in
>     ScriptContext.ENGINE_SCOPE Bindings.
>
>     To run the test case:
>
>     - unzip testcaseFXMLLoaderScriptEngines.zip,
>
>     - change into "testcaseFXMLLoaderScriptEngines" subdirectory,
>
>     - run the testcase by issuing the following command:
>
>       - Unix:
>
>             java -cp .:RgfPseudoScriptEngine.jar 
> FXMLLoaderTestCase4ScriptEngineScope
>
>       - Windows:
>
>             java -cp .;RgfPseudoScriptEngine.jar 
> FXMLLoaderTestCase4ScriptEngineScope
>
>     FXMLLoaderTestCase4ScriptEngineScope loads "demo_01.fxml" which is a 
> controller
>     that uses the pseudo script language 
> rgf.scriptEngine.RgfPseudoScriptEngine,
>     which logs the eval() invocations with the script code and the Bindings 
> of the
>     ScriptContext.
>
>     Comparing "demo_01.fxml" and the output of the above test case 
> demonstrates that
>     FXMLLoader does not popuplate the [3] ENGINE_SCOPE Bindings with the 
> filename of
>     the script that gets evaluated, nor does add the ARGV entry to the 
> ENGINE_SCOPE
>     Bindings in the case of events (just an entry named "event").
>
>     In case of errors (during development or deployment) it is not possible
>     therefore to point to the file (external file or the fxml-file defining
>     explicitly script code) in which a runtime error has occurred.
>
>     In the case of an event callback, if ARGV was defined the script code 
> could
>     directly fetch and interact with the supplied event object argument.  In 
> the
>     case that a script engine does not automatically make Bindings entry 
> available
>     as implicit variables (e.g.  for scoping reasons) it becomes cumbersome 
> or even
>     impossible in some script engine implementations (if they do not provide 
> access
>     to the Bindings) to get at the event argument of the callback invocation.
>
>     The JSR-223 specifications lists all the (reserved) ScriptEngine 
> constants that
>     are meant to be used as reserved keys for the ENGINE_SCOPE Bindings, 
> whenever
>     appropriate cf.  [0] p.  l50 ff.  (A ScriptEngine is supposed to populate 
> and
>     maintain the ENGINE_SCOPE Bindings hence the definition of these 
> constants with
>     the class.)
>
>     Running the above program on Windows yields the output captured and 
> supplied in
>     [4].
>
>     The supplied patch [5] changes FXMLLoader.java such,
>
>     - that the ScriptEngine.FILENAME entry is always set in the ENGINE_SCOPE
>       Bindings. In the case that the scripts are hosted in a fxml-file that 
> file
>       path will be used together with an appended string that hints at the 
> location
>       in the fxml file from where the script has been taken for evaluation. 
> In the
>       case of event handling scripts that appended string hints at the 
> location in
>       the fxml-file where the event attribute with the script code got used.
>
>     - and that the ScriptEngine.ARGV entry is always set in the ENGINE_SCOPE
>       Bindings for event callbacks using the 'event' object as the single 
> argument.
>
>     Applying the patch and running the above program on Linux yields the 
> output
>     captured and supplied in [6].
>
>     ---
>
>     The jar-file [7] needs merely to be put on the CLASSPATH (or MODULE_PATH 
> as a
>     proper module-info.class is included, the module name is 
> "rgf.scriptEngine") to
>     make the pseudo scripting language available and to run the supplied 
> testcase.
>     The RgfPseudoScriptEngine (script engine name and extension is "rpsl")
>     implementation should also make it possible to create test units for 
> asserting
>     that Java script hosts are populating the ScriptContext Bindings 
> according to
>     specifications.
>
>     All Java classes come with their source code (the script engine service 
> file and
>     module-info.{java|class} are contained in the jar file).
>
>     Having signed the OCA you may use all of the supplied code freely.
>
>     If there is anything you need or that I could provide, please let me know.
>
>     ---rony
>
>     [0] JSR-223 specification at <https://jcp.org/en/jsr/detail?id=223>, 
> download
>         <https://jcp.org/aboutJava/communityprocess/pfd/jsr223/index.html>:
>         "java_scripting-1_0-fr-spec.pdf"
>
>     [1]
>     
> <https://docs.oracle.com/en/java/javase/11/docs/api/java.scripting/javax/script/ScriptEngine.html#FILENAME>
>
>     [2]
>     
> <https://docs.oracle.com/en/java/javase/11/docs/api/java.scripting/javax/script/ScriptEngine.html#ARGV>
>
>     [3]
>     
> <https://docs.oracle.com/en/java/javase/11/docs/api/java.scripting/javax/script/ScriptContext.html#ENGINE_SCOPE>
>
>     [4] Output of running the testcase on Windows (Java 8): 
> "info/Demo_output_without_fix.txt"
>
>     [5] FXMLLoader patch: 
> "info/diff_add_FILENAME_ARGV_to_FXMLLoader_preferable_20191121.txt"
>
>     [6] Output of running the testcase after patching FXMLLoader with [5] on 
> Linux (OpenJDK 11.0.5):
>         "info/Demo_output_with_fix_and_linenumbers.txt"
>
>     [7] Pseudo script engine implementation to be put on the CLASSPATH or 
> MODULE_PATH (module
>         name "rgf.scriptEngine"): <RgfPseudoScriptEngine.jar>
>
>     [8] FXML test case:
>
>         - FXMLLoaderTestCase4ScriptEngineScope.{java|class}
>           ... loads "demo_01.rxml" and dumps the engine and global Bindings
>
>         - demo_01.fxml
>         ... FXML file using scripts in the pseudo script language [7] as 
> controller,
>             either as external or embedded scripts, including scripts for 
> event
>             handling Action and MouseClicked events
>
>         - demo_01_bottomscript.rpsl  ... serving as external script file
>
>         - demo_01_middlescript.rpsl  ... serving as external script file
>
>         - demo_01_topscript.rpsl     ... serving as external script file
>
> If there is anything else I can/should do, please advise.
> (Being on the road in the next few days it might take me until the beginning 
> of next week to get back.)
>
> ---rony
>

Reply via email to