Pārlūkot izejas kodu

Make sure that the Modelverse has both modelverse implementations, by
default the SCCD one is used

Yentl Van Tendeloo 8 gadi atpakaļ
vecāks
revīzija
359a2e76a0
2 mainītis faili ar 1084 papildinājumiem un 21 dzēšanām
  1. 51 21
      wrappers/modelverse.py
  2. 1033 0
      wrappers/modelverse_code.py

+ 51 - 21
wrappers/modelverse.py

@@ -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
 

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1033 - 0
wrappers/modelverse_code.py