server.py 53 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe and Joeri Exelmans
  3. Date: Wed Jul 27 14:52:25 2016
  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 python_runtime.statecharts_core import *
  10. import time
  11. import os
  12. import urllib
  13. import sys
  14. import json
  15. import sys
  16. from collections import defaultdict
  17. sys.path.append("../kernel/")
  18. sys.path.append("../state/")
  19. from modelverse_kernel.main import ModelverseKernel
  20. from modelverse_state.main import ModelverseState
  21. # package "MvK Server"
  22. class MvKController(RuntimeClassBase):
  23. def __init__(self, controller, params):
  24. RuntimeClassBase.__init__(self, controller)
  25. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  26. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  27. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  28. self.semantics.priority = StatechartSemantics.SourceParent
  29. self.semantics.concurrency = StatechartSemantics.Single
  30. # Call user defined constructor
  31. MvKController.user_defined_constructor(self, params)
  32. def user_defined_constructor(self, params):
  33. self.mvs = ModelverseState("../bootstrap/bootstrap.m")
  34. self.root = self.mvs.read_root()[0]
  35. self.mvk = ModelverseKernel(self.root)
  36. self.all_failed = False
  37. self.timeout = False
  38. self.users = set()
  39. self.input_queue = defaultdict(list)
  40. self.output_queue = defaultdict(list)
  41. self.source = None
  42. self.mvs_operations = {
  43. "CN": self.mvs.create_node,
  44. "CE": self.mvs.create_edge,
  45. "CNV": self.mvs.create_nodevalue,
  46. "CD": self.mvs.create_dict,
  47. "RV": self.mvs.read_value,
  48. "RO": self.mvs.read_outgoing,
  49. "RI": self.mvs.read_incoming,
  50. "RE": self.mvs.read_edge,
  51. "RD": self.mvs.read_dict,
  52. "RDN": self.mvs.read_dict_node,
  53. "RDNE": self.mvs.read_dict_node_edge,
  54. "RDE": self.mvs.read_dict_edge,
  55. "RRD": self.mvs.read_reverse_dict,
  56. "RR": self.mvs.read_root,
  57. "RDK": self.mvs.read_dict_keys,
  58. "DE": self.mvs.delete_edge,
  59. "DN": self.mvs.delete_node,
  60. }
  61. self.execute_modelverse("", "load_primitives", [])
  62. def user_defined_destructor(self):
  63. pass
  64. # User defined method
  65. def execute_modelverse(self, username, operation, params):
  66. reply = None
  67. commands = []
  68. while 1:
  69. commands = self.mvk.execute_yields(username, operation, params, reply)
  70. if commands is None:
  71. break
  72. reply = [self.mvs_operations[command[0]](*(command[1]))[0] for command in commands]
  73. if len(reply) == 1:
  74. reply = reply[0]
  75. def initializeStatechart(self):
  76. self.current_state[self.Root] = []
  77. self.current_state[self.Root_running] = []
  78. self.current_state[self.Root_running_wait_for_requests] = []
  79. self.current_state[self.Root_running_execution] = []
  80. self.current_state[self.Root_running_remove_sockets] = []
  81. # Enter default state
  82. self.enter_Root_init_server()
  83. # Unique IDs for all statechart nodes
  84. Root = 0
  85. Root_running = 1
  86. Root_running_wait_for_requests = 2
  87. Root_running_execution = 3
  88. Root_running_remove_sockets = 4
  89. Root_init_server = 5
  90. Root_running_wait_for_requests_wait = 6
  91. Root_running_execution_execution = 7
  92. Root_running_remove_sockets_remove_sockets = 8
  93. # Statechart enter/exit action method(s)
  94. def enter_Root_running(self):
  95. self.current_state[self.Root].append(self.Root_running)
  96. def exit_Root_running(self):
  97. self.exit_Root_running_wait_for_requests()
  98. self.exit_Root_running_execution()
  99. self.exit_Root_running_remove_sockets()
  100. self.current_state[self.Root] = []
  101. def enter_Root_running_wait_for_requests(self):
  102. self.current_state[self.Root_running].append(self.Root_running_wait_for_requests)
  103. def exit_Root_running_wait_for_requests(self):
  104. if self.Root_running_wait_for_requests_wait in self.current_state[self.Root_running_wait_for_requests]:
  105. self.exit_Root_running_wait_for_requests_wait()
  106. self.current_state[self.Root_running] = []
  107. def enter_Root_running_execution(self):
  108. self.current_state[self.Root_running].append(self.Root_running_execution)
  109. def exit_Root_running_execution(self):
  110. if self.Root_running_execution_execution in self.current_state[self.Root_running_execution]:
  111. self.exit_Root_running_execution_execution()
  112. self.current_state[self.Root_running] = []
  113. def enter_Root_running_remove_sockets(self):
  114. self.current_state[self.Root_running].append(self.Root_running_remove_sockets)
  115. def exit_Root_running_remove_sockets(self):
  116. if self.Root_running_remove_sockets_remove_sockets in self.current_state[self.Root_running_remove_sockets]:
  117. self.exit_Root_running_remove_sockets_remove_sockets()
  118. self.current_state[self.Root_running] = []
  119. def enter_Root_init_server(self):
  120. self.big_step.outputEventOM(Event("create_instance", None, [self, 'to_mvi', 'Server', '', 8001]))
  121. self.current_state[self.Root].append(self.Root_init_server)
  122. def exit_Root_init_server(self):
  123. self.current_state[self.Root] = []
  124. def enter_Root_running_wait_for_requests_wait(self):
  125. self.current_state[self.Root_running_wait_for_requests].append(self.Root_running_wait_for_requests_wait)
  126. def exit_Root_running_wait_for_requests_wait(self):
  127. self.current_state[self.Root_running_wait_for_requests] = []
  128. def enter_Root_running_execution_execution(self):
  129. self.timers[0] = 0
  130. self.timers[1] = 0.1
  131. self.timers[2] = 0
  132. self.timeout = False
  133. self.destination = None
  134. if self.users:
  135. user = self.users.pop()
  136. # Check if there are values to input
  137. if self.input_queue[user]:
  138. source, args = self.input_queue[user].pop(0)
  139. for args_entry in args:
  140. self.execute_modelverse(user, "set_input", args_entry)
  141. self.destination = source
  142. self.value = {"id": 200, "value": "OK"}
  143. self.all_failed = False
  144. # Now process for some steps, or until we are again blocked for input
  145. for x in xrange(200):
  146. self.execute_modelverse(user, "execute_rule", [])
  147. if not self.mvk.success:
  148. # Blocking or broken, so quit already to stop wasting CPU
  149. break
  150. self.all_failed = False
  151. # Check that we don't have anything to output yet, otherwise we wait
  152. if self.destination is None:
  153. # Perform output if there is anything
  154. if self.output_queue[user]:
  155. self.execute_modelverse(user, "get_output", [])
  156. if self.mvk.success:
  157. self.destination = self.output_queue[user].pop(0)
  158. self.value = self.mvk.returnvalue
  159. self.all_failed = False
  160. else:
  161. out = self.mvs.read_outgoing(self.root)[0]
  162. for m in out:
  163. src, user = self.mvs.read_edge(m)[0]
  164. outgoing = self.mvs.read_outgoing(m)[0]
  165. first = self.mvs.read_edge(outgoing[0])[0]
  166. dest = first[1]
  167. name = self.mvs.read_value(dest)[0]
  168. if name.startswith("__"):
  169. continue
  170. self.users.add(name)
  171. self.timeout = self.all_failed
  172. self.all_failed = True
  173. self.current_state[self.Root_running_execution].append(self.Root_running_execution_execution)
  174. def exit_Root_running_execution_execution(self):
  175. self.timers.pop(0, None)
  176. self.timers.pop(1, None)
  177. self.timers.pop(2, None)
  178. self.current_state[self.Root_running_execution] = []
  179. def enter_Root_running_remove_sockets_remove_sockets(self):
  180. self.current_state[self.Root_running_remove_sockets].append(self.Root_running_remove_sockets_remove_sockets)
  181. def exit_Root_running_remove_sockets_remove_sockets(self):
  182. self.current_state[self.Root_running_remove_sockets] = []
  183. # Statechart enter/exit default method(s)
  184. def enterDefault_Root_running(self):
  185. self.enter_Root_running()
  186. self.enterDefault_Root_running_wait_for_requests()
  187. self.enterDefault_Root_running_execution()
  188. self.enterDefault_Root_running_remove_sockets()
  189. def enterDefault_Root_running_wait_for_requests(self):
  190. self.enter_Root_running_wait_for_requests()
  191. self.enter_Root_running_wait_for_requests_wait()
  192. def enterDefault_Root_running_execution(self):
  193. self.enter_Root_running_execution()
  194. self.enter_Root_running_execution_execution()
  195. def enterDefault_Root_running_remove_sockets(self):
  196. self.enter_Root_running_remove_sockets()
  197. self.enter_Root_running_remove_sockets_remove_sockets()
  198. # Statechart transitions
  199. def generateCandidatesChildren_Root(self):
  200. if self.current_state[self.Root][0] == self.Root_init_server:
  201. return self.generateCandidates_Root_init_server()
  202. elif self.current_state[self.Root][0] == self.Root_running:
  203. return self.generateCandidates_Root_running()
  204. return False
  205. def generateCandidates_Root(self):
  206. if not self.combo_step.isArenaChanged(self.Root):
  207. return self.generateCandidatesChildren_Root()
  208. else:
  209. return True
  210. def generateCandidatesCurrent_Root_init_server(self):
  211. enabled_events = self.getEnabledEvents()
  212. for e in enabled_events:
  213. if e.name == "instance_created":
  214. self.small_step.addCandidate(self.transition_Root_init_server_1, e.parameters)
  215. return True
  216. return False
  217. def generateCandidates_Root_init_server(self):
  218. if not self.combo_step.isArenaChanged(self.Root_init_server):
  219. return self.generateCandidatesCurrent_Root_init_server()
  220. else:
  221. return True
  222. def transition_Root_init_server_1(self, parameters):
  223. instancename = parameters[0]
  224. self.exit_Root_init_server()
  225. self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
  226. self.combo_step.setArenaChanged(self.Root)
  227. self.enterDefault_Root_running()
  228. def generateCandidatesChildren_Root_running(self):
  229. branch_done = False
  230. branch_done = (self.generateCandidates_Root_running_wait_for_requests() or branch_done)
  231. branch_done = (self.generateCandidates_Root_running_execution() or branch_done)
  232. branch_done = (self.generateCandidates_Root_running_remove_sockets() or branch_done)
  233. return branch_done
  234. def generateCandidates_Root_running(self):
  235. if not self.combo_step.isArenaChanged(self.Root_running):
  236. return self.generateCandidatesChildren_Root_running()
  237. else:
  238. return True
  239. def generateCandidatesChildren_Root_running_wait_for_requests(self):
  240. if self.current_state[self.Root_running_wait_for_requests][0] == self.Root_running_wait_for_requests_wait:
  241. return self.generateCandidates_Root_running_wait_for_requests_wait()
  242. return False
  243. def generateCandidates_Root_running_wait_for_requests(self):
  244. if not self.combo_step.isArenaChanged(self.Root_running_wait_for_requests):
  245. return self.generateCandidatesChildren_Root_running_wait_for_requests()
  246. else:
  247. return True
  248. def generateCandidatesCurrent_Root_running_wait_for_requests_wait(self):
  249. enabled_events = self.getEnabledEvents()
  250. for e in enabled_events:
  251. if e.name == "from_mvi":
  252. self.small_step.addCandidate(self.transition_Root_running_wait_for_requests_wait_1, e.parameters)
  253. return True
  254. return False
  255. def generateCandidates_Root_running_wait_for_requests_wait(self):
  256. if not self.combo_step.isArenaChanged(self.Root_running_wait_for_requests_wait):
  257. return self.generateCandidatesCurrent_Root_running_wait_for_requests_wait()
  258. else:
  259. return True
  260. def transition_Root_running_wait_for_requests_wait_1(self, parameters):
  261. source = parameters[0]
  262. data = parameters[1]
  263. self.exit_Root_running_wait_for_requests_wait()
  264. # No JSON encoding necessary, as it is not complex
  265. try:
  266. if data["op"] == "set_input":
  267. if "element_type" in data:
  268. if data["element_type"] == "V":
  269. value = json.loads(data["value"])
  270. else:
  271. value = data["value"]
  272. args = [data["element_type"], value]
  273. self.input_queue[data["username"]].append((source, [args]))
  274. else:
  275. d = []
  276. for t, v in json.loads(data["data"]):
  277. if t == "V":
  278. v = json.loads(v)
  279. d.append([t, v])
  280. self.input_queue[data["username"]].append((source, d))
  281. elif data["op"] == "get_output":
  282. self.output_queue[data["username"]].append(source)
  283. else:
  284. print("DROPPING unknown operation: " + str(data["op"]))
  285. except:
  286. print("DROPPING deserialization error")
  287. self.combo_step.setArenaChanged(self.Root_running_wait_for_requests)
  288. self.enter_Root_running_wait_for_requests_wait()
  289. def generateCandidatesChildren_Root_running_execution(self):
  290. if self.current_state[self.Root_running_execution][0] == self.Root_running_execution_execution:
  291. return self.generateCandidates_Root_running_execution_execution()
  292. return False
  293. def generateCandidates_Root_running_execution(self):
  294. if not self.combo_step.isArenaChanged(self.Root_running_execution):
  295. return self.generateCandidatesChildren_Root_running_execution()
  296. else:
  297. return True
  298. def generateCandidatesCurrent_Root_running_execution_execution(self):
  299. enabled_events = self.getEnabledEvents()
  300. for e in enabled_events:
  301. if e.name == "_0after":
  302. parameters = e.parameters
  303. if self.destination is not None:
  304. self.small_step.addCandidate(self.transition_Root_running_execution_execution_1, e.parameters)
  305. return True
  306. enabled_events = self.getEnabledEvents()
  307. for e in enabled_events:
  308. if e.name == "_1after":
  309. parameters = e.parameters
  310. if self.timeout and self.destination is None:
  311. self.small_step.addCandidate(self.transition_Root_running_execution_execution_2, e.parameters)
  312. return True
  313. enabled_events = self.getEnabledEvents()
  314. for e in enabled_events:
  315. if e.name == "_2after":
  316. parameters = e.parameters
  317. if not self.timeout and self.destination is None:
  318. self.small_step.addCandidate(self.transition_Root_running_execution_execution_3, e.parameters)
  319. return True
  320. return False
  321. def generateCandidates_Root_running_execution_execution(self):
  322. if not self.combo_step.isArenaChanged(self.Root_running_execution_execution):
  323. return self.generateCandidatesCurrent_Root_running_execution_execution()
  324. else:
  325. return True
  326. def transition_Root_running_execution_execution_1(self, parameters):
  327. self.exit_Root_running_execution_execution()
  328. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'to_mvi/%s' % self.destination, Event("HTTP_input", None, [self.value])]))
  329. self.combo_step.setArenaChanged(self.Root_running_execution)
  330. self.enter_Root_running_execution_execution()
  331. def transition_Root_running_execution_execution_2(self, parameters):
  332. self.exit_Root_running_execution_execution()
  333. self.combo_step.setArenaChanged(self.Root_running_execution)
  334. self.enter_Root_running_execution_execution()
  335. def transition_Root_running_execution_execution_3(self, parameters):
  336. self.exit_Root_running_execution_execution()
  337. self.combo_step.setArenaChanged(self.Root_running_execution)
  338. self.enter_Root_running_execution_execution()
  339. def generateCandidatesChildren_Root_running_remove_sockets(self):
  340. if self.current_state[self.Root_running_remove_sockets][0] == self.Root_running_remove_sockets_remove_sockets:
  341. return self.generateCandidates_Root_running_remove_sockets_remove_sockets()
  342. return False
  343. def generateCandidates_Root_running_remove_sockets(self):
  344. if not self.combo_step.isArenaChanged(self.Root_running_remove_sockets):
  345. return self.generateCandidatesChildren_Root_running_remove_sockets()
  346. else:
  347. return True
  348. def generateCandidatesCurrent_Root_running_remove_sockets_remove_sockets(self):
  349. enabled_events = self.getEnabledEvents()
  350. for e in enabled_events:
  351. if e.name == "delete_socket":
  352. self.small_step.addCandidate(self.transition_Root_running_remove_sockets_remove_sockets_1, e.parameters)
  353. return True
  354. return False
  355. def generateCandidates_Root_running_remove_sockets_remove_sockets(self):
  356. if not self.combo_step.isArenaChanged(self.Root_running_remove_sockets_remove_sockets):
  357. return self.generateCandidatesCurrent_Root_running_remove_sockets_remove_sockets()
  358. else:
  359. return True
  360. def transition_Root_running_remove_sockets_remove_sockets_1(self, parameters):
  361. socket = parameters[0]
  362. self.exit_Root_running_remove_sockets_remove_sockets()
  363. for user in self.output_queue.keys():
  364. self.output_queue[user] = [s for s in self.output_queue[user] if s != socket]
  365. self.combo_step.setArenaChanged(self.Root_running_remove_sockets)
  366. self.enter_Root_running_remove_sockets_remove_sockets()
  367. # Generate transition candidates for current small step
  368. def generateCandidates(self):
  369. self.generateCandidates_Root()
  370. class Server(RuntimeClassBase):
  371. def __init__(self, controller, address, port):
  372. RuntimeClassBase.__init__(self, controller)
  373. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  374. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  375. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  376. self.semantics.priority = StatechartSemantics.SourceParent
  377. self.semantics.concurrency = StatechartSemantics.Single
  378. # Call user defined constructor
  379. Server.user_defined_constructor(self, address, port)
  380. def user_defined_constructor(self, address, port):
  381. self.socket = None
  382. self.address = address
  383. self.port = port
  384. def user_defined_destructor(self):
  385. pass
  386. def initializeStatechart(self):
  387. self.current_state[self.Root] = []
  388. self.current_state[self.Root_main] = []
  389. self.current_state[self.Root_main_forward] = []
  390. self.current_state[self.Root_main_server] = []
  391. self.current_state[self.Root_main_close_socket] = []
  392. # Enter default state
  393. self.enterDefault_Root_main()
  394. # Unique IDs for all statechart nodes
  395. Root = 0
  396. Root_main = 1
  397. Root_main_forward = 2
  398. Root_main_server = 3
  399. Root_main_close_socket = 4
  400. Root_main_forward_forward = 5
  401. Root_main_server_init = 6
  402. Root_main_server_binding = 7
  403. Root_main_server_listening = 8
  404. Root_main_server_accepting = 9
  405. Root_main_close_socket_close = 10
  406. # Statechart enter/exit action method(s)
  407. def enter_Root_main(self):
  408. self.current_state[self.Root].append(self.Root_main)
  409. def exit_Root_main(self):
  410. self.exit_Root_main_forward()
  411. self.exit_Root_main_server()
  412. self.exit_Root_main_close_socket()
  413. self.current_state[self.Root] = []
  414. def enter_Root_main_forward(self):
  415. self.current_state[self.Root_main].append(self.Root_main_forward)
  416. def exit_Root_main_forward(self):
  417. if self.Root_main_forward_forward in self.current_state[self.Root_main_forward]:
  418. self.exit_Root_main_forward_forward()
  419. self.current_state[self.Root_main] = []
  420. def enter_Root_main_server(self):
  421. self.current_state[self.Root_main].append(self.Root_main_server)
  422. def exit_Root_main_server(self):
  423. if self.Root_main_server_init in self.current_state[self.Root_main_server]:
  424. self.exit_Root_main_server_init()
  425. if self.Root_main_server_binding in self.current_state[self.Root_main_server]:
  426. self.exit_Root_main_server_binding()
  427. if self.Root_main_server_listening in self.current_state[self.Root_main_server]:
  428. self.exit_Root_main_server_listening()
  429. if self.Root_main_server_accepting in self.current_state[self.Root_main_server]:
  430. self.exit_Root_main_server_accepting()
  431. self.current_state[self.Root_main] = []
  432. def enter_Root_main_close_socket(self):
  433. self.current_state[self.Root_main].append(self.Root_main_close_socket)
  434. def exit_Root_main_close_socket(self):
  435. if self.Root_main_close_socket_close in self.current_state[self.Root_main_close_socket]:
  436. self.exit_Root_main_close_socket_close()
  437. self.current_state[self.Root_main] = []
  438. def enter_Root_main_forward_forward(self):
  439. self.current_state[self.Root_main_forward].append(self.Root_main_forward_forward)
  440. def exit_Root_main_forward_forward(self):
  441. self.current_state[self.Root_main_forward] = []
  442. def enter_Root_main_server_init(self):
  443. self.big_step.outputEvent(Event("create_socket", "socket_out", []))
  444. self.current_state[self.Root_main_server].append(self.Root_main_server_init)
  445. def exit_Root_main_server_init(self):
  446. self.current_state[self.Root_main_server] = []
  447. def enter_Root_main_server_binding(self):
  448. self.big_step.outputEvent(Event("bind_socket", "socket_out", [self.socket, (self.address, self.port)]))
  449. self.current_state[self.Root_main_server].append(self.Root_main_server_binding)
  450. def exit_Root_main_server_binding(self):
  451. self.current_state[self.Root_main_server] = []
  452. def enter_Root_main_server_listening(self):
  453. self.big_step.outputEvent(Event("listen_socket", "socket_out", [self.socket]))
  454. self.current_state[self.Root_main_server].append(self.Root_main_server_listening)
  455. def exit_Root_main_server_listening(self):
  456. self.current_state[self.Root_main_server] = []
  457. def enter_Root_main_server_accepting(self):
  458. self.timers[0] = 1.0
  459. self.current_state[self.Root_main_server].append(self.Root_main_server_accepting)
  460. def exit_Root_main_server_accepting(self):
  461. self.timers.pop(0, None)
  462. self.current_state[self.Root_main_server] = []
  463. def enter_Root_main_close_socket_close(self):
  464. self.current_state[self.Root_main_close_socket].append(self.Root_main_close_socket_close)
  465. def exit_Root_main_close_socket_close(self):
  466. self.current_state[self.Root_main_close_socket] = []
  467. # Statechart enter/exit default method(s)
  468. def enterDefault_Root_main(self):
  469. self.enter_Root_main()
  470. self.enterDefault_Root_main_forward()
  471. self.enterDefault_Root_main_server()
  472. self.enterDefault_Root_main_close_socket()
  473. def enterDefault_Root_main_forward(self):
  474. self.enter_Root_main_forward()
  475. self.enter_Root_main_forward_forward()
  476. def enterDefault_Root_main_server(self):
  477. self.enter_Root_main_server()
  478. self.enter_Root_main_server_init()
  479. def enterDefault_Root_main_close_socket(self):
  480. self.enter_Root_main_close_socket()
  481. self.enter_Root_main_close_socket_close()
  482. # Statechart transitions
  483. def generateCandidatesChildren_Root(self):
  484. if self.current_state[self.Root][0] == self.Root_main:
  485. return self.generateCandidates_Root_main()
  486. return False
  487. def generateCandidates_Root(self):
  488. if not self.combo_step.isArenaChanged(self.Root):
  489. return self.generateCandidatesChildren_Root()
  490. else:
  491. return True
  492. def generateCandidatesChildren_Root_main(self):
  493. branch_done = False
  494. branch_done = (self.generateCandidates_Root_main_forward() or branch_done)
  495. branch_done = (self.generateCandidates_Root_main_server() or branch_done)
  496. branch_done = (self.generateCandidates_Root_main_close_socket() or branch_done)
  497. return branch_done
  498. def generateCandidates_Root_main(self):
  499. if not self.combo_step.isArenaChanged(self.Root_main):
  500. return self.generateCandidatesChildren_Root_main()
  501. else:
  502. return True
  503. def generateCandidatesChildren_Root_main_forward(self):
  504. if self.current_state[self.Root_main_forward][0] == self.Root_main_forward_forward:
  505. return self.generateCandidates_Root_main_forward_forward()
  506. return False
  507. def generateCandidates_Root_main_forward(self):
  508. if not self.combo_step.isArenaChanged(self.Root_main_forward):
  509. return self.generateCandidatesChildren_Root_main_forward()
  510. else:
  511. return True
  512. def generateCandidatesCurrent_Root_main_forward_forward(self):
  513. enabled_events = self.getEnabledEvents()
  514. for e in enabled_events:
  515. if e.name == "HTTP_output":
  516. self.small_step.addCandidate(self.transition_Root_main_forward_forward_1, e.parameters)
  517. return True
  518. return False
  519. def generateCandidates_Root_main_forward_forward(self):
  520. if not self.combo_step.isArenaChanged(self.Root_main_forward_forward):
  521. return self.generateCandidatesCurrent_Root_main_forward_forward()
  522. else:
  523. return True
  524. def transition_Root_main_forward_forward_1(self, parameters):
  525. association_name = parameters[0]
  526. data = parameters[1]
  527. self.exit_Root_main_forward_forward()
  528. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("from_mvi", None, [association_name, data])]))
  529. self.combo_step.setArenaChanged(self.Root_main_forward)
  530. self.enter_Root_main_forward_forward()
  531. def generateCandidatesChildren_Root_main_server(self):
  532. if self.current_state[self.Root_main_server][0] == self.Root_main_server_init:
  533. return self.generateCandidates_Root_main_server_init()
  534. elif self.current_state[self.Root_main_server][0] == self.Root_main_server_binding:
  535. return self.generateCandidates_Root_main_server_binding()
  536. elif self.current_state[self.Root_main_server][0] == self.Root_main_server_listening:
  537. return self.generateCandidates_Root_main_server_listening()
  538. elif self.current_state[self.Root_main_server][0] == self.Root_main_server_accepting:
  539. return self.generateCandidates_Root_main_server_accepting()
  540. return False
  541. def generateCandidates_Root_main_server(self):
  542. if not self.combo_step.isArenaChanged(self.Root_main_server):
  543. return self.generateCandidatesChildren_Root_main_server()
  544. else:
  545. return True
  546. def generateCandidatesCurrent_Root_main_server_init(self):
  547. enabled_events = self.getEnabledEvents()
  548. for e in enabled_events:
  549. if (e.name == "created_socket") and (e.port == "socket_in"):
  550. self.small_step.addCandidate(self.transition_Root_main_server_init_1, e.parameters)
  551. return True
  552. return False
  553. def generateCandidates_Root_main_server_init(self):
  554. if not self.combo_step.isArenaChanged(self.Root_main_server_init):
  555. return self.generateCandidatesCurrent_Root_main_server_init()
  556. else:
  557. return True
  558. def transition_Root_main_server_init_1(self, parameters):
  559. socket = parameters[0]
  560. self.exit_Root_main_server_init()
  561. self.socket = socket
  562. self.combo_step.setArenaChanged(self.Root_main_server)
  563. self.enter_Root_main_server_binding()
  564. def generateCandidatesCurrent_Root_main_server_binding(self):
  565. enabled_events = self.getEnabledEvents()
  566. for e in enabled_events:
  567. if (e.name == "bound_socket") and (e.port == "socket_in"):
  568. parameters = e.parameters
  569. socket = parameters[0]
  570. if self.socket == socket:
  571. self.small_step.addCandidate(self.transition_Root_main_server_binding_1, e.parameters)
  572. return True
  573. return False
  574. def generateCandidates_Root_main_server_binding(self):
  575. if not self.combo_step.isArenaChanged(self.Root_main_server_binding):
  576. return self.generateCandidatesCurrent_Root_main_server_binding()
  577. else:
  578. return True
  579. def transition_Root_main_server_binding_1(self, parameters):
  580. socket = parameters[0]
  581. self.exit_Root_main_server_binding()
  582. self.combo_step.setArenaChanged(self.Root_main_server)
  583. self.enter_Root_main_server_listening()
  584. def generateCandidatesCurrent_Root_main_server_listening(self):
  585. enabled_events = self.getEnabledEvents()
  586. for e in enabled_events:
  587. if (e.name == "listened_socket") and (e.port == "socket_in"):
  588. parameters = e.parameters
  589. socket = parameters[0]
  590. if self.socket == socket:
  591. self.small_step.addCandidate(self.transition_Root_main_server_listening_1, e.parameters)
  592. return True
  593. return False
  594. def generateCandidates_Root_main_server_listening(self):
  595. if not self.combo_step.isArenaChanged(self.Root_main_server_listening):
  596. return self.generateCandidatesCurrent_Root_main_server_listening()
  597. else:
  598. return True
  599. def transition_Root_main_server_listening_1(self, parameters):
  600. socket = parameters[0]
  601. self.exit_Root_main_server_listening()
  602. self.big_step.outputEvent(Event("accept_socket", "socket_out", [self.socket]))
  603. self.combo_step.setArenaChanged(self.Root_main_server)
  604. self.enter_Root_main_server_accepting()
  605. def generateCandidatesCurrent_Root_main_server_accepting(self):
  606. enabled_events = self.getEnabledEvents()
  607. for e in enabled_events:
  608. if (e.name == "accepted_socket") and (e.port == "socket_in"):
  609. self.small_step.addCandidate(self.transition_Root_main_server_accepting_1, e.parameters)
  610. return True
  611. enabled_events = self.getEnabledEvents()
  612. for e in enabled_events:
  613. if e.name == "instance_created":
  614. self.small_step.addCandidate(self.transition_Root_main_server_accepting_2, e.parameters)
  615. return True
  616. enabled_events = self.getEnabledEvents()
  617. for e in enabled_events:
  618. if e.name == "_0after":
  619. self.small_step.addCandidate(self.transition_Root_main_server_accepting_3, e.parameters)
  620. return True
  621. return False
  622. def generateCandidates_Root_main_server_accepting(self):
  623. if not self.combo_step.isArenaChanged(self.Root_main_server_accepting):
  624. return self.generateCandidatesCurrent_Root_main_server_accepting()
  625. else:
  626. return True
  627. def transition_Root_main_server_accepting_1(self, parameters):
  628. socket = parameters[0]
  629. connected_socket = parameters[1]
  630. self.exit_Root_main_server_accepting()
  631. self.big_step.outputEventOM(Event("create_instance", None, [self, 'sockets', 'Socket', connected_socket]))
  632. self.big_step.outputEvent(Event("accept_socket", "socket_out", [self.socket]))
  633. self.combo_step.setArenaChanged(self.Root_main_server)
  634. self.enter_Root_main_server_accepting()
  635. def transition_Root_main_server_accepting_2(self, parameters):
  636. instancename = parameters[0]
  637. self.exit_Root_main_server_accepting()
  638. self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
  639. self.big_step.outputEventOM(Event("narrow_cast", None, [self, instancename, Event("set_association_name", None, [instancename])]))
  640. self.combo_step.setArenaChanged(self.Root_main_server)
  641. self.enter_Root_main_server_accepting()
  642. def transition_Root_main_server_accepting_3(self, parameters):
  643. self.exit_Root_main_server_accepting()
  644. self.combo_step.setArenaChanged(self.Root_main_server)
  645. self.enter_Root_main_server_accepting()
  646. def generateCandidatesChildren_Root_main_close_socket(self):
  647. if self.current_state[self.Root_main_close_socket][0] == self.Root_main_close_socket_close:
  648. return self.generateCandidates_Root_main_close_socket_close()
  649. return False
  650. def generateCandidates_Root_main_close_socket(self):
  651. if not self.combo_step.isArenaChanged(self.Root_main_close_socket):
  652. return self.generateCandidatesChildren_Root_main_close_socket()
  653. else:
  654. return True
  655. def generateCandidatesCurrent_Root_main_close_socket_close(self):
  656. enabled_events = self.getEnabledEvents()
  657. for e in enabled_events:
  658. if e.name == "close_socket":
  659. self.small_step.addCandidate(self.transition_Root_main_close_socket_close_1, e.parameters)
  660. return True
  661. return False
  662. def generateCandidates_Root_main_close_socket_close(self):
  663. if not self.combo_step.isArenaChanged(self.Root_main_close_socket_close):
  664. return self.generateCandidatesCurrent_Root_main_close_socket_close()
  665. else:
  666. return True
  667. def transition_Root_main_close_socket_close_1(self, parameters):
  668. association_name = parameters[0]
  669. self.exit_Root_main_close_socket_close()
  670. self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
  671. self.big_step.outputEventOM(Event("broad_cast", None, [Event("delete_socket", None, [association_name])]))
  672. self.combo_step.setArenaChanged(self.Root_main_close_socket)
  673. self.enter_Root_main_close_socket_close()
  674. # Generate transition candidates for current small step
  675. def generateCandidates(self):
  676. self.generateCandidates_Root()
  677. class Socket(RuntimeClassBase):
  678. def __init__(self, controller, my_socket):
  679. RuntimeClassBase.__init__(self, controller)
  680. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  681. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  682. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  683. self.semantics.priority = StatechartSemantics.SourceParent
  684. self.semantics.concurrency = StatechartSemantics.Single
  685. # Call user defined constructor
  686. Socket.user_defined_constructor(self, my_socket)
  687. def user_defined_constructor(self, my_socket):
  688. self.socket = my_socket
  689. self.received_data = ""
  690. self.send_data = ""
  691. self.closed = False
  692. self.association_name = None
  693. def user_defined_destructor(self):
  694. pass
  695. def initializeStatechart(self):
  696. self.current_state[self.Root] = []
  697. self.current_state[self.Root_connected] = []
  698. self.current_state[self.Root_connected_listening] = []
  699. self.current_state[self.Root_connected_sending] = []
  700. self.current_state[self.Root_connected_queueing] = []
  701. self.current_state[self.Root_connected_parsing] = []
  702. # Enter default state
  703. self.enter_Root_init()
  704. # Unique IDs for all statechart nodes
  705. Root = 0
  706. Root_connected = 1
  707. Root_connected_listening = 2
  708. Root_connected_sending = 3
  709. Root_connected_queueing = 4
  710. Root_connected_parsing = 5
  711. Root_init = 6
  712. Root_connected_listening_listen = 7
  713. Root_connected_listening_closed = 8
  714. Root_connected_sending_waiting_for_data = 9
  715. Root_connected_sending_transferring = 10
  716. Root_connected_queueing_queueing = 11
  717. Root_connected_parsing_wait_for_header = 12
  718. Root_connected_parsing_closing = 13
  719. Root_connected_parsing_wait_for_payload = 14
  720. Root_close = 15
  721. # Statechart enter/exit action method(s)
  722. def enter_Root_connected(self):
  723. self.current_state[self.Root].append(self.Root_connected)
  724. def exit_Root_connected(self):
  725. self.exit_Root_connected_listening()
  726. self.exit_Root_connected_sending()
  727. self.exit_Root_connected_queueing()
  728. self.exit_Root_connected_parsing()
  729. self.current_state[self.Root] = []
  730. def enter_Root_connected_listening(self):
  731. self.current_state[self.Root_connected].append(self.Root_connected_listening)
  732. def exit_Root_connected_listening(self):
  733. if self.Root_connected_listening_listen in self.current_state[self.Root_connected_listening]:
  734. self.exit_Root_connected_listening_listen()
  735. if self.Root_connected_listening_closed in self.current_state[self.Root_connected_listening]:
  736. self.exit_Root_connected_listening_closed()
  737. self.current_state[self.Root_connected] = []
  738. def enter_Root_connected_sending(self):
  739. self.current_state[self.Root_connected].append(self.Root_connected_sending)
  740. def exit_Root_connected_sending(self):
  741. if self.Root_connected_sending_waiting_for_data in self.current_state[self.Root_connected_sending]:
  742. self.exit_Root_connected_sending_waiting_for_data()
  743. if self.Root_connected_sending_transferring in self.current_state[self.Root_connected_sending]:
  744. self.exit_Root_connected_sending_transferring()
  745. self.current_state[self.Root_connected] = []
  746. def enter_Root_connected_queueing(self):
  747. self.current_state[self.Root_connected].append(self.Root_connected_queueing)
  748. def exit_Root_connected_queueing(self):
  749. if self.Root_connected_queueing_queueing in self.current_state[self.Root_connected_queueing]:
  750. self.exit_Root_connected_queueing_queueing()
  751. self.current_state[self.Root_connected] = []
  752. def enter_Root_connected_parsing(self):
  753. self.current_state[self.Root_connected].append(self.Root_connected_parsing)
  754. def exit_Root_connected_parsing(self):
  755. if self.Root_connected_parsing_wait_for_header in self.current_state[self.Root_connected_parsing]:
  756. self.exit_Root_connected_parsing_wait_for_header()
  757. if self.Root_connected_parsing_closing in self.current_state[self.Root_connected_parsing]:
  758. self.exit_Root_connected_parsing_closing()
  759. if self.Root_connected_parsing_wait_for_payload in self.current_state[self.Root_connected_parsing]:
  760. self.exit_Root_connected_parsing_wait_for_payload()
  761. self.current_state[self.Root_connected] = []
  762. def enter_Root_init(self):
  763. self.current_state[self.Root].append(self.Root_init)
  764. def exit_Root_init(self):
  765. self.current_state[self.Root] = []
  766. def enter_Root_connected_listening_listen(self):
  767. self.big_step.outputEvent(Event("recv_socket", "socket_out", [self.socket]))
  768. self.current_state[self.Root_connected_listening].append(self.Root_connected_listening_listen)
  769. def exit_Root_connected_listening_listen(self):
  770. self.current_state[self.Root_connected_listening] = []
  771. def enter_Root_connected_listening_closed(self):
  772. self.closed = True
  773. self.current_state[self.Root_connected_listening].append(self.Root_connected_listening_closed)
  774. def exit_Root_connected_listening_closed(self):
  775. self.current_state[self.Root_connected_listening] = []
  776. def enter_Root_connected_sending_waiting_for_data(self):
  777. self.current_state[self.Root_connected_sending].append(self.Root_connected_sending_waiting_for_data)
  778. def exit_Root_connected_sending_waiting_for_data(self):
  779. self.current_state[self.Root_connected_sending] = []
  780. def enter_Root_connected_sending_transferring(self):
  781. self.current_state[self.Root_connected_sending].append(self.Root_connected_sending_transferring)
  782. def exit_Root_connected_sending_transferring(self):
  783. self.current_state[self.Root_connected_sending] = []
  784. def enter_Root_connected_queueing_queueing(self):
  785. self.current_state[self.Root_connected_queueing].append(self.Root_connected_queueing_queueing)
  786. def exit_Root_connected_queueing_queueing(self):
  787. self.current_state[self.Root_connected_queueing] = []
  788. def enter_Root_connected_parsing_wait_for_header(self):
  789. self.current_state[self.Root_connected_parsing].append(self.Root_connected_parsing_wait_for_header)
  790. def exit_Root_connected_parsing_wait_for_header(self):
  791. self.current_state[self.Root_connected_parsing] = []
  792. def enter_Root_connected_parsing_closing(self):
  793. self.timers[0] = 0.0
  794. self.current_state[self.Root_connected_parsing].append(self.Root_connected_parsing_closing)
  795. def exit_Root_connected_parsing_closing(self):
  796. self.timers.pop(0, None)
  797. self.current_state[self.Root_connected_parsing] = []
  798. def enter_Root_connected_parsing_wait_for_payload(self):
  799. self.current_state[self.Root_connected_parsing].append(self.Root_connected_parsing_wait_for_payload)
  800. def exit_Root_connected_parsing_wait_for_payload(self):
  801. self.current_state[self.Root_connected_parsing] = []
  802. def enter_Root_close(self):
  803. self.big_step.outputEvent(Event("close_socket", "socket_out", [self.socket]))
  804. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("close_socket", None, [self.association_name])]))
  805. self.current_state[self.Root].append(self.Root_close)
  806. def exit_Root_close(self):
  807. self.current_state[self.Root] = []
  808. # Statechart enter/exit default method(s)
  809. def enterDefault_Root_connected(self):
  810. self.enter_Root_connected()
  811. self.enterDefault_Root_connected_listening()
  812. self.enterDefault_Root_connected_sending()
  813. self.enterDefault_Root_connected_queueing()
  814. self.enterDefault_Root_connected_parsing()
  815. def enterDefault_Root_connected_listening(self):
  816. self.enter_Root_connected_listening()
  817. self.enter_Root_connected_listening_listen()
  818. def enterDefault_Root_connected_sending(self):
  819. self.enter_Root_connected_sending()
  820. self.enter_Root_connected_sending_waiting_for_data()
  821. def enterDefault_Root_connected_queueing(self):
  822. self.enter_Root_connected_queueing()
  823. self.enter_Root_connected_queueing_queueing()
  824. def enterDefault_Root_connected_parsing(self):
  825. self.enter_Root_connected_parsing()
  826. self.enter_Root_connected_parsing_wait_for_header()
  827. # Statechart transitions
  828. def generateCandidatesChildren_Root(self):
  829. if self.current_state[self.Root][0] == self.Root_init:
  830. return self.generateCandidates_Root_init()
  831. elif self.current_state[self.Root][0] == self.Root_connected:
  832. return self.generateCandidates_Root_connected()
  833. elif self.current_state[self.Root][0] == self.Root_close:
  834. return self.generateCandidates_Root_close()
  835. return False
  836. def generateCandidates_Root(self):
  837. if not self.combo_step.isArenaChanged(self.Root):
  838. return self.generateCandidatesChildren_Root()
  839. else:
  840. return True
  841. def generateCandidatesCurrent_Root_init(self):
  842. enabled_events = self.getEnabledEvents()
  843. for e in enabled_events:
  844. if e.name == "set_association_name":
  845. self.small_step.addCandidate(self.transition_Root_init_1, e.parameters)
  846. return True
  847. return False
  848. def generateCandidates_Root_init(self):
  849. if not self.combo_step.isArenaChanged(self.Root_init):
  850. return self.generateCandidatesCurrent_Root_init()
  851. else:
  852. return True
  853. def transition_Root_init_1(self, parameters):
  854. association_name = parameters[0]
  855. self.exit_Root_init()
  856. self.association_name = association_name
  857. self.combo_step.setArenaChanged(self.Root)
  858. self.enterDefault_Root_connected()
  859. def generateCandidatesChildren_Root_connected(self):
  860. branch_done = False
  861. branch_done = (self.generateCandidates_Root_connected_listening() or branch_done)
  862. branch_done = (self.generateCandidates_Root_connected_sending() or branch_done)
  863. branch_done = (self.generateCandidates_Root_connected_queueing() or branch_done)
  864. branch_done = (self.generateCandidates_Root_connected_parsing() or branch_done)
  865. return branch_done
  866. def generateCandidatesCurrent_Root_connected(self):
  867. enabled_events = self.getEnabledEvents()
  868. for e in enabled_events:
  869. if e.name == "close":
  870. self.small_step.addCandidate(self.transition_Root_connected_1, e.parameters)
  871. return True
  872. return False
  873. def generateCandidates_Root_connected(self):
  874. if not self.combo_step.isArenaChanged(self.Root_connected):
  875. branch_done = False
  876. if self.semantics.priority == StatechartSemantics.SourceParent:
  877. branch_done = self.generateCandidatesCurrent_Root_connected()
  878. if not branch_done:
  879. branch_done = self.generateCandidatesChildren_Root_connected()
  880. elif self.semantics.priority == StatechartSemantics.SourceChild:
  881. branch_done = self.generateCandidatesChildren_Root_connected()
  882. if not branch_done:
  883. branch_done = self.generateCandidatesCurrent_Root_connected()
  884. return branch_done
  885. else:
  886. return True
  887. def transition_Root_connected_1(self, parameters):
  888. self.exit_Root_connected()
  889. self.combo_step.setArenaChanged(self.Root)
  890. self.enter_Root_close()
  891. def generateCandidatesChildren_Root_connected_listening(self):
  892. if self.current_state[self.Root_connected_listening][0] == self.Root_connected_listening_listen:
  893. return self.generateCandidates_Root_connected_listening_listen()
  894. elif self.current_state[self.Root_connected_listening][0] == self.Root_connected_listening_closed:
  895. return self.generateCandidates_Root_connected_listening_closed()
  896. return False
  897. def generateCandidates_Root_connected_listening(self):
  898. if not self.combo_step.isArenaChanged(self.Root_connected_listening):
  899. return self.generateCandidatesChildren_Root_connected_listening()
  900. else:
  901. return True
  902. def generateCandidatesCurrent_Root_connected_listening_listen(self):
  903. enabled_events = self.getEnabledEvents()
  904. for e in enabled_events:
  905. if (e.name == "received_socket") and (e.port == "socket_in"):
  906. parameters = e.parameters
  907. socket = parameters[0]
  908. data = parameters[1]
  909. if (self.socket == socket) and (len(data) > 0):
  910. self.small_step.addCandidate(self.transition_Root_connected_listening_listen_1, e.parameters)
  911. return True
  912. enabled_events = self.getEnabledEvents()
  913. for e in enabled_events:
  914. if (e.name == "received_socket") and (e.port == "socket_in"):
  915. parameters = e.parameters
  916. socket = parameters[0]
  917. data = parameters[1]
  918. if (self.socket == socket) and (len(data) == 0):
  919. self.small_step.addCandidate(self.transition_Root_connected_listening_listen_2, e.parameters)
  920. return True
  921. return False
  922. def generateCandidates_Root_connected_listening_listen(self):
  923. if not self.combo_step.isArenaChanged(self.Root_connected_listening_listen):
  924. return self.generateCandidatesCurrent_Root_connected_listening_listen()
  925. else:
  926. return True
  927. def transition_Root_connected_listening_listen_1(self, parameters):
  928. socket = parameters[0]
  929. data = parameters[1]
  930. self.exit_Root_connected_listening_listen()
  931. self.received_data += data
  932. self.raiseInternalEvent(Event("received_data", None, []))
  933. self.combo_step.setArenaChanged(self.Root_connected_listening)
  934. self.enter_Root_connected_listening_listen()
  935. def transition_Root_connected_listening_listen_2(self, parameters):
  936. socket = parameters[0]
  937. data = parameters[1]
  938. self.exit_Root_connected_listening_listen()
  939. self.raiseInternalEvent(Event("received_data", None, []))
  940. self.combo_step.setArenaChanged(self.Root_connected_listening)
  941. self.enter_Root_connected_listening_closed()
  942. def generateCandidates_Root_connected_listening_closed(self):
  943. return False
  944. def generateCandidatesChildren_Root_connected_sending(self):
  945. if self.current_state[self.Root_connected_sending][0] == self.Root_connected_sending_waiting_for_data:
  946. return self.generateCandidates_Root_connected_sending_waiting_for_data()
  947. elif self.current_state[self.Root_connected_sending][0] == self.Root_connected_sending_transferring:
  948. return self.generateCandidates_Root_connected_sending_transferring()
  949. return False
  950. def generateCandidates_Root_connected_sending(self):
  951. if not self.combo_step.isArenaChanged(self.Root_connected_sending):
  952. return self.generateCandidatesChildren_Root_connected_sending()
  953. else:
  954. return True
  955. def generateCandidatesCurrent_Root_connected_sending_waiting_for_data(self):
  956. enabled_events = self.getEnabledEvents()
  957. if len(self.send_data) > 0:
  958. self.small_step.addCandidate(self.transition_Root_connected_sending_waiting_for_data_1, [])
  959. return True
  960. return False
  961. def generateCandidates_Root_connected_sending_waiting_for_data(self):
  962. if not self.combo_step.isArenaChanged(self.Root_connected_sending_waiting_for_data):
  963. return self.generateCandidatesCurrent_Root_connected_sending_waiting_for_data()
  964. else:
  965. return True
  966. def transition_Root_connected_sending_waiting_for_data_1(self, parameters):
  967. self.exit_Root_connected_sending_waiting_for_data()
  968. self.big_step.outputEvent(Event("send_socket", "socket_out", [self.socket, self.send_data]))
  969. self.combo_step.setArenaChanged(self.Root_connected_sending)
  970. self.enter_Root_connected_sending_transferring()
  971. def generateCandidatesCurrent_Root_connected_sending_transferring(self):
  972. enabled_events = self.getEnabledEvents()
  973. for e in enabled_events:
  974. if (e.name == "sent_socket") and (e.port == "socket_in"):
  975. parameters = e.parameters
  976. socket = parameters[0]
  977. sent_bytes = parameters[1]
  978. if self.socket == socket:
  979. self.small_step.addCandidate(self.transition_Root_connected_sending_transferring_1, e.parameters)
  980. return True
  981. return False
  982. def generateCandidates_Root_connected_sending_transferring(self):
  983. if not self.combo_step.isArenaChanged(self.Root_connected_sending_transferring):
  984. return self.generateCandidatesCurrent_Root_connected_sending_transferring()
  985. else:
  986. return True
  987. def transition_Root_connected_sending_transferring_1(self, parameters):
  988. socket = parameters[0]
  989. sent_bytes = parameters[1]
  990. self.exit_Root_connected_sending_transferring()
  991. self.send_data = self.send_data[sent_bytes:]
  992. self.combo_step.setArenaChanged(self.Root_connected_sending)
  993. self.enter_Root_connected_sending_waiting_for_data()
  994. def generateCandidatesChildren_Root_connected_queueing(self):
  995. if self.current_state[self.Root_connected_queueing][0] == self.Root_connected_queueing_queueing:
  996. return self.generateCandidates_Root_connected_queueing_queueing()
  997. return False
  998. def generateCandidates_Root_connected_queueing(self):
  999. if not self.combo_step.isArenaChanged(self.Root_connected_queueing):
  1000. return self.generateCandidatesChildren_Root_connected_queueing()
  1001. else:
  1002. return True
  1003. def generateCandidatesCurrent_Root_connected_queueing_queueing(self):
  1004. enabled_events = self.getEnabledEvents()
  1005. for e in enabled_events:
  1006. if e.name == "HTTP_input":
  1007. self.small_step.addCandidate(self.transition_Root_connected_queueing_queueing_1, e.parameters)
  1008. return True
  1009. return False
  1010. def generateCandidates_Root_connected_queueing_queueing(self):
  1011. if not self.combo_step.isArenaChanged(self.Root_connected_queueing_queueing):
  1012. return self.generateCandidatesCurrent_Root_connected_queueing_queueing()
  1013. else:
  1014. return True
  1015. def transition_Root_connected_queueing_queueing_1(self, parameters):
  1016. data = parameters[0]
  1017. self.exit_Root_connected_queueing_queueing()
  1018. #post_data = "&".join(["%s=%s" % (urllib.quote(k), urllib.quote(v)) for k, v in data.iteritems()])
  1019. post_data = "&".join(["%s=%s" % (k, v) for k, v in data.iteritems()])
  1020. self.send_data += "HTTP/1.0 200 OK\r\n"
  1021. self.send_data += "Content-Length: %s\r\n" % len(post_data)
  1022. self.send_data += "Content-Type: %s; charset=UTF-8\r\n" % "text/plain"
  1023. self.send_data += "\r\n"
  1024. self.send_data += str(post_data)
  1025. self.combo_step.setArenaChanged(self.Root_connected_queueing)
  1026. self.enter_Root_connected_queueing_queueing()
  1027. def generateCandidatesChildren_Root_connected_parsing(self):
  1028. if self.current_state[self.Root_connected_parsing][0] == self.Root_connected_parsing_wait_for_header:
  1029. return self.generateCandidates_Root_connected_parsing_wait_for_header()
  1030. elif self.current_state[self.Root_connected_parsing][0] == self.Root_connected_parsing_closing:
  1031. return self.generateCandidates_Root_connected_parsing_closing()
  1032. elif self.current_state[self.Root_connected_parsing][0] == self.Root_connected_parsing_wait_for_payload:
  1033. return self.generateCandidates_Root_connected_parsing_wait_for_payload()
  1034. return False
  1035. def generateCandidates_Root_connected_parsing(self):
  1036. if not self.combo_step.isArenaChanged(self.Root_connected_parsing):
  1037. return self.generateCandidatesChildren_Root_connected_parsing()
  1038. else:
  1039. return True
  1040. def generateCandidatesCurrent_Root_connected_parsing_wait_for_header(self):
  1041. enabled_events = self.getEnabledEvents()
  1042. if '\r\n\r\n' in self.received_data and self.received_data.startswith('POST'):
  1043. self.small_step.addCandidate(self.transition_Root_connected_parsing_wait_for_header_1, [])
  1044. return True
  1045. enabled_events = self.getEnabledEvents()
  1046. if self.closed and len(self.received_data) == 0:
  1047. self.small_step.addCandidate(self.transition_Root_connected_parsing_wait_for_header_2, [])
  1048. return True
  1049. return False
  1050. def generateCandidates_Root_connected_parsing_wait_for_header(self):
  1051. if not self.combo_step.isArenaChanged(self.Root_connected_parsing_wait_for_header):
  1052. return self.generateCandidatesCurrent_Root_connected_parsing_wait_for_header()
  1053. else:
  1054. return True
  1055. def transition_Root_connected_parsing_wait_for_header_1(self, parameters):
  1056. self.exit_Root_connected_parsing_wait_for_header()
  1057. header, self.received_data = self.received_data.split("\r\n\r\n", 1)
  1058. header = header.lower()
  1059. if "content-length" in header:
  1060. _, after = header.split("content-length:", 1)
  1061. after = after.split("\r\n", 1)[0]
  1062. after = after.strip()
  1063. self.length = int(after)
  1064. else:
  1065. self.length = float('inf')
  1066. self.combo_step.setArenaChanged(self.Root_connected_parsing)
  1067. self.enter_Root_connected_parsing_wait_for_payload()
  1068. def transition_Root_connected_parsing_wait_for_header_2(self, parameters):
  1069. self.exit_Root_connected_parsing_wait_for_header()
  1070. self.combo_step.setArenaChanged(self.Root_connected_parsing)
  1071. self.enter_Root_connected_parsing_closing()
  1072. def generateCandidatesCurrent_Root_connected_parsing_closing(self):
  1073. enabled_events = self.getEnabledEvents()
  1074. for e in enabled_events:
  1075. if e.name == "_0after":
  1076. self.small_step.addCandidate(self.transition_Root_connected_parsing_closing_1, e.parameters)
  1077. return True
  1078. return False
  1079. def generateCandidates_Root_connected_parsing_closing(self):
  1080. if not self.combo_step.isArenaChanged(self.Root_connected_parsing_closing):
  1081. return self.generateCandidatesCurrent_Root_connected_parsing_closing()
  1082. else:
  1083. return True
  1084. def transition_Root_connected_parsing_closing_1(self, parameters):
  1085. self.exit_Root_connected_parsing_closing()
  1086. self.raiseInternalEvent(Event("close", None, []))
  1087. self.combo_step.setArenaChanged(self.Root_connected_parsing)
  1088. self.enter_Root_connected_parsing_closing()
  1089. def generateCandidatesCurrent_Root_connected_parsing_wait_for_payload(self):
  1090. enabled_events = self.getEnabledEvents()
  1091. if len(self.received_data) >= self.length or self.closed:
  1092. self.small_step.addCandidate(self.transition_Root_connected_parsing_wait_for_payload_1, [])
  1093. return True
  1094. return False
  1095. def generateCandidates_Root_connected_parsing_wait_for_payload(self):
  1096. if not self.combo_step.isArenaChanged(self.Root_connected_parsing_wait_for_payload):
  1097. return self.generateCandidatesCurrent_Root_connected_parsing_wait_for_payload()
  1098. else:
  1099. return True
  1100. def transition_Root_connected_parsing_wait_for_payload_1(self, parameters):
  1101. self.exit_Root_connected_parsing_wait_for_payload()
  1102. if self.length == float('inf'):
  1103. data = self.received_data
  1104. self.received_data = ""
  1105. else:
  1106. data = self.received_data[:self.length]
  1107. self.received_data = self.received_data[self.length:]
  1108. # We support POST data only, so everything is in the data
  1109. try:
  1110. params = dict([p.split('=') for p in data.split('&')])
  1111. data = {k: urllib.unquote_plus(v) for k, v in params.iteritems()}
  1112. except:
  1113. data = {}
  1114. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("HTTP_output", None, [self.association_name, data])]))
  1115. self.combo_step.setArenaChanged(self.Root_connected_parsing)
  1116. self.enter_Root_connected_parsing_wait_for_header()
  1117. def generateCandidates_Root_close(self):
  1118. return False
  1119. # Generate transition candidates for current small step
  1120. def generateCandidates(self):
  1121. self.generateCandidates_Root()
  1122. class ObjectManager(ObjectManagerBase):
  1123. def __init__(self, controller):
  1124. ObjectManagerBase.__init__(self, controller)
  1125. def instantiate(self, class_name, construct_params):
  1126. if class_name == "MvKController":
  1127. instance = MvKController(self.controller, construct_params[0])
  1128. instance.associations = {}
  1129. instance.associations["to_mvi"] = Association("Server", 1, 1)
  1130. elif class_name == "Server":
  1131. instance = Server(self.controller, construct_params[0], construct_params[1])
  1132. instance.associations = {}
  1133. instance.associations["sockets"] = Association("Socket", 0, -1)
  1134. instance.associations["parent"] = Association("MvKController", 1, 1)
  1135. elif class_name == "Socket":
  1136. instance = Socket(self.controller, construct_params[0])
  1137. instance.associations = {}
  1138. instance.associations["parent"] = Association("Server", 1, 1)
  1139. return instance
  1140. class Controller(ThreadsControllerBase):
  1141. def __init__(self, params, keep_running = None):
  1142. if keep_running == None: keep_running = True
  1143. ThreadsControllerBase.__init__(self, ObjectManager(self), keep_running)
  1144. self.addInputPort("socket_in")
  1145. self.addOutputPort("socket_out")
  1146. self.object_manager.createInstance("MvKController", [params])