A tutorial on SCXML History Element - Remembering State Information
An SCXML with a complex state (A state with substates/parallel elements) can be made to preserve its state information on exit. When a complex state with a history is entered again, it enters the state it was last in rather than the initial state which it would have otherwise entered.
Use Case
To define an error-handler. In many cases, it might be desirable to have the error-handling logic at one place which can be re-used in all the error conditions. Normally, the flow would be, action1-state [act] do action1 on error do error-handling back to action1-state else action2-state [act] do action1 on error do error-handling back to action2-state else action3-state [act] do action1 on error do error-handling back to action3-state else
Example based on the use case above (without history)
<scxml xmlns="http://www.w3.org/2005/07/SCXML" version="1.0" xmlns:somespace="http://stack.mera.com/CCXML" initialstate="action1-state"> <state id="action1-state"> <transition event="act" target="action2-state"/> </state> <state id="action2-state"> <onentry> <somespace:some-action/> </onentry> <transition event="act" target="action3-state"/> <transition event="application.error" target="action2-error-handler"/> </state> <state id="action3-state"> <onentry> <somespace:some-action/> </onentry> <transition event="act" target="action4-state"/> <transition event="application.error" target="action3-error-handler"/> </state> <state id="action4-state" final="true"/> <state id="action2-error-handler"> <onentry> <somespace:handle-error/> </onentry> <transition target="action2-state"/> </state> <state id="action3-error-handler"> <onentry> <somespace:handle-error/> </onentry> <transition target="action3-state"/> </state> <state id="action4-state" final="true"/> </scxml>
SCXML Using history element
<?xml version="1.0"?> <scxml xmlns="http://www.w3.org/2005/07/SCXML" xmlns:my="http://my.custom-actions.domain/CUSTOM" version="1.0" initialstate="universe"> <state id="universe"> <initial> <transition target="history-actions"/> </initial> <transition event="application.error" target="error-handler"/> <history type="deep" id="history-actions"> <transition target="action-1"/> </history> <state id="action-1"> <transition event="action.done" target="action-2"/> </state> <state id="action-2"> <transition event="action.done" target="action-3"/> </state> <state id="action-3" final="true"/> </state> <state id="error-handler"> <transition event="error.handled" target="history-actions"/> </state> </scxml>
Explanation
TODO
Source Code
TODO
Contributed By: Fasihullah Askiri