server.py 85 KB

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