user_statechart.xml 6.8 KB

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