RFR: 8234959: FXMLLoader does not populate ENGINE_SCOPE Bindings with FILENAME and ARGV

Rony G.Flatscher github.com+60214806+ronyfla at openjdk.java.net
Tue Feb 25 13:33:10 UTC 2020


On Sat, 22 Feb 2020 15:39:35 GMT, Rony G. Flatscher <github.com+60214806+ronyfla at openjdk.org> wrote:

> …9: FXMLLoader does not populate ENGINE_SCOPE Bindings with FILENAME and ARGV

OK, forgot to submit an explanatory text related to this fix. Posted [1] which explains the problem and the suggested solution for discussion. 

- This pull request relates to: <https://bugs.openjdk.java.net/browse/JDK-8234959>

- Brief background: the controller code for a FXML file can be written in
  any of the Java script languages that implement the javax.script framework
  introduced with Java 6

There are three possible types of script code definitions possible in fxml files:

1. in an empty script element where the source attribute denotes an external file
   that contains the code, e.g.:

     <fx:script source="somescript.rex" />

   This pull request uses the source attribute value as the filename.

   There are no arguments to be supplied.

2. text of a script element, e.g.:

      <fx:script>say 'code executed at:' .dateTime~new </fx:script>

   or:

      <fx:script><![CDATA[say 'code executed at:' .dateTime~new ]]></fx:script>

   This pull request uses the fxml-filename appended with the string
   "-script_starting_at_line_" and the starting line number of the code.

   There are no arguments to be supplied.

   Reasonings:

        - in the case that multiple fxml files employ script code it is important
          to learn the name of the fxml file that hosts the code that gets executed

        - the dash after the fxml filename is meant to ease parsing

        - in the case that there are multiple fx:script elements in a fxml file
          with inline code it is important to learn in which line the code starts
          that gets executed

        - the decorated filename thereby becomes self documentary and unambiguous to
          the script code developer when debugging


3. PCDATA text in an event attribute which by convention starts with "on", e.g. "onAction":

   <fx:button text="Hi!" onAction="say 'click at:' .dateTime~new', event='arg(1)~toString" />

   This pull request uses the fxml-filename appended with a dash "-", appended with the
   name of the event attribute, the string "_attribute_in_element_ending_at_line_" and
   the ending line number of the element.

   In the ScriptEventHandler constructor the decorated filename gets stored in addition
   to the script and the scriptEngine.

   Each time the event fires the event object argument will be stored in a copy of the
   engineBindings with the index EVENT_KEY as well as with a single capacity Object array
   stored with the index ScriptEngine.ARGV and the filename with the index
   ScriptEngine.FILENAME. The script's evaluation will get this engineBindings as
   its ENGINE_SCOPE Bindings supplied.

   Reasonings:

        - in the case that multiple fxml files employ script code it is important
          to learn the name of the fxml file that hosts the event code that gets
          executed

        - the dash after the fxml filename is meant to ease parsing

        - in the case that there are multiple event attributes in elements
          in a fxml file it is important to learn which event attribute in which
          element hosts the event script code that gets executed

        - the decorated filename thereby becomes self documentary and unambiguous to
          the script code developer when debugging

        - the structural change to the constructor (adding the decorated filename as
          a third argument) of the private static ScriptEventHandler class is confined
          to the FXMLLoader class and has no side effects

[1] "Ad suggested test unit for 'JDK-8234959 FXMLLoader does not populate ENGINE_SCOPE Bindings with FILENAME and ARGV'": <https://mail.openjdk.java.net/pipermail/openjfx-dev/2020-February/025104.html>

-------------

PR: https://git.openjdk.java.net/jfx/pull/122


More information about the openjfx-dev mailing list