server.py 80 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
  3. Date: Thu Feb 9 13:03:43 2017
  4. Model author: Yentl Van Tendeloo
  5. Model name: MvK Server
  6. Model description:
  7. Modelverse Kernel server. Server for the MvI, client of the MvS.
  8. """
  9. from sccd.runtime.statecharts_core import *
  10. import time
  11. import os
  12. import urllib
  13. import sys
  14. import json
  15. from modelverse_kernel.main import ModelverseKernel
  16. sys.path.append("../../state")
  17. from modelverse_state.main import ModelverseState
  18. # package "MvK Server"
  19. class MvKController(RuntimeClassBase):
  20. def __init__(self, controller, params):
  21. RuntimeClassBase.__init__(self, controller)
  22. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  23. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  24. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  25. self.semantics.priority = StatechartSemantics.SourceParent
  26. self.semantics.concurrency = StatechartSemantics.Single
  27. # build Statechart structure
  28. self.build_statechart_structure()
  29. # call user defined constructor
  30. MvKController.user_defined_constructor(self, params)
  31. def user_defined_constructor(self, params):
  32. self.users = []
  33. self.user_statecharts = {"__hierarchy": None}
  34. self.input_queue = []
  35. self.user_queue = {}
  36. self.source = None
  37. self.root = None
  38. self.params = params
  39. def user_defined_destructor(self):
  40. pass
  41. # builds Statechart structure
  42. def build_statechart_structure(self):
  43. # state <root>
  44. self.states[""] = State(0, self)
  45. # state /init_server
  46. self.states["/init_server"] = State(1, self)
  47. self.states["/init_server"].setEnter(self._init_server_enter)
  48. # state /init_executor
  49. self.states["/init_executor"] = State(2, self)
  50. self.states["/init_executor"].setEnter(self._init_executor_enter)
  51. # state /read_root
  52. self.states["/read_root"] = State(3, self)
  53. self.states["/read_root"].setEnter(self._read_root_enter)
  54. # state /running
  55. self.states["/running"] = ParallelState(4, self)
  56. # state /running/wait_for_requests
  57. self.states["/running/wait_for_requests"] = State(5, self)
  58. # state /running/wait_for_requests/wait
  59. self.states["/running/wait_for_requests/wait"] = State(6, self)
  60. # state /running/push
  61. self.states["/running/push"] = State(7, self)
  62. # state /running/push/wait
  63. self.states["/running/push/wait"] = State(8, self)
  64. # state /running/push/process
  65. self.states["/running/push/process"] = State(9, self)
  66. # state /running/find_users
  67. self.states["/running/find_users"] = State(10, self)
  68. # state /running/find_users/get_all_links
  69. self.states["/running/find_users/get_all_links"] = State(11, self)
  70. self.states["/running/find_users/get_all_links"].setEnter(self._running_find_users_get_all_links_enter)
  71. # state /running/find_users/retrieve_users
  72. self.states["/running/find_users/retrieve_users"] = State(12, self)
  73. # state /running/find_users/got_usernames
  74. self.states["/running/find_users/got_usernames"] = State(13, self)
  75. # state /running/find_users/process_users
  76. self.states["/running/find_users/process_users"] = State(14, self)
  77. # state /running/find_users/creating_user
  78. self.states["/running/find_users/creating_user"] = State(15, self)
  79. # state /running/find_users/wait
  80. self.states["/running/find_users/wait"] = State(16, self)
  81. self.states["/running/find_users/wait"].setEnter(self._running_find_users_wait_enter)
  82. self.states["/running/find_users/wait"].setExit(self._running_find_users_wait_exit)
  83. # add children
  84. self.states[""].addChild(self.states["/init_server"])
  85. self.states[""].addChild(self.states["/init_executor"])
  86. self.states[""].addChild(self.states["/read_root"])
  87. self.states[""].addChild(self.states["/running"])
  88. self.states["/running"].addChild(self.states["/running/wait_for_requests"])
  89. self.states["/running"].addChild(self.states["/running/push"])
  90. self.states["/running"].addChild(self.states["/running/find_users"])
  91. self.states["/running/wait_for_requests"].addChild(self.states["/running/wait_for_requests/wait"])
  92. self.states["/running/push"].addChild(self.states["/running/push/wait"])
  93. self.states["/running/push"].addChild(self.states["/running/push/process"])
  94. self.states["/running/find_users"].addChild(self.states["/running/find_users/get_all_links"])
  95. self.states["/running/find_users"].addChild(self.states["/running/find_users/retrieve_users"])
  96. self.states["/running/find_users"].addChild(self.states["/running/find_users/got_usernames"])
  97. self.states["/running/find_users"].addChild(self.states["/running/find_users/process_users"])
  98. self.states["/running/find_users"].addChild(self.states["/running/find_users/creating_user"])
  99. self.states["/running/find_users"].addChild(self.states["/running/find_users/wait"])
  100. self.states[""].fixTree()
  101. self.states[""].default_state = self.states["/init_server"]
  102. self.states["/running/wait_for_requests"].default_state = self.states["/running/wait_for_requests/wait"]
  103. self.states["/running/push"].default_state = self.states["/running/push/wait"]
  104. self.states["/running/find_users"].default_state = self.states["/running/find_users/get_all_links"]
  105. # transition /init_server
  106. _init_server_0 = Transition(self, self.states["/init_server"], [self.states["/init_executor"]])
  107. _init_server_0.setAction(self._init_server_0_exec)
  108. _init_server_0.setTrigger(Event("instance_created", None))
  109. self.states["/init_server"].addTransition(_init_server_0)
  110. # transition /init_executor
  111. _init_executor_0 = Transition(self, self.states["/init_executor"], [self.states["/read_root"]])
  112. _init_executor_0.setAction(self._init_executor_0_exec)
  113. _init_executor_0.setTrigger(Event("instance_created", None))
  114. self.states["/init_executor"].addTransition(_init_executor_0)
  115. # transition /read_root
  116. _read_root_0 = Transition(self, self.states["/read_root"], [self.states["/running"]])
  117. _read_root_0.setAction(self._read_root_0_exec)
  118. _read_root_0.setTrigger(Event("raw_exec_reply", None))
  119. self.states["/read_root"].addTransition(_read_root_0)
  120. # transition /running/wait_for_requests/wait
  121. _running_wait_for_requests_wait_0 = Transition(self, self.states["/running/wait_for_requests/wait"], [self.states["/running/wait_for_requests/wait"]])
  122. _running_wait_for_requests_wait_0.setAction(self._running_wait_for_requests_wait_0_exec)
  123. _running_wait_for_requests_wait_0.setTrigger(Event("from_mvi", None))
  124. self.states["/running/wait_for_requests/wait"].addTransition(_running_wait_for_requests_wait_0)
  125. # transition /running/push/wait
  126. _running_push_wait_0 = Transition(self, self.states["/running/push/wait"], [self.states["/running/push/process"]])
  127. _running_push_wait_0.setTrigger(None)
  128. _running_push_wait_0.setGuard(self._running_push_wait_0_guard)
  129. self.states["/running/push/wait"].addTransition(_running_push_wait_0)
  130. _running_push_wait_1 = Transition(self, self.states["/running/push/wait"], [self.states["/running/push/wait"]])
  131. _running_push_wait_1.setAction(self._running_push_wait_1_exec)
  132. _running_push_wait_1.setTrigger(None)
  133. _running_push_wait_1.setGuard(self._running_push_wait_1_guard)
  134. self.states["/running/push/wait"].addTransition(_running_push_wait_1)
  135. # transition /running/push/process
  136. _running_push_process_0 = Transition(self, self.states["/running/push/process"], [self.states["/running/push/wait"]])
  137. _running_push_process_0.setAction(self._running_push_process_0_exec)
  138. _running_push_process_0.setTrigger(None)
  139. _running_push_process_0.setGuard(self._running_push_process_0_guard)
  140. self.states["/running/push/process"].addTransition(_running_push_process_0)
  141. _running_push_process_1 = Transition(self, self.states["/running/push/process"], [self.states["/running/push/wait"]])
  142. _running_push_process_1.setAction(self._running_push_process_1_exec)
  143. _running_push_process_1.setTrigger(None)
  144. _running_push_process_1.setGuard(self._running_push_process_1_guard)
  145. self.states["/running/push/process"].addTransition(_running_push_process_1)
  146. # transition /running/find_users/get_all_links
  147. _running_find_users_get_all_links_0 = Transition(self, self.states["/running/find_users/get_all_links"], [self.states["/running/find_users/retrieve_users"]])
  148. _running_find_users_get_all_links_0.setAction(self._running_find_users_get_all_links_0_exec)
  149. _running_find_users_get_all_links_0.setTrigger(Event("raw_exec_reply", None))
  150. self.states["/running/find_users/get_all_links"].addTransition(_running_find_users_get_all_links_0)
  151. # transition /running/find_users/retrieve_users
  152. _running_find_users_retrieve_users_0 = Transition(self, self.states["/running/find_users/retrieve_users"], [self.states["/running/find_users/got_usernames"]])
  153. _running_find_users_retrieve_users_0.setAction(self._running_find_users_retrieve_users_0_exec)
  154. _running_find_users_retrieve_users_0.setTrigger(None)
  155. _running_find_users_retrieve_users_0.setGuard(self._running_find_users_retrieve_users_0_guard)
  156. self.states["/running/find_users/retrieve_users"].addTransition(_running_find_users_retrieve_users_0)
  157. _running_find_users_retrieve_users_1 = Transition(self, self.states["/running/find_users/retrieve_users"], [self.states["/running/find_users/wait"]])
  158. _running_find_users_retrieve_users_1.setTrigger(None)
  159. _running_find_users_retrieve_users_1.setGuard(self._running_find_users_retrieve_users_1_guard)
  160. self.states["/running/find_users/retrieve_users"].addTransition(_running_find_users_retrieve_users_1)
  161. # transition /running/find_users/got_usernames
  162. _running_find_users_got_usernames_0 = Transition(self, self.states["/running/find_users/got_usernames"], [self.states["/running/find_users/process_users"]])
  163. _running_find_users_got_usernames_0.setAction(self._running_find_users_got_usernames_0_exec)
  164. _running_find_users_got_usernames_0.setTrigger(Event("raw_exec_reply", None))
  165. self.states["/running/find_users/got_usernames"].addTransition(_running_find_users_got_usernames_0)
  166. # transition /running/find_users/process_users
  167. _running_find_users_process_users_0 = Transition(self, self.states["/running/find_users/process_users"], [self.states["/running/find_users/wait"]])
  168. _running_find_users_process_users_0.setTrigger(None)
  169. _running_find_users_process_users_0.setGuard(self._running_find_users_process_users_0_guard)
  170. self.states["/running/find_users/process_users"].addTransition(_running_find_users_process_users_0)
  171. _running_find_users_process_users_1 = Transition(self, self.states["/running/find_users/process_users"], [self.states["/running/find_users/creating_user"]])
  172. _running_find_users_process_users_1.setAction(self._running_find_users_process_users_1_exec)
  173. _running_find_users_process_users_1.setTrigger(None)
  174. _running_find_users_process_users_1.setGuard(self._running_find_users_process_users_1_guard)
  175. self.states["/running/find_users/process_users"].addTransition(_running_find_users_process_users_1)
  176. _running_find_users_process_users_2 = Transition(self, self.states["/running/find_users/process_users"], [self.states["/running/find_users/process_users"]])
  177. _running_find_users_process_users_2.setAction(self._running_find_users_process_users_2_exec)
  178. _running_find_users_process_users_2.setTrigger(None)
  179. _running_find_users_process_users_2.setGuard(self._running_find_users_process_users_2_guard)
  180. self.states["/running/find_users/process_users"].addTransition(_running_find_users_process_users_2)
  181. # transition /running/find_users/creating_user
  182. _running_find_users_creating_user_0 = Transition(self, self.states["/running/find_users/creating_user"], [self.states["/running/find_users/retrieve_users"]])
  183. _running_find_users_creating_user_0.setAction(self._running_find_users_creating_user_0_exec)
  184. _running_find_users_creating_user_0.setTrigger(Event("instance_created", None))
  185. self.states["/running/find_users/creating_user"].addTransition(_running_find_users_creating_user_0)
  186. # transition /running/find_users/wait
  187. _running_find_users_wait_0 = Transition(self, self.states["/running/find_users/wait"], [self.states["/running/find_users/get_all_links"]])
  188. _running_find_users_wait_0.setTrigger(Event("_0after"))
  189. self.states["/running/find_users/wait"].addTransition(_running_find_users_wait_0)
  190. _running_find_users_wait_1 = Transition(self, self.states["/running/find_users/wait"], [self.states["/running/find_users/get_all_links"]])
  191. _running_find_users_wait_1.setTrigger(Event("force_user_refresh", None))
  192. self.states["/running/find_users/wait"].addTransition(_running_find_users_wait_1)
  193. def _init_server_enter(self):
  194. self.big_step.outputEventOM(Event("create_instance", None, [self, 'to_mvi', 'Server', '', 8001]))
  195. def _init_executor_enter(self):
  196. self.big_step.outputEventOM(Event("create_instance", None, [self, 'executor', 'Executor']))
  197. def _read_root_enter(self):
  198. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'executor', Event("raw_exec", None, [[['RR', []]], 'parent'])]))
  199. def _running_find_users_get_all_links_enter(self):
  200. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'executor', Event("raw_exec", None, [[['RDK', [self.root]]], 'parent'])]))
  201. def _running_find_users_wait_enter(self):
  202. self.addTimer(0, 1.0)
  203. def _running_find_users_wait_exit(self):
  204. self.removeTimer(0)
  205. def _init_server_0_exec(self, parameters):
  206. instancename = parameters[0]
  207. self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
  208. def _init_executor_0_exec(self, parameters):
  209. instancename = parameters[0]
  210. self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
  211. def _read_root_0_exec(self, parameters):
  212. data = parameters[0]
  213. self.root = data[0][0]
  214. def _running_wait_for_requests_wait_0_exec(self, parameters):
  215. source = parameters[0]
  216. data = parameters[1]
  217. # No JSON encoding necessary, as it is not complex
  218. try:
  219. print 'from_mvi %s' % data
  220. args = None
  221. if data["op"] == "set_input":
  222. if "value" in data:
  223. value = [json.loads(data["value"])]
  224. else:
  225. value = json.loads(data["data"])
  226. for v in value[:-1]:
  227. self.input_queue.append((None, data["op"], [v], data["username"]))
  228. self.input_queue.append((source, data["op"], [value[-1]], data["username"]))
  229. else:
  230. self.input_queue.append((source, data["op"], args, data["username"]))
  231. except ValueError:
  232. print("Error when deserializing request: " + str(data))
  233. raise
  234. def _running_push_wait_0_guard(self, parameters):
  235. return self.input_queue and self.input_queue[0][3] in self.user_statecharts
  236. def _running_push_wait_1_exec(self, parameters):
  237. self.user_queue.setdefault(self.input_queue[0][3], []).append(self.input_queue.pop(0))
  238. self.raiseInternalEvent(Event("force_user_refresh", None, []))
  239. def _running_push_wait_1_guard(self, parameters):
  240. return self.input_queue and self.input_queue[0][3] not in self.user_statecharts
  241. def _running_push_process_0_exec(self, parameters):
  242. source, op, args, username = self.input_queue.pop(0)
  243. self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.user_statecharts[username], Event("set_input", None, [source, args])]))
  244. def _running_push_process_0_guard(self, parameters):
  245. return self.input_queue[0][1] == 'set_input'
  246. def _running_push_process_1_exec(self, parameters):
  247. source, op, args, username = self.input_queue.pop(0)
  248. self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.user_statecharts[username], Event("get_output", None, [source, args])]))
  249. def _running_push_process_1_guard(self, parameters):
  250. return self.input_queue[0][1] == 'get_output'
  251. def _running_find_users_get_all_links_0_exec(self, parameters):
  252. data = parameters[0]
  253. self.users = data[0][0]
  254. def _running_find_users_retrieve_users_0_exec(self, parameters):
  255. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'executor', Event("raw_exec", None, [[['RV', [user]] for user in self.users], 'parent'])]))
  256. def _running_find_users_retrieve_users_0_guard(self, parameters):
  257. return self.users
  258. def _running_find_users_retrieve_users_1_guard(self, parameters):
  259. return not self.users
  260. def _running_find_users_got_usernames_0_exec(self, parameters):
  261. data = parameters[0]
  262. data = set([v[0] for v in data])
  263. self.add_users = [v for v in data if v not in self.user_statecharts]
  264. self.delete_users = [v for v in self.user_statecharts if v not in data]
  265. def _running_find_users_process_users_0_guard(self, parameters):
  266. return not self.add_users and not self.delete_users
  267. def _running_find_users_process_users_1_exec(self, parameters):
  268. self.big_step.outputEventOM(Event("create_instance", None, [self, 'users', 'UserStatechart', self.add_users[0]]))
  269. def _running_find_users_process_users_1_guard(self, parameters):
  270. return self.add_users and not self.delete_users
  271. def _running_find_users_process_users_2_exec(self, parameters):
  272. self.big_step.outputEventOM(Event("delete_instance", None, [self, self.user_statecharts.pop(self.delete_users.pop(0))]))
  273. def _running_find_users_process_users_2_guard(self, parameters):
  274. return self.delete_users
  275. def _running_find_users_creating_user_0_exec(self, parameters):
  276. instancename = parameters[0]
  277. self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
  278. self.big_step.outputEventOM(Event("narrow_cast", None, [self, instancename, Event("set_returnpath", None, [instancename])]))
  279. self.user_statecharts[self.add_users[0]] = instancename
  280. # Repush all this user's messages in the input queue
  281. self.input_queue.extend(self.user_queue.pop(self.add_users[0], []))
  282. self.add_users.pop(0)
  283. def initializeStatechart(self):
  284. # enter default state
  285. self.default_targets = self.states["/init_server"].getEffectiveTargetStates()
  286. RuntimeClassBase.initializeStatechart(self)
  287. class Server(RuntimeClassBase):
  288. def __init__(self, controller, address, port):
  289. RuntimeClassBase.__init__(self, controller)
  290. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  291. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  292. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  293. self.semantics.priority = StatechartSemantics.SourceParent
  294. self.semantics.concurrency = StatechartSemantics.Single
  295. # build Statechart structure
  296. self.build_statechart_structure()
  297. # call user defined constructor
  298. Server.user_defined_constructor(self, address, port)
  299. def user_defined_constructor(self, address, port):
  300. self.socket = None
  301. self.address = address
  302. self.port = port
  303. def user_defined_destructor(self):
  304. pass
  305. # builds Statechart structure
  306. def build_statechart_structure(self):
  307. # state <root>
  308. self.states[""] = State(0, self)
  309. # state /main
  310. self.states["/main"] = ParallelState(1, self)
  311. # state /main/forward
  312. self.states["/main/forward"] = State(2, self)
  313. # state /main/forward/forward
  314. self.states["/main/forward/forward"] = State(3, self)
  315. # state /main/server
  316. self.states["/main/server"] = State(4, self)
  317. # state /main/server/init
  318. self.states["/main/server/init"] = State(5, self)
  319. self.states["/main/server/init"].setEnter(self._main_server_init_enter)
  320. # state /main/server/binding
  321. self.states["/main/server/binding"] = State(6, self)
  322. self.states["/main/server/binding"].setEnter(self._main_server_binding_enter)
  323. # state /main/server/listening
  324. self.states["/main/server/listening"] = State(7, self)
  325. self.states["/main/server/listening"].setEnter(self._main_server_listening_enter)
  326. # state /main/server/accepting
  327. self.states["/main/server/accepting"] = State(8, self)
  328. self.states["/main/server/accepting"].setEnter(self._main_server_accepting_enter)
  329. self.states["/main/server/accepting"].setExit(self._main_server_accepting_exit)
  330. # state /main/close_socket
  331. self.states["/main/close_socket"] = State(9, self)
  332. # state /main/close_socket/close
  333. self.states["/main/close_socket/close"] = State(10, self)
  334. # add children
  335. self.states[""].addChild(self.states["/main"])
  336. self.states["/main"].addChild(self.states["/main/forward"])
  337. self.states["/main"].addChild(self.states["/main/server"])
  338. self.states["/main"].addChild(self.states["/main/close_socket"])
  339. self.states["/main/forward"].addChild(self.states["/main/forward/forward"])
  340. self.states["/main/server"].addChild(self.states["/main/server/init"])
  341. self.states["/main/server"].addChild(self.states["/main/server/binding"])
  342. self.states["/main/server"].addChild(self.states["/main/server/listening"])
  343. self.states["/main/server"].addChild(self.states["/main/server/accepting"])
  344. self.states["/main/close_socket"].addChild(self.states["/main/close_socket/close"])
  345. self.states[""].fixTree()
  346. self.states[""].default_state = self.states["/main"]
  347. self.states["/main/forward"].default_state = self.states["/main/forward/forward"]
  348. self.states["/main/server"].default_state = self.states["/main/server/init"]
  349. self.states["/main/close_socket"].default_state = self.states["/main/close_socket/close"]
  350. # transition /main/forward/forward
  351. _main_forward_forward_0 = Transition(self, self.states["/main/forward/forward"], [self.states["/main/forward/forward"]])
  352. _main_forward_forward_0.setAction(self._main_forward_forward_0_exec)
  353. _main_forward_forward_0.setTrigger(Event("HTTP_output", None))
  354. self.states["/main/forward/forward"].addTransition(_main_forward_forward_0)
  355. # transition /main/server/init
  356. _main_server_init_0 = Transition(self, self.states["/main/server/init"], [self.states["/main/server/binding"]])
  357. _main_server_init_0.setAction(self._main_server_init_0_exec)
  358. _main_server_init_0.setTrigger(Event("created_socket", "socket_in"))
  359. self.states["/main/server/init"].addTransition(_main_server_init_0)
  360. # transition /main/server/binding
  361. _main_server_binding_0 = Transition(self, self.states["/main/server/binding"], [self.states["/main/server/listening"]])
  362. _main_server_binding_0.setTrigger(Event("bound_socket", "socket_in"))
  363. _main_server_binding_0.setGuard(self._main_server_binding_0_guard)
  364. self.states["/main/server/binding"].addTransition(_main_server_binding_0)
  365. # transition /main/server/listening
  366. _main_server_listening_0 = Transition(self, self.states["/main/server/listening"], [self.states["/main/server/accepting"]])
  367. _main_server_listening_0.setAction(self._main_server_listening_0_exec)
  368. _main_server_listening_0.setTrigger(Event("listened_socket", "socket_in"))
  369. _main_server_listening_0.setGuard(self._main_server_listening_0_guard)
  370. self.states["/main/server/listening"].addTransition(_main_server_listening_0)
  371. # transition /main/server/accepting
  372. _main_server_accepting_0 = Transition(self, self.states["/main/server/accepting"], [self.states["/main/server/accepting"]])
  373. _main_server_accepting_0.setAction(self._main_server_accepting_0_exec)
  374. _main_server_accepting_0.setTrigger(Event("accepted_socket", "socket_in"))
  375. self.states["/main/server/accepting"].addTransition(_main_server_accepting_0)
  376. _main_server_accepting_1 = Transition(self, self.states["/main/server/accepting"], [self.states["/main/server/accepting"]])
  377. _main_server_accepting_1.setAction(self._main_server_accepting_1_exec)
  378. _main_server_accepting_1.setTrigger(Event("instance_created", None))
  379. self.states["/main/server/accepting"].addTransition(_main_server_accepting_1)
  380. _main_server_accepting_2 = Transition(self, self.states["/main/server/accepting"], [self.states["/main/server/accepting"]])
  381. _main_server_accepting_2.setTrigger(Event("_0after"))
  382. self.states["/main/server/accepting"].addTransition(_main_server_accepting_2)
  383. # transition /main/close_socket/close
  384. _main_close_socket_close_0 = Transition(self, self.states["/main/close_socket/close"], [self.states["/main/close_socket/close"]])
  385. _main_close_socket_close_0.setAction(self._main_close_socket_close_0_exec)
  386. _main_close_socket_close_0.setTrigger(Event("close_socket", None))
  387. self.states["/main/close_socket/close"].addTransition(_main_close_socket_close_0)
  388. def _main_server_init_enter(self):
  389. self.big_step.outputEvent(Event("create_socket", "socket_out", []))
  390. def _main_server_binding_enter(self):
  391. self.big_step.outputEvent(Event("bind_socket", "socket_out", [self.socket, (self.address, self.port)]))
  392. def _main_server_listening_enter(self):
  393. self.big_step.outputEvent(Event("listen_socket", "socket_out", [self.socket]))
  394. def _main_server_accepting_enter(self):
  395. self.addTimer(0, 1.0)
  396. def _main_server_accepting_exit(self):
  397. self.removeTimer(0)
  398. def _main_forward_forward_0_exec(self, parameters):
  399. association_name = parameters[0]
  400. data = parameters[1]
  401. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("from_mvi", None, [association_name, data])]))
  402. def _main_server_init_0_exec(self, parameters):
  403. socket = parameters[0]
  404. self.socket = socket
  405. def _main_server_binding_0_guard(self, parameters):
  406. socket = parameters[0]
  407. return self.socket == socket
  408. def _main_server_listening_0_exec(self, parameters):
  409. socket = parameters[0]
  410. self.big_step.outputEvent(Event("accept_socket", "socket_out", [self.socket]))
  411. def _main_server_listening_0_guard(self, parameters):
  412. socket = parameters[0]
  413. return self.socket == socket
  414. def _main_server_accepting_0_exec(self, parameters):
  415. socket = parameters[0]
  416. connected_socket = parameters[1]
  417. self.big_step.outputEventOM(Event("create_instance", None, [self, 'sockets', 'Socket', connected_socket]))
  418. self.big_step.outputEvent(Event("accept_socket", "socket_out", [self.socket]))
  419. def _main_server_accepting_1_exec(self, parameters):
  420. instancename = parameters[0]
  421. self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
  422. self.big_step.outputEventOM(Event("narrow_cast", None, [self, instancename, Event("set_association_name", None, [instancename])]))
  423. def _main_close_socket_close_0_exec(self, parameters):
  424. association_name = parameters[0]
  425. self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
  426. def initializeStatechart(self):
  427. # enter default state
  428. self.default_targets = self.states["/main"].getEffectiveTargetStates()
  429. RuntimeClassBase.initializeStatechart(self)
  430. class Socket(RuntimeClassBase):
  431. def __init__(self, controller, my_socket):
  432. RuntimeClassBase.__init__(self, controller)
  433. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  434. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  435. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  436. self.semantics.priority = StatechartSemantics.SourceParent
  437. self.semantics.concurrency = StatechartSemantics.Single
  438. # build Statechart structure
  439. self.build_statechart_structure()
  440. # call user defined constructor
  441. Socket.user_defined_constructor(self, my_socket)
  442. def user_defined_constructor(self, my_socket):
  443. self.socket = my_socket
  444. self.received_data = ""
  445. self.send_data = ""
  446. self.closed = False
  447. self.association_name = None
  448. def user_defined_destructor(self):
  449. pass
  450. # builds Statechart structure
  451. def build_statechart_structure(self):
  452. # state <root>
  453. self.states[""] = State(0, self)
  454. # state /init
  455. self.states["/init"] = State(1, self)
  456. # state /connected
  457. self.states["/connected"] = ParallelState(2, self)
  458. # state /connected/listening
  459. self.states["/connected/listening"] = State(3, self)
  460. # state /connected/listening/listen
  461. self.states["/connected/listening/listen"] = State(4, self)
  462. self.states["/connected/listening/listen"].setEnter(self._connected_listening_listen_enter)
  463. # state /connected/listening/closed
  464. self.states["/connected/listening/closed"] = State(5, self)
  465. self.states["/connected/listening/closed"].setEnter(self._connected_listening_closed_enter)
  466. # state /connected/sending
  467. self.states["/connected/sending"] = State(6, self)
  468. # state /connected/sending/waiting_for_data
  469. self.states["/connected/sending/waiting_for_data"] = State(7, self)
  470. # state /connected/sending/transferring
  471. self.states["/connected/sending/transferring"] = State(8, self)
  472. # state /connected/queueing
  473. self.states["/connected/queueing"] = State(9, self)
  474. # state /connected/queueing/queueing
  475. self.states["/connected/queueing/queueing"] = State(10, self)
  476. # state /connected/parsing
  477. self.states["/connected/parsing"] = State(11, self)
  478. # state /connected/parsing/wait_for_header
  479. self.states["/connected/parsing/wait_for_header"] = State(12, self)
  480. # state /connected/parsing/closing
  481. self.states["/connected/parsing/closing"] = State(13, self)
  482. self.states["/connected/parsing/closing"].setEnter(self._connected_parsing_closing_enter)
  483. self.states["/connected/parsing/closing"].setExit(self._connected_parsing_closing_exit)
  484. # state /connected/parsing/wait_for_payload
  485. self.states["/connected/parsing/wait_for_payload"] = State(14, self)
  486. # state /close
  487. self.states["/close"] = State(15, self)
  488. self.states["/close"].setEnter(self._close_enter)
  489. # add children
  490. self.states[""].addChild(self.states["/init"])
  491. self.states[""].addChild(self.states["/connected"])
  492. self.states[""].addChild(self.states["/close"])
  493. self.states["/connected"].addChild(self.states["/connected/listening"])
  494. self.states["/connected"].addChild(self.states["/connected/sending"])
  495. self.states["/connected"].addChild(self.states["/connected/queueing"])
  496. self.states["/connected"].addChild(self.states["/connected/parsing"])
  497. self.states["/connected/listening"].addChild(self.states["/connected/listening/listen"])
  498. self.states["/connected/listening"].addChild(self.states["/connected/listening/closed"])
  499. self.states["/connected/sending"].addChild(self.states["/connected/sending/waiting_for_data"])
  500. self.states["/connected/sending"].addChild(self.states["/connected/sending/transferring"])
  501. self.states["/connected/queueing"].addChild(self.states["/connected/queueing/queueing"])
  502. self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_header"])
  503. self.states["/connected/parsing"].addChild(self.states["/connected/parsing/closing"])
  504. self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_payload"])
  505. self.states[""].fixTree()
  506. self.states[""].default_state = self.states["/init"]
  507. self.states["/connected/listening"].default_state = self.states["/connected/listening/listen"]
  508. self.states["/connected/sending"].default_state = self.states["/connected/sending/waiting_for_data"]
  509. self.states["/connected/queueing"].default_state = self.states["/connected/queueing/queueing"]
  510. self.states["/connected/parsing"].default_state = self.states["/connected/parsing/wait_for_header"]
  511. # transition /init
  512. _init_0 = Transition(self, self.states["/init"], [self.states["/connected"]])
  513. _init_0.setAction(self._init_0_exec)
  514. _init_0.setTrigger(Event("set_association_name", None))
  515. self.states["/init"].addTransition(_init_0)
  516. # transition /connected/listening/listen
  517. _connected_listening_listen_0 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/listen"]])
  518. _connected_listening_listen_0.setAction(self._connected_listening_listen_0_exec)
  519. _connected_listening_listen_0.setTrigger(Event("received_socket", "socket_in"))
  520. _connected_listening_listen_0.setGuard(self._connected_listening_listen_0_guard)
  521. self.states["/connected/listening/listen"].addTransition(_connected_listening_listen_0)
  522. _connected_listening_listen_1 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/closed"]])
  523. _connected_listening_listen_1.setAction(self._connected_listening_listen_1_exec)
  524. _connected_listening_listen_1.setTrigger(Event("received_socket", "socket_in"))
  525. _connected_listening_listen_1.setGuard(self._connected_listening_listen_1_guard)
  526. self.states["/connected/listening/listen"].addTransition(_connected_listening_listen_1)
  527. # transition /connected/sending/waiting_for_data
  528. _connected_sending_waiting_for_data_0 = Transition(self, self.states["/connected/sending/waiting_for_data"], [self.states["/connected/sending/transferring"]])
  529. _connected_sending_waiting_for_data_0.setAction(self._connected_sending_waiting_for_data_0_exec)
  530. _connected_sending_waiting_for_data_0.setTrigger(None)
  531. _connected_sending_waiting_for_data_0.setGuard(self._connected_sending_waiting_for_data_0_guard)
  532. self.states["/connected/sending/waiting_for_data"].addTransition(_connected_sending_waiting_for_data_0)
  533. # transition /connected/sending/transferring
  534. _connected_sending_transferring_0 = Transition(self, self.states["/connected/sending/transferring"], [self.states["/connected/sending/waiting_for_data"]])
  535. _connected_sending_transferring_0.setAction(self._connected_sending_transferring_0_exec)
  536. _connected_sending_transferring_0.setTrigger(Event("sent_socket", "socket_in"))
  537. _connected_sending_transferring_0.setGuard(self._connected_sending_transferring_0_guard)
  538. self.states["/connected/sending/transferring"].addTransition(_connected_sending_transferring_0)
  539. # transition /connected/queueing/queueing
  540. _connected_queueing_queueing_0 = Transition(self, self.states["/connected/queueing/queueing"], [self.states["/connected/queueing/queueing"]])
  541. _connected_queueing_queueing_0.setAction(self._connected_queueing_queueing_0_exec)
  542. _connected_queueing_queueing_0.setTrigger(Event("HTTP_input", None))
  543. self.states["/connected/queueing/queueing"].addTransition(_connected_queueing_queueing_0)
  544. # transition /connected/parsing/wait_for_header
  545. _connected_parsing_wait_for_header_0 = Transition(self, self.states["/connected/parsing/wait_for_header"], [self.states["/connected/parsing/wait_for_payload"]])
  546. _connected_parsing_wait_for_header_0.setAction(self._connected_parsing_wait_for_header_0_exec)
  547. _connected_parsing_wait_for_header_0.setTrigger(None)
  548. _connected_parsing_wait_for_header_0.setGuard(self._connected_parsing_wait_for_header_0_guard)
  549. self.states["/connected/parsing/wait_for_header"].addTransition(_connected_parsing_wait_for_header_0)
  550. _connected_parsing_wait_for_header_1 = Transition(self, self.states["/connected/parsing/wait_for_header"], [self.states["/connected/parsing/closing"]])
  551. _connected_parsing_wait_for_header_1.setTrigger(None)
  552. _connected_parsing_wait_for_header_1.setGuard(self._connected_parsing_wait_for_header_1_guard)
  553. self.states["/connected/parsing/wait_for_header"].addTransition(_connected_parsing_wait_for_header_1)
  554. # transition /connected/parsing/closing
  555. _connected_parsing_closing_0 = Transition(self, self.states["/connected/parsing/closing"], [self.states["/connected/parsing/closing"]])
  556. _connected_parsing_closing_0.setAction(self._connected_parsing_closing_0_exec)
  557. _connected_parsing_closing_0.setTrigger(Event("_0after"))
  558. self.states["/connected/parsing/closing"].addTransition(_connected_parsing_closing_0)
  559. # transition /connected/parsing/wait_for_payload
  560. _connected_parsing_wait_for_payload_0 = Transition(self, self.states["/connected/parsing/wait_for_payload"], [self.states["/connected/parsing/wait_for_header"]])
  561. _connected_parsing_wait_for_payload_0.setAction(self._connected_parsing_wait_for_payload_0_exec)
  562. _connected_parsing_wait_for_payload_0.setTrigger(None)
  563. _connected_parsing_wait_for_payload_0.setGuard(self._connected_parsing_wait_for_payload_0_guard)
  564. self.states["/connected/parsing/wait_for_payload"].addTransition(_connected_parsing_wait_for_payload_0)
  565. # transition /connected
  566. _connected_0 = Transition(self, self.states["/connected"], [self.states["/close"]])
  567. _connected_0.setTrigger(Event("close", None))
  568. self.states["/connected"].addTransition(_connected_0)
  569. def _connected_listening_listen_enter(self):
  570. self.big_step.outputEvent(Event("recv_socket", "socket_out", [self.socket]))
  571. def _connected_listening_closed_enter(self):
  572. self.closed = True
  573. def _connected_parsing_closing_enter(self):
  574. self.addTimer(0, 0.0)
  575. def _connected_parsing_closing_exit(self):
  576. self.removeTimer(0)
  577. def _close_enter(self):
  578. self.big_step.outputEvent(Event("close_socket", "socket_out", [self.socket]))
  579. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("close_socket", None, [self.association_name])]))
  580. def _init_0_exec(self, parameters):
  581. association_name = parameters[0]
  582. self.association_name = association_name
  583. def _connected_listening_listen_0_exec(self, parameters):
  584. socket = parameters[0]
  585. data = parameters[1]
  586. self.received_data += data
  587. self.raiseInternalEvent(Event("received_data", None, []))
  588. def _connected_listening_listen_0_guard(self, parameters):
  589. socket = parameters[0]
  590. data = parameters[1]
  591. return (self.socket == socket) and (len(data) > 0)
  592. def _connected_listening_listen_1_exec(self, parameters):
  593. socket = parameters[0]
  594. data = parameters[1]
  595. self.raiseInternalEvent(Event("received_data", None, []))
  596. def _connected_listening_listen_1_guard(self, parameters):
  597. socket = parameters[0]
  598. data = parameters[1]
  599. return (self.socket == socket) and (len(data) == 0)
  600. def _connected_sending_waiting_for_data_0_exec(self, parameters):
  601. self.big_step.outputEvent(Event("send_socket", "socket_out", [self.socket, self.send_data]))
  602. def _connected_sending_waiting_for_data_0_guard(self, parameters):
  603. return len(self.send_data) > 0
  604. def _connected_sending_transferring_0_exec(self, parameters):
  605. socket = parameters[0]
  606. sent_bytes = parameters[1]
  607. self.send_data = self.send_data[sent_bytes:]
  608. def _connected_sending_transferring_0_guard(self, parameters):
  609. socket = parameters[0]
  610. sent_bytes = parameters[1]
  611. return self.socket == socket
  612. def _connected_queueing_queueing_0_exec(self, parameters):
  613. data = parameters[0]
  614. #post_data = "&".join(["%s=%s" % (urllib.quote(k), urllib.quote(v)) for k, v in data.iteritems()])
  615. #post_data = "&".join(["%s=%s" % (k, v) for k, v in data.iteritems()])
  616. post_data = data
  617. self.send_data += "HTTP/1.0 200 OK\r\n"
  618. self.send_data += "Content-Length: %s\r\n" % len(post_data)
  619. self.send_data += "Content-Type: %s; charset=UTF-8\r\n" % "text/plain"
  620. self.send_data += "\r\n"
  621. self.send_data += str(post_data)
  622. def _connected_parsing_wait_for_header_0_exec(self, parameters):
  623. header, self.received_data = self.received_data.split("\r\n\r\n", 1)
  624. header = header.lower()
  625. if "content-length" in header:
  626. _, after = header.split("content-length:", 1)
  627. after = after.split("\r\n", 1)[0]
  628. after = after.strip()
  629. self.length = int(after)
  630. else:
  631. self.length = float('inf')
  632. def _connected_parsing_wait_for_header_0_guard(self, parameters):
  633. return '\r\n\r\n' in self.received_data and self.received_data.startswith('POST')
  634. def _connected_parsing_wait_for_header_1_guard(self, parameters):
  635. return self.closed and len(self.received_data) == 0
  636. def _connected_parsing_closing_0_exec(self, parameters):
  637. self.raiseInternalEvent(Event("close", None, []))
  638. def _connected_parsing_wait_for_payload_0_exec(self, parameters):
  639. if self.length == float('inf'):
  640. data = self.received_data
  641. self.received_data = ""
  642. else:
  643. data = self.received_data[:self.length]
  644. self.received_data = self.received_data[self.length:]
  645. # We support POST data only, so everything is in the data
  646. try:
  647. params = dict([p.split('=') for p in data.split('&')])
  648. data = {k: urllib.unquote_plus(v) for k, v in params.iteritems()}
  649. except:
  650. data = {}
  651. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("HTTP_output", None, [self.association_name, data])]))
  652. def _connected_parsing_wait_for_payload_0_guard(self, parameters):
  653. return len(self.received_data) >= self.length or self.closed
  654. def initializeStatechart(self):
  655. # enter default state
  656. self.default_targets = self.states["/init"].getEffectiveTargetStates()
  657. RuntimeClassBase.initializeStatechart(self)
  658. class HTTPClient(RuntimeClassBase):
  659. def __init__(self, controller, hostname, port):
  660. RuntimeClassBase.__init__(self, controller)
  661. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  662. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  663. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  664. self.semantics.priority = StatechartSemantics.SourceParent
  665. self.semantics.concurrency = StatechartSemantics.Single
  666. # build Statechart structure
  667. self.build_statechart_structure()
  668. # call user defined constructor
  669. HTTPClient.user_defined_constructor(self, hostname, port)
  670. def user_defined_constructor(self, hostname, port):
  671. self.socket = None
  672. self.destination = (hostname, port)
  673. self.received_data = ""
  674. self.send_data = ""
  675. self.queue = []
  676. self.destinations = []
  677. def user_defined_destructor(self):
  678. pass
  679. # builds Statechart structure
  680. def build_statechart_structure(self):
  681. # state <root>
  682. self.states[""] = State(0, self)
  683. # state /init
  684. self.states["/init"] = State(1, self)
  685. self.states["/init"].setEnter(self._init_enter)
  686. # state /connecting
  687. self.states["/connecting"] = State(2, self)
  688. self.states["/connecting"].setEnter(self._connecting_enter)
  689. # state /connected
  690. self.states["/connected"] = ParallelState(3, self)
  691. # state /connected/listening
  692. self.states["/connected/listening"] = State(4, self)
  693. # state /connected/listening/listen
  694. self.states["/connected/listening/listen"] = State(5, self)
  695. self.states["/connected/listening/listen"].setEnter(self._connected_listening_listen_enter)
  696. # state /connected/listening/close
  697. self.states["/connected/listening/close"] = State(6, self)
  698. # state /connected/sending
  699. self.states["/connected/sending"] = State(7, self)
  700. # state /connected/sending/waiting_for_data
  701. self.states["/connected/sending/waiting_for_data"] = State(8, self)
  702. # state /connected/sending/transferring
  703. self.states["/connected/sending/transferring"] = State(9, self)
  704. # state /connected/queueing
  705. self.states["/connected/queueing"] = State(10, self)
  706. # state /connected/queueing/queueing
  707. self.states["/connected/queueing/queueing"] = State(11, self)
  708. self.states["/connected/queueing/queueing"].setEnter(self._connected_queueing_queueing_enter)
  709. # state /connected/parsing
  710. self.states["/connected/parsing"] = State(12, self)
  711. # state /connected/parsing/wait_for_header
  712. self.states["/connected/parsing/wait_for_header"] = State(13, self)
  713. # state /connected/parsing/wait_for_payload
  714. self.states["/connected/parsing/wait_for_payload"] = State(14, self)
  715. # add children
  716. self.states[""].addChild(self.states["/init"])
  717. self.states[""].addChild(self.states["/connecting"])
  718. self.states[""].addChild(self.states["/connected"])
  719. self.states["/connected"].addChild(self.states["/connected/listening"])
  720. self.states["/connected"].addChild(self.states["/connected/sending"])
  721. self.states["/connected"].addChild(self.states["/connected/queueing"])
  722. self.states["/connected"].addChild(self.states["/connected/parsing"])
  723. self.states["/connected/listening"].addChild(self.states["/connected/listening/listen"])
  724. self.states["/connected/listening"].addChild(self.states["/connected/listening/close"])
  725. self.states["/connected/sending"].addChild(self.states["/connected/sending/waiting_for_data"])
  726. self.states["/connected/sending"].addChild(self.states["/connected/sending/transferring"])
  727. self.states["/connected/queueing"].addChild(self.states["/connected/queueing/queueing"])
  728. self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_header"])
  729. self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_payload"])
  730. self.states[""].fixTree()
  731. self.states[""].default_state = self.states["/init"]
  732. self.states["/connected/listening"].default_state = self.states["/connected/listening/listen"]
  733. self.states["/connected/sending"].default_state = self.states["/connected/sending/waiting_for_data"]
  734. self.states["/connected/queueing"].default_state = self.states["/connected/queueing/queueing"]
  735. self.states["/connected/parsing"].default_state = self.states["/connected/parsing/wait_for_header"]
  736. # transition /init
  737. _init_0 = Transition(self, self.states["/init"], [self.states["/connecting"]])
  738. _init_0.setAction(self._init_0_exec)
  739. _init_0.setTrigger(Event("created_socket", "socket_in"))
  740. self.states["/init"].addTransition(_init_0)
  741. # transition /connecting
  742. _connecting_0 = Transition(self, self.states["/connecting"], [self.states["/connected"]])
  743. _connecting_0.setAction(self._connecting_0_exec)
  744. _connecting_0.setTrigger(Event("connected_socket", "socket_in"))
  745. _connecting_0.setGuard(self._connecting_0_guard)
  746. self.states["/connecting"].addTransition(_connecting_0)
  747. # transition /connected/listening/listen
  748. _connected_listening_listen_0 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/listen"]])
  749. _connected_listening_listen_0.setAction(self._connected_listening_listen_0_exec)
  750. _connected_listening_listen_0.setTrigger(Event("received_socket", "socket_in"))
  751. _connected_listening_listen_0.setGuard(self._connected_listening_listen_0_guard)
  752. self.states["/connected/listening/listen"].addTransition(_connected_listening_listen_0)
  753. _connected_listening_listen_1 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/close"]])
  754. _connected_listening_listen_1.setTrigger(Event("received_socket", "socket_in"))
  755. _connected_listening_listen_1.setGuard(self._connected_listening_listen_1_guard)
  756. self.states["/connected/listening/listen"].addTransition(_connected_listening_listen_1)
  757. # transition /connected/sending/waiting_for_data
  758. _connected_sending_waiting_for_data_0 = Transition(self, self.states["/connected/sending/waiting_for_data"], [self.states["/connected/sending/transferring"]])
  759. _connected_sending_waiting_for_data_0.setAction(self._connected_sending_waiting_for_data_0_exec)
  760. _connected_sending_waiting_for_data_0.setTrigger(None)
  761. _connected_sending_waiting_for_data_0.setGuard(self._connected_sending_waiting_for_data_0_guard)
  762. self.states["/connected/sending/waiting_for_data"].addTransition(_connected_sending_waiting_for_data_0)
  763. # transition /connected/sending/transferring
  764. _connected_sending_transferring_0 = Transition(self, self.states["/connected/sending/transferring"], [self.states["/connected/sending/waiting_for_data"]])
  765. _connected_sending_transferring_0.setAction(self._connected_sending_transferring_0_exec)
  766. _connected_sending_transferring_0.setTrigger(Event("sent_socket", "socket_in"))
  767. _connected_sending_transferring_0.setGuard(self._connected_sending_transferring_0_guard)
  768. self.states["/connected/sending/transferring"].addTransition(_connected_sending_transferring_0)
  769. # transition /connected/queueing/queueing
  770. _connected_queueing_queueing_0 = Transition(self, self.states["/connected/queueing/queueing"], [self.states["/connected/queueing/queueing"]])
  771. _connected_queueing_queueing_0.setAction(self._connected_queueing_queueing_0_exec)
  772. _connected_queueing_queueing_0.setTrigger(Event("HTTP_input", None))
  773. self.states["/connected/queueing/queueing"].addTransition(_connected_queueing_queueing_0)
  774. # transition /connected/parsing/wait_for_header
  775. _connected_parsing_wait_for_header_0 = Transition(self, self.states["/connected/parsing/wait_for_header"], [self.states["/connected/parsing/wait_for_payload"]])
  776. _connected_parsing_wait_for_header_0.setAction(self._connected_parsing_wait_for_header_0_exec)
  777. _connected_parsing_wait_for_header_0.setTrigger(None)
  778. _connected_parsing_wait_for_header_0.setGuard(self._connected_parsing_wait_for_header_0_guard)
  779. self.states["/connected/parsing/wait_for_header"].addTransition(_connected_parsing_wait_for_header_0)
  780. # transition /connected/parsing/wait_for_payload
  781. _connected_parsing_wait_for_payload_0 = Transition(self, self.states["/connected/parsing/wait_for_payload"], [self.states["/connected/parsing/wait_for_header"]])
  782. _connected_parsing_wait_for_payload_0.setAction(self._connected_parsing_wait_for_payload_0_exec)
  783. _connected_parsing_wait_for_payload_0.setTrigger(None)
  784. _connected_parsing_wait_for_payload_0.setGuard(self._connected_parsing_wait_for_payload_0_guard)
  785. self.states["/connected/parsing/wait_for_payload"].addTransition(_connected_parsing_wait_for_payload_0)
  786. def _init_enter(self):
  787. self.big_step.outputEvent(Event("create_socket", "", []))
  788. def _connecting_enter(self):
  789. self.big_step.outputEvent(Event("connect_socket", "", [self.socket, self.destination]))
  790. def _connected_listening_listen_enter(self):
  791. self.big_step.outputEvent(Event("recv_socket", "socket_out", [self.socket]))
  792. def _connected_queueing_queueing_enter(self):
  793. pass
  794. def _init_0_exec(self, parameters):
  795. socket = parameters[0]
  796. self.socket = socket
  797. def _connecting_0_exec(self, parameters):
  798. socket = parameters[0]
  799. self.big_step.outputEventOM(Event("broad_cast", None, [Event("http_client_ready", None, [])]))
  800. def _connecting_0_guard(self, parameters):
  801. socket = parameters[0]
  802. return self.socket == socket
  803. def _connected_listening_listen_0_exec(self, parameters):
  804. socket = parameters[0]
  805. data = parameters[1]
  806. self.received_data += data
  807. def _connected_listening_listen_0_guard(self, parameters):
  808. socket = parameters[0]
  809. data = parameters[1]
  810. return (self.socket == socket) and (len(data) > 0)
  811. def _connected_listening_listen_1_guard(self, parameters):
  812. socket = parameters[0]
  813. data = parameters[1]
  814. return (self.socket == socket) and (len(data) == 0)
  815. def _connected_sending_waiting_for_data_0_exec(self, parameters):
  816. self.big_step.outputEvent(Event("send_socket", "socket_out", [self.socket, self.send_data]))
  817. def _connected_sending_waiting_for_data_0_guard(self, parameters):
  818. return len(self.send_data) > 0
  819. def _connected_sending_transferring_0_exec(self, parameters):
  820. socket = parameters[0]
  821. sent_bytes = parameters[1]
  822. self.send_data = self.send_data[sent_bytes:]
  823. def _connected_sending_transferring_0_guard(self, parameters):
  824. socket = parameters[0]
  825. sent_bytes = parameters[1]
  826. return self.socket == socket
  827. def _connected_queueing_queueing_0_exec(self, parameters):
  828. data = parameters[0]
  829. destination = parameters[1]
  830. self.send_data += "POST / HTTP/1.0\r\n"
  831. self.send_data += "Content-Length: %i\r\n" % len(str(data))
  832. self.send_data += "\r\n"
  833. self.send_data += data
  834. self.destinations.append(destination)
  835. def _connected_parsing_wait_for_header_0_exec(self, parameters):
  836. header, self.received_data = self.received_data.split("\r\n\r\n", 1)
  837. header = header.lower()
  838. if "content-length" in header:
  839. _, after = header.split("content-length:", 1)
  840. after, _ = after.split("\r\n", 1)
  841. after = after.strip()
  842. self.length = int(after)
  843. else:
  844. self.length = float('inf')
  845. def _connected_parsing_wait_for_header_0_guard(self, parameters):
  846. return '\r\n\r\n' in self.received_data
  847. def _connected_parsing_wait_for_payload_0_exec(self, parameters):
  848. data = self.received_data[:self.length]
  849. self.received_data = self.received_data[self.length:]
  850. params = dict([p.split('=') for p in data.split('&')])
  851. data = {k: urllib.unquote_plus(v) for k, v in params.iteritems()}
  852. self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.destinations.pop(0), Event("HTTP_output", None, [data])]))
  853. def _connected_parsing_wait_for_payload_0_guard(self, parameters):
  854. return len(self.received_data) >= self.length
  855. def initializeStatechart(self):
  856. # enter default state
  857. self.default_targets = self.states["/init"].getEffectiveTargetStates()
  858. RuntimeClassBase.initializeStatechart(self)
  859. class UserStatechart(RuntimeClassBase):
  860. def __init__(self, controller, username):
  861. RuntimeClassBase.__init__(self, controller)
  862. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  863. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  864. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  865. self.semantics.priority = StatechartSemantics.SourceParent
  866. self.semantics.concurrency = StatechartSemantics.Single
  867. # build Statechart structure
  868. self.build_statechart_structure()
  869. # call user defined constructor
  870. UserStatechart.user_defined_constructor(self, username)
  871. def user_defined_constructor(self, username):
  872. self.username = username
  873. self.output_queue = []
  874. self.source_execution = None
  875. self.request_id = 0
  876. self.outstanding_execution = None
  877. self.outstanding_input = {}
  878. self.outstanding_output = None
  879. def user_defined_destructor(self):
  880. pass
  881. # builds Statechart structure
  882. def build_statechart_structure(self):
  883. # state <root>
  884. self.states[""] = State(0, self)
  885. # state /init
  886. self.states["/init"] = State(1, self)
  887. # state /running
  888. self.states["/running"] = ParallelState(2, self)
  889. # state /running/execution
  890. self.states["/running/execution"] = State(3, self)
  891. # state /running/execution/init
  892. self.states["/running/execution/init"] = State(4, self)
  893. self.states["/running/execution/init"].setEnter(self._running_execution_init_enter)
  894. # state /running/execution/timeout
  895. self.states["/running/execution/timeout"] = State(5, self)
  896. self.states["/running/execution/timeout"].setEnter(self._running_execution_timeout_enter)
  897. self.states["/running/execution/timeout"].setExit(self._running_execution_timeout_exit)
  898. # state /running/set_input
  899. self.states["/running/set_input"] = State(6, self)
  900. # state /running/set_input/fetch
  901. self.states["/running/set_input/fetch"] = State(7, self)
  902. # state /running/get_output_queue
  903. self.states["/running/get_output_queue"] = State(8, self)
  904. # state /running/get_output_queue/waiting
  905. self.states["/running/get_output_queue/waiting"] = State(9, self)
  906. # state /running/get_output
  907. self.states["/running/get_output"] = State(10, self)
  908. # state /running/get_output/try_execute
  909. self.states["/running/get_output/try_execute"] = State(11, self)
  910. # state /running/get_output/waiting
  911. self.states["/running/get_output/waiting"] = State(12, self)
  912. self.states["/running/get_output/waiting"].setEnter(self._running_get_output_waiting_enter)
  913. self.states["/running/get_output/waiting"].setExit(self._running_get_output_waiting_exit)
  914. # add children
  915. self.states[""].addChild(self.states["/init"])
  916. self.states[""].addChild(self.states["/running"])
  917. self.states["/running"].addChild(self.states["/running/execution"])
  918. self.states["/running"].addChild(self.states["/running/set_input"])
  919. self.states["/running"].addChild(self.states["/running/get_output_queue"])
  920. self.states["/running"].addChild(self.states["/running/get_output"])
  921. self.states["/running/execution"].addChild(self.states["/running/execution/init"])
  922. self.states["/running/execution"].addChild(self.states["/running/execution/timeout"])
  923. self.states["/running/set_input"].addChild(self.states["/running/set_input/fetch"])
  924. self.states["/running/get_output_queue"].addChild(self.states["/running/get_output_queue/waiting"])
  925. self.states["/running/get_output"].addChild(self.states["/running/get_output/try_execute"])
  926. self.states["/running/get_output"].addChild(self.states["/running/get_output/waiting"])
  927. self.states[""].fixTree()
  928. self.states[""].default_state = self.states["/init"]
  929. self.states["/running/execution"].default_state = self.states["/running/execution/init"]
  930. self.states["/running/set_input"].default_state = self.states["/running/set_input/fetch"]
  931. self.states["/running/get_output_queue"].default_state = self.states["/running/get_output_queue/waiting"]
  932. self.states["/running/get_output"].default_state = self.states["/running/get_output/try_execute"]
  933. # transition /init
  934. _init_0 = Transition(self, self.states["/init"], [self.states["/running"]])
  935. _init_0.setAction(self._init_0_exec)
  936. _init_0.setTrigger(Event("set_returnpath", None))
  937. self.states["/init"].addTransition(_init_0)
  938. # transition /running/execution/init
  939. _running_execution_init_0 = Transition(self, self.states["/running/execution/init"], [self.states["/running/execution/init"]])
  940. _running_execution_init_0.setTrigger(Event("executed", None))
  941. _running_execution_init_0.setGuard(self._running_execution_init_0_guard)
  942. self.states["/running/execution/init"].addTransition(_running_execution_init_0)
  943. _running_execution_init_1 = Transition(self, self.states["/running/execution/init"], [self.states["/running/execution/timeout"]])
  944. _running_execution_init_1.setTrigger(Event("executed", None))
  945. _running_execution_init_1.setGuard(self._running_execution_init_1_guard)
  946. self.states["/running/execution/init"].addTransition(_running_execution_init_1)
  947. # transition /running/execution/timeout
  948. _running_execution_timeout_0 = Transition(self, self.states["/running/execution/timeout"], [self.states["/running/execution/init"]])
  949. _running_execution_timeout_0.setTrigger(Event("_0after"))
  950. self.states["/running/execution/timeout"].addTransition(_running_execution_timeout_0)
  951. _running_execution_timeout_1 = Transition(self, self.states["/running/execution/timeout"], [self.states["/running/execution/init"]])
  952. _running_execution_timeout_1.setTrigger(Event("set_input_done", None))
  953. self.states["/running/execution/timeout"].addTransition(_running_execution_timeout_1)
  954. # transition /running/set_input/fetch
  955. _running_set_input_fetch_0 = Transition(self, self.states["/running/set_input/fetch"], [self.states["/running/set_input/fetch"]])
  956. _running_set_input_fetch_0.setAction(self._running_set_input_fetch_0_exec)
  957. _running_set_input_fetch_0.setTrigger(Event("set_input", None))
  958. self.states["/running/set_input/fetch"].addTransition(_running_set_input_fetch_0)
  959. _running_set_input_fetch_1 = Transition(self, self.states["/running/set_input/fetch"], [self.states["/running/set_input/fetch"]])
  960. _running_set_input_fetch_1.setAction(self._running_set_input_fetch_1_exec)
  961. _running_set_input_fetch_1.setTrigger(Event("executed", None))
  962. _running_set_input_fetch_1.setGuard(self._running_set_input_fetch_1_guard)
  963. self.states["/running/set_input/fetch"].addTransition(_running_set_input_fetch_1)
  964. # transition /running/get_output_queue/waiting
  965. _running_get_output_queue_waiting_0 = Transition(self, self.states["/running/get_output_queue/waiting"], [self.states["/running/get_output_queue/waiting"]])
  966. _running_get_output_queue_waiting_0.setAction(self._running_get_output_queue_waiting_0_exec)
  967. _running_get_output_queue_waiting_0.setTrigger(Event("get_output", None))
  968. self.states["/running/get_output_queue/waiting"].addTransition(_running_get_output_queue_waiting_0)
  969. # transition /running/get_output/try_execute
  970. _running_get_output_try_execute_0 = Transition(self, self.states["/running/get_output/try_execute"], [self.states["/running/get_output/try_execute"]])
  971. _running_get_output_try_execute_0.setAction(self._running_get_output_try_execute_0_exec)
  972. _running_get_output_try_execute_0.setTrigger(None)
  973. _running_get_output_try_execute_0.setGuard(self._running_get_output_try_execute_0_guard)
  974. self.states["/running/get_output/try_execute"].addTransition(_running_get_output_try_execute_0)
  975. _running_get_output_try_execute_1 = Transition(self, self.states["/running/get_output/try_execute"], [self.states["/running/get_output/try_execute"]])
  976. _running_get_output_try_execute_1.setAction(self._running_get_output_try_execute_1_exec)
  977. _running_get_output_try_execute_1.setTrigger(Event("executed", None))
  978. _running_get_output_try_execute_1.setGuard(self._running_get_output_try_execute_1_guard)
  979. self.states["/running/get_output/try_execute"].addTransition(_running_get_output_try_execute_1)
  980. _running_get_output_try_execute_2 = Transition(self, self.states["/running/get_output/try_execute"], [self.states["/running/get_output/waiting"]])
  981. _running_get_output_try_execute_2.setAction(self._running_get_output_try_execute_2_exec)
  982. _running_get_output_try_execute_2.setTrigger(Event("executed", None))
  983. _running_get_output_try_execute_2.setGuard(self._running_get_output_try_execute_2_guard)
  984. self.states["/running/get_output/try_execute"].addTransition(_running_get_output_try_execute_2)
  985. # transition /running/get_output/waiting
  986. _running_get_output_waiting_0 = Transition(self, self.states["/running/get_output/waiting"], [self.states["/running/get_output/try_execute"]])
  987. _running_get_output_waiting_0.setTrigger(Event("_1after"))
  988. self.states["/running/get_output/waiting"].addTransition(_running_get_output_waiting_0)
  989. def _running_execution_init_enter(self):
  990. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/executor', Event("execute", None, [self.returnpath, self.username, 'execute_rule', [], self.request_id])]))
  991. self.outstanding_execution = self.request_id
  992. self.request_id += 1
  993. def _running_execution_timeout_enter(self):
  994. self.addTimer(0, 1.0)
  995. def _running_execution_timeout_exit(self):
  996. self.removeTimer(0)
  997. def _running_get_output_waiting_enter(self):
  998. self.addTimer(1, 1.0)
  999. def _running_get_output_waiting_exit(self):
  1000. self.removeTimer(1)
  1001. def _init_0_exec(self, parameters):
  1002. returnpath = parameters[0]
  1003. self.returnpath = returnpath
  1004. def _running_execution_init_0_guard(self, parameters):
  1005. returnvalue = parameters[0]
  1006. success = parameters[1]
  1007. request_id = parameters[2]
  1008. return success and self.outstanding_execution == request_id
  1009. def _running_execution_init_1_guard(self, parameters):
  1010. returnvalue = parameters[0]
  1011. success = parameters[1]
  1012. request_id = parameters[2]
  1013. return not success and self.outstanding_execution == request_id
  1014. def _running_set_input_fetch_0_exec(self, parameters):
  1015. source = parameters[0]
  1016. args = parameters[1]
  1017. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/executor', Event("execute", None, [self.returnpath, self.username, 'set_input', args, self.request_id])]))
  1018. if source is not None:
  1019. self.outstanding_input[self.request_id] = source
  1020. self.request_id += 1
  1021. def _running_set_input_fetch_1_exec(self, parameters):
  1022. returnvalue = parameters[0]
  1023. success = parameters[1]
  1024. request_id = parameters[2]
  1025. source = self.outstanding_input.pop(request_id)
  1026. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/to_mvi/' + source, Event("HTTP_input", None, [json.dumps(returnvalue)])]))
  1027. self.raiseInternalEvent(Event("set_input_done", None, []))
  1028. def _running_set_input_fetch_1_guard(self, parameters):
  1029. returnvalue = parameters[0]
  1030. success = parameters[1]
  1031. request_id = parameters[2]
  1032. return request_id in self.outstanding_input
  1033. def _running_get_output_queue_waiting_0_exec(self, parameters):
  1034. source = parameters[0]
  1035. args = parameters[1]
  1036. self.output_queue.append(source)
  1037. def _running_get_output_try_execute_0_exec(self, parameters):
  1038. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/executor', Event("execute", None, [self.returnpath, self.username, 'get_output', [], self.request_id])]))
  1039. self.outstanding_output = self.request_id
  1040. self.request_id += 1
  1041. def _running_get_output_try_execute_0_guard(self, parameters):
  1042. return self.outstanding_output is None and self.output_queue
  1043. def _running_get_output_try_execute_1_exec(self, parameters):
  1044. returnvalue = parameters[0]
  1045. success = parameters[1]
  1046. request_id = parameters[2]
  1047. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/to_mvi/' + self.output_queue.pop(0), Event("HTTP_input", None, [json.dumps(returnvalue)])]))
  1048. self.outstanding_output = None
  1049. def _running_get_output_try_execute_1_guard(self, parameters):
  1050. returnvalue = parameters[0]
  1051. success = parameters[1]
  1052. request_id = parameters[2]
  1053. return success and request_id == self.outstanding_output
  1054. def _running_get_output_try_execute_2_exec(self, parameters):
  1055. returnvalue = parameters[0]
  1056. success = parameters[1]
  1057. request_id = parameters[2]
  1058. self.outstanding_output = None
  1059. def _running_get_output_try_execute_2_guard(self, parameters):
  1060. returnvalue = parameters[0]
  1061. success = parameters[1]
  1062. request_id = parameters[2]
  1063. return not success and request_id == self.outstanding_output
  1064. def initializeStatechart(self):
  1065. # enter default state
  1066. self.default_targets = self.states["/init"].getEffectiveTargetStates()
  1067. RuntimeClassBase.initializeStatechart(self)
  1068. class Executor(RuntimeClassBase):
  1069. def __init__(self, controller):
  1070. RuntimeClassBase.__init__(self, controller)
  1071. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  1072. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  1073. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  1074. self.semantics.priority = StatechartSemantics.SourceParent
  1075. self.semantics.concurrency = StatechartSemantics.Single
  1076. # build Statechart structure
  1077. self.build_statechart_structure()
  1078. # call user defined constructor
  1079. Executor.user_defined_constructor(self)
  1080. def user_defined_constructor(self):
  1081. self.mvs = ModelverseState("../../bootstrap/bootstrap.m.gz")
  1082. self.request_queue = [("", "", "load_primitives", [], None)]
  1083. self.mvs.GC = True
  1084. self.mvk = ModelverseKernel(self.mvs.read_root()[0])
  1085. self.first = True
  1086. self.mvs_response = None
  1087. self.mvs_operations = {
  1088. "CN": self.mvs.create_node,
  1089. "CE": self.mvs.create_edge,
  1090. "CNV": self.mvs.create_nodevalue,
  1091. "CD": self.mvs.create_dict,
  1092. "RV": self.mvs.read_value,
  1093. "RO": self.mvs.read_outgoing,
  1094. "RI": self.mvs.read_incoming,
  1095. "RE": self.mvs.read_edge,
  1096. "RD": self.mvs.read_dict,
  1097. "RDN": self.mvs.read_dict_node,
  1098. "RDNE": self.mvs.read_dict_node_edge,
  1099. "RDE": self.mvs.read_dict_edge,
  1100. "RRD": self.mvs.read_reverse_dict,
  1101. "RR": self.mvs.read_root,
  1102. "RDK": self.mvs.read_dict_keys,
  1103. "DE": self.mvs.delete_edge,
  1104. "DN": self.mvs.delete_node,
  1105. }
  1106. def user_defined_destructor(self):
  1107. pass
  1108. # builds Statechart structure
  1109. def build_statechart_structure(self):
  1110. # state <root>
  1111. self.states[""] = State(0, self)
  1112. # state /init
  1113. self.states["/init"] = ParallelState(1, self)
  1114. # state /init/raw_exec
  1115. self.states["/init/raw_exec"] = State(2, self)
  1116. # state /init/raw_exec/raw_exec
  1117. self.states["/init/raw_exec/raw_exec"] = State(3, self)
  1118. # state /init/queue
  1119. self.states["/init/queue"] = State(4, self)
  1120. # state /init/queue/queue
  1121. self.states["/init/queue/queue"] = State(5, self)
  1122. # state /init/execute
  1123. self.states["/init/execute"] = State(6, self)
  1124. # state /init/execute/idle
  1125. self.states["/init/execute/idle"] = State(7, self)
  1126. # state /init/execute/execution
  1127. self.states["/init/execute/execution"] = State(8, self)
  1128. self.states["/init/execute/execution"].setEnter(self._init_execute_execution_enter)
  1129. # add children
  1130. self.states[""].addChild(self.states["/init"])
  1131. self.states["/init"].addChild(self.states["/init/raw_exec"])
  1132. self.states["/init"].addChild(self.states["/init/queue"])
  1133. self.states["/init"].addChild(self.states["/init/execute"])
  1134. self.states["/init/raw_exec"].addChild(self.states["/init/raw_exec/raw_exec"])
  1135. self.states["/init/queue"].addChild(self.states["/init/queue/queue"])
  1136. self.states["/init/execute"].addChild(self.states["/init/execute/idle"])
  1137. self.states["/init/execute"].addChild(self.states["/init/execute/execution"])
  1138. self.states[""].fixTree()
  1139. self.states[""].default_state = self.states["/init"]
  1140. self.states["/init/raw_exec"].default_state = self.states["/init/raw_exec/raw_exec"]
  1141. self.states["/init/queue"].default_state = self.states["/init/queue/queue"]
  1142. self.states["/init/execute"].default_state = self.states["/init/execute/idle"]
  1143. # transition /init/raw_exec/raw_exec
  1144. _init_raw_exec_raw_exec_0 = Transition(self, self.states["/init/raw_exec/raw_exec"], [self.states["/init/raw_exec/raw_exec"]])
  1145. _init_raw_exec_raw_exec_0.setAction(self._init_raw_exec_raw_exec_0_exec)
  1146. _init_raw_exec_raw_exec_0.setTrigger(Event("raw_exec", None))
  1147. self.states["/init/raw_exec/raw_exec"].addTransition(_init_raw_exec_raw_exec_0)
  1148. # transition /init/queue/queue
  1149. _init_queue_queue_0 = Transition(self, self.states["/init/queue/queue"], [self.states["/init/queue/queue"]])
  1150. _init_queue_queue_0.setAction(self._init_queue_queue_0_exec)
  1151. _init_queue_queue_0.setTrigger(Event("execute", None))
  1152. self.states["/init/queue/queue"].addTransition(_init_queue_queue_0)
  1153. # transition /init/execute/idle
  1154. _init_execute_idle_0 = Transition(self, self.states["/init/execute/idle"], [self.states["/init/execute/execution"]])
  1155. _init_execute_idle_0.setTrigger(None)
  1156. _init_execute_idle_0.setGuard(self._init_execute_idle_0_guard)
  1157. self.states["/init/execute/idle"].addTransition(_init_execute_idle_0)
  1158. # transition /init/execute/execution
  1159. _init_execute_execution_0 = Transition(self, self.states["/init/execute/execution"], [self.states["/init/execute/idle"]])
  1160. _init_execute_execution_0.setAction(self._init_execute_execution_0_exec)
  1161. _init_execute_execution_0.setTrigger(None)
  1162. _init_execute_execution_0.setGuard(self._init_execute_execution_0_guard)
  1163. self.states["/init/execute/execution"].addTransition(_init_execute_execution_0)
  1164. _init_execute_execution_1 = Transition(self, self.states["/init/execute/execution"], [self.states["/init/execute/idle"]])
  1165. _init_execute_execution_1.setTrigger(None)
  1166. _init_execute_execution_1.setGuard(self._init_execute_execution_1_guard)
  1167. self.states["/init/execute/execution"].addTransition(_init_execute_execution_1)
  1168. def _init_execute_execution_enter(self):
  1169. self.mvk.returnvalue = None
  1170. self.mvk.success = True
  1171. self.first = True
  1172. self.returnpath, username, operation, params, self.request_id = self.request_queue.pop(0)
  1173. reply = None
  1174. commands = []
  1175. if operation == "set_input":
  1176. print("Add input " + str(params))
  1177. while 1:
  1178. commands = self.mvk.execute_yields(username, operation, params, reply)
  1179. if commands is None:
  1180. break
  1181. reply = [self.mvs_operations[command[0]](*(command[1]))[0] for command in commands]
  1182. def _init_raw_exec_raw_exec_0_exec(self, parameters):
  1183. operations = parameters[0]
  1184. source = parameters[1]
  1185. reply = [self.mvs_operations[command[0]](*command[1]) for command in operations]
  1186. self.big_step.outputEventOM(Event("narrow_cast", None, [self, source, Event("raw_exec_reply", None, [reply])]))
  1187. def _init_queue_queue_0_exec(self, parameters):
  1188. returnpath = parameters[0]
  1189. username = parameters[1]
  1190. operation = parameters[2]
  1191. params = parameters[3]
  1192. request_id = parameters[4]
  1193. self.request_queue.append((("/" + returnpath) if returnpath is not None else None, username, operation, params, request_id))
  1194. def _init_execute_idle_0_guard(self, parameters):
  1195. return self.request_queue
  1196. def _init_execute_execution_0_exec(self, parameters):
  1197. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent' + self.returnpath, Event("executed", None, [self.mvk.returnvalue, self.mvk.success, self.request_id])]))
  1198. def _init_execute_execution_0_guard(self, parameters):
  1199. return self.returnpath is not None
  1200. def _init_execute_execution_1_guard(self, parameters):
  1201. return self.returnpath is None
  1202. def initializeStatechart(self):
  1203. # enter default state
  1204. self.default_targets = self.states["/init"].getEffectiveTargetStates()
  1205. RuntimeClassBase.initializeStatechart(self)
  1206. class ObjectManager(ObjectManagerBase):
  1207. def __init__(self, controller):
  1208. ObjectManagerBase.__init__(self, controller)
  1209. def instantiate(self, class_name, construct_params):
  1210. if class_name == "MvKController":
  1211. instance = MvKController(self.controller, construct_params[0])
  1212. instance.associations = {}
  1213. instance.associations["to_mvs"] = Association("HTTPClient", 1, 1)
  1214. instance.associations["to_mvi"] = Association("Server", 1, 1)
  1215. instance.associations["users"] = Association("UserStatechart", 0, -1)
  1216. instance.associations["executor"] = Association("Executor", 1, 1)
  1217. elif class_name == "Server":
  1218. instance = Server(self.controller, construct_params[0], construct_params[1])
  1219. instance.associations = {}
  1220. instance.associations["sockets"] = Association("Socket", 0, -1)
  1221. instance.associations["parent"] = Association("MvKController", 1, 1)
  1222. elif class_name == "Socket":
  1223. instance = Socket(self.controller, construct_params[0])
  1224. instance.associations = {}
  1225. instance.associations["parent"] = Association("Server", 1, 1)
  1226. elif class_name == "HTTPClient":
  1227. instance = HTTPClient(self.controller, construct_params[0], construct_params[1])
  1228. instance.associations = {}
  1229. instance.associations["parent"] = Association("MvKController", 1, 1)
  1230. elif class_name == "UserStatechart":
  1231. instance = UserStatechart(self.controller, construct_params[0])
  1232. instance.associations = {}
  1233. instance.associations["parent"] = Association("MvKController", 1, 1)
  1234. elif class_name == "Executor":
  1235. instance = Executor(self.controller)
  1236. instance.associations = {}
  1237. instance.associations["parent"] = Association("MvKController", 1, 1)
  1238. else:
  1239. raise Exception("Cannot instantiate class " + class_name)
  1240. return instance
  1241. class Controller(ThreadsControllerBase):
  1242. def __init__(self, params, keep_running = None, behind_schedule_callback = None):
  1243. if keep_running == None: keep_running = True
  1244. if behind_schedule_callback == None: behind_schedule_callback = None
  1245. ThreadsControllerBase.__init__(self, ObjectManager(self), keep_running, behind_schedule_callback)
  1246. self.addInputPort("socket_in")
  1247. self.addOutputPort("socket_out")
  1248. self.object_manager.createInstance("MvKController", [params])