server.py 86 KB

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