From: Rony G. F. <Ron...@wu...> - 2015-06-11 17:15:12
|
Hmm, an additional info, a correction. On 11.06.2015 18:42, Rony G. Flatscher wrote: > Hi there, > > thought, for archival purposes at least :), that I sketch the reasonings that stood behind the > implementation of JSR-223 ("javax.script") in BSF4ooRexx. The JSR-223 implementation is now > considered to be complete, the latest beta of BSF4ooRexx () contains it. You will find examples in > Java and NetRexx that employ this support for ooRexx in the directories > "bsf4oorexx/samples/NetRexx/jsr223" and "bsf4oorexx/samples/Java/jsr223". > > A remark: I was one of the members of the "Java Specification Request" group # 223 ten years ago. > As such I was able to influence the architecture a little bit. The technical lead, a then Sun > employee, Mike Goran, was engaged in experimenting with adding support for PHP in the context of > JSP and the like, so this environment had its influences a little bit, the other one came (e.g. > through myself) from the Apache Software Foundation (ASF) "Bean Scripting Framework (BSF)", which > I use in BSF4ooRexx (that's where "BSF" comes from). > > Ad JSR-223: the specifations can be found and downloaded from > <https://jcp.org/aboutJava/communityprocess/final/jsr223/index.html>. The implementation in Java > took first place with Java 6 (Java 1.6) in the package "javax.script". Currently, Java 8 (Java > 1.8) is the latest official release of Java, hence here the link to its documentation > <https://docs.oracle.com/javase/8/docs/api/index.html?javax/script/package-summary.html>. Please > consult this documentation, if interested in details. > > * javax.script.ScriptEngine: one needs to implement this interface, which is responsible for > evaluating scripts, supplying data to the scripts using the javax.script.ScriptContext > interface functionality and fetching any return values from such scripts. > o To ease the implementation of script engines, there is a partially implemented (abstract) > class that one can extend: javax.script.AbstractScriptEngine > o The org.rexxla.bsf.engines.rexx.jsr223.RexxScriptEngine class extends the > AbstractScriptEngine. > + This class implements the Compilable and Invocable interfaces as well. > + In addition it defines a method named "RexxCompiledScript getCurrentScript()" that > returns the compiled (actually the initialized routine object from the latest run) script. > + As long as no script has been evaluated/run by the RexxScriptEngine instance yet, it > is possible to configure the associated ooRexx interpreter to your needs, by using the > method "public org.rexxla.bsf.engines.rexx.RexxEngine getBsfRexxEngine()"; cf. samples > in "bsf4oorexx/samples/NetRexx/handlers" and "bsf4oorexx/samples/Java/handlers" > > * The ScriptContext maintains instances of classes that implement the javax.script.Bindings > interface at the ScriptContext.ENGINE_SCOPE and/or the ScriptContext.GLOBAL_SCOPE. Note these > scopes have well defined, numeric values, ENGINE_SCOPE the value 100, GLOBAL_SCOPE the value > 200. In theory it is possible to define any additional number of bindings by using different > numeric values for "scope". > o To ease the implementation of script engines, there is an implementation of the Bindings > interface: javax.script.SimpleBindings > o To ease the implementation of script engines, there is an implementation of the > ScriptContext interface: javax.script.SimpleScriptContext which employs > javax.script.SimpleBindings > > * javax.script.ScriptEngineFactory: this interface must be implemented. > o The org.rexxla.bsf.engines.rexx.jsr223.RexxScriptEngineFactory implements this interface. > > * javax.script.Invocable: this interface is optional. > Addtional REMARK: * javax.script.Invocable: this interface is optional. o implemented by org.rexxla.bsf.engines.rexx.jsr223.RexxScriptEngine o implemented by org.rexxla.bsf.engines.rexx.jsr223.RexxCompiledScript > * javax.script.Compilable: this interface is optional. > CORRECTION: * javax.script.Compilable: this interface is optional. o implemented by org.rexxla.bsf.engines.rexx.jsr223.RexxScriptEngine * javax.script.CompiledScript o To ease the implementation of script engines, there is a partially implemented (abstract) class that one can extend: javax.script.CompiledScript o The org.rexxla.bsf.engines.rexx.jsr223.RexxCompiledScript extends this abstract class. + RexxCompiledScript implements the Invocable interface > The RexxScriptEngine will always compile the supplied script, caches it ("state of the script > engine") and invokes the "Object eval(ScriptContext)" method on it. > > If the same script source gets supplied again, then the RexxCompiledScript is reused, by supplying > the actual ScriptContext which should be employed in its ".eval(Scriptcontext)". > > Any invocation from Invocable() methods will cause the appropriate Invocable methods in the > compiled script (fetched with "RexxCompiledScript RexxScriptEngine.getCurrentScript()") to be > executed. Due to the BSF4ooRexx implementation the Invocable methods "public Object > invokeMethod(Object thiz, String name, Object... args)" and "public <T> T getInterface(Object > thiz, Class<T> clasz)" are implemented (and used by RexxCompiledScript objects) in > RexxScriptEngine, the other Invocable methods are used with their RexxCompiledScript implementations. > > The JSR-223 samples that demonstrate how to use the "javax.script" functionality (together with > the Rexx scripts they employ) from NetRexx and Java can be found > "bsf4oorexx/samples/NetRexx/jsr223" and "bsf4oorexx/samples/Java/jsr223". > > A concluding hint: the "bsf4oorexx/samples" directories all have a file named "index.html" which > briefly explains the samples stored in the directory they belong to. > > ---- > > If there are any questions, please come forward and ask them! > > ---rony Sorry for any inconvenience. ---rony |