server.py 79 KB

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