Server.xml 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <class name="Server">
  2. <relationships>
  3. <association name="sockets" class="Socket"/>
  4. </relationships>
  5. <constructor>
  6. <parameter name="bootfile"/>
  7. <body>
  8. <![CDATA[
  9. self.socket = None
  10. self.processing_association_name = None
  11. self.processing_data = None
  12. self.queue = []
  13. self.mvs = ModelverseState(bootfile)
  14. self.mvs_operations = {
  15. "CN": self.mvs.create_node,
  16. "CE": self.mvs.create_edge,
  17. "CNV": self.mvs.create_nodevalue,
  18. "CD": self.mvs.create_dict,
  19. "RV": self.mvs.read_value,
  20. "RO": self.mvs.read_outgoing,
  21. "RI": self.mvs.read_incoming,
  22. "RE": self.mvs.read_edge,
  23. "RD": self.mvs.read_dict,
  24. "RDN": self.mvs.read_dict_node,
  25. "RDE": self.mvs.read_dict_edge,
  26. "RRD": self.mvs.read_reverse_dict,
  27. "RR": self.mvs.read_root,
  28. "RDK": self.mvs.read_dict_keys,
  29. "DE": self.mvs.delete_edge,
  30. "DN": self.mvs.delete_node,
  31. "DG": self.mvs.dump,
  32. }
  33. ]]>
  34. </body>
  35. </constructor>
  36. <method name="process_message">
  37. <parameter name="operation_name"/>
  38. <parameter name="parameters"/>
  39. <body>
  40. <![CDATA[
  41. op = self.mvs_operations[operation_name]
  42. return op(*parameters)
  43. ]]>
  44. </body>
  45. </method>
  46. <scxml initial="main">
  47. <parallel id="main">
  48. <state id="queue">
  49. <state id="queue">
  50. <transition event="HTTP_output" target=".">
  51. <parameter name="association_name"/>
  52. <parameter name="data"/>
  53. <script>
  54. self.queue.append((association_name, data))
  55. </script>
  56. </transition>
  57. </state>
  58. </state>
  59. <state id="processor" initial="wait_for_input">
  60. <state id="wait_for_input">
  61. <transition cond="len(self.queue) > 0" target="../process_input">
  62. <script>
  63. self.processing_association_name, self.processing_data = self.queue.pop(0)
  64. try:
  65. self.processing_data = json.loads(self.processing_data["requests"])
  66. except:
  67. print("Error in deserialization: " + str(self.processing_data))
  68. </script>
  69. </transition>
  70. </state>
  71. <state id="process_input">
  72. <!-- A message from the client, containing data. -->
  73. <transition target="../wait_for_input">
  74. <script>
  75. reply = []
  76. print(self.processing_data)
  77. for op, params in self.processing_data:
  78. try:
  79. result = self.process_message(op, params)
  80. try:
  81. reply.append(result)
  82. except:
  83. traceback.print_exc()
  84. reply.append([None, 496])
  85. except:
  86. traceback.print_exc()
  87. reply.append([None, 497])
  88. </script>
  89. <raise scope="narrow" target="self.processing_association_name" event="HTTP_input">
  90. <parameter expr="{'data': json.dumps(reply)}"/>
  91. </raise>
  92. </transition>
  93. </state>
  94. </state>
  95. <state id="server" initial="init">
  96. <state id="init">
  97. <onentry>
  98. <raise scope="output" event="create_socket" port="socket_out"/>
  99. </onentry>
  100. <transition port="socket_in" event="created_socket" target="../binding">
  101. <parameter name="socket"/>
  102. <script>
  103. self.socket = socket
  104. </script>
  105. </transition>
  106. </state>
  107. <!-- TODO fix hardcoded port number -->
  108. <state id="binding">
  109. <onentry>
  110. <raise scope="output" event="bind_socket" port="socket_out">
  111. <parameter expr="self.socket"/>
  112. <parameter expr="('', 8000)"/>
  113. </raise>
  114. </onentry>
  115. <transition port="socket_in" event="bound_socket" cond="self.socket == socket" target="../listening">
  116. <parameter name="socket"/>
  117. </transition>
  118. </state>
  119. <state id="listening">
  120. <onentry>
  121. <raise scope="output" event="listen_socket" port="socket_out">
  122. <parameter expr="self.socket"/>
  123. </raise>
  124. </onentry>
  125. <transition port="socket_in" event="listened_socket" cond="self.socket == socket" target="../accepting">
  126. <parameter name="socket"/>
  127. </transition>
  128. </state>
  129. <state id="accepting">
  130. <onentry>
  131. <raise scope="output" port="socket_out" event="accept_socket">
  132. <parameter expr="self.socket"/>
  133. </raise>
  134. </onentry>
  135. <transition port="socket_in" event="accepted_socket" cond="self.socket == socket" target=".">
  136. <parameter name="socket"/>
  137. <parameter name="connected_socket"/>
  138. <script>
  139. </script>
  140. <raise scope="cd" event="create_instance">
  141. <parameter expr="'sockets'" />
  142. <parameter expr="'Socket'" />
  143. <parameter expr="connected_socket" />
  144. </raise>
  145. </transition>
  146. <transition event="instance_created" target=".">
  147. <parameter name="instancename"/>
  148. <raise scope="cd" event="start_instance">
  149. <parameter expr="instancename" />
  150. </raise>
  151. <raise scope="narrow" event="set_association_name" target="instancename">
  152. <parameter expr="instancename"/>
  153. </raise>
  154. </transition>
  155. </state>
  156. </state>
  157. <state id="close_socket">
  158. <state id="close">
  159. <transition event="close" target=".">
  160. <parameter name="association_name"/>
  161. <raise scope="cd" event="delete_instance">
  162. <parameter expr="association_name"/>
  163. </raise>
  164. </transition>
  165. </state>
  166. </state>
  167. </parallel>
  168. </scxml>
  169. </class>