123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- <class name="Executor">
- <relationships>
- <association name="parent" class="MvKController" min="1" max="1"/>
- </relationships>
- <constructor>
- <parameter name="mvk"/>
- <body>
- <![CDATA[
- self.mvs = ModelverseState("../bootstrap/bootstrap.m.gz")
- self.request_queue = [("", "", "load_primitives", [], None)]
- self.mvs.GC = True
- self.mvk = mvk
- 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,
- }
- ]]>
- </body>
- </constructor>
- <method name="execute_modelverse">
- <parameter name="username"/>
- <parameter name="operation"/>
- <parameter name="params"/>
- <body>
- <![CDATA[
- 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]
- #for c, r in zip(commands, reply):
- # print("%s --> %s" % (c, r))
- ]]>
- </body>
- </method>
-
- <scxml initial="init">
- <parallel id="init">
- <state id="queue">
- <state id="queue">
- <transition event="execute" target=".">
- <parameter name="returnpath"/>
- <parameter name="username"/>
- <parameter name="operation"/>
- <parameter name="params"/>
- <parameter name="request_id"/>
- <script>
- print 'got execute event'
- self.request_queue.append(("/" + returnpath, username, operation, params, request_id))
- </script>
- </transition>
- </state>
- </state>
- <state id="execute" initial="idle">
- <state id="idle">
- <onentry>
- <script>
- print 'in idle'
- </script>
- </onentry>
- <transition cond="self.request_queue" target="../execution"/>
- </state>
- <state id="execution">
- <onentry>
- <script>
- try:
- _, username, operation, params, _ = self.request_queue[0]
- print 'executing %s %s' % (operation, params)
- self.mvs_commands = self.mvk.execute_yields(username, operation, params, self.mvs_response)
- except:
- import traceback
- traceback.print_exc()
- print("Exec error")
- #TODO for debugging
- sys.exit(0)
- self.mvs_commands = None
- </script>
- </onentry>
- <transition cond="self.mvs_commands is None" target="../idle">
- <script>
- returnpath, _, _, _, request_id = self.request_queue.pop(0)
- self.mvs_response = None
- </script>
- <raise event="executed" scope="narrow" target="'parent' + returnpath">
- <parameter expr="self.mvk.returnvalue"/>
- <parameter expr="self.mvk.success"/>
- <parameter expr="request_id"/>
- </raise>
- <script>
- self.mvk.returnvalue = None
- self.mvk.success = True
- self.first = True
- </script>
- </transition>
- <transition cond="self.mvs_commands is not None and len(self.mvs_commands) > 0" target="../waiting_for_response">
- <raise event="HTTP_input" scope="narrow" target="'parent/to_mvs'">
- <parameter expr="'requests=%s' % json.dumps(self.mvs_commands)"/>
- <parameter expr="'parent/executor'"/>
- </raise>
- </transition>
- <transition cond="self.mvs_commands is not None and len(self.mvs_commands) == 0" target=".">
- <script>
- self.mvs_response = []
- </script>
- </transition>
- </state>
- <state id="waiting_for_response">
- <transition event="HTTP_output" target="../execution">
- <parameter name="data"/>
- <script>
- self.mvs_response = [v[0] for v in json.loads(data["data"])]
- </script>
- </transition>
- <onexit>
- <script>
- print 'leaving waiting_for_response'
- </script>
- </onexit>
- <onentry>
- <script>
- print 'entering waiting_for_response'
- </script>
- </onentry>
- </state>
- </state>
- </parallel>
- </scxml>
- </class>
|