1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630 |
- """
- Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
- Date: Fri Feb 10 10:24:39 2017
- Model author: Yentl Van Tendeloo
- Model name: MvK Server
- Model description:
- Modelverse Kernel server. Server for the MvI, client of the MvS.
- """
- from sccd.runtime.statecharts_core import *
- import time
- import os
- import urllib
- import sys
- import json
- from modelverse_kernel.main import ModelverseKernel
- sys.path.append("../../state")
- from modelverse_state.main import ModelverseState
- # package "MvK Server"
- class MvKController(RuntimeClassBase):
- def __init__(self, controller, params):
- RuntimeClassBase.__init__(self, controller)
-
- self.semantics.big_step_maximality = StatechartSemantics.TakeMany
- self.semantics.internal_event_lifeline = StatechartSemantics.Queue
- self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
- self.semantics.priority = StatechartSemantics.SourceParent
- self.semantics.concurrency = StatechartSemantics.Single
-
- # build Statechart structure
- self.build_statechart_structure()
-
- # call user defined constructor
- MvKController.user_defined_constructor(self, params)
-
- def user_defined_constructor(self, params):
- self.users = []
- self.user_statecharts = {"__hierarchy": None}
- self.input_queue = []
- self.user_queue = {}
- self.source = None
- self.root = None
-
- self.params = params
-
- def user_defined_destructor(self):
- pass
-
-
- # builds Statechart structure
- def build_statechart_structure(self):
-
- # state <root>
- self.states[""] = State(0, self)
-
- # state /init_server
- self.states["/init_server"] = State(1, self)
- self.states["/init_server"].setEnter(self._init_server_enter)
-
- # state /init_executor
- self.states["/init_executor"] = State(2, self)
- self.states["/init_executor"].setEnter(self._init_executor_enter)
-
- # state /get_mvk
- self.states["/get_mvk"] = State(3, self)
- self.states["/get_mvk"].setEnter(self._get_mvk_enter)
-
- # state /read_root
- self.states["/read_root"] = State(4, self)
- self.states["/read_root"].setEnter(self._read_root_enter)
-
- # state /running
- self.states["/running"] = ParallelState(5, self)
-
- # state /running/wait_for_requests
- self.states["/running/wait_for_requests"] = State(6, self)
-
- # state /running/wait_for_requests/wait
- self.states["/running/wait_for_requests/wait"] = State(7, self)
-
- # state /running/push
- self.states["/running/push"] = State(8, self)
-
- # state /running/push/wait
- self.states["/running/push/wait"] = State(9, self)
-
- # state /running/push/process
- self.states["/running/push/process"] = State(10, self)
-
- # state /running/find_users
- self.states["/running/find_users"] = State(11, self)
-
- # state /running/find_users/get_all_links
- self.states["/running/find_users/get_all_links"] = State(12, self)
- self.states["/running/find_users/get_all_links"].setEnter(self._running_find_users_get_all_links_enter)
-
- # state /running/find_users/retrieve_users
- self.states["/running/find_users/retrieve_users"] = State(13, self)
-
- # state /running/find_users/got_usernames
- self.states["/running/find_users/got_usernames"] = State(14, self)
-
- # state /running/find_users/process_users
- self.states["/running/find_users/process_users"] = State(15, self)
-
- # state /running/find_users/creating_user
- self.states["/running/find_users/creating_user"] = State(16, self)
-
- # state /running/find_users/wait
- self.states["/running/find_users/wait"] = State(17, self)
- self.states["/running/find_users/wait"].setEnter(self._running_find_users_wait_enter)
- self.states["/running/find_users/wait"].setExit(self._running_find_users_wait_exit)
-
- # add children
- self.states[""].addChild(self.states["/init_server"])
- self.states[""].addChild(self.states["/init_executor"])
- self.states[""].addChild(self.states["/get_mvk"])
- self.states[""].addChild(self.states["/read_root"])
- self.states[""].addChild(self.states["/running"])
- self.states["/running"].addChild(self.states["/running/wait_for_requests"])
- self.states["/running"].addChild(self.states["/running/push"])
- self.states["/running"].addChild(self.states["/running/find_users"])
- self.states["/running/wait_for_requests"].addChild(self.states["/running/wait_for_requests/wait"])
- self.states["/running/push"].addChild(self.states["/running/push/wait"])
- self.states["/running/push"].addChild(self.states["/running/push/process"])
- self.states["/running/find_users"].addChild(self.states["/running/find_users/get_all_links"])
- self.states["/running/find_users"].addChild(self.states["/running/find_users/retrieve_users"])
- self.states["/running/find_users"].addChild(self.states["/running/find_users/got_usernames"])
- self.states["/running/find_users"].addChild(self.states["/running/find_users/process_users"])
- self.states["/running/find_users"].addChild(self.states["/running/find_users/creating_user"])
- self.states["/running/find_users"].addChild(self.states["/running/find_users/wait"])
- self.states[""].fixTree()
- self.states[""].default_state = self.states["/init_server"]
- self.states["/running/wait_for_requests"].default_state = self.states["/running/wait_for_requests/wait"]
- self.states["/running/push"].default_state = self.states["/running/push/wait"]
- self.states["/running/find_users"].default_state = self.states["/running/find_users/get_all_links"]
-
- # transition /init_server
- _init_server_0 = Transition(self, self.states["/init_server"], [self.states["/init_executor"]])
- _init_server_0.setAction(self._init_server_0_exec)
- _init_server_0.setTrigger(Event("instance_created", None))
- self.states["/init_server"].addTransition(_init_server_0)
-
- # transition /init_executor
- _init_executor_0 = Transition(self, self.states["/init_executor"], [self.states["/get_mvk"]])
- _init_executor_0.setAction(self._init_executor_0_exec)
- _init_executor_0.setTrigger(Event("instance_created", None))
- self.states["/init_executor"].addTransition(_init_executor_0)
-
- # transition /get_mvk
- _get_mvk_0 = Transition(self, self.states["/get_mvk"], [self.states["/read_root"]])
- _get_mvk_0.setAction(self._get_mvk_0_exec)
- _get_mvk_0.setTrigger(Event("get_mvk_reply", None))
- self.states["/get_mvk"].addTransition(_get_mvk_0)
-
- # transition /read_root
- _read_root_0 = Transition(self, self.states["/read_root"], [self.states["/running"]])
- _read_root_0.setAction(self._read_root_0_exec)
- _read_root_0.setTrigger(Event("raw_exec_reply", None))
- self.states["/read_root"].addTransition(_read_root_0)
-
- # transition /running/wait_for_requests/wait
- _running_wait_for_requests_wait_0 = Transition(self, self.states["/running/wait_for_requests/wait"], [self.states["/running/wait_for_requests/wait"]])
- _running_wait_for_requests_wait_0.setAction(self._running_wait_for_requests_wait_0_exec)
- _running_wait_for_requests_wait_0.setTrigger(Event("from_mvi", None))
- self.states["/running/wait_for_requests/wait"].addTransition(_running_wait_for_requests_wait_0)
-
- # transition /running/push/wait
- _running_push_wait_0 = Transition(self, self.states["/running/push/wait"], [self.states["/running/push/process"]])
- _running_push_wait_0.setTrigger(None)
- _running_push_wait_0.setGuard(self._running_push_wait_0_guard)
- self.states["/running/push/wait"].addTransition(_running_push_wait_0)
- _running_push_wait_1 = Transition(self, self.states["/running/push/wait"], [self.states["/running/push/wait"]])
- _running_push_wait_1.setAction(self._running_push_wait_1_exec)
- _running_push_wait_1.setTrigger(None)
- _running_push_wait_1.setGuard(self._running_push_wait_1_guard)
- self.states["/running/push/wait"].addTransition(_running_push_wait_1)
-
- # transition /running/push/process
- _running_push_process_0 = Transition(self, self.states["/running/push/process"], [self.states["/running/push/wait"]])
- _running_push_process_0.setAction(self._running_push_process_0_exec)
- _running_push_process_0.setTrigger(None)
- _running_push_process_0.setGuard(self._running_push_process_0_guard)
- self.states["/running/push/process"].addTransition(_running_push_process_0)
- _running_push_process_1 = Transition(self, self.states["/running/push/process"], [self.states["/running/push/wait"]])
- _running_push_process_1.setAction(self._running_push_process_1_exec)
- _running_push_process_1.setTrigger(None)
- _running_push_process_1.setGuard(self._running_push_process_1_guard)
- self.states["/running/push/process"].addTransition(_running_push_process_1)
- _running_push_process_2 = Transition(self, self.states["/running/push/process"], [self.states["/running/push/wait"]])
- _running_push_process_2.setAction(self._running_push_process_2_exec)
- _running_push_process_2.setTrigger(None)
- _running_push_process_2.setGuard(self._running_push_process_2_guard)
- self.states["/running/push/process"].addTransition(_running_push_process_2)
- _running_push_process_3 = Transition(self, self.states["/running/push/process"], [self.states["/running/push/wait"]])
- _running_push_process_3.setAction(self._running_push_process_3_exec)
- _running_push_process_3.setTrigger(None)
- _running_push_process_3.setGuard(self._running_push_process_3_guard)
- self.states["/running/push/process"].addTransition(_running_push_process_3)
-
- # transition /running/find_users/get_all_links
- _running_find_users_get_all_links_0 = Transition(self, self.states["/running/find_users/get_all_links"], [self.states["/running/find_users/retrieve_users"]])
- _running_find_users_get_all_links_0.setAction(self._running_find_users_get_all_links_0_exec)
- _running_find_users_get_all_links_0.setTrigger(Event("raw_exec_reply", None))
- self.states["/running/find_users/get_all_links"].addTransition(_running_find_users_get_all_links_0)
-
- # transition /running/find_users/retrieve_users
- _running_find_users_retrieve_users_0 = Transition(self, self.states["/running/find_users/retrieve_users"], [self.states["/running/find_users/got_usernames"]])
- _running_find_users_retrieve_users_0.setAction(self._running_find_users_retrieve_users_0_exec)
- _running_find_users_retrieve_users_0.setTrigger(None)
- _running_find_users_retrieve_users_0.setGuard(self._running_find_users_retrieve_users_0_guard)
- self.states["/running/find_users/retrieve_users"].addTransition(_running_find_users_retrieve_users_0)
- _running_find_users_retrieve_users_1 = Transition(self, self.states["/running/find_users/retrieve_users"], [self.states["/running/find_users/wait"]])
- _running_find_users_retrieve_users_1.setTrigger(None)
- _running_find_users_retrieve_users_1.setGuard(self._running_find_users_retrieve_users_1_guard)
- self.states["/running/find_users/retrieve_users"].addTransition(_running_find_users_retrieve_users_1)
-
- # transition /running/find_users/got_usernames
- _running_find_users_got_usernames_0 = Transition(self, self.states["/running/find_users/got_usernames"], [self.states["/running/find_users/process_users"]])
- _running_find_users_got_usernames_0.setAction(self._running_find_users_got_usernames_0_exec)
- _running_find_users_got_usernames_0.setTrigger(Event("raw_exec_reply", None))
- self.states["/running/find_users/got_usernames"].addTransition(_running_find_users_got_usernames_0)
-
- # transition /running/find_users/process_users
- _running_find_users_process_users_0 = Transition(self, self.states["/running/find_users/process_users"], [self.states["/running/find_users/wait"]])
- _running_find_users_process_users_0.setTrigger(None)
- _running_find_users_process_users_0.setGuard(self._running_find_users_process_users_0_guard)
- self.states["/running/find_users/process_users"].addTransition(_running_find_users_process_users_0)
- _running_find_users_process_users_1 = Transition(self, self.states["/running/find_users/process_users"], [self.states["/running/find_users/creating_user"]])
- _running_find_users_process_users_1.setAction(self._running_find_users_process_users_1_exec)
- _running_find_users_process_users_1.setTrigger(None)
- _running_find_users_process_users_1.setGuard(self._running_find_users_process_users_1_guard)
- self.states["/running/find_users/process_users"].addTransition(_running_find_users_process_users_1)
- _running_find_users_process_users_2 = Transition(self, self.states["/running/find_users/process_users"], [self.states["/running/find_users/process_users"]])
- _running_find_users_process_users_2.setAction(self._running_find_users_process_users_2_exec)
- _running_find_users_process_users_2.setTrigger(None)
- _running_find_users_process_users_2.setGuard(self._running_find_users_process_users_2_guard)
- self.states["/running/find_users/process_users"].addTransition(_running_find_users_process_users_2)
-
- # transition /running/find_users/creating_user
- _running_find_users_creating_user_0 = Transition(self, self.states["/running/find_users/creating_user"], [self.states["/running/find_users/retrieve_users"]])
- _running_find_users_creating_user_0.setAction(self._running_find_users_creating_user_0_exec)
- _running_find_users_creating_user_0.setTrigger(Event("instance_created", None))
- self.states["/running/find_users/creating_user"].addTransition(_running_find_users_creating_user_0)
-
- # transition /running/find_users/wait
- _running_find_users_wait_0 = Transition(self, self.states["/running/find_users/wait"], [self.states["/running/find_users/get_all_links"]])
- _running_find_users_wait_0.setTrigger(Event("_0after"))
- self.states["/running/find_users/wait"].addTransition(_running_find_users_wait_0)
- _running_find_users_wait_1 = Transition(self, self.states["/running/find_users/wait"], [self.states["/running/find_users/get_all_links"]])
- _running_find_users_wait_1.setTrigger(Event("force_user_refresh", None))
- self.states["/running/find_users/wait"].addTransition(_running_find_users_wait_1)
-
- def _init_server_enter(self):
- self.big_step.outputEventOM(Event("create_instance", None, [self, 'to_mvi', 'Server', '', 8001]))
-
- def _init_executor_enter(self):
- self.big_step.outputEventOM(Event("create_instance", None, [self, 'executor', 'Executor']))
-
- def _get_mvk_enter(self):
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'executor', Event("get_mvk", None, ['parent'])]))
-
- def _read_root_enter(self):
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'executor', Event("raw_exec", None, [[['RR', []]], 'parent'])]))
-
- def _running_find_users_get_all_links_enter(self):
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'executor', Event("raw_exec", None, [[['RDK', [self.root]]], 'parent'])]))
-
- def _running_find_users_wait_enter(self):
- self.addTimer(0, 1.0)
-
- def _running_find_users_wait_exit(self):
- self.removeTimer(0)
-
- def _init_server_0_exec(self, parameters):
- instancename = parameters[0]
- self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
-
- def _init_executor_0_exec(self, parameters):
- instancename = parameters[0]
- self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
-
- def _get_mvk_0_exec(self, parameters):
- mvk = parameters[0]
- self.mvk = mvk
-
- def _read_root_0_exec(self, parameters):
- data = parameters[0]
- self.root = data[0][0]
-
- def _running_wait_for_requests_wait_0_exec(self, parameters):
- source = parameters[0]
- data = parameters[1]
- # No JSON encoding necessary, as it is not complex
- print("Got from MVI")
- try:
- args = None
- if data["op"] == "set_input":
- if "value" in data:
- value = [json.loads(data["value"])]
- else:
- value = json.loads(data["data"])
- for v in value[:-1]:
- self.input_queue.append((None, data["op"], [v], data["username"]))
- self.input_queue.append((source, data["op"], [value[-1]], data["username"]))
- print("Added to input queue")
- else:
- print("Appending " + data["op"])
- self.input_queue.append((source, data["op"], args, data["username"]))
- except ValueError:
- print("Error when deserializing request: " + str(data))
- raise
-
- def _running_push_wait_0_guard(self, parameters):
- return self.input_queue and self.input_queue[0][3] in self.user_statecharts
-
- def _running_push_wait_1_exec(self, parameters):
- print("Queue user")
- self.user_queue.setdefault(self.input_queue[0][3], []).append(self.input_queue.pop(0))
- self.raiseInternalEvent(Event("force_user_refresh", None, []))
-
- def _running_push_wait_1_guard(self, parameters):
- return self.input_queue and self.input_queue[0][3] not in self.user_statecharts
-
- def _running_push_process_0_exec(self, parameters):
- source, op, args, username = self.input_queue.pop(0)
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.user_statecharts[username], Event("set_input", None, [source, args])]))
-
- def _running_push_process_0_guard(self, parameters):
- return self.input_queue[0][1] == 'set_input'
-
- def _running_push_process_1_exec(self, parameters):
- source, op, args, username = self.input_queue.pop(0)
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.user_statecharts[username], Event("get_output", None, [source, args])]))
-
- def _running_push_process_1_guard(self, parameters):
- return self.input_queue[0][1] == 'get_output'
-
- def _running_push_process_2_exec(self, parameters):
- print("Sending pause")
- source, op, args, username = self.input_queue.pop(0)
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.user_statecharts[username], Event("pause", None, [source, args])]))
-
- def _running_push_process_2_guard(self, parameters):
- return self.input_queue[0][1] == 'pause'
-
- def _running_push_process_3_exec(self, parameters):
- source, op, args, username = self.input_queue.pop(0)
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.user_statecharts[username], Event("resume", None, [source, args])]))
-
- def _running_push_process_3_guard(self, parameters):
- return self.input_queue[0][1] == 'resume'
-
- def _running_find_users_get_all_links_0_exec(self, parameters):
- data = parameters[0]
- self.users = data[0][0]
-
- def _running_find_users_retrieve_users_0_exec(self, parameters):
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'executor', Event("raw_exec", None, [[['RV', [user]] for user in self.users], 'parent'])]))
-
- def _running_find_users_retrieve_users_0_guard(self, parameters):
- return self.users
-
- def _running_find_users_retrieve_users_1_guard(self, parameters):
- return not self.users
-
- def _running_find_users_got_usernames_0_exec(self, parameters):
- data = parameters[0]
- data = set([v[0] for v in data])
- self.add_users = [v for v in data if v not in self.user_statecharts]
- self.delete_users = [v for v in self.user_statecharts if v not in data]
-
- def _running_find_users_process_users_0_guard(self, parameters):
- return not self.add_users and not self.delete_users
-
- def _running_find_users_process_users_1_exec(self, parameters):
- self.big_step.outputEventOM(Event("create_instance", None, [self, 'users', 'UserStatechart', self.add_users[0], self.mvk]))
-
- def _running_find_users_process_users_1_guard(self, parameters):
- return self.add_users and not self.delete_users
-
- def _running_find_users_process_users_2_exec(self, parameters):
- self.big_step.outputEventOM(Event("delete_instance", None, [self, self.user_statecharts.pop(self.delete_users.pop(0))]))
-
- def _running_find_users_process_users_2_guard(self, parameters):
- return self.delete_users
-
- def _running_find_users_creating_user_0_exec(self, parameters):
- instancename = parameters[0]
- self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, instancename, Event("set_returnpath", None, [instancename])]))
- self.user_statecharts[self.add_users[0]] = instancename
- # Repush all this user's messages in the input queue
- self.input_queue.extend(self.user_queue.pop(self.add_users[0], []))
- self.add_users.pop(0)
-
- def initializeStatechart(self):
- # enter default state
- self.default_targets = self.states["/init_server"].getEffectiveTargetStates()
- RuntimeClassBase.initializeStatechart(self)
- class Server(RuntimeClassBase):
- def __init__(self, controller, address, port):
- RuntimeClassBase.__init__(self, controller)
-
- self.semantics.big_step_maximality = StatechartSemantics.TakeMany
- self.semantics.internal_event_lifeline = StatechartSemantics.Queue
- self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
- self.semantics.priority = StatechartSemantics.SourceParent
- self.semantics.concurrency = StatechartSemantics.Single
-
- # build Statechart structure
- self.build_statechart_structure()
-
- # call user defined constructor
- Server.user_defined_constructor(self, address, port)
-
- def user_defined_constructor(self, address, port):
- self.socket = None
- self.address = address
- self.port = port
-
- def user_defined_destructor(self):
- pass
-
-
- # builds Statechart structure
- def build_statechart_structure(self):
-
- # state <root>
- self.states[""] = State(0, self)
-
- # state /main
- self.states["/main"] = ParallelState(1, self)
-
- # state /main/forward
- self.states["/main/forward"] = State(2, self)
-
- # state /main/forward/forward
- self.states["/main/forward/forward"] = State(3, self)
-
- # state /main/server
- self.states["/main/server"] = State(4, self)
-
- # state /main/server/init
- self.states["/main/server/init"] = State(5, self)
- self.states["/main/server/init"].setEnter(self._main_server_init_enter)
-
- # state /main/server/binding
- self.states["/main/server/binding"] = State(6, self)
- self.states["/main/server/binding"].setEnter(self._main_server_binding_enter)
-
- # state /main/server/listening
- self.states["/main/server/listening"] = State(7, self)
- self.states["/main/server/listening"].setEnter(self._main_server_listening_enter)
-
- # state /main/server/accepting
- self.states["/main/server/accepting"] = State(8, self)
-
- # state /main/close_socket
- self.states["/main/close_socket"] = State(9, self)
-
- # state /main/close_socket/close
- self.states["/main/close_socket/close"] = State(10, self)
-
- # add children
- self.states[""].addChild(self.states["/main"])
- self.states["/main"].addChild(self.states["/main/forward"])
- self.states["/main"].addChild(self.states["/main/server"])
- self.states["/main"].addChild(self.states["/main/close_socket"])
- self.states["/main/forward"].addChild(self.states["/main/forward/forward"])
- self.states["/main/server"].addChild(self.states["/main/server/init"])
- self.states["/main/server"].addChild(self.states["/main/server/binding"])
- self.states["/main/server"].addChild(self.states["/main/server/listening"])
- self.states["/main/server"].addChild(self.states["/main/server/accepting"])
- self.states["/main/close_socket"].addChild(self.states["/main/close_socket/close"])
- self.states[""].fixTree()
- self.states[""].default_state = self.states["/main"]
- self.states["/main/forward"].default_state = self.states["/main/forward/forward"]
- self.states["/main/server"].default_state = self.states["/main/server/init"]
- self.states["/main/close_socket"].default_state = self.states["/main/close_socket/close"]
-
- # transition /main/forward/forward
- _main_forward_forward_0 = Transition(self, self.states["/main/forward/forward"], [self.states["/main/forward/forward"]])
- _main_forward_forward_0.setAction(self._main_forward_forward_0_exec)
- _main_forward_forward_0.setTrigger(Event("HTTP_output", None))
- self.states["/main/forward/forward"].addTransition(_main_forward_forward_0)
-
- # transition /main/server/init
- _main_server_init_0 = Transition(self, self.states["/main/server/init"], [self.states["/main/server/binding"]])
- _main_server_init_0.setAction(self._main_server_init_0_exec)
- _main_server_init_0.setTrigger(Event("created_socket", "socket_in"))
- self.states["/main/server/init"].addTransition(_main_server_init_0)
-
- # transition /main/server/binding
- _main_server_binding_0 = Transition(self, self.states["/main/server/binding"], [self.states["/main/server/listening"]])
- _main_server_binding_0.setTrigger(Event("bound_socket", "socket_in"))
- _main_server_binding_0.setGuard(self._main_server_binding_0_guard)
- self.states["/main/server/binding"].addTransition(_main_server_binding_0)
-
- # transition /main/server/listening
- _main_server_listening_0 = Transition(self, self.states["/main/server/listening"], [self.states["/main/server/accepting"]])
- _main_server_listening_0.setAction(self._main_server_listening_0_exec)
- _main_server_listening_0.setTrigger(Event("listened_socket", "socket_in"))
- _main_server_listening_0.setGuard(self._main_server_listening_0_guard)
- self.states["/main/server/listening"].addTransition(_main_server_listening_0)
-
- # transition /main/server/accepting
- _main_server_accepting_0 = Transition(self, self.states["/main/server/accepting"], [self.states["/main/server/accepting"]])
- _main_server_accepting_0.setAction(self._main_server_accepting_0_exec)
- _main_server_accepting_0.setTrigger(Event("accepted_socket", "socket_in"))
- self.states["/main/server/accepting"].addTransition(_main_server_accepting_0)
- _main_server_accepting_1 = Transition(self, self.states["/main/server/accepting"], [self.states["/main/server/accepting"]])
- _main_server_accepting_1.setAction(self._main_server_accepting_1_exec)
- _main_server_accepting_1.setTrigger(Event("instance_created", None))
- self.states["/main/server/accepting"].addTransition(_main_server_accepting_1)
-
- # transition /main/close_socket/close
- _main_close_socket_close_0 = Transition(self, self.states["/main/close_socket/close"], [self.states["/main/close_socket/close"]])
- _main_close_socket_close_0.setAction(self._main_close_socket_close_0_exec)
- _main_close_socket_close_0.setTrigger(Event("close_socket", None))
- self.states["/main/close_socket/close"].addTransition(_main_close_socket_close_0)
-
- def _main_server_init_enter(self):
- self.big_step.outputEvent(Event("create_socket", "socket_out", []))
-
- def _main_server_binding_enter(self):
- self.big_step.outputEvent(Event("bind_socket", "socket_out", [self.socket, (self.address, self.port)]))
-
- def _main_server_listening_enter(self):
- self.big_step.outputEvent(Event("listen_socket", "socket_out", [self.socket]))
-
- def _main_forward_forward_0_exec(self, parameters):
- association_name = parameters[0]
- data = parameters[1]
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("from_mvi", None, [association_name, data])]))
-
- def _main_server_init_0_exec(self, parameters):
- socket = parameters[0]
- self.socket = socket
-
- def _main_server_binding_0_guard(self, parameters):
- socket = parameters[0]
- return self.socket == socket
-
- def _main_server_listening_0_exec(self, parameters):
- socket = parameters[0]
- self.big_step.outputEvent(Event("accept_socket", "socket_out", [self.socket]))
-
- def _main_server_listening_0_guard(self, parameters):
- socket = parameters[0]
- return self.socket == socket
-
- def _main_server_accepting_0_exec(self, parameters):
- socket = parameters[0]
- connected_socket = parameters[1]
- self.big_step.outputEventOM(Event("create_instance", None, [self, 'sockets', 'Socket', connected_socket]))
- self.big_step.outputEvent(Event("accept_socket", "socket_out", [self.socket]))
-
- def _main_server_accepting_1_exec(self, parameters):
- instancename = parameters[0]
- self.big_step.outputEventOM(Event("start_instance", None, [self, instancename]))
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, instancename, Event("set_association_name", None, [instancename])]))
-
- def _main_close_socket_close_0_exec(self, parameters):
- association_name = parameters[0]
- self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
-
- def initializeStatechart(self):
- # enter default state
- self.default_targets = self.states["/main"].getEffectiveTargetStates()
- RuntimeClassBase.initializeStatechart(self)
- class Socket(RuntimeClassBase):
- def __init__(self, controller, my_socket):
- RuntimeClassBase.__init__(self, controller)
-
- self.semantics.big_step_maximality = StatechartSemantics.TakeMany
- self.semantics.internal_event_lifeline = StatechartSemantics.Queue
- self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
- self.semantics.priority = StatechartSemantics.SourceParent
- self.semantics.concurrency = StatechartSemantics.Single
-
- # build Statechart structure
- self.build_statechart_structure()
-
- # call user defined constructor
- Socket.user_defined_constructor(self, my_socket)
-
- def user_defined_constructor(self, my_socket):
- self.socket = my_socket
- self.received_data = ""
- self.send_data = ""
- self.closed = False
- self.association_name = None
-
- def user_defined_destructor(self):
- pass
-
-
- # builds Statechart structure
- def build_statechart_structure(self):
-
- # state <root>
- self.states[""] = State(0, self)
-
- # state /init
- self.states["/init"] = State(1, self)
-
- # state /connected
- self.states["/connected"] = ParallelState(2, self)
-
- # state /connected/listening
- self.states["/connected/listening"] = State(3, self)
-
- # state /connected/listening/listen
- self.states["/connected/listening/listen"] = State(4, self)
- self.states["/connected/listening/listen"].setEnter(self._connected_listening_listen_enter)
-
- # state /connected/listening/closed
- self.states["/connected/listening/closed"] = State(5, self)
- self.states["/connected/listening/closed"].setEnter(self._connected_listening_closed_enter)
-
- # state /connected/sending
- self.states["/connected/sending"] = State(6, self)
-
- # state /connected/sending/waiting_for_data
- self.states["/connected/sending/waiting_for_data"] = State(7, self)
-
- # state /connected/sending/transferring
- self.states["/connected/sending/transferring"] = State(8, self)
-
- # state /connected/queueing
- self.states["/connected/queueing"] = State(9, self)
-
- # state /connected/queueing/queueing
- self.states["/connected/queueing/queueing"] = State(10, self)
-
- # state /connected/parsing
- self.states["/connected/parsing"] = State(11, self)
-
- # state /connected/parsing/wait_for_header
- self.states["/connected/parsing/wait_for_header"] = State(12, self)
-
- # state /connected/parsing/closing
- self.states["/connected/parsing/closing"] = State(13, self)
- self.states["/connected/parsing/closing"].setEnter(self._connected_parsing_closing_enter)
- self.states["/connected/parsing/closing"].setExit(self._connected_parsing_closing_exit)
-
- # state /connected/parsing/wait_for_payload
- self.states["/connected/parsing/wait_for_payload"] = State(14, self)
-
- # state /close
- self.states["/close"] = State(15, self)
- self.states["/close"].setEnter(self._close_enter)
-
- # add children
- self.states[""].addChild(self.states["/init"])
- self.states[""].addChild(self.states["/connected"])
- self.states[""].addChild(self.states["/close"])
- self.states["/connected"].addChild(self.states["/connected/listening"])
- self.states["/connected"].addChild(self.states["/connected/sending"])
- self.states["/connected"].addChild(self.states["/connected/queueing"])
- self.states["/connected"].addChild(self.states["/connected/parsing"])
- self.states["/connected/listening"].addChild(self.states["/connected/listening/listen"])
- self.states["/connected/listening"].addChild(self.states["/connected/listening/closed"])
- self.states["/connected/sending"].addChild(self.states["/connected/sending/waiting_for_data"])
- self.states["/connected/sending"].addChild(self.states["/connected/sending/transferring"])
- self.states["/connected/queueing"].addChild(self.states["/connected/queueing/queueing"])
- self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_header"])
- self.states["/connected/parsing"].addChild(self.states["/connected/parsing/closing"])
- self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_payload"])
- self.states[""].fixTree()
- self.states[""].default_state = self.states["/init"]
- self.states["/connected/listening"].default_state = self.states["/connected/listening/listen"]
- self.states["/connected/sending"].default_state = self.states["/connected/sending/waiting_for_data"]
- self.states["/connected/queueing"].default_state = self.states["/connected/queueing/queueing"]
- self.states["/connected/parsing"].default_state = self.states["/connected/parsing/wait_for_header"]
-
- # transition /init
- _init_0 = Transition(self, self.states["/init"], [self.states["/connected"]])
- _init_0.setAction(self._init_0_exec)
- _init_0.setTrigger(Event("set_association_name", None))
- self.states["/init"].addTransition(_init_0)
-
- # transition /connected/listening/listen
- _connected_listening_listen_0 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/listen"]])
- _connected_listening_listen_0.setAction(self._connected_listening_listen_0_exec)
- _connected_listening_listen_0.setTrigger(Event("received_socket", "socket_in"))
- _connected_listening_listen_0.setGuard(self._connected_listening_listen_0_guard)
- self.states["/connected/listening/listen"].addTransition(_connected_listening_listen_0)
- _connected_listening_listen_1 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/closed"]])
- _connected_listening_listen_1.setAction(self._connected_listening_listen_1_exec)
- _connected_listening_listen_1.setTrigger(Event("received_socket", "socket_in"))
- _connected_listening_listen_1.setGuard(self._connected_listening_listen_1_guard)
- self.states["/connected/listening/listen"].addTransition(_connected_listening_listen_1)
-
- # transition /connected/sending/waiting_for_data
- _connected_sending_waiting_for_data_0 = Transition(self, self.states["/connected/sending/waiting_for_data"], [self.states["/connected/sending/transferring"]])
- _connected_sending_waiting_for_data_0.setAction(self._connected_sending_waiting_for_data_0_exec)
- _connected_sending_waiting_for_data_0.setTrigger(None)
- _connected_sending_waiting_for_data_0.setGuard(self._connected_sending_waiting_for_data_0_guard)
- self.states["/connected/sending/waiting_for_data"].addTransition(_connected_sending_waiting_for_data_0)
-
- # transition /connected/sending/transferring
- _connected_sending_transferring_0 = Transition(self, self.states["/connected/sending/transferring"], [self.states["/connected/sending/waiting_for_data"]])
- _connected_sending_transferring_0.setAction(self._connected_sending_transferring_0_exec)
- _connected_sending_transferring_0.setTrigger(Event("sent_socket", "socket_in"))
- _connected_sending_transferring_0.setGuard(self._connected_sending_transferring_0_guard)
- self.states["/connected/sending/transferring"].addTransition(_connected_sending_transferring_0)
-
- # transition /connected/queueing/queueing
- _connected_queueing_queueing_0 = Transition(self, self.states["/connected/queueing/queueing"], [self.states["/connected/queueing/queueing"]])
- _connected_queueing_queueing_0.setAction(self._connected_queueing_queueing_0_exec)
- _connected_queueing_queueing_0.setTrigger(Event("HTTP_input", None))
- self.states["/connected/queueing/queueing"].addTransition(_connected_queueing_queueing_0)
-
- # transition /connected/parsing/wait_for_header
- _connected_parsing_wait_for_header_0 = Transition(self, self.states["/connected/parsing/wait_for_header"], [self.states["/connected/parsing/wait_for_payload"]])
- _connected_parsing_wait_for_header_0.setAction(self._connected_parsing_wait_for_header_0_exec)
- _connected_parsing_wait_for_header_0.setTrigger(None)
- _connected_parsing_wait_for_header_0.setGuard(self._connected_parsing_wait_for_header_0_guard)
- self.states["/connected/parsing/wait_for_header"].addTransition(_connected_parsing_wait_for_header_0)
- _connected_parsing_wait_for_header_1 = Transition(self, self.states["/connected/parsing/wait_for_header"], [self.states["/connected/parsing/closing"]])
- _connected_parsing_wait_for_header_1.setTrigger(None)
- _connected_parsing_wait_for_header_1.setGuard(self._connected_parsing_wait_for_header_1_guard)
- self.states["/connected/parsing/wait_for_header"].addTransition(_connected_parsing_wait_for_header_1)
-
- # transition /connected/parsing/closing
- _connected_parsing_closing_0 = Transition(self, self.states["/connected/parsing/closing"], [self.states["/connected/parsing/closing"]])
- _connected_parsing_closing_0.setAction(self._connected_parsing_closing_0_exec)
- _connected_parsing_closing_0.setTrigger(Event("_0after"))
- self.states["/connected/parsing/closing"].addTransition(_connected_parsing_closing_0)
-
- # transition /connected/parsing/wait_for_payload
- _connected_parsing_wait_for_payload_0 = Transition(self, self.states["/connected/parsing/wait_for_payload"], [self.states["/connected/parsing/wait_for_header"]])
- _connected_parsing_wait_for_payload_0.setAction(self._connected_parsing_wait_for_payload_0_exec)
- _connected_parsing_wait_for_payload_0.setTrigger(None)
- _connected_parsing_wait_for_payload_0.setGuard(self._connected_parsing_wait_for_payload_0_guard)
- self.states["/connected/parsing/wait_for_payload"].addTransition(_connected_parsing_wait_for_payload_0)
-
- # transition /connected
- _connected_0 = Transition(self, self.states["/connected"], [self.states["/close"]])
- _connected_0.setTrigger(Event("close", None))
- self.states["/connected"].addTransition(_connected_0)
-
- def _connected_listening_listen_enter(self):
- self.big_step.outputEvent(Event("recv_socket", "socket_out", [self.socket]))
-
- def _connected_listening_closed_enter(self):
- self.closed = True
-
- def _connected_parsing_closing_enter(self):
- self.addTimer(0, 0.0)
-
- def _connected_parsing_closing_exit(self):
- self.removeTimer(0)
-
- def _close_enter(self):
- self.big_step.outputEvent(Event("close_socket", "socket_out", [self.socket]))
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("close_socket", None, [self.association_name])]))
-
- def _init_0_exec(self, parameters):
- association_name = parameters[0]
- self.association_name = association_name
-
- def _connected_listening_listen_0_exec(self, parameters):
- socket = parameters[0]
- data = parameters[1]
- self.received_data += data
- self.raiseInternalEvent(Event("received_data", None, []))
-
- def _connected_listening_listen_0_guard(self, parameters):
- socket = parameters[0]
- data = parameters[1]
- return (self.socket == socket) and (len(data) > 0)
-
- def _connected_listening_listen_1_exec(self, parameters):
- socket = parameters[0]
- data = parameters[1]
- self.raiseInternalEvent(Event("received_data", None, []))
-
- def _connected_listening_listen_1_guard(self, parameters):
- socket = parameters[0]
- data = parameters[1]
- return (self.socket == socket) and (len(data) == 0)
-
- def _connected_sending_waiting_for_data_0_exec(self, parameters):
- self.big_step.outputEvent(Event("send_socket", "socket_out", [self.socket, self.send_data]))
-
- def _connected_sending_waiting_for_data_0_guard(self, parameters):
- return len(self.send_data) > 0
-
- def _connected_sending_transferring_0_exec(self, parameters):
- socket = parameters[0]
- sent_bytes = parameters[1]
- self.send_data = self.send_data[sent_bytes:]
-
- def _connected_sending_transferring_0_guard(self, parameters):
- socket = parameters[0]
- sent_bytes = parameters[1]
- return self.socket == socket
-
- def _connected_queueing_queueing_0_exec(self, parameters):
- data = parameters[0]
- #post_data = "&".join(["%s=%s" % (urllib.quote(k), urllib.quote(v)) for k, v in data.iteritems()])
- #post_data = "&".join(["%s=%s" % (k, v) for k, v in data.iteritems()])
- post_data = data
- self.send_data += "HTTP/1.0 200 OK\r\n"
- self.send_data += "Content-Length: %s\r\n" % len(post_data)
- self.send_data += "Content-Type: %s; charset=UTF-8\r\n" % "text/plain"
- self.send_data += "\r\n"
- self.send_data += str(post_data)
-
- def _connected_parsing_wait_for_header_0_exec(self, parameters):
- header, self.received_data = self.received_data.split("\r\n\r\n", 1)
- header = header.lower()
- if "content-length" in header:
- _, after = header.split("content-length:", 1)
- after = after.split("\r\n", 1)[0]
- after = after.strip()
- self.length = int(after)
- else:
- self.length = float('inf')
-
- def _connected_parsing_wait_for_header_0_guard(self, parameters):
- return '\r\n\r\n' in self.received_data and self.received_data.startswith('POST')
-
- def _connected_parsing_wait_for_header_1_guard(self, parameters):
- return self.closed and len(self.received_data) == 0
-
- def _connected_parsing_closing_0_exec(self, parameters):
- self.raiseInternalEvent(Event("close", None, []))
-
- def _connected_parsing_wait_for_payload_0_exec(self, parameters):
- if self.length == float('inf'):
- data = self.received_data
- self.received_data = ""
- else:
- data = self.received_data[:self.length]
- self.received_data = self.received_data[self.length:]
-
- # We support POST data only, so everything is in the data
- try:
- params = dict([p.split('=') for p in data.split('&')])
- data = {k: urllib.unquote_plus(v) for k, v in params.iteritems()}
- except:
- data = {}
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("HTTP_output", None, [self.association_name, data])]))
-
- def _connected_parsing_wait_for_payload_0_guard(self, parameters):
- return len(self.received_data) >= self.length or self.closed
-
- def initializeStatechart(self):
- # enter default state
- self.default_targets = self.states["/init"].getEffectiveTargetStates()
- RuntimeClassBase.initializeStatechart(self)
- class HTTPClient(RuntimeClassBase):
- def __init__(self, controller, hostname, port):
- RuntimeClassBase.__init__(self, controller)
-
- self.semantics.big_step_maximality = StatechartSemantics.TakeMany
- self.semantics.internal_event_lifeline = StatechartSemantics.Queue
- self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
- self.semantics.priority = StatechartSemantics.SourceParent
- self.semantics.concurrency = StatechartSemantics.Single
-
- # build Statechart structure
- self.build_statechart_structure()
-
- # call user defined constructor
- HTTPClient.user_defined_constructor(self, hostname, port)
-
- def user_defined_constructor(self, hostname, port):
- self.socket = None
- self.destination = (hostname, port)
- self.received_data = ""
- self.send_data = ""
- self.queue = []
- self.destinations = []
-
- def user_defined_destructor(self):
- pass
-
-
- # builds Statechart structure
- def build_statechart_structure(self):
-
- # state <root>
- self.states[""] = State(0, self)
-
- # state /init
- self.states["/init"] = State(1, self)
- self.states["/init"].setEnter(self._init_enter)
-
- # state /connecting
- self.states["/connecting"] = State(2, self)
- self.states["/connecting"].setEnter(self._connecting_enter)
-
- # state /connected
- self.states["/connected"] = ParallelState(3, self)
-
- # state /connected/listening
- self.states["/connected/listening"] = State(4, self)
-
- # state /connected/listening/listen
- self.states["/connected/listening/listen"] = State(5, self)
- self.states["/connected/listening/listen"].setEnter(self._connected_listening_listen_enter)
-
- # state /connected/listening/close
- self.states["/connected/listening/close"] = State(6, self)
-
- # state /connected/sending
- self.states["/connected/sending"] = State(7, self)
-
- # state /connected/sending/waiting_for_data
- self.states["/connected/sending/waiting_for_data"] = State(8, self)
-
- # state /connected/sending/transferring
- self.states["/connected/sending/transferring"] = State(9, self)
-
- # state /connected/queueing
- self.states["/connected/queueing"] = State(10, self)
-
- # state /connected/queueing/queueing
- self.states["/connected/queueing/queueing"] = State(11, self)
- self.states["/connected/queueing/queueing"].setEnter(self._connected_queueing_queueing_enter)
-
- # state /connected/parsing
- self.states["/connected/parsing"] = State(12, self)
-
- # state /connected/parsing/wait_for_header
- self.states["/connected/parsing/wait_for_header"] = State(13, self)
-
- # state /connected/parsing/wait_for_payload
- self.states["/connected/parsing/wait_for_payload"] = State(14, self)
-
- # add children
- self.states[""].addChild(self.states["/init"])
- self.states[""].addChild(self.states["/connecting"])
- self.states[""].addChild(self.states["/connected"])
- self.states["/connected"].addChild(self.states["/connected/listening"])
- self.states["/connected"].addChild(self.states["/connected/sending"])
- self.states["/connected"].addChild(self.states["/connected/queueing"])
- self.states["/connected"].addChild(self.states["/connected/parsing"])
- self.states["/connected/listening"].addChild(self.states["/connected/listening/listen"])
- self.states["/connected/listening"].addChild(self.states["/connected/listening/close"])
- self.states["/connected/sending"].addChild(self.states["/connected/sending/waiting_for_data"])
- self.states["/connected/sending"].addChild(self.states["/connected/sending/transferring"])
- self.states["/connected/queueing"].addChild(self.states["/connected/queueing/queueing"])
- self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_header"])
- self.states["/connected/parsing"].addChild(self.states["/connected/parsing/wait_for_payload"])
- self.states[""].fixTree()
- self.states[""].default_state = self.states["/init"]
- self.states["/connected/listening"].default_state = self.states["/connected/listening/listen"]
- self.states["/connected/sending"].default_state = self.states["/connected/sending/waiting_for_data"]
- self.states["/connected/queueing"].default_state = self.states["/connected/queueing/queueing"]
- self.states["/connected/parsing"].default_state = self.states["/connected/parsing/wait_for_header"]
-
- # transition /init
- _init_0 = Transition(self, self.states["/init"], [self.states["/connecting"]])
- _init_0.setAction(self._init_0_exec)
- _init_0.setTrigger(Event("created_socket", "socket_in"))
- self.states["/init"].addTransition(_init_0)
-
- # transition /connecting
- _connecting_0 = Transition(self, self.states["/connecting"], [self.states["/connected"]])
- _connecting_0.setAction(self._connecting_0_exec)
- _connecting_0.setTrigger(Event("connected_socket", "socket_in"))
- _connecting_0.setGuard(self._connecting_0_guard)
- self.states["/connecting"].addTransition(_connecting_0)
-
- # transition /connected/listening/listen
- _connected_listening_listen_0 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/listen"]])
- _connected_listening_listen_0.setAction(self._connected_listening_listen_0_exec)
- _connected_listening_listen_0.setTrigger(Event("received_socket", "socket_in"))
- _connected_listening_listen_0.setGuard(self._connected_listening_listen_0_guard)
- self.states["/connected/listening/listen"].addTransition(_connected_listening_listen_0)
- _connected_listening_listen_1 = Transition(self, self.states["/connected/listening/listen"], [self.states["/connected/listening/close"]])
- _connected_listening_listen_1.setTrigger(Event("received_socket", "socket_in"))
- _connected_listening_listen_1.setGuard(self._connected_listening_listen_1_guard)
- self.states["/connected/listening/listen"].addTransition(_connected_listening_listen_1)
-
- # transition /connected/sending/waiting_for_data
- _connected_sending_waiting_for_data_0 = Transition(self, self.states["/connected/sending/waiting_for_data"], [self.states["/connected/sending/transferring"]])
- _connected_sending_waiting_for_data_0.setAction(self._connected_sending_waiting_for_data_0_exec)
- _connected_sending_waiting_for_data_0.setTrigger(None)
- _connected_sending_waiting_for_data_0.setGuard(self._connected_sending_waiting_for_data_0_guard)
- self.states["/connected/sending/waiting_for_data"].addTransition(_connected_sending_waiting_for_data_0)
-
- # transition /connected/sending/transferring
- _connected_sending_transferring_0 = Transition(self, self.states["/connected/sending/transferring"], [self.states["/connected/sending/waiting_for_data"]])
- _connected_sending_transferring_0.setAction(self._connected_sending_transferring_0_exec)
- _connected_sending_transferring_0.setTrigger(Event("sent_socket", "socket_in"))
- _connected_sending_transferring_0.setGuard(self._connected_sending_transferring_0_guard)
- self.states["/connected/sending/transferring"].addTransition(_connected_sending_transferring_0)
-
- # transition /connected/queueing/queueing
- _connected_queueing_queueing_0 = Transition(self, self.states["/connected/queueing/queueing"], [self.states["/connected/queueing/queueing"]])
- _connected_queueing_queueing_0.setAction(self._connected_queueing_queueing_0_exec)
- _connected_queueing_queueing_0.setTrigger(Event("HTTP_input", None))
- self.states["/connected/queueing/queueing"].addTransition(_connected_queueing_queueing_0)
-
- # transition /connected/parsing/wait_for_header
- _connected_parsing_wait_for_header_0 = Transition(self, self.states["/connected/parsing/wait_for_header"], [self.states["/connected/parsing/wait_for_payload"]])
- _connected_parsing_wait_for_header_0.setAction(self._connected_parsing_wait_for_header_0_exec)
- _connected_parsing_wait_for_header_0.setTrigger(None)
- _connected_parsing_wait_for_header_0.setGuard(self._connected_parsing_wait_for_header_0_guard)
- self.states["/connected/parsing/wait_for_header"].addTransition(_connected_parsing_wait_for_header_0)
-
- # transition /connected/parsing/wait_for_payload
- _connected_parsing_wait_for_payload_0 = Transition(self, self.states["/connected/parsing/wait_for_payload"], [self.states["/connected/parsing/wait_for_header"]])
- _connected_parsing_wait_for_payload_0.setAction(self._connected_parsing_wait_for_payload_0_exec)
- _connected_parsing_wait_for_payload_0.setTrigger(None)
- _connected_parsing_wait_for_payload_0.setGuard(self._connected_parsing_wait_for_payload_0_guard)
- self.states["/connected/parsing/wait_for_payload"].addTransition(_connected_parsing_wait_for_payload_0)
-
- def _init_enter(self):
- self.big_step.outputEvent(Event("create_socket", "", []))
-
- def _connecting_enter(self):
- self.big_step.outputEvent(Event("connect_socket", "", [self.socket, self.destination]))
-
- def _connected_listening_listen_enter(self):
- self.big_step.outputEvent(Event("recv_socket", "socket_out", [self.socket]))
-
- def _connected_queueing_queueing_enter(self):
- pass
-
- def _init_0_exec(self, parameters):
- socket = parameters[0]
- self.socket = socket
-
- def _connecting_0_exec(self, parameters):
- socket = parameters[0]
- self.big_step.outputEventOM(Event("broad_cast", None, [Event("http_client_ready", None, [])]))
-
- def _connecting_0_guard(self, parameters):
- socket = parameters[0]
- return self.socket == socket
-
- def _connected_listening_listen_0_exec(self, parameters):
- socket = parameters[0]
- data = parameters[1]
- self.received_data += data
-
- def _connected_listening_listen_0_guard(self, parameters):
- socket = parameters[0]
- data = parameters[1]
- return (self.socket == socket) and (len(data) > 0)
-
- def _connected_listening_listen_1_guard(self, parameters):
- socket = parameters[0]
- data = parameters[1]
- return (self.socket == socket) and (len(data) == 0)
-
- def _connected_sending_waiting_for_data_0_exec(self, parameters):
- self.big_step.outputEvent(Event("send_socket", "socket_out", [self.socket, self.send_data]))
-
- def _connected_sending_waiting_for_data_0_guard(self, parameters):
- return len(self.send_data) > 0
-
- def _connected_sending_transferring_0_exec(self, parameters):
- socket = parameters[0]
- sent_bytes = parameters[1]
- self.send_data = self.send_data[sent_bytes:]
-
- def _connected_sending_transferring_0_guard(self, parameters):
- socket = parameters[0]
- sent_bytes = parameters[1]
- return self.socket == socket
-
- def _connected_queueing_queueing_0_exec(self, parameters):
- data = parameters[0]
- destination = parameters[1]
- self.send_data += "POST / HTTP/1.0\r\n"
- self.send_data += "Content-Length: %i\r\n" % len(str(data))
- self.send_data += "\r\n"
- self.send_data += data
- self.destinations.append(destination)
-
- def _connected_parsing_wait_for_header_0_exec(self, parameters):
- header, self.received_data = self.received_data.split("\r\n\r\n", 1)
- header = header.lower()
- if "content-length" in header:
- _, after = header.split("content-length:", 1)
- after, _ = after.split("\r\n", 1)
- after = after.strip()
- self.length = int(after)
- else:
- self.length = float('inf')
-
- def _connected_parsing_wait_for_header_0_guard(self, parameters):
- return '\r\n\r\n' in self.received_data
-
- def _connected_parsing_wait_for_payload_0_exec(self, parameters):
- data = self.received_data[:self.length]
- self.received_data = self.received_data[self.length:]
- params = dict([p.split('=') for p in data.split('&')])
- data = {k: urllib.unquote_plus(v) for k, v in params.iteritems()}
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.destinations.pop(0), Event("HTTP_output", None, [data])]))
-
- def _connected_parsing_wait_for_payload_0_guard(self, parameters):
- return len(self.received_data) >= self.length
-
- def initializeStatechart(self):
- # enter default state
- self.default_targets = self.states["/init"].getEffectiveTargetStates()
- RuntimeClassBase.initializeStatechart(self)
- class UserStatechart(RuntimeClassBase):
- def __init__(self, controller, username, mvk):
- RuntimeClassBase.__init__(self, controller)
-
- self.semantics.big_step_maximality = StatechartSemantics.TakeMany
- self.semantics.internal_event_lifeline = StatechartSemantics.Queue
- self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
- self.semantics.priority = StatechartSemantics.SourceParent
- self.semantics.concurrency = StatechartSemantics.Single
-
- # build Statechart structure
- self.build_statechart_structure()
-
- # call user defined constructor
- UserStatechart.user_defined_constructor(self, username, mvk)
-
- def user_defined_constructor(self, username, mvk):
- self.username = username
- self.mvk = mvk
-
- self.output_queue = []
- self.source_execution = None
-
- self.request_id = 0
- self.outstanding_execution = None
- self.outstanding_input = {}
- self.outstanding_output = None
-
- def user_defined_destructor(self):
- pass
-
-
- # builds Statechart structure
- def build_statechart_structure(self):
-
- # state <root>
- self.states[""] = State(0, self)
-
- # state /init
- self.states["/init"] = State(1, self)
-
- # state /running
- self.states["/running"] = ParallelState(2, self)
-
- # state /running/execution
- self.states["/running/execution"] = State(3, self)
-
- # state /running/execution/executing
- self.states["/running/execution/executing"] = State(4, self)
-
- # state /running/execution/executing/executing
- self.states["/running/execution/executing/executing"] = State(5, self)
- self.states["/running/execution/executing/executing"].setEnter(self._running_execution_executing_executing_enter)
-
- # state /running/execution/executing/timeout
- self.states["/running/execution/executing/timeout"] = State(6, self)
- self.states["/running/execution/executing/timeout"].setEnter(self._running_execution_executing_timeout_enter)
- self.states["/running/execution/executing/timeout"].setExit(self._running_execution_executing_timeout_exit)
-
- # state /running/execution/paused
- self.states["/running/execution/paused"] = State(7, self)
-
- # state /running/set_input
- self.states["/running/set_input"] = State(8, self)
-
- # state /running/set_input/fetch
- self.states["/running/set_input/fetch"] = State(9, self)
-
- # state /running/get_output_queue
- self.states["/running/get_output_queue"] = State(10, self)
-
- # state /running/get_output_queue/waiting
- self.states["/running/get_output_queue/waiting"] = State(11, self)
-
- # state /running/get_output
- self.states["/running/get_output"] = State(12, self)
-
- # state /running/get_output/try_execute
- self.states["/running/get_output/try_execute"] = State(13, self)
-
- # state /running/get_output/waiting
- self.states["/running/get_output/waiting"] = State(14, self)
- self.states["/running/get_output/waiting"].setEnter(self._running_get_output_waiting_enter)
- self.states["/running/get_output/waiting"].setExit(self._running_get_output_waiting_exit)
-
- # add children
- self.states[""].addChild(self.states["/init"])
- self.states[""].addChild(self.states["/running"])
- self.states["/running"].addChild(self.states["/running/execution"])
- self.states["/running"].addChild(self.states["/running/set_input"])
- self.states["/running"].addChild(self.states["/running/get_output_queue"])
- self.states["/running"].addChild(self.states["/running/get_output"])
- self.states["/running/execution"].addChild(self.states["/running/execution/executing"])
- self.states["/running/execution"].addChild(self.states["/running/execution/paused"])
- self.states["/running/execution/executing"].addChild(self.states["/running/execution/executing/executing"])
- self.states["/running/execution/executing"].addChild(self.states["/running/execution/executing/timeout"])
- self.states["/running/set_input"].addChild(self.states["/running/set_input/fetch"])
- self.states["/running/get_output_queue"].addChild(self.states["/running/get_output_queue/waiting"])
- self.states["/running/get_output"].addChild(self.states["/running/get_output/try_execute"])
- self.states["/running/get_output"].addChild(self.states["/running/get_output/waiting"])
- self.states[""].fixTree()
- self.states[""].default_state = self.states["/init"]
- self.states["/running/execution"].default_state = self.states["/running/execution/executing"]
- self.states["/running/execution/executing"].default_state = self.states["/running/execution/executing/executing"]
- self.states["/running/set_input"].default_state = self.states["/running/set_input/fetch"]
- self.states["/running/get_output_queue"].default_state = self.states["/running/get_output_queue/waiting"]
- self.states["/running/get_output"].default_state = self.states["/running/get_output/try_execute"]
-
- # transition /init
- _init_0 = Transition(self, self.states["/init"], [self.states["/running"]])
- _init_0.setAction(self._init_0_exec)
- _init_0.setTrigger(Event("set_returnpath", None))
- self.states["/init"].addTransition(_init_0)
-
- # transition /running/execution/executing/executing
- _running_execution_executing_executing_0 = Transition(self, self.states["/running/execution/executing/executing"], [self.states["/running/execution/executing/executing"]])
- _running_execution_executing_executing_0.setTrigger(Event("executed", None))
- _running_execution_executing_executing_0.setGuard(self._running_execution_executing_executing_0_guard)
- self.states["/running/execution/executing/executing"].addTransition(_running_execution_executing_executing_0)
- _running_execution_executing_executing_1 = Transition(self, self.states["/running/execution/executing/executing"], [self.states["/running/execution/executing/timeout"]])
- _running_execution_executing_executing_1.setTrigger(Event("executed", None))
- _running_execution_executing_executing_1.setGuard(self._running_execution_executing_executing_1_guard)
- self.states["/running/execution/executing/executing"].addTransition(_running_execution_executing_executing_1)
-
- # transition /running/execution/executing/timeout
- _running_execution_executing_timeout_0 = Transition(self, self.states["/running/execution/executing/timeout"], [self.states["/running/execution/executing/executing"]])
- _running_execution_executing_timeout_0.setTrigger(Event("_0after"))
- self.states["/running/execution/executing/timeout"].addTransition(_running_execution_executing_timeout_0)
- _running_execution_executing_timeout_1 = Transition(self, self.states["/running/execution/executing/timeout"], [self.states["/running/execution/executing/executing"]])
- _running_execution_executing_timeout_1.setTrigger(Event("set_input_done", None))
- self.states["/running/execution/executing/timeout"].addTransition(_running_execution_executing_timeout_1)
-
- # transition /running/execution/paused
- _running_execution_paused_0 = Transition(self, self.states["/running/execution/paused"], [self.states["/running/execution/executing"]])
- _running_execution_paused_0.setAction(self._running_execution_paused_0_exec)
- _running_execution_paused_0.setTrigger(Event("resume", None))
- self.states["/running/execution/paused"].addTransition(_running_execution_paused_0)
-
- # transition /running/set_input/fetch
- _running_set_input_fetch_0 = Transition(self, self.states["/running/set_input/fetch"], [self.states["/running/set_input/fetch"]])
- _running_set_input_fetch_0.setAction(self._running_set_input_fetch_0_exec)
- _running_set_input_fetch_0.setTrigger(Event("set_input", None))
- self.states["/running/set_input/fetch"].addTransition(_running_set_input_fetch_0)
- _running_set_input_fetch_1 = Transition(self, self.states["/running/set_input/fetch"], [self.states["/running/set_input/fetch"]])
- _running_set_input_fetch_1.setAction(self._running_set_input_fetch_1_exec)
- _running_set_input_fetch_1.setTrigger(Event("executed", None))
- _running_set_input_fetch_1.setGuard(self._running_set_input_fetch_1_guard)
- self.states["/running/set_input/fetch"].addTransition(_running_set_input_fetch_1)
-
- # transition /running/get_output_queue/waiting
- _running_get_output_queue_waiting_0 = Transition(self, self.states["/running/get_output_queue/waiting"], [self.states["/running/get_output_queue/waiting"]])
- _running_get_output_queue_waiting_0.setAction(self._running_get_output_queue_waiting_0_exec)
- _running_get_output_queue_waiting_0.setTrigger(Event("get_output", None))
- self.states["/running/get_output_queue/waiting"].addTransition(_running_get_output_queue_waiting_0)
-
- # transition /running/get_output/try_execute
- _running_get_output_try_execute_0 = Transition(self, self.states["/running/get_output/try_execute"], [self.states["/running/get_output/try_execute"]])
- _running_get_output_try_execute_0.setAction(self._running_get_output_try_execute_0_exec)
- _running_get_output_try_execute_0.setTrigger(None)
- _running_get_output_try_execute_0.setGuard(self._running_get_output_try_execute_0_guard)
- self.states["/running/get_output/try_execute"].addTransition(_running_get_output_try_execute_0)
- _running_get_output_try_execute_1 = Transition(self, self.states["/running/get_output/try_execute"], [self.states["/running/get_output/try_execute"]])
- _running_get_output_try_execute_1.setAction(self._running_get_output_try_execute_1_exec)
- _running_get_output_try_execute_1.setTrigger(Event("executed", None))
- _running_get_output_try_execute_1.setGuard(self._running_get_output_try_execute_1_guard)
- self.states["/running/get_output/try_execute"].addTransition(_running_get_output_try_execute_1)
- _running_get_output_try_execute_2 = Transition(self, self.states["/running/get_output/try_execute"], [self.states["/running/get_output/waiting"]])
- _running_get_output_try_execute_2.setAction(self._running_get_output_try_execute_2_exec)
- _running_get_output_try_execute_2.setTrigger(Event("executed", None))
- _running_get_output_try_execute_2.setGuard(self._running_get_output_try_execute_2_guard)
- self.states["/running/get_output/try_execute"].addTransition(_running_get_output_try_execute_2)
-
- # transition /running/get_output/waiting
- _running_get_output_waiting_0 = Transition(self, self.states["/running/get_output/waiting"], [self.states["/running/get_output/try_execute"]])
- _running_get_output_waiting_0.setTrigger(Event("_1after"))
- self.states["/running/get_output/waiting"].addTransition(_running_get_output_waiting_0)
-
- # transition /running/execution/executing
- _running_execution_executing_0 = Transition(self, self.states["/running/execution/executing"], [self.states["/running/execution/paused"]])
- _running_execution_executing_0.setAction(self._running_execution_executing_0_exec)
- _running_execution_executing_0.setTrigger(Event("pause", None))
- self.states["/running/execution/executing"].addTransition(_running_execution_executing_0)
-
- def _running_execution_executing_executing_enter(self):
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/executor', Event("execute", None, [self.returnpath, self.username, 'execute_rule', [], self.request_id])]))
- self.outstanding_execution = self.request_id
- self.request_id += 1
-
- def _running_execution_executing_timeout_enter(self):
- self.addTimer(0, 1.0)
-
- def _running_execution_executing_timeout_exit(self):
- self.removeTimer(0)
-
- def _running_get_output_waiting_enter(self):
- self.addTimer(1, 1.0)
-
- def _running_get_output_waiting_exit(self):
- self.removeTimer(1)
-
- def _running_execution_executing_0_exec(self, parameters):
- source = parameters[0]
- args = parameters[1]
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/to_mvi/' + source, Event("HTTP_input", None, [json.dumps({'user': self.username, 'state': 'paused', 'info': self.mvk.debug_info})])]))
-
- def _init_0_exec(self, parameters):
- returnpath = parameters[0]
- self.returnpath = returnpath
-
- def _running_execution_executing_executing_0_guard(self, parameters):
- returnvalue = parameters[0]
- success = parameters[1]
- request_id = parameters[2]
- return success and self.outstanding_execution == request_id
-
- def _running_execution_executing_executing_1_guard(self, parameters):
- returnvalue = parameters[0]
- success = parameters[1]
- request_id = parameters[2]
- return not success and self.outstanding_execution == request_id
-
- def _running_execution_paused_0_exec(self, parameters):
- source = parameters[0]
- args = parameters[1]
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/to_mvi/' + source, Event("HTTP_input", None, [json.dumps({'user': self.username, 'state': 'running'})])]))
-
- def _running_set_input_fetch_0_exec(self, parameters):
- source = parameters[0]
- args = parameters[1]
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/executor', Event("execute", None, [self.returnpath, self.username, 'set_input', args, self.request_id])]))
- if source is not None:
- self.outstanding_input[self.request_id] = source
- self.request_id += 1
-
- def _running_set_input_fetch_1_exec(self, parameters):
- returnvalue = parameters[0]
- success = parameters[1]
- request_id = parameters[2]
- source = self.outstanding_input.pop(request_id)
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/to_mvi/' + source, Event("HTTP_input", None, [json.dumps(returnvalue)])]))
- self.raiseInternalEvent(Event("set_input_done", None, []))
-
- def _running_set_input_fetch_1_guard(self, parameters):
- returnvalue = parameters[0]
- success = parameters[1]
- request_id = parameters[2]
- return request_id in self.outstanding_input
-
- def _running_get_output_queue_waiting_0_exec(self, parameters):
- source = parameters[0]
- args = parameters[1]
- self.output_queue.append(source)
-
- def _running_get_output_try_execute_0_exec(self, parameters):
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/executor', Event("execute", None, [self.returnpath, self.username, 'get_output', [], self.request_id])]))
- self.outstanding_output = self.request_id
- self.request_id += 1
-
- def _running_get_output_try_execute_0_guard(self, parameters):
- return self.outstanding_output is None and self.output_queue
-
- def _running_get_output_try_execute_1_exec(self, parameters):
- returnvalue = parameters[0]
- success = parameters[1]
- request_id = parameters[2]
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/to_mvi/' + self.output_queue.pop(0), Event("HTTP_input", None, [json.dumps(returnvalue)])]))
- self.outstanding_output = None
-
- def _running_get_output_try_execute_1_guard(self, parameters):
- returnvalue = parameters[0]
- success = parameters[1]
- request_id = parameters[2]
- return success and request_id == self.outstanding_output
-
- def _running_get_output_try_execute_2_exec(self, parameters):
- returnvalue = parameters[0]
- success = parameters[1]
- request_id = parameters[2]
- self.outstanding_output = None
-
- def _running_get_output_try_execute_2_guard(self, parameters):
- returnvalue = parameters[0]
- success = parameters[1]
- request_id = parameters[2]
- return not success and request_id == self.outstanding_output
-
- def initializeStatechart(self):
- # enter default state
- self.default_targets = self.states["/init"].getEffectiveTargetStates()
- RuntimeClassBase.initializeStatechart(self)
- class Executor(RuntimeClassBase):
- def __init__(self, controller):
- RuntimeClassBase.__init__(self, controller)
-
- self.semantics.big_step_maximality = StatechartSemantics.TakeMany
- self.semantics.internal_event_lifeline = StatechartSemantics.Queue
- self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
- self.semantics.priority = StatechartSemantics.SourceParent
- self.semantics.concurrency = StatechartSemantics.Single
-
- # build Statechart structure
- self.build_statechart_structure()
-
- # call user defined constructor
- Executor.user_defined_constructor(self)
-
- def user_defined_constructor(self):
- self.mvs = ModelverseState("../../bootstrap/bootstrap.m.gz")
- self.request_queue = [("", "", "load_primitives", [], None)]
- self.mvs.GC = True
- self.mvk = ModelverseKernel(self.mvs.read_root()[0])
- self.first = True
- self.mvs_response = None
-
- self.mvs_operations = {
- "CN": self.mvs.create_node,
- "CE": self.mvs.create_edge,
- "CNV": self.mvs.create_nodevalue,
- "CD": self.mvs.create_dict,
-
- "RV": self.mvs.read_value,
- "RO": self.mvs.read_outgoing,
- "RI": self.mvs.read_incoming,
- "RE": self.mvs.read_edge,
- "RD": self.mvs.read_dict,
- "RDN": self.mvs.read_dict_node,
- "RDNE": self.mvs.read_dict_node_edge,
- "RDE": self.mvs.read_dict_edge,
- "RRD": self.mvs.read_reverse_dict,
- "RR": self.mvs.read_root,
- "RDK": self.mvs.read_dict_keys,
-
- "DE": self.mvs.delete_edge,
- "DN": self.mvs.delete_node,
- }
-
- def user_defined_destructor(self):
- pass
-
-
- # builds Statechart structure
- def build_statechart_structure(self):
-
- # state <root>
- self.states[""] = State(0, self)
-
- # state /init
- self.states["/init"] = ParallelState(1, self)
-
- # state /init/raw_exec
- self.states["/init/raw_exec"] = State(2, self)
-
- # state /init/raw_exec/raw_exec
- self.states["/init/raw_exec/raw_exec"] = State(3, self)
-
- # state /init/queue
- self.states["/init/queue"] = State(4, self)
-
- # state /init/queue/queue
- self.states["/init/queue/queue"] = State(5, self)
-
- # state /init/execute
- self.states["/init/execute"] = State(6, self)
-
- # state /init/execute/idle
- self.states["/init/execute/idle"] = State(7, self)
-
- # state /init/execute/execution
- self.states["/init/execute/execution"] = State(8, self)
- self.states["/init/execute/execution"].setEnter(self._init_execute_execution_enter)
-
- # add children
- self.states[""].addChild(self.states["/init"])
- self.states["/init"].addChild(self.states["/init/raw_exec"])
- self.states["/init"].addChild(self.states["/init/queue"])
- self.states["/init"].addChild(self.states["/init/execute"])
- self.states["/init/raw_exec"].addChild(self.states["/init/raw_exec/raw_exec"])
- self.states["/init/queue"].addChild(self.states["/init/queue/queue"])
- self.states["/init/execute"].addChild(self.states["/init/execute/idle"])
- self.states["/init/execute"].addChild(self.states["/init/execute/execution"])
- self.states[""].fixTree()
- self.states[""].default_state = self.states["/init"]
- self.states["/init/raw_exec"].default_state = self.states["/init/raw_exec/raw_exec"]
- self.states["/init/queue"].default_state = self.states["/init/queue/queue"]
- self.states["/init/execute"].default_state = self.states["/init/execute/idle"]
-
- # transition /init/raw_exec/raw_exec
- _init_raw_exec_raw_exec_0 = Transition(self, self.states["/init/raw_exec/raw_exec"], [self.states["/init/raw_exec/raw_exec"]])
- _init_raw_exec_raw_exec_0.setAction(self._init_raw_exec_raw_exec_0_exec)
- _init_raw_exec_raw_exec_0.setTrigger(Event("raw_exec", None))
- self.states["/init/raw_exec/raw_exec"].addTransition(_init_raw_exec_raw_exec_0)
- _init_raw_exec_raw_exec_1 = Transition(self, self.states["/init/raw_exec/raw_exec"], [self.states["/init/raw_exec/raw_exec"]])
- _init_raw_exec_raw_exec_1.setAction(self._init_raw_exec_raw_exec_1_exec)
- _init_raw_exec_raw_exec_1.setTrigger(Event("get_mvk", None))
- self.states["/init/raw_exec/raw_exec"].addTransition(_init_raw_exec_raw_exec_1)
-
- # transition /init/queue/queue
- _init_queue_queue_0 = Transition(self, self.states["/init/queue/queue"], [self.states["/init/queue/queue"]])
- _init_queue_queue_0.setAction(self._init_queue_queue_0_exec)
- _init_queue_queue_0.setTrigger(Event("execute", None))
- self.states["/init/queue/queue"].addTransition(_init_queue_queue_0)
-
- # transition /init/execute/idle
- _init_execute_idle_0 = Transition(self, self.states["/init/execute/idle"], [self.states["/init/execute/execution"]])
- _init_execute_idle_0.setTrigger(None)
- _init_execute_idle_0.setGuard(self._init_execute_idle_0_guard)
- self.states["/init/execute/idle"].addTransition(_init_execute_idle_0)
-
- # transition /init/execute/execution
- _init_execute_execution_0 = Transition(self, self.states["/init/execute/execution"], [self.states["/init/execute/idle"]])
- _init_execute_execution_0.setAction(self._init_execute_execution_0_exec)
- _init_execute_execution_0.setTrigger(None)
- _init_execute_execution_0.setGuard(self._init_execute_execution_0_guard)
- self.states["/init/execute/execution"].addTransition(_init_execute_execution_0)
- _init_execute_execution_1 = Transition(self, self.states["/init/execute/execution"], [self.states["/init/execute/idle"]])
- _init_execute_execution_1.setTrigger(None)
- _init_execute_execution_1.setGuard(self._init_execute_execution_1_guard)
- self.states["/init/execute/execution"].addTransition(_init_execute_execution_1)
-
- def _init_execute_execution_enter(self):
- self.mvk.returnvalue = None
- self.mvk.success = True
- self.first = True
-
- self.returnpath, username, operation, params, self.request_id = self.request_queue.pop(0)
- reply = None
- commands = []
- while 1:
- commands = self.mvk.execute_yields(username, operation, params, reply)
- if commands is None:
- break
- reply = [self.mvs_operations[command[0]](*(command[1]))[0] for command in commands]
-
- def _init_raw_exec_raw_exec_0_exec(self, parameters):
- operations = parameters[0]
- source = parameters[1]
- reply = [self.mvs_operations[command[0]](*command[1]) for command in operations]
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, source, Event("raw_exec_reply", None, [reply])]))
-
- def _init_raw_exec_raw_exec_1_exec(self, parameters):
- source = parameters[0]
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, source, Event("get_mvk_reply", None, [self.mvk])]))
-
- def _init_queue_queue_0_exec(self, parameters):
- returnpath = parameters[0]
- username = parameters[1]
- operation = parameters[2]
- params = parameters[3]
- request_id = parameters[4]
- self.request_queue.append((("/" + returnpath) if returnpath is not None else None, username, operation, params, request_id))
-
- def _init_execute_idle_0_guard(self, parameters):
- return self.request_queue
-
- def _init_execute_execution_0_exec(self, parameters):
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent' + self.returnpath, Event("executed", None, [self.mvk.returnvalue, self.mvk.success, self.request_id])]))
-
- def _init_execute_execution_0_guard(self, parameters):
- return self.returnpath is not None
-
- def _init_execute_execution_1_guard(self, parameters):
- return self.returnpath is None
-
- def initializeStatechart(self):
- # enter default state
- self.default_targets = self.states["/init"].getEffectiveTargetStates()
- RuntimeClassBase.initializeStatechart(self)
- class ObjectManager(ObjectManagerBase):
- def __init__(self, controller):
- ObjectManagerBase.__init__(self, controller)
-
- def instantiate(self, class_name, construct_params):
- if class_name == "MvKController":
- instance = MvKController(self.controller, construct_params[0])
- instance.associations = {}
- instance.associations["to_mvs"] = Association("HTTPClient", 1, 1)
- instance.associations["to_mvi"] = Association("Server", 1, 1)
- instance.associations["users"] = Association("UserStatechart", 0, -1)
- instance.associations["executor"] = Association("Executor", 1, 1)
- elif class_name == "Server":
- instance = Server(self.controller, construct_params[0], construct_params[1])
- instance.associations = {}
- instance.associations["sockets"] = Association("Socket", 0, -1)
- instance.associations["parent"] = Association("MvKController", 1, 1)
- elif class_name == "Socket":
- instance = Socket(self.controller, construct_params[0])
- instance.associations = {}
- instance.associations["parent"] = Association("Server", 1, 1)
- elif class_name == "HTTPClient":
- instance = HTTPClient(self.controller, construct_params[0], construct_params[1])
- instance.associations = {}
- instance.associations["parent"] = Association("MvKController", 1, 1)
- elif class_name == "UserStatechart":
- instance = UserStatechart(self.controller, construct_params[0], construct_params[1])
- instance.associations = {}
- instance.associations["parent"] = Association("MvKController", 1, 1)
- elif class_name == "Executor":
- instance = Executor(self.controller)
- instance.associations = {}
- instance.associations["parent"] = Association("MvKController", 1, 1)
- else:
- raise Exception("Cannot instantiate class " + class_name)
- return instance
- class Controller(ThreadsControllerBase):
- def __init__(self, params, keep_running = None, behind_schedule_callback = None):
- if keep_running == None: keep_running = True
- if behind_schedule_callback == None: behind_schedule_callback = None
- ThreadsControllerBase.__init__(self, ObjectManager(self), keep_running, behind_schedule_callback)
- self.addInputPort("socket_in")
- self.addOutputPort("socket_out")
- self.object_manager.createInstance("MvKController", [params])
|