user_statechart.xml 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <class name="UserStatechart">
  2. <relationships>
  3. <association name="parent" class="MvKController" min="1" max="1"/>
  4. </relationships>
  5. <constructor>
  6. <parameter name="username"/>
  7. <parameter name="mvk" />
  8. <body>
  9. <![CDATA[
  10. self.username = username
  11. self.mvk = mvk
  12. self.output_queue = []
  13. self.source_execution = None
  14. self.request_id = 0
  15. self.outstanding_execution = None
  16. self.outstanding_input = {}
  17. self.outstanding_output = None
  18. ]]>
  19. </body>
  20. </constructor>
  21. <scxml initial="init">
  22. <state id="init">
  23. <transition event="set_returnpath" target="../running">
  24. <parameter name="returnpath"/>
  25. <script>
  26. self.returnpath = returnpath
  27. </script>
  28. </transition>
  29. </state>
  30. <parallel id="running">
  31. <state id="execution" initial="executing">
  32. <state id="executing" initial="executing">
  33. <state id="executing">
  34. <onentry>
  35. <raise event="execute" scope="narrow" target="'parent/executor'">
  36. <parameter expr="self.returnpath"/>
  37. <parameter expr="self.username"/>
  38. <parameter expr="'execute_rule'"/>
  39. <parameter expr="[]"/>
  40. <parameter expr="self.request_id"/>
  41. </raise>
  42. <script>
  43. self.outstanding_execution = self.request_id
  44. self.request_id += 1
  45. </script>
  46. </onentry>
  47. <transition event="executed" cond="success and self.outstanding_execution == request_id" target=".">
  48. <parameter name="returnvalue"/>
  49. <parameter name="success"/>
  50. <parameter name="request_id"/>
  51. </transition>
  52. <transition event="executed" cond="not success and self.outstanding_execution == request_id" target="../timeout">
  53. <parameter name="returnvalue"/>
  54. <parameter name="success"/>
  55. <parameter name="request_id"/>
  56. </transition>
  57. </state>
  58. <state id="timeout">
  59. <transition after="1.0" target="../executing"/>
  60. <transition event="set_input_done" target="../executing"/>
  61. </state>
  62. <transition target="../paused" event="pause">
  63. <parameter name="source"/>
  64. <parameter name="args"/>
  65. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  66. <parameter expr="json.dumps({'user': self.username, 'state': 'paused', 'info': self.mvk.debug_info})"/>
  67. </raise>
  68. </transition>
  69. </state>
  70. <state id="paused">
  71. <transition target="../executing" event="resume">
  72. <parameter name="source"/>
  73. <parameter name="args"/>
  74. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  75. <parameter expr="json.dumps({'user': self.username, 'state': 'running'})"/>
  76. </raise>
  77. </transition>
  78. </state>
  79. </state>
  80. <state id="set_input" initial="fetch">
  81. <state id="fetch">
  82. <transition event="set_input" target=".">
  83. <parameter name="source"/>
  84. <parameter name="args"/>
  85. <raise event="execute" scope="narrow" target="'parent/executor'">
  86. <parameter expr="self.returnpath"/>
  87. <parameter expr="self.username"/>
  88. <parameter expr="'set_input'"/>
  89. <parameter expr="args"/>
  90. <parameter expr="self.request_id"/>
  91. </raise>
  92. <script>
  93. if source is not None:
  94. self.outstanding_input[self.request_id] = source
  95. self.request_id += 1
  96. </script>
  97. </transition>
  98. <transition event="executed" cond="request_id in self.outstanding_input" target=".">
  99. <parameter name="returnvalue"/>
  100. <parameter name="success"/>
  101. <parameter name="request_id"/>
  102. <script>
  103. source = self.outstanding_input.pop(request_id)
  104. </script>
  105. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  106. <parameter expr="json.dumps(returnvalue)"/>
  107. </raise>
  108. <raise event="set_input_done"/>
  109. </transition>
  110. </state>
  111. </state>
  112. <state id="get_output_queue">
  113. <state id="waiting">
  114. <transition event="get_output" target=".">
  115. <parameter name="source"/>
  116. <parameter name="args"/>
  117. <script>
  118. self.output_queue.append(source)
  119. </script>
  120. </transition>
  121. </state>
  122. </state>
  123. <state id="get_output" initial="try_execute">
  124. <state id="try_execute">
  125. <transition cond="self.outstanding_output is None and self.output_queue" target=".">
  126. <raise event="execute" scope="narrow" target="'parent/executor'">
  127. <parameter expr="self.returnpath"/>
  128. <parameter expr="self.username"/>
  129. <parameter expr="'get_output'"/>
  130. <parameter expr="[]"/>
  131. <parameter expr="self.request_id"/>
  132. </raise>
  133. <script>
  134. self.outstanding_output = self.request_id
  135. self.request_id += 1
  136. </script>
  137. </transition>
  138. <transition event="executed" cond="success and request_id == self.outstanding_output" target=".">
  139. <parameter name="returnvalue"/>
  140. <parameter name="success"/>
  141. <parameter name="request_id"/>
  142. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + self.output_queue.pop(0)">
  143. <parameter expr="json.dumps(returnvalue)"/>
  144. </raise>
  145. <script>
  146. self.outstanding_output = None
  147. </script>
  148. </transition>
  149. <transition event="executed" cond="not success and request_id == self.outstanding_output" target="../waiting">
  150. <parameter name="returnvalue"/>
  151. <parameter name="success"/>
  152. <parameter name="request_id"/>
  153. <script>
  154. self.outstanding_output = None
  155. </script>
  156. </transition>
  157. </state>
  158. <state id="waiting">
  159. <transition after="1.0" target="../try_execute"/>
  160. </state>
  161. </state>
  162. </parallel>
  163. </scxml>
  164. </class>