Rahul, thank you for your clear explanation. The internal transitions would be the best solution for my use case (and also the default behavior I would personally expect).
In terms of implementing internal transitions, I came across a thread from James Barnett who claims to have them (and other standard features) implemented. Here's the link, http://apache-commons.680414.n4.nabble.com/scxml-removing-superstep-etc-td690740.html. Would you know if there was any subsequent progress? Thanks, Hynek On Tue, Jul 26, 2011 at 9:14 PM, Rahul Akolkar <[email protected]>wrote: > On Mon, Jul 25, 2011 at 6:31 AM, Hynek Cihlar <[email protected]> > wrote: > > I have come across the following case, where I believe the Commons SCXML > > behaves incorrectly. > > > > Assuming the following state machine configuration: > > > > <scxml xmlns="http://www.w3.org/2005/07/scxml" > > xmlns:cs="http://commons.apache.org/scxml" > > version="1.0" > > initialstate="parallel"> > > > > <parallel id="parallel"> > > > > <state id="A"> > > <initial> > > <transition target="A.1"/> > > </initial> > > > > <transition event="anEvent" target="A.2"/> > > <transition event="anAEvent" target="A.3"/> > > > > <state id="A.1"/> > > <state id="A.2"/> > > <state id="A.3"/> > > </state> > > > > <state id="B"> > > > > <initial> > > <transition target="B.1"/> > > </initial> > > > > <transition event="anEvent" target="B.2"/> > > > > <state id="B.1"/> > > <state id="B.2"/> > > </state> > > > > </parallel> > > </scxml> > > > > > > First the event "anEvent" is triggered to bring the parallel states "A" > and > > "B" from their initial states. Now, after triggering the event "anAEvent" > I > > would expect only the state of "A" to be changed. Surprisingly the event > has > > also effect on the "B" state, when it is brought to its initial state. > > > <snip/> > > I understand why this could be slightly surprising, but this is > expected behavior. > > There are two rules of execution that combine here: > (a) When a state machine follows a transition, it must leave the > source state (and enter the target) > (b) A state machine must be in all or none of the orthogonal siblings > (or regions of a parallel) at any given time > > Now, with the above in mind, while processing "anAEvent" the state > machine must leave its source state "A" which happens to be a region > of the parallel, thereby the other region "B" must also be exited. On > reentry into these regions, the rest states are "A2" (explicit target > of transition) and "B1" (initial in absence of any explicit target). > > Clearly, this behavior may not be what you desire. Couple of ways to > correct this and obtain the behavior you are after: > (1) Avoid having transitions that are placed in direct child states of > parallel, this may be done by having an intermediate "wrapper" state. > (2) Define the transition as "internal" so source state is not exited > in this case -- this is easier in theory but not supported by Commons > SCXML at the moment (patches to add support welcome). > > -Rahul > > > > Tested on the svn revision 1143657, last changed date 2011-06-07 01:13:06 > > +0200 (Tue, 07 Jun 2011). > > > > I am attaching the output log from the engine execution. > > > > 2011-07-25 12:26:56,419 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:44] : /parallel > > 2011-07-25 12:26:56,420 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:44] : /parallel/A > > 2011-07-25 12:26:56,421 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:44] : /parallel/B > > 2011-07-25 12:26:56,421 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:44] : /parallel/A/A.1 > > 2011-07-25 12:26:56,421 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:44] : /parallel/B/B.1 > > 2011-07-25 12:26:56,425 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdata = null > > 2011-07-25 12:26:56,426 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdatamap = > > {B.entry=null, parallel.entry=null, A.1.entry=null, B.1.entry=null, > > A.entry=null} > > 2011-07-25 12:26:56,451 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdata = null > > 2011-07-25 12:26:56,451 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdatamap = > > {B.entry=null, parallel.entry=null, A.1.entry=null, B.1.entry=null, > > A.entry=null} > > 2011-07-25 12:26:56,452 DEBUG > [org.apache.commons.scxml.SCXMLExecutor:538] : > > Current States: [A.1, B.1] > > 2011-07-25 12:26:56,452 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdata = null > > 2011-07-25 12:26:56,452 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdatamap = > > {anEvent=null} > > 2011-07-25 12:26:56,459 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:53] : /parallel/B/B.1 > > 2011-07-25 12:26:56,459 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:53] : /parallel/A/A.1 > > 2011-07-25 12:26:56,459 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:53] : /parallel/B > > 2011-07-25 12:26:56,459 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:53] : /parallel/A > > 2011-07-25 12:26:56,459 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:63] : transition (event > = > > anEvent, cond = null, from = /parallel/A, to = /parallel/A/A.2) > > 2011-07-25 12:26:56,459 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:63] : transition (event > = > > anEvent, cond = null, from = /parallel/B, to = /parallel/B/B.2) > > 2011-07-25 12:26:56,460 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:44] : /parallel/A > > 2011-07-25 12:26:56,460 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:44] : /parallel/B > > 2011-07-25 12:26:56,460 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:44] : /parallel/A/A.2 > > 2011-07-25 12:26:56,460 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:44] : /parallel/B/B.2 > > 2011-07-25 12:26:56,460 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdata = null > > 2011-07-25 12:26:56,460 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdatamap = > > {B.entry=null, B.exit=null, B.2.entry=null, A.2.entry=null, > B.1.exit=null, > > A.exit=null, A.1.exit=null, A.entry=null} > > 2011-07-25 12:26:56,465 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdata = null > > 2011-07-25 12:26:56,465 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdatamap = > > {B.entry=null, parallel.entry=null, A.1.entry=null, B.1.entry=null, > > A.entry=null} > > 2011-07-25 12:26:56,465 DEBUG > [org.apache.commons.scxml.SCXMLExecutor:538] : > > Current States: [B.2, A.2] > > 2011-07-25 12:26:56,465 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdata = null > > 2011-07-25 12:26:56,465 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdatamap = > > {anAEvent=null} > > 2011-07-25 12:26:56,469 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:53] : /parallel/B/B.2 > > 2011-07-25 12:26:56,469 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:53] : /parallel/A/A.2 > > 2011-07-25 12:26:56,469 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:53] : /parallel/B > > 2011-07-25 12:26:56,470 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:53] : /parallel/A > > 2011-07-25 12:26:56,470 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:63] : transition (event > = > > anAEvent, cond = null, from = /parallel/A, to = /parallel/A/A.3) > > 2011-07-25 12:26:56,470 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:44] : /parallel/A > > 2011-07-25 12:26:56,470 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:44] : /parallel/B > > 2011-07-25 12:26:56,470 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:44] : /parallel/A/A.3 > > 2011-07-25 12:26:56,470 INFO > > [org.apache.commons.scxml.env.SimpleSCXMLListener:44] : /parallel/B/B.1 > > 2011-07-25 12:26:56,470 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdata = null > > 2011-07-25 12:26:56,471 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdatamap = > > {B.entry=null, B.exit=null, B.2.exit=null, A.3.entry=null, A.exit=null, > > B.1.entry=null, A.entry=null, A.2.exit=null} > > 2011-07-25 12:26:56,473 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdata = null > > 2011-07-25 12:26:56,474 DEBUG > > [org.apache.commons.scxml.env.SimpleContext:165] : _eventdatamap = > > {B.entry=null, parallel.entry=null, A.1.entry=null, B.1.entry=null, > > A.entry=null} > > 2011-07-25 12:26:56,474 DEBUG > [org.apache.commons.scxml.SCXMLExecutor:538] : > > Current States: [A.3, B.1] > > > > > > > > Hynek > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
