W3C home > Mailing lists > Public > www-voice@w3.org > January to March 2013

RE: Fallback for LCCA when <scxml> is included

From: Jim Barnett <Jim.Barnett@genesyslab.com>
Date: Tue, 12 Feb 2013 21:50:32 +0000
To: Gavin Kistner <phrogz@me.com>, "www-voice@w3.org" <www-voice@w3.org>, "www-voice@w3.org" <www-voice@w3.org>
Message-ID: <57A15FAF9E58F841B2B1651FFE16D281020538@GENSJZMBX03.msg.int.genesyslab.com>
<transition> is not allowed inside the <scxml> element (in part to avoid problems like this.) <scxml> can have <state>, <parallel>, and <final> children (along with <datamodel> and <script>), but <transition is not allowed.

-          Jim

From: Gavin Kistner [mailto:phrogz@me.com]
Sent: Tuesday, February 12, 2013 4:39 PM
To: www-voice@w3.org; www-voice@w3.org
Subject: Fallback for LCCA when <scxml> is included

The prose for findLCCA() says "Note that there is guaranteed to be such an element since the <scxml> wrapper element is a common ancestor of all states." This makes sense; of course findLCCA() should always return something, the <scxml> if nothing else.

Then the prose says "Note also that since we are speaking of proper ancestor (parent or parent of a parent, etc.) the LCCA is never a member of stateList.". This is also true from the implementation.

However, if the <scxml> element itself is in stateList, then the current implementation causes the second statement to win over the first, and findLCCA() has a Null return value. Consider this document:

    <scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0">
      <transition cond="In('a')" target="pass"/>
      <parallel id="p"><state id="a"/></parallel>
      <final id="pass"/>

When processing the states to enter in enterStates() findLCCA() is passed t.source, which is the <scxml>. Consequently findLCCA() returns Null, which causes the call to getProperAncestors(s,ancestor) to include the <scxml> element (since there is no stop node). This adds <scxml> to the configuration, and consequently my runtime gets cranky when it hits an active 'state' with no id.

The proposed fix is to add a final fallback line to findLCCA() as follows:

    function findLCCA(stateList):
      for anc in getProperAncestors(stateList.head(),null).filter(isCompoundState):
        if stateList.tail().every(lambda s: isDescendant(s,anc)):
          return anc
      return findScxml() # returns the root 'doc' <scxml> element
Received on Tuesday, 12 February 2013 21:51:00 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 21:07:43 UTC