server.py 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe and Joeri Exelmans
  3. Date: Tue Jan 19 08:40:10 2016
  4. Model author: Yentl Van Tendeloo
  5. Model name: MvK Server interface
  6. Model description:
  7. MvK Server interface that receives events through the Socket2Event layer.
  8. Incoming messages are processed as HTTP requests and are forwarded to the MvK.
  9. """
  10. from python_runtime.statecharts_core import *
  11. import urlparse
  12. import urllib
  13. import sys
  14. import traceback
  15. import json
  16. from modelverse_state.main import ModelverseState
  17. # package "MvK Server interface"
  18. class Server(RuntimeClassBase):
  19. def __init__(self, controller, bootfile):
  20. RuntimeClassBase.__init__(self, controller)
  21. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  22. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  23. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  24. self.semantics.priority = StatechartSemantics.SourceParent
  25. self.semantics.concurrency = StatechartSemantics.Single
  26. # Call user defined constructor
  27. Server.user_defined_constructor(self, bootfile)
  28. def user_defined_constructor(self, bootfile):
  29. self.socket = None
  30. self.processing_association_name = None
  31. self.processing_data = None
  32. self.queue = []
  33. self.mvs = ModelverseState(bootfile)
  34. self.mvs_operations = {
  35. "CN": self.mvs.create_node,
  36. "CE": self.mvs.create_edge,
  37. "CNV": self.mvs.create_nodevalue,
  38. "CD": self.mvs.create_dict,
  39. "RV": self.mvs.read_value,
  40. "RO": self.mvs.read_outgoing,
  41. "RI": self.mvs.read_incoming,
  42. "RE": self.mvs.read_edge,
  43. "RD": self.mvs.read_dict,
  44. "RDN": self.mvs.read_dict_node,
  45. "RDE": self.mvs.read_dict_edge,
  46. "RRD": self.mvs.read_reverse_dict,
  47. "RR": self.mvs.read_root,
  48. "RDK": self.mvs.read_dict_keys,
  49. "DE": self.mvs.delete_edge,
  50. "DN": self.mvs.delete_node,
  51. "DG": self.mvs.dump,
  52. }
  53. def user_defined_destructor(self):
  54. pass
  55. # User defined method
  56. def process_message(self, operation_name, parameters):
  57. op = self.mvs_operations[operation_name]
  58. return op(*parameters)
  59. def initializeStatechart(self):
  60. self.current_state[self.Root] = []
  61. self.current_state[self.Root_main] = []
  62. self.current_state[self.Root_main_queue] = []
  63. self.current_state[self.Root_main_processor] = []
  64. self.current_state[self.Root_main_server] = []
  65. self.current_state[self.Root_main_close_socket] = []
  66. # Enter default state
  67. self.enterDefault_Root_main()
  68. # Unique IDs for all statechart nodes
  69. Root = 0
  70. Root_main = 1
  71. Root_main_queue = 2
  72. Root_main_processor = 3
  73. Root_main_server = 4
  74. Root_main_close_socket = 5
  75. Root_main_queue_queue = 6
  76. Root_main_processor_wait_for_input = 7
  77. Root_main_processor_process_input = 8
  78. Root_main_server_init = 9
  79. Root_main_server_binding = 10
  80. Root_main_server_listening = 11
  81. Root_main_server_accepting = 12
  82. Root_main_close_socket_close = 13
  83. # Statechart enter/exit action method(s)
  84. def enter_Root_main(self):
  85. self.current_state[self.Root].append(self.Root_main)
  86. def exit_Root_main(self):
  87. self.exit_Root_main_queue()
  88. self.exit_Root_main_processor()
  89. self.exit_Root_main_server()
  90. self.exit_Root_main_close_socket()
  91. self.current_state[self.Root] = []
  92. def enter_Root_main_queue(self):
  93. self.current_state[self.Root_main].append(self.Root_main_queue)
  94. def exit_Root_main_queue(self):
  95. if self.Root_main_queue_queue in self.current_state[self.Root_main_queue]:
  96. self.exit_Root_main_queue_queue()
  97. self.current_state[self.Root_main] = []
  98. def enter_Root_main_processor(self):
  99. self.current_state[self.Root_main].append(self.Root_main_processor)
  100. def exit_Root_main_processor(self):
  101. if self.Root_main_processor_wait_for_input in self.current_state[self.Root_main_processor]:
  102. self.exit_Root_main_processor_wait_for_input()
  103. if self.Root_main_processor_process_input in self.current_state[self.Root_main_processor]:
  104. self.exit_Root_main_processor_process_input()
  105. self.current_state[self.Root_main] = []
  106. def enter_Root_main_server(self):
  107. self.current_state[self.Root_main].append(self.Root_main_server)
  108. def exit_Root_main_server(self):
  109. if self.Root_main_server_init in self.current_state[self.Root_main_server]:
  110. self.exit_Root_main_server_init()
  111. if self.Root_main_server_binding in self.current_state[self.Root_main_server]:
  112. self.exit_Root_main_server_binding()
  113. if self.Root_main_server_listening in self.current_state[self.Root_main_server]:
  114. self.exit_Root_main_server_listening()
  115. if self.Root_main_server_accepting in self.current_state[self.Root_main_server]:
  116. self.exit_Root_main_server_accepting()
  117. self.current_state[self.Root_main] = []
  118. def enter_Root_main_close_socket(self):
  119. self.current_state[self.Root_main].append(self.Root_main_close_socket)
  120. def exit_Root_main_close_socket(self):
  121. if self.Root_main_close_socket_close in self.current_state[self.Root_main_close_socket]:
  122. self.exit_Root_main_close_socket_close()
  123. self.current_state[self.Root_main] = []
  124. def enter_Root_main_queue_queue(self):
  125. self.current_state[self.Root_main_queue].append(self.Root_main_queue_queue)
  126. def exit_Root_main_queue_queue(self):
  127. self.current_state[self.Root_main_queue] = []
  128. def enter_Root_main_processor_wait_for_input(self):
  129. self.current_state[self.Root_main_processor].append(self.Root_main_processor_wait_for_input)
  130. def exit_Root_main_processor_wait_for_input(self):
  131. self.current_state[self.Root_main_processor] = []
  132. def enter_Root_main_processor_process_input(self):
  133. self.current_state[self.Root_main_processor].append(self.Root_main_processor_process_input)
  134. def exit_Root_main_processor_process_input(self):
  135. self.current_state[self.Root_main_processor] = []
  136. def enter_Root_main_server_init(self):
  137. self.big_step.outputEvent(Event("create_socket", "socket_out", []))
  138. self.current_state[self.Root_main_server].append(self.Root_main_server_init)
  139. def exit_Root_main_server_init(self):
  140. self.current_state[self.Root_main_server] = []
  141. def enter_Root_main_server_binding(self):
  142. self.big_step.outputEvent(Event("bind_socket", "socket_out", [self.socket, ('', 8000)]))
  143. self.current_state[self.Root_main_server].append(self.Root_main_server_binding)
  144. def exit_Root_main_server_binding(self):
  145. self.current_state[self.Root_main_server] = []
  146. def enter_Root_main_server_listening(self):
  147. self.big_step.outputEvent(Event("listen_socket", "socket_out", [self.socket]))
  148. self.current_state[self.Root_main_server].append(self.Root_main_server_listening)
  149. def exit_Root_main_server_listening(self):
  150. self.current_state[self.Root_main_server] = []
  151. def enter_Root_main_server_accepting(self):
  152. self.big_step.outputEvent(Event("accept_socket", "socket_out", [self.socket]))
  153. self.current_state[self.Root_main_server].append(self.Root_main_server_accepting)
  154. def exit_Root_main_server_accepting(self):
  155. self.current_state[self.Root_main_server] = []
  156. def enter_Root_main_close_socket_close(self):
  157. self.current_state[self.Root_main_close_socket].append(self.Root_main_close_socket_close)
  158. def exit_Root_main_close_socket_close(self):
  159. self.current_state[self.Root_main_close_socket] = []
  160. # Statechart enter/exit default method(s)
  161. def enterDefault_Root_main(self):
  162. self.enter_Root_main()
  163. self.enterDefault_Root_main_queue()
  164. self.enterDefault_Root_main_processor()
  165. self.enterDefault_Root_main_server()
  166. self.enterDefault_Root_main_close_socket()
  167. def enterDefault_Root_main_queue(self):
  168. self.enter_Root_main_queue()
  169. self.enter_Root_main_queue_queue()
  170. def enterDefault_Root_main_processor(self):
  171. self.enter_Root_main_processor()
  172. self.enter_Root_main_processor_wait_for_input()
  173. def enterDefault_Root_main_server(self):
  174. self.enter_Root_main_server()
  175. self.enter_Root_main_server_init()
  176. def enterDefault_Root_main_close_socket(self):
  177. self.enter_Root_main_close_socket()
  178. self.enter_Root_main_close_socket_close()
  179. # Statechart transitions
  180. def generateCandidatesChildren_Root(self):
  181. if self.current_state[self.Root][0] == self.Root_main:
  182. return self.generateCandidates_Root_main()
  183. return False
  184. def generateCandidates_Root(self):
  185. if not self.combo_step.isArenaChanged(self.Root):
  186. return self.generateCandidatesChildren_Root()
  187. else:
  188. return True
  189. def generateCandidatesChildren_Root_main(self):
  190. branch_done = False
  191. branch_done = (self.generateCandidates_Root_main_queue() or branch_done)
  192. branch_done = (self.generateCandidates_Root_main_processor() or branch_done)
  193. branch_done = (self.generateCandidates_Root_main_server() or branch_done)
  194. branch_done = (self.generateCandidates_Root_main_close_socket() or branch_done)
  195. return branch_done
  196. def generateCandidates_Root_main(self):
  197. if not self.combo_step.isArenaChanged(self.Root_main):
  198. return self.generateCandidatesChildren_Root_main()
  199. else:
  200. return True
  201. def generateCandidatesChildren_Root_main_queue(self):
  202. if self.current_state[self.Root_main_queue][0] == self.Root_main_queue_queue:
  203. return self.generateCandidates_Root_main_queue_queue()
  204. return False
  205. def generateCandidates_Root_main_queue(self):
  206. if not self.combo_step.isArenaChanged(self.Root_main_queue):
  207. return self.generateCandidatesChildren_Root_main_queue()
  208. else:
  209. return True
  210. def generateCandidatesCurrent_Root_main_queue_queue(self):
  211. enabled_events = self.getEnabledEvents()
  212. for e in enabled_events:
  213. if e.name == "HTTP_output":
  214. self.small_step.addCandidate(self.transition_Root_main_queue_queue_1, e.parameters)
  215. return True
  216. return False
  217. def generateCandidates_Root_main_queue_queue(self):
  218. if not self.combo_step.isArenaChanged(self.Root_main_queue_queue):
  219. return self.generateCandidatesCurrent_Root_main_queue_queue()
  220. else:
  221. return True
  222. def transition_Root_main_queue_queue_1(self, parameters):
  223. association_name = parameters[0]
  224. data = parameters[1]
  225. self.exit_Root_main_queue_queue()
  226. self.queue.append((association_name, data))
  227. self.combo_step.setArenaChanged(self.Root_main_queue)
  228. self.enter_Root_main_queue_queue()
  229. def generateCandidatesChildren_Root_main_processor(self):
  230. if self.current_state[self.Root_main_processor][0] == self.Root_main_processor_wait_for_input:
  231. return self.generateCandidates_Root_main_processor_wait_for_input()
  232. elif self.current_state[self.Root_main_processor][0] == self.Root_main_processor_process_input:
  233. return self.generateCandidates_Root_main_processor_process_input()
  234. return False
  235. def generateCandidates_Root_main_processor(self):
  236. if not self.combo_step.isArenaChanged(self.Root_main_processor):
  237. return self.generateCandidatesChildren_Root_main_processor()
  238. else:
  239. return True
  240. def generateCandidatesCurrent_Root_main_processor_wait_for_input(self):
  241. enabled_events = self.getEnabledEvents()
  242. if len(self.queue) > 0:
  243. self.small_step.addCandidate(self.transition_Root_main_processor_wait_for_input_1, [])
  244. return True
  245. return False
  246. def generateCandidates_Root_main_processor_wait_for_input(self):
  247. if not self.combo_step.isArenaChanged(self.Root_main_processor_wait_for_input):
  248. return self.generateCandidatesCurrent_Root_main_processor_wait_for_input()
  249. else:
  250. return True
  251. def transition_Root_main_processor_wait_for_input_1(self, parameters):
  252. self.exit_Root_main_processor_wait_for_input()
  253. self.processing_association_name, self.processing_data = self.queue.pop(0)
  254. try:
  255. self.processing_data = json.loads(self.processing_data["requests"])
  256. except:
  257. print("Error in deserialization: " + str(self.processing_data))
  258. self.combo_step.setArenaChanged(self.Root_main_processor)
  259. self.enter_Root_main_processor_process_input()
  260. def generateCandidatesCurrent_Root_main_processor_process_input(self):
  261. enabled_events = self.getEnabledEvents()
  262. self.small_step.addCandidate(self.transition_Root_main_processor_process_input_1, [])
  263. return True
  264. return False
  265. def generateCandidates_Root_main_processor_process_input(self):
  266. if not self.combo_step.isArenaChanged(self.Root_main_processor_process_input):
  267. return self.generateCandidatesCurrent_Root_main_processor_process_input()
  268. else:
  269. return True
  270. def transition_Root_main_processor_process_input_1(self, parameters):
  271. self.exit_Root_main_processor_process_input()
  272. reply = []
  273. print(self.processing_data)
  274. for op, params in self.processing_data:
  275. try:
  276. result = self.process_message(op, params)
  277. try:
  278. reply.append(result)
  279. except:
  280. traceback.print_exc()
  281. reply.append([None, 496])
  282. except:
  283. traceback.print_exc()
  284. reply.append([None, 497])
  285. self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.processing_association_name, Event("HTTP_input", None, [{'data': json.dumps(reply)}])]))
  286. self.combo_step.setArenaChanged(self.Root_main_processor)
  287. self.enter_Root_main_processor_wait_for_input()
  288. def generateCandidatesChildren_Root_main_server(self):
  289. if self.current_state[self.Root_main_server][0] == self.Root_main_server_init:
  290. return self.generateCandidates_Root_main_server_init()
  291. elif self.current_state[self.Root_main_server][0] == self.Root_main_server_binding:
  292. return self.generateCandidates_Root_main_server_binding()
  293. elif self.current_state[self.Root_main_server][0] == self.Root_main_server_listening:
  294. return self.generateCandidates_Root_main_server_listening()
  295. elif self.current_state[self.Root_main_server][0] == self.Root_main_server_accepting:
  296. return self.generateCandidates_Root_main_server_accepting()
  297. return False
  298. def generateCandidates_Root_main_server(self):
  299. if not self.combo_step.isArenaChanged(self.Root_main_server):
  300. return self.generateCandidatesChildren_Root_main_server()
  301. else:
  302. return True
  303. def generateCandidatesCurrent_Root_main_server_init(self):
  304. enabled_events = self.getEnabledEvents()
  305. for e in enabled_events:
  306. if (e.name == "created_socket") and (e.port == "socket_in"):
  307. self.small_step.addCandidate(self.transition_Root_main_server_init_1, e.parameters)
  308. return True
  309. return False
  310. def generateCandidates_Root_main_server_init(self):
  311. if not self.combo_step.isArenaChanged(self.Root_main_server_init):
  312. return self.generateCandidatesCurrent_Root_main_server_init()
  313. else:
  314. return True
  315. def transition_Root_main_server_init_1(self, parameters):
  316. socket = parameters[0]
  317. self.exit_Root_main_server_init()
  318. self.socket = socket
  319. self.combo_step.setArenaChanged(self.Root_main_server)
  320. self.enter_Root_main_server_binding()
  321. def generateCandidatesCurrent_Root_main_server_binding(self):
  322. enabled_events = self.getEnabledEvents()
  323. for e in enabled_events:
  324. if (e.name == "bound_socket") and (e.port == "socket_in"):
  325. parameters = e.parameters
  326. socket = parameters[0]
  327. if self.socket == socket:
  328. self.small_step.addCandidate(self.transition_Root_main_server_binding_1, e.parameters)
  329. return True
  330. return False
  331. def generateCandidates_Root_main_server_binding(self):
  332. if not self.combo_step.isArenaChanged(self.Root_main_server_binding):
  333. return self.generateCandidatesCurrent_Root_main_server_binding()
  334. else:
  335. return True
  336. def transition_Root_main_server_binding_1(self, parameters):
  337. socket = parameters[0]
  338. self.exit_Root_main_server_binding()
  339. self.combo_step.setArenaChanged(self.Root_main_server)
  340. self.enter_Root_main_server_listening()
  341. def generateCandidatesCurrent_Root_main_server_listening(self):
  342. enabled_events = self.getEnabledEvents()
  343. for e in enabled_events:
  344. if (e.name == "listened_socket") and (e.port == "socket_in"):
  345. parameters = e.parameters
  346. socket = parameters[0]
  347. if self.socket == socket:
  348. self.small_step.addCandidate(self.transition_Root_main_server_listening_1, e.parameters)
  349. return True
  350. return False
  351. def generateCandidates_Root_main_server_listening(self):
  352. if not self.combo_step.isArenaChanged(self.Root_main_server_listening):
  353. return self.generateCandidatesCurrent_Root_main_server_listening()
  354. else:
  355. return True
  356. def transition_Root_main_server_listening_1(self, parameters):
  357. socket = parameters[0]
  358. self.exit_Root_main_server_listening()
  359. self.combo_step.setArenaChanged(self.Root_main_server)
  360. self.enter_Root_main_server_accepting()
  361. def generateCandidatesCurrent_Root_main_server_accepting(self):
  362. enabled_events = self.getEnabledEvents()
  363. for e in enabled_events:
  364. if (e.name == "accepted_socket") and (e.port == "socket_in"):
  365. parameters = e.parameters
  366. socket = parameters[0]
  367. connected_socket = parameters[1]
  368. if self.socket == socket:
  369. self.small_step.addCandidate(self.transition_Root_main_server_accepting_1, e.parameters)
  370. return True
  371. enabled_events = self.getEnabledEvents()
  372. for e in enabled_events:
  373. if e.name == "instance_created":
  374. self.small_step.addCandidate(self.transition_Root_main_server_accepting_2, e.parameters)
  375. return True
  376. return False
  377. def generateCandidates_Root_main_server_accepting(self):
  378. if not self.combo_step.isArenaChanged(self.Root_main_server_accepting):
  379. return self.generateCandidatesCurrent_Root_main_server_accepting()
  380. else:
  381. return True
  382. def transition_Root_main_server_accepting_1(self, parameters):
  383. socket = parameters[0]
  384. connected_socket = parameters[1]
  385. self.exit_Root_main_server_accepting()
  386. self.big_step.outputEventOM(Event("create_instance", None, [self, 'sockets', 'Socket', connected_socket]))
  387. self.combo_step.setArenaChanged(self.Root_main_server)
  388. self.enter_Root_main_server_accepting()
  389. def transition_Root_main_server_accepting_2(self, parameters):
  390. instancename = parameters[0]
  391. self.exit_Root_main_server_accepting()
  392. self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
  393. self.big_step.outputEventOM(Event("narrow_cast", None, [self, instancename, Event("set_association_name", None, [instancename])]))
  394. self.combo_step.setArenaChanged(self.Root_main_server)
  395. self.enter_Root_main_server_accepting()
  396. def generateCandidatesChildren_Root_main_close_socket(self):
  397. if self.current_state[self.Root_main_close_socket][0] == self.Root_main_close_socket_close:
  398. return self.generateCandidates_Root_main_close_socket_close()
  399. return False
  400. def generateCandidates_Root_main_close_socket(self):
  401. if not self.combo_step.isArenaChanged(self.Root_main_close_socket):
  402. return self.generateCandidatesChildren_Root_main_close_socket()
  403. else:
  404. return True
  405. def generateCandidatesCurrent_Root_main_close_socket_close(self):
  406. enabled_events = self.getEnabledEvents()
  407. for e in enabled_events:
  408. if e.name == "close":
  409. self.small_step.addCandidate(self.transition_Root_main_close_socket_close_1, e.parameters)
  410. return True
  411. return False
  412. def generateCandidates_Root_main_close_socket_close(self):
  413. if not self.combo_step.isArenaChanged(self.Root_main_close_socket_close):
  414. return self.generateCandidatesCurrent_Root_main_close_socket_close()
  415. else:
  416. return True
  417. def transition_Root_main_close_socket_close_1(self, parameters):
  418. association_name = parameters[0]
  419. self.exit_Root_main_close_socket_close()
  420. self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
  421. self.combo_step.setArenaChanged(self.Root_main_close_socket)
  422. self.enter_Root_main_close_socket_close()
  423. # Generate transition candidates for current small step
  424. def generateCandidates(self):
  425. self.generateCandidates_Root()
  426. class Socket(RuntimeClassBase):
  427. def __init__(self, controller, my_socket):
  428. RuntimeClassBase.__init__(self, controller)
  429. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  430. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  431. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  432. self.semantics.priority = StatechartSemantics.SourceParent
  433. self.semantics.concurrency = StatechartSemantics.Single
  434. # Call user defined constructor
  435. Socket.user_defined_constructor(self, my_socket)
  436. def user_defined_constructor(self, my_socket):
  437. self.socket = my_socket
  438. self.received_data = ""
  439. self.send_data = ""
  440. self.closed = False
  441. self.association_name = None
  442. def user_defined_destructor(self):
  443. pass
  444. def initializeStatechart(self):
  445. self.current_state[self.Root] = []
  446. self.current_state[self.Root_connected] = []
  447. self.current_state[self.Root_connected_listening] = []
  448. self.current_state[self.Root_connected_sending] = []
  449. self.current_state[self.Root_connected_queueing] = []
  450. self.current_state[self.Root_connected_parsing] = []
  451. # Enter default state
  452. self.enter_Root_init()
  453. # Unique IDs for all statechart nodes
  454. Root = 0
  455. Root_connected = 1
  456. Root_connected_listening = 2
  457. Root_connected_sending = 3
  458. Root_connected_queueing = 4
  459. Root_connected_parsing = 5
  460. Root_init = 6
  461. Root_connected_listening_listen = 7
  462. Root_connected_listening_closed = 8
  463. Root_connected_sending_waiting_for_data = 9
  464. Root_connected_sending_transferring = 10
  465. Root_connected_queueing_queueing = 11
  466. Root_connected_parsing_wait_for_header = 12
  467. Root_connected_parsing_closing = 13
  468. Root_connected_parsing_wait_for_payload = 14
  469. Root_close = 15
  470. # Statechart enter/exit action method(s)
  471. def enter_Root_connected(self):
  472. self.current_state[self.Root].append(self.Root_connected)
  473. def exit_Root_connected(self):
  474. self.exit_Root_connected_listening()
  475. self.exit_Root_connected_sending()
  476. self.exit_Root_connected_queueing()
  477. self.exit_Root_connected_parsing()
  478. self.current_state[self.Root] = []
  479. def enter_Root_connected_listening(self):
  480. self.current_state[self.Root_connected].append(self.Root_connected_listening)
  481. def exit_Root_connected_listening(self):
  482. if self.Root_connected_listening_listen in self.current_state[self.Root_connected_listening]:
  483. self.exit_Root_connected_listening_listen()
  484. if self.Root_connected_listening_closed in self.current_state[self.Root_connected_listening]:
  485. self.exit_Root_connected_listening_closed()
  486. self.current_state[self.Root_connected] = []
  487. def enter_Root_connected_sending(self):
  488. self.current_state[self.Root_connected].append(self.Root_connected_sending)
  489. def exit_Root_connected_sending(self):
  490. if self.Root_connected_sending_waiting_for_data in self.current_state[self.Root_connected_sending]:
  491. self.exit_Root_connected_sending_waiting_for_data()
  492. if self.Root_connected_sending_transferring in self.current_state[self.Root_connected_sending]:
  493. self.exit_Root_connected_sending_transferring()
  494. self.current_state[self.Root_connected] = []
  495. def enter_Root_connected_queueing(self):
  496. self.current_state[self.Root_connected].append(self.Root_connected_queueing)
  497. def exit_Root_connected_queueing(self):
  498. if self.Root_connected_queueing_queueing in self.current_state[self.Root_connected_queueing]:
  499. self.exit_Root_connected_queueing_queueing()
  500. self.current_state[self.Root_connected] = []
  501. def enter_Root_connected_parsing(self):
  502. self.current_state[self.Root_connected].append(self.Root_connected_parsing)
  503. def exit_Root_connected_parsing(self):
  504. if self.Root_connected_parsing_wait_for_header in self.current_state[self.Root_connected_parsing]:
  505. self.exit_Root_connected_parsing_wait_for_header()
  506. if self.Root_connected_parsing_closing in self.current_state[self.Root_connected_parsing]:
  507. self.exit_Root_connected_parsing_closing()
  508. if self.Root_connected_parsing_wait_for_payload in self.current_state[self.Root_connected_parsing]:
  509. self.exit_Root_connected_parsing_wait_for_payload()
  510. self.current_state[self.Root_connected] = []
  511. def enter_Root_init(self):
  512. self.current_state[self.Root].append(self.Root_init)
  513. def exit_Root_init(self):
  514. self.current_state[self.Root] = []
  515. def enter_Root_connected_listening_listen(self):
  516. self.big_step.outputEvent(Event("recv_socket", "socket_out", [self.socket]))
  517. self.current_state[self.Root_connected_listening].append(self.Root_connected_listening_listen)
  518. def exit_Root_connected_listening_listen(self):
  519. self.current_state[self.Root_connected_listening] = []
  520. def enter_Root_connected_listening_closed(self):
  521. self.closed = True
  522. self.current_state[self.Root_connected_listening].append(self.Root_connected_listening_closed)
  523. def exit_Root_connected_listening_closed(self):
  524. self.current_state[self.Root_connected_listening] = []
  525. def enter_Root_connected_sending_waiting_for_data(self):
  526. self.current_state[self.Root_connected_sending].append(self.Root_connected_sending_waiting_for_data)
  527. def exit_Root_connected_sending_waiting_for_data(self):
  528. self.current_state[self.Root_connected_sending] = []
  529. def enter_Root_connected_sending_transferring(self):
  530. self.current_state[self.Root_connected_sending].append(self.Root_connected_sending_transferring)
  531. def exit_Root_connected_sending_transferring(self):
  532. self.current_state[self.Root_connected_sending] = []
  533. def enter_Root_connected_queueing_queueing(self):
  534. self.current_state[self.Root_connected_queueing].append(self.Root_connected_queueing_queueing)
  535. def exit_Root_connected_queueing_queueing(self):
  536. self.current_state[self.Root_connected_queueing] = []
  537. def enter_Root_connected_parsing_wait_for_header(self):
  538. self.current_state[self.Root_connected_parsing].append(self.Root_connected_parsing_wait_for_header)
  539. def exit_Root_connected_parsing_wait_for_header(self):
  540. self.current_state[self.Root_connected_parsing] = []
  541. def enter_Root_connected_parsing_closing(self):
  542. self.timers[0] = 0.0
  543. self.current_state[self.Root_connected_parsing].append(self.Root_connected_parsing_closing)
  544. def exit_Root_connected_parsing_closing(self):
  545. self.timers.pop(0, None)
  546. self.current_state[self.Root_connected_parsing] = []
  547. def enter_Root_connected_parsing_wait_for_payload(self):
  548. self.current_state[self.Root_connected_parsing].append(self.Root_connected_parsing_wait_for_payload)
  549. def exit_Root_connected_parsing_wait_for_payload(self):
  550. self.current_state[self.Root_connected_parsing] = []
  551. def enter_Root_close(self):
  552. self.big_step.outputEvent(Event("close_socket", "socket_out", [self.socket]))
  553. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("close_socket", None, [self.association_name])]))
  554. self.current_state[self.Root].append(self.Root_close)
  555. def exit_Root_close(self):
  556. self.current_state[self.Root] = []
  557. # Statechart enter/exit default method(s)
  558. def enterDefault_Root_connected(self):
  559. self.enter_Root_connected()
  560. self.enterDefault_Root_connected_listening()
  561. self.enterDefault_Root_connected_sending()
  562. self.enterDefault_Root_connected_queueing()
  563. self.enterDefault_Root_connected_parsing()
  564. def enterDefault_Root_connected_listening(self):
  565. self.enter_Root_connected_listening()
  566. self.enter_Root_connected_listening_listen()
  567. def enterDefault_Root_connected_sending(self):
  568. self.enter_Root_connected_sending()
  569. self.enter_Root_connected_sending_waiting_for_data()
  570. def enterDefault_Root_connected_queueing(self):
  571. self.enter_Root_connected_queueing()
  572. self.enter_Root_connected_queueing_queueing()
  573. def enterDefault_Root_connected_parsing(self):
  574. self.enter_Root_connected_parsing()
  575. self.enter_Root_connected_parsing_wait_for_header()
  576. # Statechart transitions
  577. def generateCandidatesChildren_Root(self):
  578. if self.current_state[self.Root][0] == self.Root_init:
  579. return self.generateCandidates_Root_init()
  580. elif self.current_state[self.Root][0] == self.Root_connected:
  581. return self.generateCandidates_Root_connected()
  582. elif self.current_state[self.Root][0] == self.Root_close:
  583. return self.generateCandidates_Root_close()
  584. return False
  585. def generateCandidates_Root(self):
  586. if not self.combo_step.isArenaChanged(self.Root):
  587. return self.generateCandidatesChildren_Root()
  588. else:
  589. return True
  590. def generateCandidatesCurrent_Root_init(self):
  591. enabled_events = self.getEnabledEvents()
  592. for e in enabled_events:
  593. if e.name == "set_association_name":
  594. self.small_step.addCandidate(self.transition_Root_init_1, e.parameters)
  595. return True
  596. return False
  597. def generateCandidates_Root_init(self):
  598. if not self.combo_step.isArenaChanged(self.Root_init):
  599. return self.generateCandidatesCurrent_Root_init()
  600. else:
  601. return True
  602. def transition_Root_init_1(self, parameters):
  603. association_name = parameters[0]
  604. self.exit_Root_init()
  605. self.association_name = association_name
  606. self.combo_step.setArenaChanged(self.Root)
  607. self.enterDefault_Root_connected()
  608. def generateCandidatesChildren_Root_connected(self):
  609. branch_done = False
  610. branch_done = (self.generateCandidates_Root_connected_listening() or branch_done)
  611. branch_done = (self.generateCandidates_Root_connected_sending() or branch_done)
  612. branch_done = (self.generateCandidates_Root_connected_queueing() or branch_done)
  613. branch_done = (self.generateCandidates_Root_connected_parsing() or branch_done)
  614. return branch_done
  615. def generateCandidatesCurrent_Root_connected(self):
  616. enabled_events = self.getEnabledEvents()
  617. for e in enabled_events:
  618. if e.name == "close":
  619. self.small_step.addCandidate(self.transition_Root_connected_1, e.parameters)
  620. return True
  621. return False
  622. def generateCandidates_Root_connected(self):
  623. if not self.combo_step.isArenaChanged(self.Root_connected):
  624. branch_done = False
  625. if self.semantics.priority == StatechartSemantics.SourceParent:
  626. branch_done = self.generateCandidatesCurrent_Root_connected()
  627. if not branch_done:
  628. branch_done = self.generateCandidatesChildren_Root_connected()
  629. elif self.semantics.priority == StatechartSemantics.SourceChild:
  630. branch_done = self.generateCandidatesChildren_Root_connected()
  631. if not branch_done:
  632. branch_done = self.generateCandidatesCurrent_Root_connected()
  633. return branch_done
  634. else:
  635. return True
  636. def transition_Root_connected_1(self, parameters):
  637. self.exit_Root_connected()
  638. self.combo_step.setArenaChanged(self.Root)
  639. self.enter_Root_close()
  640. def generateCandidatesChildren_Root_connected_listening(self):
  641. if self.current_state[self.Root_connected_listening][0] == self.Root_connected_listening_listen:
  642. return self.generateCandidates_Root_connected_listening_listen()
  643. elif self.current_state[self.Root_connected_listening][0] == self.Root_connected_listening_closed:
  644. return self.generateCandidates_Root_connected_listening_closed()
  645. return False
  646. def generateCandidates_Root_connected_listening(self):
  647. if not self.combo_step.isArenaChanged(self.Root_connected_listening):
  648. return self.generateCandidatesChildren_Root_connected_listening()
  649. else:
  650. return True
  651. def generateCandidatesCurrent_Root_connected_listening_listen(self):
  652. enabled_events = self.getEnabledEvents()
  653. for e in enabled_events:
  654. if (e.name == "received_socket") and (e.port == "socket_in"):
  655. parameters = e.parameters
  656. socket = parameters[0]
  657. data = parameters[1]
  658. if (self.socket == socket) and (len(data) > 0):
  659. self.small_step.addCandidate(self.transition_Root_connected_listening_listen_1, e.parameters)
  660. return True
  661. enabled_events = self.getEnabledEvents()
  662. for e in enabled_events:
  663. if (e.name == "received_socket") and (e.port == "socket_in"):
  664. parameters = e.parameters
  665. socket = parameters[0]
  666. data = parameters[1]
  667. if (self.socket == socket) and (len(data) == 0):
  668. self.small_step.addCandidate(self.transition_Root_connected_listening_listen_2, e.parameters)
  669. return True
  670. return False
  671. def generateCandidates_Root_connected_listening_listen(self):
  672. if not self.combo_step.isArenaChanged(self.Root_connected_listening_listen):
  673. return self.generateCandidatesCurrent_Root_connected_listening_listen()
  674. else:
  675. return True
  676. def transition_Root_connected_listening_listen_1(self, parameters):
  677. socket = parameters[0]
  678. data = parameters[1]
  679. self.exit_Root_connected_listening_listen()
  680. self.received_data += data
  681. self.raiseInternalEvent(Event("received_data", None, []))
  682. self.combo_step.setArenaChanged(self.Root_connected_listening)
  683. self.enter_Root_connected_listening_listen()
  684. def transition_Root_connected_listening_listen_2(self, parameters):
  685. socket = parameters[0]
  686. data = parameters[1]
  687. self.exit_Root_connected_listening_listen()
  688. self.raiseInternalEvent(Event("received_data", None, []))
  689. self.combo_step.setArenaChanged(self.Root_connected_listening)
  690. self.enter_Root_connected_listening_closed()
  691. def generateCandidates_Root_connected_listening_closed(self):
  692. return False
  693. def generateCandidatesChildren_Root_connected_sending(self):
  694. if self.current_state[self.Root_connected_sending][0] == self.Root_connected_sending_waiting_for_data:
  695. return self.generateCandidates_Root_connected_sending_waiting_for_data()
  696. elif self.current_state[self.Root_connected_sending][0] == self.Root_connected_sending_transferring:
  697. return self.generateCandidates_Root_connected_sending_transferring()
  698. return False
  699. def generateCandidates_Root_connected_sending(self):
  700. if not self.combo_step.isArenaChanged(self.Root_connected_sending):
  701. return self.generateCandidatesChildren_Root_connected_sending()
  702. else:
  703. return True
  704. def generateCandidatesCurrent_Root_connected_sending_waiting_for_data(self):
  705. enabled_events = self.getEnabledEvents()
  706. if len(self.send_data) > 0:
  707. self.small_step.addCandidate(self.transition_Root_connected_sending_waiting_for_data_1, [])
  708. return True
  709. return False
  710. def generateCandidates_Root_connected_sending_waiting_for_data(self):
  711. if not self.combo_step.isArenaChanged(self.Root_connected_sending_waiting_for_data):
  712. return self.generateCandidatesCurrent_Root_connected_sending_waiting_for_data()
  713. else:
  714. return True
  715. def transition_Root_connected_sending_waiting_for_data_1(self, parameters):
  716. self.exit_Root_connected_sending_waiting_for_data()
  717. self.big_step.outputEvent(Event("send_socket", "socket_out", [self.socket, self.send_data]))
  718. self.combo_step.setArenaChanged(self.Root_connected_sending)
  719. self.enter_Root_connected_sending_transferring()
  720. def generateCandidatesCurrent_Root_connected_sending_transferring(self):
  721. enabled_events = self.getEnabledEvents()
  722. for e in enabled_events:
  723. if (e.name == "sent_socket") and (e.port == "socket_in"):
  724. parameters = e.parameters
  725. socket = parameters[0]
  726. sent_bytes = parameters[1]
  727. if self.socket == socket:
  728. self.small_step.addCandidate(self.transition_Root_connected_sending_transferring_1, e.parameters)
  729. return True
  730. return False
  731. def generateCandidates_Root_connected_sending_transferring(self):
  732. if not self.combo_step.isArenaChanged(self.Root_connected_sending_transferring):
  733. return self.generateCandidatesCurrent_Root_connected_sending_transferring()
  734. else:
  735. return True
  736. def transition_Root_connected_sending_transferring_1(self, parameters):
  737. socket = parameters[0]
  738. sent_bytes = parameters[1]
  739. self.exit_Root_connected_sending_transferring()
  740. self.send_data = self.send_data[sent_bytes:]
  741. self.combo_step.setArenaChanged(self.Root_connected_sending)
  742. self.enter_Root_connected_sending_waiting_for_data()
  743. def generateCandidatesChildren_Root_connected_queueing(self):
  744. if self.current_state[self.Root_connected_queueing][0] == self.Root_connected_queueing_queueing:
  745. return self.generateCandidates_Root_connected_queueing_queueing()
  746. return False
  747. def generateCandidates_Root_connected_queueing(self):
  748. if not self.combo_step.isArenaChanged(self.Root_connected_queueing):
  749. return self.generateCandidatesChildren_Root_connected_queueing()
  750. else:
  751. return True
  752. def generateCandidatesCurrent_Root_connected_queueing_queueing(self):
  753. enabled_events = self.getEnabledEvents()
  754. for e in enabled_events:
  755. if e.name == "HTTP_input":
  756. self.small_step.addCandidate(self.transition_Root_connected_queueing_queueing_1, e.parameters)
  757. return True
  758. return False
  759. def generateCandidates_Root_connected_queueing_queueing(self):
  760. if not self.combo_step.isArenaChanged(self.Root_connected_queueing_queueing):
  761. return self.generateCandidatesCurrent_Root_connected_queueing_queueing()
  762. else:
  763. return True
  764. def transition_Root_connected_queueing_queueing_1(self, parameters):
  765. data = parameters[0]
  766. self.exit_Root_connected_queueing_queueing()
  767. post_data = "&".join(["%s=%s" % (k, v) for k, v in data.iteritems()])
  768. self.send_data += "HTTP/1.0 200 OK\r\n"
  769. self.send_data += "Content-Length: %s\r\n" % len(post_data)
  770. self.send_data += "Content-Type: %s; charset=UTF-8\r\n" % "text/plain"
  771. self.send_data += "\r\n"
  772. self.send_data += str(post_data)
  773. self.combo_step.setArenaChanged(self.Root_connected_queueing)
  774. self.enter_Root_connected_queueing_queueing()
  775. def generateCandidatesChildren_Root_connected_parsing(self):
  776. if self.current_state[self.Root_connected_parsing][0] == self.Root_connected_parsing_wait_for_header:
  777. return self.generateCandidates_Root_connected_parsing_wait_for_header()
  778. elif self.current_state[self.Root_connected_parsing][0] == self.Root_connected_parsing_closing:
  779. return self.generateCandidates_Root_connected_parsing_closing()
  780. elif self.current_state[self.Root_connected_parsing][0] == self.Root_connected_parsing_wait_for_payload:
  781. return self.generateCandidates_Root_connected_parsing_wait_for_payload()
  782. return False
  783. def generateCandidates_Root_connected_parsing(self):
  784. if not self.combo_step.isArenaChanged(self.Root_connected_parsing):
  785. return self.generateCandidatesChildren_Root_connected_parsing()
  786. else:
  787. return True
  788. def generateCandidatesCurrent_Root_connected_parsing_wait_for_header(self):
  789. enabled_events = self.getEnabledEvents()
  790. if '\r\n\r\n' in self.received_data and self.received_data.startswith('POST'):
  791. self.small_step.addCandidate(self.transition_Root_connected_parsing_wait_for_header_1, [])
  792. return True
  793. enabled_events = self.getEnabledEvents()
  794. if self.closed and len(self.received_data) == 0:
  795. self.small_step.addCandidate(self.transition_Root_connected_parsing_wait_for_header_2, [])
  796. return True
  797. return False
  798. def generateCandidates_Root_connected_parsing_wait_for_header(self):
  799. if not self.combo_step.isArenaChanged(self.Root_connected_parsing_wait_for_header):
  800. return self.generateCandidatesCurrent_Root_connected_parsing_wait_for_header()
  801. else:
  802. return True
  803. def transition_Root_connected_parsing_wait_for_header_1(self, parameters):
  804. self.exit_Root_connected_parsing_wait_for_header()
  805. header, self.received_data = self.received_data.split("\r\n\r\n", 1)
  806. header = header.lower()
  807. if "content-length" in header:
  808. _, after = header.split("content-length:", 1)
  809. after = after.split("\r\n", 1)[0]
  810. after = after.strip()
  811. self.length = int(after)
  812. else:
  813. self.length = float('inf')
  814. self.combo_step.setArenaChanged(self.Root_connected_parsing)
  815. self.enter_Root_connected_parsing_wait_for_payload()
  816. def transition_Root_connected_parsing_wait_for_header_2(self, parameters):
  817. self.exit_Root_connected_parsing_wait_for_header()
  818. self.combo_step.setArenaChanged(self.Root_connected_parsing)
  819. self.enter_Root_connected_parsing_closing()
  820. def generateCandidatesCurrent_Root_connected_parsing_closing(self):
  821. enabled_events = self.getEnabledEvents()
  822. for e in enabled_events:
  823. if e.name == "_0after":
  824. self.small_step.addCandidate(self.transition_Root_connected_parsing_closing_1, e.parameters)
  825. return True
  826. return False
  827. def generateCandidates_Root_connected_parsing_closing(self):
  828. if not self.combo_step.isArenaChanged(self.Root_connected_parsing_closing):
  829. return self.generateCandidatesCurrent_Root_connected_parsing_closing()
  830. else:
  831. return True
  832. def transition_Root_connected_parsing_closing_1(self, parameters):
  833. self.exit_Root_connected_parsing_closing()
  834. self.raiseInternalEvent(Event("close", None, []))
  835. self.combo_step.setArenaChanged(self.Root_connected_parsing)
  836. self.enter_Root_connected_parsing_closing()
  837. def generateCandidatesCurrent_Root_connected_parsing_wait_for_payload(self):
  838. enabled_events = self.getEnabledEvents()
  839. if len(self.received_data) >= self.length or self.closed:
  840. self.small_step.addCandidate(self.transition_Root_connected_parsing_wait_for_payload_1, [])
  841. return True
  842. return False
  843. def generateCandidates_Root_connected_parsing_wait_for_payload(self):
  844. if not self.combo_step.isArenaChanged(self.Root_connected_parsing_wait_for_payload):
  845. return self.generateCandidatesCurrent_Root_connected_parsing_wait_for_payload()
  846. else:
  847. return True
  848. def transition_Root_connected_parsing_wait_for_payload_1(self, parameters):
  849. self.exit_Root_connected_parsing_wait_for_payload()
  850. if self.length == float('inf'):
  851. data = self.received_data
  852. self.received_data = ""
  853. else:
  854. data = self.received_data[:self.length]
  855. self.received_data = self.received_data[self.length:]
  856. # We support POST data only, so everything is in the data
  857. try:
  858. params = dict([p.split('=') for p in data.split('&')])
  859. data = {k: urllib.unquote_plus(v) for k, v in params.iteritems()}
  860. except:
  861. import traceback
  862. traceback.print_exc()
  863. print("Could not parse: " + str(data))
  864. data = {}
  865. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("HTTP_output", None, [self.association_name, data])]))
  866. self.combo_step.setArenaChanged(self.Root_connected_parsing)
  867. self.enter_Root_connected_parsing_wait_for_header()
  868. def generateCandidates_Root_close(self):
  869. return False
  870. # Generate transition candidates for current small step
  871. def generateCandidates(self):
  872. self.generateCandidates_Root()
  873. class ObjectManager(ObjectManagerBase):
  874. def __init__(self, controller):
  875. ObjectManagerBase.__init__(self, controller)
  876. def instantiate(self, class_name, construct_params):
  877. if class_name == "Server":
  878. instance = Server(self.controller, construct_params[0])
  879. instance.associations = {}
  880. instance.associations["sockets"] = Association("Socket", 0, -1)
  881. elif class_name == "Socket":
  882. instance = Socket(self.controller, construct_params[0])
  883. instance.associations = {}
  884. instance.associations["parent"] = Association("Server", 1, 1)
  885. return instance
  886. class Controller(ThreadsControllerBase):
  887. def __init__(self, bootfile, keep_running = None):
  888. if keep_running == None: keep_running = True
  889. ThreadsControllerBase.__init__(self, ObjectManager(self), keep_running)
  890. self.addInputPort("socket_in")
  891. self.addOutputPort("socket_out")
  892. self.object_manager.createInstance("Server", [bootfile])