target.py 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
  3. Model author: Yentl Van Tendeloo
  4. Model name: HTTP Server
  5. Model description:
  6. Example HTTP echo server.
  7. """
  8. from sccd.runtime.statecharts_core import *
  9. import time
  10. import os
  11. import urllib
  12. import sys
  13. import json
  14. import sys
  15. # package "HTTP Server"
  16. class Echo(RuntimeClassBase):
  17. def __init__(self, controller, params):
  18. RuntimeClassBase.__init__(self, controller)
  19. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  20. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  21. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  22. self.semantics.priority = StatechartSemantics.SourceParent
  23. self.semantics.concurrency = StatechartSemantics.Single
  24. # build Statechart structure
  25. self.build_statechart_structure()
  26. # call user defined constructor
  27. Echo.user_defined_constructor(self, params)
  28. def user_defined_constructor(self, params):
  29. self.source = None
  30. def user_defined_destructor(self):
  31. pass
  32. # builds Statechart structure
  33. def build_statechart_structure(self):
  34. # state <root>
  35. self.states[""] = State(0, "", self)
  36. # state /init_server
  37. self.states["/init_server"] = State(1, "/init_server", self)
  38. self.states["/init_server"].setEnter(self._init_server_enter)
  39. # state /wait_for_requests
  40. self.states["/wait_for_requests"] = State(2, "/wait_for_requests", self)
  41. # state /wait_for_requests/wait
  42. self.states["/wait_for_requests/wait"] = State(3, "/wait_for_requests/wait", self)
  43. # add children
  44. self.states[""].addChild(self.states["/init_server"])
  45. self.states[""].addChild(self.states["/wait_for_requests"])
  46. self.states["/wait_for_requests"].addChild(self.states["/wait_for_requests/wait"])
  47. self.states[""].fixTree()
  48. self.states[""].default_state = self.states["/init_server"]
  49. self.states["/wait_for_requests"].default_state = self.states["/wait_for_requests/wait"]
  50. # transition /init_server
  51. _init_server_0 = Transition(self, self.states["/init_server"], [self.states["/wait_for_requests"]])
  52. _init_server_0.setAction(self._init_server_0_exec)
  53. _init_server_0.setTrigger(Event("instance_created", None))
  54. self.states["/init_server"].addTransition(_init_server_0)
  55. # transition /wait_for_requests/wait
  56. _wait_for_requests_wait_0 = Transition(self, self.states["/wait_for_requests/wait"], [self.states["/wait_for_requests/wait"]])
  57. _wait_for_requests_wait_0.setAction(self._wait_for_requests_wait_0_exec)
  58. _wait_for_requests_wait_0.setTrigger(Event("HTTP_output", None))
  59. self.states["/wait_for_requests/wait"].addTransition(_wait_for_requests_wait_0)
  60. def _init_server_enter(self):
  61. self.big_step.outputEventOM(Event("create_instance", None, [self, 'to_server', 'Server', '', 8080]))
  62. def _init_server_0_exec(self, parameters):
  63. instancename = parameters[0]
  64. self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
  65. def _wait_for_requests_wait_0_exec(self, parameters):
  66. source = parameters[0]
  67. data = parameters[1]
  68. print("Got input: " + str(data))
  69. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'to_server/%s' % source, Event("HTTP_input", None, [data])]))
  70. def initializeStatechart(self):
  71. # enter default state
  72. self.default_targets = self.states["/init_server"].getEffectiveTargetStates()
  73. RuntimeClassBase.initializeStatechart(self)
  74. class Server(RuntimeClassBase):
  75. def __init__(self, controller, address, port):
  76. RuntimeClassBase.__init__(self, controller)
  77. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  78. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  79. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  80. self.semantics.priority = StatechartSemantics.SourceParent
  81. self.semantics.concurrency = StatechartSemantics.Single
  82. # build Statechart structure
  83. self.build_statechart_structure()
  84. # call user defined constructor
  85. Server.user_defined_constructor(self, address, port)
  86. def user_defined_constructor(self, address, port):
  87. self.socket = None
  88. self.address = address
  89. self.port = port
  90. def user_defined_destructor(self):
  91. pass
  92. # builds Statechart structure
  93. def build_statechart_structure(self):
  94. # state <root>
  95. self.states[""] = State(0, "", self)
  96. # state /main
  97. self.states["/main"] = ParallelState(1, "/main", self)
  98. # state /main/forward
  99. self.states["/main/forward"] = State(2, "/main/forward", self)
  100. # state /main/forward/forward
  101. self.states["/main/forward/forward"] = State(3, "/main/forward/forward", self)
  102. # state /main/server
  103. self.states["/main/server"] = State(4, "/main/server", self)
  104. # state /main/server/init
  105. self.states["/main/server/init"] = State(5, "/main/server/init", self)
  106. self.states["/main/server/init"].setEnter(self._main_server_init_enter)
  107. # state /main/server/binding
  108. self.states["/main/server/binding"] = State(6, "/main/server/binding", self)
  109. self.states["/main/server/binding"].setEnter(self._main_server_binding_enter)
  110. # state /main/server/listening
  111. self.states["/main/server/listening"] = State(7, "/main/server/listening", self)
  112. self.states["/main/server/listening"].setEnter(self._main_server_listening_enter)
  113. # state /main/server/accepting
  114. self.states["/main/server/accepting"] = State(8, "/main/server/accepting", self)
  115. self.states["/main/server/accepting"].setEnter(self._main_server_accepting_enter)
  116. self.states["/main/server/accepting"].setExit(self._main_server_accepting_exit)
  117. # state /main/close_socket
  118. self.states["/main/close_socket"] = State(9, "/main/close_socket", self)
  119. # state /main/close_socket/close
  120. self.states["/main/close_socket/close"] = State(10, "/main/close_socket/close", self)
  121. # add children
  122. self.states[""].addChild(self.states["/main"])
  123. self.states["/main"].addChild(self.states["/main/forward"])
  124. self.states["/main"].addChild(self.states["/main/server"])
  125. self.states["/main"].addChild(self.states["/main/close_socket"])
  126. self.states["/main/forward"].addChild(self.states["/main/forward/forward"])
  127. self.states["/main/server"].addChild(self.states["/main/server/init"])
  128. self.states["/main/server"].addChild(self.states["/main/server/binding"])
  129. self.states["/main/server"].addChild(self.states["/main/server/listening"])
  130. self.states["/main/server"].addChild(self.states["/main/server/accepting"])
  131. self.states["/main/close_socket"].addChild(self.states["/main/close_socket/close"])
  132. self.states[""].fixTree()
  133. self.states[""].default_state = self.states["/main"]
  134. self.states["/main/forward"].default_state = self.states["/main/forward/forward"]
  135. self.states["/main/server"].default_state = self.states["/main/server/init"]
  136. self.states["/main/close_socket"].default_state = self.states["/main/close_socket/close"]
  137. # transition /main/forward/forward
  138. _main_forward_forward_0 = Transition(self, self.states["/main/forward/forward"], [self.states["/main/forward/forward"]])
  139. _main_forward_forward_0.setAction(self._main_forward_forward_0_exec)
  140. _main_forward_forward_0.setTrigger(Event("HTTP_output", None))
  141. self.states["/main/forward/forward"].addTransition(_main_forward_forward_0)
  142. # transition /main/server/init
  143. _main_server_init_0 = Transition(self, self.states["/main/server/init"], [self.states["/main/server/binding"]])
  144. _main_server_init_0.setAction(self._main_server_init_0_exec)
  145. _main_server_init_0.setTrigger(Event("created_socket", self.getInPortName("socket_in")))
  146. self.states["/main/server/init"].addTransition(_main_server_init_0)
  147. # transition /main/server/binding
  148. _main_server_binding_0 = Transition(self, self.states["/main/server/binding"], [self.states["/main/server/listening"]])
  149. _main_server_binding_0.setTrigger(Event("bound_socket", self.getInPortName("socket_in")))
  150. _main_server_binding_0.setGuard(self._main_server_binding_0_guard)
  151. self.states["/main/server/binding"].addTransition(_main_server_binding_0)
  152. # transition /main/server/listening
  153. _main_server_listening_0 = Transition(self, self.states["/main/server/listening"], [self.states["/main/server/accepting"]])
  154. _main_server_listening_0.setAction(self._main_server_listening_0_exec)
  155. _main_server_listening_0.setTrigger(Event("listened_socket", self.getInPortName("socket_in")))
  156. _main_server_listening_0.setGuard(self._main_server_listening_0_guard)
  157. self.states["/main/server/listening"].addTransition(_main_server_listening_0)
  158. # transition /main/server/accepting
  159. _main_server_accepting_0 = Transition(self, self.states["/main/server/accepting"], [self.states["/main/server/accepting"]])
  160. _main_server_accepting_0.setAction(self._main_server_accepting_0_exec)
  161. _main_server_accepting_0.setTrigger(Event("accepted_socket", self.getInPortName("socket_in")))
  162. self.states["/main/server/accepting"].addTransition(_main_server_accepting_0)
  163. _main_server_accepting_1 = Transition(self, self.states["/main/server/accepting"], [self.states["/main/server/accepting"]])
  164. _main_server_accepting_1.setAction(self._main_server_accepting_1_exec)
  165. _main_server_accepting_1.setTrigger(Event("instance_created", None))
  166. self.states["/main/server/accepting"].addTransition(_main_server_accepting_1)
  167. _main_server_accepting_2 = Transition(self, self.states["/main/server/accepting"], [self.states["/main/server/accepting"]])
  168. _main_server_accepting_2.setTrigger(Event("_0after"))
  169. self.states["/main/server/accepting"].addTransition(_main_server_accepting_2)
  170. # transition /main/close_socket/close
  171. _main_close_socket_close_0 = Transition(self, self.states["/main/close_socket/close"], [self.states["/main/close_socket/close"]])
  172. _main_close_socket_close_0.setAction(self._main_close_socket_close_0_exec)
  173. _main_close_socket_close_0.setTrigger(Event("close_socket", None))
  174. self.states["/main/close_socket/close"].addTransition(_main_close_socket_close_0)
  175. def _main_server_init_enter(self):
  176. self.big_step.outputEvent(Event("create_socket", self.getOutPortName("socket_out"), []))
  177. def _main_server_binding_enter(self):
  178. self.big_step.outputEvent(Event("bind_socket", self.getOutPortName("socket_out"), [self.socket, (self.address, self.port)]))
  179. def _main_server_listening_enter(self):
  180. self.big_step.outputEvent(Event("listen_socket", self.getOutPortName("socket_out"), [self.socket]))
  181. def _main_server_accepting_enter(self):
  182. self.addTimer(0, 1.0)
  183. def _main_server_accepting_exit(self):
  184. self.removeTimer(0)
  185. def _main_forward_forward_0_exec(self, parameters):
  186. association_name = parameters[0]
  187. data = parameters[1]
  188. print("Forward")
  189. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("HTTP_output", None, [association_name, data])]))
  190. def _main_server_init_0_exec(self, parameters):
  191. socket = parameters[0]
  192. self.socket = socket
  193. def _main_server_binding_0_guard(self, parameters):
  194. socket = parameters[0]
  195. return self.socket == socket
  196. def _main_server_listening_0_exec(self, parameters):
  197. socket = parameters[0]
  198. self.big_step.outputEvent(Event("accept_socket", self.getOutPortName("socket_out"), [self.socket]))
  199. def _main_server_listening_0_guard(self, parameters):
  200. socket = parameters[0]
  201. return self.socket == socket
  202. def _main_server_accepting_0_exec(self, parameters):
  203. socket = parameters[0]
  204. connected_socket = parameters[1]
  205. self.big_step.outputEventOM(Event("create_instance", None, [self, 'sockets', 'Socket', connected_socket]))
  206. self.big_step.outputEvent(Event("accept_socket", self.getOutPortName("socket_out"), [self.socket]))
  207. def _main_server_accepting_1_exec(self, parameters):
  208. instancename = parameters[0]
  209. self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
  210. self.big_step.outputEventOM(Event("narrow_cast", None, [self, instancename, Event("set_association_name", None, [instancename])]))
  211. def _main_close_socket_close_0_exec(self, parameters):
  212. association_name = parameters[0]
  213. self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
  214. def initializeStatechart(self):
  215. # enter default state
  216. self.default_targets = self.states["/main"].getEffectiveTargetStates()
  217. RuntimeClassBase.initializeStatechart(self)
  218. class Socket(RuntimeClassBase):
  219. def __init__(self, controller, my_socket):
  220. RuntimeClassBase.__init__(self, controller)
  221. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  222. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  223. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  224. self.semantics.priority = StatechartSemantics.SourceParent
  225. self.semantics.concurrency = StatechartSemantics.Single
  226. # build Statechart structure
  227. self.build_statechart_structure()
  228. # call user defined constructor
  229. Socket.user_defined_constructor(self, my_socket)
  230. def user_defined_constructor(self, my_socket):
  231. self.socket = my_socket
  232. self.received_data = ""
  233. self.send_data = ""
  234. self.closed = False
  235. self.association_name = None
  236. def user_defined_destructor(self):
  237. pass
  238. # builds Statechart structure
  239. def build_statechart_structure(self):
  240. # state <root>
  241. self.states[""] = State(0, "", self)
  242. # state /init
  243. self.states["/init"] = State(1, "/init", self)
  244. # state /connected
  245. self.states["/connected"] = ParallelState(2, "/connected", self)
  246. # state /connected/listening
  247. self.states["/connected/listening"] = State(3, "/connected/listening", self)
  248. # state /connected/listening/listen
  249. self.states["/connected/listening/listen"] = State(4, "/connected/listening/listen", self)
  250. self.states["/connected/listening/listen"].setEnter(self._connected_listening_listen_enter)
  251. # state /connected/listening/closed
  252. self.states["/connected/listening/closed"] = State(5, "/connected/listening/closed", self)
  253. self.states["/connected/listening/closed"].setEnter(self._connected_listening_closed_enter)
  254. # state /connected/sending
  255. self.states["/connected/sending"] = State(6, "/connected/sending", self)
  256. # state /connected/sending/waiting_for_data
  257. self.states["/connected/sending/waiting_for_data"] = State(7, "/connected/sending/waiting_for_data", self)
  258. # state /connected/sending/transferring
  259. self.states["/connected/sending/transferring"] = State(8, "/connected/sending/transferring", self)
  260. # state /connected/queueing
  261. self.states["/connected/queueing"] = State(9, "/connected/queueing", self)
  262. # state /connected/queueing/queueing
  263. self.states["/connected/queueing/queueing"] = State(10, "/connected/queueing/queueing", self)
  264. # state /connected/parsing
  265. self.states["/connected/parsing"] = State(11, "/connected/parsing", self)
  266. # state /connected/parsing/wait_for_header
  267. self.states["/connected/parsing/wait_for_header"] = State(12, "/connected/parsing/wait_for_header", self)
  268. # state /connected/parsing/closing
  269. self.states["/connected/parsing/closing"] = State(13, "/connected/parsing/closing", self)
  270. self.states["/connected/parsing/closing"].setEnter(self._connected_parsing_closing_enter)
  271. self.states["/connected/parsing/closing"].setExit(self._connected_parsing_closing_exit)
  272. # state /connected/parsing/wait_for_payload
  273. self.states["/connected/parsing/wait_for_payload"] = State(14, "/connected/parsing/wait_for_payload", self)
  274. # state /close
  275. self.states["/close"] = State(15, "/close", self)
  276. self.states["/close"].setEnter(self._close_enter)
  277. # add children
  278. self.states[""].addChild(self.states["/init"])
  279. self.states[""].addChild(self.states["/connected"])
  280. self.states[""].addChild(self.states["/close"])
  281. self.states["/connected"].addChild(self.states["/connected/listening"])
  282. self.states["/connected"].addChild(self.states["/connected/sending"])
  283. self.states["/connected"].addChild(self.states["/connected/queueing"])
  284. self.states["/connected"].addChild(self.states["/connected/parsing"])
  285. self.states["/connected/listening"].addChild(self.states["/connected/listening/listen"])
  286. self.states["/connected/listening"].addChild(self.states["/connected/listening/closed"])
  287. self.states["/connected/sending"].addChild(self.states["/connected/sending/waiting_for_data"])
  288. self.states["/connected/sending"].addChild(self.states["/connected/sending/transferring"])
  289. self.states["/connected/queueing"].addChild(self.states["/connected/queueing/queueing"])
  290. self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_header"])
  291. self.states["/connected/parsing"].addChild(self.states["/connected/parsing/closing"])
  292. self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_payload"])
  293. self.states[""].fixTree()
  294. self.states[""].default_state = self.states["/init"]
  295. self.states["/connected/listening"].default_state = self.states["/connected/listening/listen"]
  296. self.states["/connected/sending"].default_state = self.states["/connected/sending/waiting_for_data"]
  297. self.states["/connected/queueing"].default_state = self.states["/connected/queueing/queueing"]
  298. self.states["/connected/parsing"].default_state = self.states["/connected/parsing/wait_for_header"]
  299. # transition /init
  300. _init_0 = Transition(self, self.states["/init"], [self.states["/connected"]])
  301. _init_0.setAction(self._init_0_exec)
  302. _init_0.setTrigger(Event("set_association_name", None))
  303. self.states["/init"].addTransition(_init_0)
  304. # transition /connected/listening/listen
  305. _connected_listening_listen_0 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/listen"]])
  306. _connected_listening_listen_0.setAction(self._connected_listening_listen_0_exec)
  307. _connected_listening_listen_0.setTrigger(Event("received_socket", self.getInPortName("socket_in")))
  308. _connected_listening_listen_0.setGuard(self._connected_listening_listen_0_guard)
  309. self.states["/connected/listening/listen"].addTransition(_connected_listening_listen_0)
  310. _connected_listening_listen_1 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/closed"]])
  311. _connected_listening_listen_1.setAction(self._connected_listening_listen_1_exec)
  312. _connected_listening_listen_1.setTrigger(Event("received_socket", self.getInPortName("socket_in")))
  313. _connected_listening_listen_1.setGuard(self._connected_listening_listen_1_guard)
  314. self.states["/connected/listening/listen"].addTransition(_connected_listening_listen_1)
  315. # transition /connected/sending/waiting_for_data
  316. _connected_sending_waiting_for_data_0 = Transition(self, self.states["/connected/sending/waiting_for_data"], [self.states["/connected/sending/transferring"]])
  317. _connected_sending_waiting_for_data_0.setAction(self._connected_sending_waiting_for_data_0_exec)
  318. _connected_sending_waiting_for_data_0.setTrigger(None)
  319. _connected_sending_waiting_for_data_0.setGuard(self._connected_sending_waiting_for_data_0_guard)
  320. self.states["/connected/sending/waiting_for_data"].addTransition(_connected_sending_waiting_for_data_0)
  321. # transition /connected/sending/transferring
  322. _connected_sending_transferring_0 = Transition(self, self.states["/connected/sending/transferring"], [self.states["/connected/sending/waiting_for_data"]])
  323. _connected_sending_transferring_0.setAction(self._connected_sending_transferring_0_exec)
  324. _connected_sending_transferring_0.setTrigger(Event("sent_socket", self.getInPortName("socket_in")))
  325. _connected_sending_transferring_0.setGuard(self._connected_sending_transferring_0_guard)
  326. self.states["/connected/sending/transferring"].addTransition(_connected_sending_transferring_0)
  327. # transition /connected/queueing/queueing
  328. _connected_queueing_queueing_0 = Transition(self, self.states["/connected/queueing/queueing"], [self.states["/connected/queueing/queueing"]])
  329. _connected_queueing_queueing_0.setAction(self._connected_queueing_queueing_0_exec)
  330. _connected_queueing_queueing_0.setTrigger(Event("HTTP_input", None))
  331. self.states["/connected/queueing/queueing"].addTransition(_connected_queueing_queueing_0)
  332. # transition /connected/parsing/wait_for_header
  333. _connected_parsing_wait_for_header_0 = Transition(self, self.states["/connected/parsing/wait_for_header"], [self.states["/connected/parsing/wait_for_payload"]])
  334. _connected_parsing_wait_for_header_0.setAction(self._connected_parsing_wait_for_header_0_exec)
  335. _connected_parsing_wait_for_header_0.setTrigger(None)
  336. _connected_parsing_wait_for_header_0.setGuard(self._connected_parsing_wait_for_header_0_guard)
  337. self.states["/connected/parsing/wait_for_header"].addTransition(_connected_parsing_wait_for_header_0)
  338. _connected_parsing_wait_for_header_1 = Transition(self, self.states["/connected/parsing/wait_for_header"], [self.states["/connected/parsing/closing"]])
  339. _connected_parsing_wait_for_header_1.setTrigger(None)
  340. _connected_parsing_wait_for_header_1.setGuard(self._connected_parsing_wait_for_header_1_guard)
  341. self.states["/connected/parsing/wait_for_header"].addTransition(_connected_parsing_wait_for_header_1)
  342. # transition /connected/parsing/closing
  343. _connected_parsing_closing_0 = Transition(self, self.states["/connected/parsing/closing"], [self.states["/connected/parsing/closing"]])
  344. _connected_parsing_closing_0.setAction(self._connected_parsing_closing_0_exec)
  345. _connected_parsing_closing_0.setTrigger(Event("_0after"))
  346. self.states["/connected/parsing/closing"].addTransition(_connected_parsing_closing_0)
  347. # transition /connected/parsing/wait_for_payload
  348. _connected_parsing_wait_for_payload_0 = Transition(self, self.states["/connected/parsing/wait_for_payload"], [self.states["/connected/parsing/wait_for_header"]])
  349. _connected_parsing_wait_for_payload_0.setAction(self._connected_parsing_wait_for_payload_0_exec)
  350. _connected_parsing_wait_for_payload_0.setTrigger(None)
  351. _connected_parsing_wait_for_payload_0.setGuard(self._connected_parsing_wait_for_payload_0_guard)
  352. self.states["/connected/parsing/wait_for_payload"].addTransition(_connected_parsing_wait_for_payload_0)
  353. # transition /connected
  354. _connected_0 = Transition(self, self.states["/connected"], [self.states["/close"]])
  355. _connected_0.setTrigger(Event("close", None))
  356. self.states["/connected"].addTransition(_connected_0)
  357. def _connected_listening_listen_enter(self):
  358. self.big_step.outputEvent(Event("recv_socket", self.getOutPortName("socket_out"), [self.socket]))
  359. def _connected_listening_closed_enter(self):
  360. self.closed = True
  361. def _connected_parsing_closing_enter(self):
  362. self.addTimer(0, 0.0)
  363. def _connected_parsing_closing_exit(self):
  364. self.removeTimer(0)
  365. def _close_enter(self):
  366. self.big_step.outputEvent(Event("close_socket", self.getOutPortName("socket_out"), [self.socket]))
  367. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("close_socket", None, [self.association_name])]))
  368. def _init_0_exec(self, parameters):
  369. association_name = parameters[0]
  370. self.association_name = association_name
  371. def _connected_listening_listen_0_exec(self, parameters):
  372. socket = parameters[0]
  373. data = parameters[1]
  374. self.received_data += data
  375. self.raiseInternalEvent(Event("received_data", None, []))
  376. def _connected_listening_listen_0_guard(self, parameters):
  377. socket = parameters[0]
  378. data = parameters[1]
  379. return (self.socket == socket) and (len(data) > 0)
  380. def _connected_listening_listen_1_exec(self, parameters):
  381. socket = parameters[0]
  382. data = parameters[1]
  383. self.raiseInternalEvent(Event("received_data", None, []))
  384. def _connected_listening_listen_1_guard(self, parameters):
  385. socket = parameters[0]
  386. data = parameters[1]
  387. return (self.socket == socket) and (len(data) == 0)
  388. def _connected_sending_waiting_for_data_0_exec(self, parameters):
  389. self.big_step.outputEvent(Event("send_socket", self.getOutPortName("socket_out"), [self.socket, self.send_data]))
  390. def _connected_sending_waiting_for_data_0_guard(self, parameters):
  391. return len(self.send_data) > 0
  392. def _connected_sending_transferring_0_exec(self, parameters):
  393. socket = parameters[0]
  394. sent_bytes = parameters[1]
  395. self.send_data = self.send_data[sent_bytes:]
  396. def _connected_sending_transferring_0_guard(self, parameters):
  397. socket = parameters[0]
  398. sent_bytes = parameters[1]
  399. return self.socket == socket
  400. def _connected_queueing_queueing_0_exec(self, parameters):
  401. data = parameters[0]
  402. #post_data = "&".join(["%s=%s" % (urllib.quote(k), urllib.quote(v)) for k, v in data.iteritems()])
  403. #post_data = "&".join(["%s=%s" % (k, v) for k, v in data.iteritems()])
  404. post_data = data
  405. self.send_data += "HTTP/1.0 200 OK\r\n"
  406. self.send_data += "Content-Length: %s\r\n" % len(post_data)
  407. self.send_data += "Content-Type: %s; charset=UTF-8\r\n" % "text/plain"
  408. self.send_data += "\r\n"
  409. self.send_data += str(post_data)
  410. def _connected_parsing_wait_for_header_0_exec(self, parameters):
  411. header, self.received_data = self.received_data.split("\r\n\r\n", 1)
  412. header = header.lower()
  413. if "content-length" in header:
  414. _, after = header.split("content-length:", 1)
  415. after = after.split("\r\n", 1)[0]
  416. after = after.strip()
  417. self.length = int(after)
  418. else:
  419. self.length = float('inf')
  420. def _connected_parsing_wait_for_header_0_guard(self, parameters):
  421. return '\r\n\r\n' in self.received_data and self.received_data.startswith('POST')
  422. def _connected_parsing_wait_for_header_1_guard(self, parameters):
  423. return self.closed and len(self.received_data) == 0
  424. def _connected_parsing_closing_0_exec(self, parameters):
  425. self.raiseInternalEvent(Event("close", None, []))
  426. def _connected_parsing_wait_for_payload_0_exec(self, parameters):
  427. if self.length == float('inf'):
  428. data = self.received_data
  429. self.received_data = ""
  430. else:
  431. data = self.received_data[:self.length]
  432. self.received_data = self.received_data[self.length:]
  433. print("Got data: " + str(data))
  434. # We support POST data only, so everything is in the data
  435. #try:
  436. # params = dict([p.split('=') for p in data.split('&')])
  437. # data = {k: urllib.unquote_plus(v) for k, v in params.iteritems()}
  438. #except:
  439. # data = {}
  440. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("HTTP_output", None, [self.association_name, data])]))
  441. def _connected_parsing_wait_for_payload_0_guard(self, parameters):
  442. return len(self.received_data) >= self.length or self.closed
  443. def initializeStatechart(self):
  444. # enter default state
  445. self.default_targets = self.states["/init"].getEffectiveTargetStates()
  446. RuntimeClassBase.initializeStatechart(self)
  447. class ObjectManager(ObjectManagerBase):
  448. def __init__(self, controller):
  449. ObjectManagerBase.__init__(self, controller)
  450. def instantiate(self, class_name, construct_params):
  451. if class_name == "Echo":
  452. instance = Echo(self.controller, construct_params[0])
  453. instance.associations = {}
  454. instance.associations["to_server"] = Association("Server", 1, 1)
  455. elif class_name == "Server":
  456. instance = Server(self.controller, construct_params[0], construct_params[1])
  457. instance.associations = {}
  458. instance.associations["sockets"] = Association("Socket", 0, -1)
  459. instance.associations["parent"] = Association("Echo", 1, 1)
  460. elif class_name == "Socket":
  461. instance = Socket(self.controller, construct_params[0])
  462. instance.associations = {}
  463. instance.associations["parent"] = Association("Server", 1, 1)
  464. else:
  465. raise Exception("Cannot instantiate class " + class_name)
  466. return instance
  467. class Controller(ThreadsControllerBase):
  468. def __init__(self, params, keep_running = None, behind_schedule_callback = None):
  469. if keep_running == None: keep_running = True
  470. if behind_schedule_callback == None: behind_schedule_callback = None
  471. ThreadsControllerBase.__init__(self, ObjectManager(self), keep_running, behind_schedule_callback)
  472. self.addInputPort("socket_in")
  473. self.addOutputPort("socket_out")
  474. self.object_manager.createInstance("Echo", [params])