|
@@ -1,11 +1,10 @@
|
|
|
import urllib
|
|
|
-import urllib2
|
|
|
-from urllib2 import URLError
|
|
|
import json
|
|
|
import random
|
|
|
import sys
|
|
|
import time
|
|
|
import threading
|
|
|
+import uuid
|
|
|
|
|
|
from sccd.runtime.statecharts_core import Event
|
|
|
|
|
@@ -64,20 +63,25 @@ class UnknownMetamodellingHierarchy(ModelverseException):
|
|
|
|
|
|
# Helper functions and configuration: do not use yourself!
|
|
|
taskname = None
|
|
|
-address = None
|
|
|
mode = MODE_UNCONNECTED
|
|
|
prev_mode = None
|
|
|
current_model = None
|
|
|
registered_metamodels = {}
|
|
|
outputs = [None]
|
|
|
+ctrl_input = None
|
|
|
+ctrl_output = None
|
|
|
|
|
|
def _output_thread(outputs, taskname):
|
|
|
- while taskname is None:
|
|
|
- time.sleep(0.1)
|
|
|
+ req_out = ctrl_output.addOutputListener("request_out")
|
|
|
+ my_id = str(uuid.uuid4())
|
|
|
|
|
|
try:
|
|
|
while 1:
|
|
|
- outputs.append(json.loads(urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "get_output", "taskname": taskname}))).read()))
|
|
|
+ ctrl_output.addInput(Event("HTTP_input", "request_in", [urllib.urlencode({"op": "get_output", "taskname": taskname}), my_id]))
|
|
|
+
|
|
|
+ event = req_out.fetch(-1)
|
|
|
+ if event.parameters[1] == my_id:
|
|
|
+ outputs.append(json.loads(event.parameters[0]))
|
|
|
except:
|
|
|
pass
|
|
|
|
|
@@ -166,14 +170,14 @@ def _input(value, port=None):
|
|
|
port = taskname
|
|
|
if isinstance(value, type([])):
|
|
|
value = json.dumps(value)
|
|
|
- urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "data": value, "taskname": port}))).read()
|
|
|
+ ctrl_input.addInput(Event("HTTP_input", "request_in", [urllib.urlencode({"op": "set_input", "taskname": port, "data": value}), None]))
|
|
|
else:
|
|
|
value = json.dumps(value)
|
|
|
- urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": value, "taskname": port}))).read()
|
|
|
+ ctrl_input.addInput(Event("HTTP_input", "request_in", [urllib.urlencode({"op": "set_input", "taskname": port, "value": value}), None]))
|
|
|
|
|
|
def _input_raw(value, taskname):
|
|
|
# Ugly json encoding of primitives
|
|
|
- urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": value, "taskname": taskname}))).read()
|
|
|
+ ctrl_input.addInput(Event("HTTP_input", "request_in", [urllib.urlencode({"op": "set_input", "taskname": taskname, "value": value}), None]))
|
|
|
|
|
|
def _compile_AL(code):
|
|
|
# Compile an action language file and send the compiled code
|
|
@@ -297,22 +301,48 @@ def alter_context(model_name, metamodel_name):
|
|
|
# Main MvC operations
|
|
|
def init(address_param="127.0.0.1:8001", timeout=20.0):
|
|
|
"""Starts up the connection to the Modelverse."""
|
|
|
+ # Start up the HTTP Client SC
|
|
|
+ import http_client
|
|
|
+ global ctrl_input
|
|
|
+ global ctrl_output
|
|
|
+
|
|
|
+ if ctrl_input is not None:
|
|
|
+ ctrl_input.stop()
|
|
|
+ if ctrl_output is not None:
|
|
|
+ ctrl_output.stop()
|
|
|
+
|
|
|
+ ctrl_input = http_client.Controller()
|
|
|
+ ctrl_output = http_client.Controller()
|
|
|
+ controllers = [ctrl_input, ctrl_output]
|
|
|
+
|
|
|
+ addr, port = address_param.split(":", 1)
|
|
|
+ port = int(port)
|
|
|
+
|
|
|
+ for ctrl in controllers:
|
|
|
+ listener = ctrl.addOutputListener("request_out")
|
|
|
+ socket2event.boot_translation_service(ctrl)
|
|
|
+ thrd = threading.Thread(target=ctrl.start)
|
|
|
+ thrd.daemon = True
|
|
|
+ thrd.start()
|
|
|
+
|
|
|
+ evt = listener.fetch(-1)
|
|
|
+ if evt.name != "http_client_initialized":
|
|
|
+ raise Exception("HTTP client did not behave as expected during init: " + str(evt.name))
|
|
|
+
|
|
|
+ ctrl.addInput(Event("connect", "request_in", [(addr, port), timeout]))
|
|
|
+
|
|
|
+ evt = listener.fetch(-1)
|
|
|
+
|
|
|
+ if evt.name == "http_client_timeout":
|
|
|
+ raise Exception("HTTP client timeout")
|
|
|
+ if evt.name != "http_client_ready":
|
|
|
+ raise Exception("HTTP client did not behave as expected during connect: " + str(evt.name))
|
|
|
+
|
|
|
global mode
|
|
|
- global address
|
|
|
- address = "http://" + address_param
|
|
|
start_time = time.time()
|
|
|
task = random.random()
|
|
|
|
|
|
- while 1:
|
|
|
- try:
|
|
|
- _input_raw('"%s"' % task, "task_manager")
|
|
|
- mode = MODE_UNAUTHORIZED
|
|
|
- break
|
|
|
- except URLError as e:
|
|
|
- if time.time() - start_time > timeout:
|
|
|
- raise ConnectionError(e.reason)
|
|
|
- else:
|
|
|
- time.sleep(0.1)
|
|
|
+ _input_raw('"%s"' % task, "task_manager")
|
|
|
|
|
|
mode = MODE_UNAUTHORIZED
|
|
|
|