target.py 33 KB

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