user_statechart.xml 6.8 KB

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