|
@@ -1,12 +1,11 @@
|
|
|
import urllib
|
|
|
import urllib2
|
|
|
+from urllib2 import URLError
|
|
|
import json
|
|
|
import random
|
|
|
-from urllib2 import URLError
|
|
|
import sys
|
|
|
import time
|
|
|
import threading
|
|
|
-import Queue
|
|
|
|
|
|
from sccd.runtime.statecharts_core import Event
|
|
|
|
|
@@ -24,6 +23,8 @@ MODE_SERVICE = 6
|
|
|
sys.path.append(COMPILER_PATH)
|
|
|
from hutn_compiler.compiler import main as do_compile
|
|
|
|
|
|
+import socket2event
|
|
|
+
|
|
|
# Exceptions
|
|
|
class ModelverseException(Exception):
|
|
|
pass
|
|
@@ -103,7 +104,7 @@ def _exec_on_statechart(statechart):
|
|
|
# Expand the event and make it HTTP input
|
|
|
_input(input_event.parameters)
|
|
|
|
|
|
- time.sleep(0.01)
|
|
|
+ time.sleep(0.02)
|
|
|
|
|
|
thrd = threading.Thread(target=_exec_sc, args=statechart)
|
|
|
thrd.daemon = True
|
|
@@ -168,7 +169,6 @@ def _input(value, port=None):
|
|
|
urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "data": value, "taskname": port}))).read()
|
|
|
else:
|
|
|
value = json.dumps(value)
|
|
|
- #print("Set input: " + str(value))
|
|
|
urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": value, "taskname": port}))).read()
|
|
|
|
|
|
def _input_raw(value, taskname):
|
|
@@ -212,8 +212,7 @@ def _compile_model(code):
|
|
|
def _output(expected=None):
|
|
|
try:
|
|
|
while len(outputs) < 2:
|
|
|
- time.sleep(0.5)
|
|
|
- #print("Sleep for output: " + str(outputs))
|
|
|
+ time.sleep(0.02)
|
|
|
|
|
|
del outputs[0]
|
|
|
#print("[OUT] %s" % outputs[0])
|
|
@@ -228,7 +227,7 @@ def _last_output():
|
|
|
return outputs[0]
|
|
|
|
|
|
# Raise common exceptions
|
|
|
-def _handle_output(requested=None, split=None):
|
|
|
+def _handle_output(requested=None, split=False):
|
|
|
value = _output()
|
|
|
if value.startswith("Model exists: "):
|
|
|
raise ModelExists(value.split(": ", 1)[1])
|
|
@@ -243,14 +242,14 @@ def _handle_output(requested=None, split=None):
|
|
|
elif value.startswith("Attribute not found: "):
|
|
|
raise NoSuchAttribute(value.split(": ", 1)[1])
|
|
|
elif requested is not None and value.startswith(requested):
|
|
|
- if split is None:
|
|
|
+ if not split:
|
|
|
return value
|
|
|
else:
|
|
|
- splitted = value.strip().split(split, 1)
|
|
|
- if len(splitted) == 1:
|
|
|
- return ""
|
|
|
+ splitted = value.strip().split(" ", 1)
|
|
|
+ if len(splitted) > 1:
|
|
|
+ return splitted[1].split("\n")
|
|
|
else:
|
|
|
- return splitted[1].rstrip()
|
|
|
+ return []
|
|
|
else:
|
|
|
raise InterfaceMismatch(value)
|
|
|
|
|
@@ -303,6 +302,7 @@ def init(address_param="127.0.0.1:8001", timeout=20.0):
|
|
|
address = "http://" + address_param
|
|
|
start_time = time.time()
|
|
|
task = random.random()
|
|
|
+
|
|
|
while 1:
|
|
|
try:
|
|
|
_input_raw('"%s"' % task, "task_manager")
|
|
@@ -314,6 +314,8 @@ def init(address_param="127.0.0.1:8001", timeout=20.0):
|
|
|
else:
|
|
|
time.sleep(0.1)
|
|
|
|
|
|
+ mode = MODE_UNAUTHORIZED
|
|
|
+
|
|
|
global outputs
|
|
|
global taskname
|
|
|
|
|
@@ -399,19 +401,16 @@ def model_list(location):
|
|
|
"""List all models."""
|
|
|
_goto_mode(MODE_MODELLING)
|
|
|
_input(["model_list", location])
|
|
|
- return set(_handle_output("Success: ", split=" ").split("\n"))
|
|
|
+ return set(_handle_output("Success: ", split=True))
|
|
|
|
|
|
def model_list_full(location):
|
|
|
"""List full information on all models."""
|
|
|
_goto_mode(MODE_MODELLING)
|
|
|
_input(["model_list_full", location])
|
|
|
- output = _handle_output("Success: ", split=" ")
|
|
|
- if output == "":
|
|
|
- return set([])
|
|
|
+ output = _handle_output("Success: ", split=True)
|
|
|
|
|
|
lst = set([])
|
|
|
- value = output.strip().split("\n")
|
|
|
- for v in value:
|
|
|
+ for v in output:
|
|
|
m = v.strip()
|
|
|
perm, own, grp, m = m.split(" ", 3)
|
|
|
lst.add((m, own, grp, perm))
|
|
@@ -426,7 +425,7 @@ def verify(model_name, metamodel_name=None):
|
|
|
metamodel_name = _get_metamodel(model_name)
|
|
|
|
|
|
_input(["verify", model_name, metamodel_name])
|
|
|
- return _handle_output("Success: ", split=" ")
|
|
|
+ return _handle_output("Success: ", split=True)[0]
|
|
|
|
|
|
def model_overwrite(model_name, new_model=None, metamodel_name=None):
|
|
|
"""Upload a new model and overwrite an existing model."""
|
|
@@ -468,16 +467,14 @@ def model_render(model_name, mapper_name):
|
|
|
_goto_mode(MODE_MODELLING)
|
|
|
|
|
|
_input(["model_render", model_name, mapper_name])
|
|
|
- return json.loads(_handle_output("Success: ", split=" "))
|
|
|
+ return json.loads(_handle_output("Success: ", split=True)[0])
|
|
|
|
|
|
def transformation_between(source, target):
|
|
|
_goto_mode(MODE_MODELLING)
|
|
|
|
|
|
_input(["transformation_between", source, target])
|
|
|
- output = _handle_output("Success: ", split=" ")
|
|
|
- if output == "":
|
|
|
- return set([])
|
|
|
- return set([v for v in output.split("\n")])
|
|
|
+ output = _handle_output("Success: ", split=True)
|
|
|
+ return set(output)
|
|
|
|
|
|
def transformation_add_MT(source_metamodels, target_metamodels, operation_name, code, callback=lambda: None):
|
|
|
"""Create a new model transformation."""
|
|
@@ -639,13 +636,10 @@ def transformation_list():
|
|
|
_goto_mode(MODE_MODELLING)
|
|
|
|
|
|
_input("transformation_list")
|
|
|
- output = _handle_output("Success: ", split=" ")
|
|
|
- if output == "":
|
|
|
- return set([])
|
|
|
+ output = _handle_output("Success: ", split=True)
|
|
|
|
|
|
lst = set([])
|
|
|
- value = output.strip().split("\n")
|
|
|
- for v in value:
|
|
|
+ for v in output:
|
|
|
t, m = v.strip().split(" ", 1)
|
|
|
t = t[1:-1].strip()
|
|
|
m = m.strip().split(":")[0].strip()
|
|
@@ -767,10 +761,8 @@ def element_list(model_name):
|
|
|
|
|
|
_input("list_full")
|
|
|
lst = set([])
|
|
|
- output = _handle_output("Success: ", split=" ")
|
|
|
- if output == "":
|
|
|
- return set([])
|
|
|
- for v in output.split("\n"):
|
|
|
+ output = _handle_output("Success: ", split=True)
|
|
|
+ for v in output:
|
|
|
m, mm = v.split(":")
|
|
|
m = m.strip()
|
|
|
mm = mm.strip()
|
|
@@ -783,10 +775,8 @@ def types(model_name):
|
|
|
|
|
|
_input("types")
|
|
|
lst = set([])
|
|
|
- output = _handle_output("Success: ", split=" ")
|
|
|
- if output == "":
|
|
|
- return set([])
|
|
|
- for v in output.split("\n"):
|
|
|
+ output = _handle_output("Success: ", split=True)
|
|
|
+ for v in output:
|
|
|
m, mm = v.split(":")
|
|
|
m = m.strip()
|
|
|
lst.add(m)
|
|
@@ -798,10 +788,8 @@ def types_full(model_name):
|
|
|
|
|
|
_input("types")
|
|
|
lst = set([])
|
|
|
- output = _handle_output("Success: ", split=" ")
|
|
|
- if output == "":
|
|
|
- return set([])
|
|
|
- for v in output.split("\n"):
|
|
|
+ output = _handle_output("Success: ", split=True)
|
|
|
+ for v in output:
|
|
|
m, mm = v.split(":")
|
|
|
m = m.strip()
|
|
|
mm = mm.strip()
|
|
@@ -813,8 +801,7 @@ def read(model_name, ID):
|
|
|
_goto_mode(MODE_MODIFY, model_name)
|
|
|
|
|
|
_input(["read", ID])
|
|
|
- output = _handle_output("Success: ", split=" ")
|
|
|
- v = output.split("\n")
|
|
|
+ v = _handle_output("Success: ", split=True)
|
|
|
t = v[1].split(":")[1].strip()
|
|
|
if (not v[2].startswith("Source:")):
|
|
|
rval = (t, None)
|
|
@@ -829,11 +816,10 @@ def read_attrs(model_name, ID):
|
|
|
_goto_mode(MODE_MODIFY, model_name)
|
|
|
|
|
|
_input(["read", ID])
|
|
|
- output = _handle_output("Success: ", split=" ")
|
|
|
- v = output.split("\n")
|
|
|
+ output = _handle_output("Success: ", split=True)
|
|
|
searching = True
|
|
|
rval = {}
|
|
|
- for r in v:
|
|
|
+ for r in output:
|
|
|
if searching:
|
|
|
if r == "Attributes:":
|
|
|
# Start working on attributes
|
|
@@ -862,7 +848,7 @@ def instantiate(model_name, typename, edge=None, ID=""):
|
|
|
_input(["instantiate_node", typename, ID])
|
|
|
else:
|
|
|
_input(["instantiate_edge", typename, ID, edge[0], edge[1]])
|
|
|
- return _handle_output("Success: ", split=" ")
|
|
|
+ return _handle_output("Success: ", split=True)[0]
|
|
|
|
|
|
def delete_element(model_name, ID):
|
|
|
"""Delete the element with the given ID"""
|
|
@@ -906,36 +892,30 @@ def read_outgoing(model_name, ID, typename):
|
|
|
_goto_mode(MODE_MODIFY, model_name)
|
|
|
|
|
|
_input(["read_outgoing", ID, typename])
|
|
|
- output = _handle_output("Success: ", split=" ")
|
|
|
- if output == "":
|
|
|
- return set([])
|
|
|
- else:
|
|
|
- return set(output.split("\n"))
|
|
|
+ output = _handle_output("Success: ", split=True)
|
|
|
+ return set(output)
|
|
|
|
|
|
def read_incoming(model_name, ID, typename):
|
|
|
"""Returns a list of all incoming associations of a specific type ("" = all)"""
|
|
|
_goto_mode(MODE_MODIFY, model_name)
|
|
|
|
|
|
_input(["read_incoming", ID, typename])
|
|
|
- output = _handle_output("Success: ", split=" ")
|
|
|
- if output == "":
|
|
|
- return set([])
|
|
|
- else:
|
|
|
- return set(output.split("\n"))
|
|
|
+ output = _handle_output("Success: ", split=True)
|
|
|
+ return set(output)
|
|
|
|
|
|
def read_association_source(model_name, ID):
|
|
|
"""Returns the source of an association."""
|
|
|
_goto_mode(MODE_MODIFY, model_name)
|
|
|
|
|
|
_input(["read_association_source", ID])
|
|
|
- return _handle_output("Success: ", split=" ")
|
|
|
+ return _handle_output("Success: ", split=True)[0]
|
|
|
|
|
|
def read_association_destination(model_name, ID):
|
|
|
"""Returns the destination of an association."""
|
|
|
_goto_mode(MODE_MODIFY, model_name)
|
|
|
|
|
|
_input(["read_association_destination", ID])
|
|
|
- return _handle_output("Success: ", split=" ")
|
|
|
+ return _handle_output("Success: ", split=True)[0]
|
|
|
|
|
|
##### To document:
|
|
|
|
|
@@ -955,7 +935,7 @@ def service_register(name, function):
|
|
|
|
|
|
# Now we are in service-mode
|
|
|
mode = MODE_SERVICE
|
|
|
- port = _handle_output("Success: ", split=" ")
|
|
|
+ port = _handle_output("Success: ", split=True)[0]
|
|
|
|
|
|
# Process events in the background!
|
|
|
threading.Thread(target=service_process, args=[port]).start()
|
|
@@ -996,7 +976,7 @@ def element_list_nice(model_name):
|
|
|
|
|
|
_input(["element_list_nice", model_name, _get_metamodel(model_name)])
|
|
|
|
|
|
- data = _handle_output("Success: ", split=" ")
|
|
|
+ data = _handle_output("Success: ", split=True)[0]
|
|
|
try:
|
|
|
return json.loads(data)
|
|
|
except:
|
|
@@ -1008,29 +988,23 @@ def connections_between(model_name, source_element, target_element):
|
|
|
_goto_mode(MODE_MODIFY, model_name)
|
|
|
|
|
|
_input(["connections_between", source_element, target_element])
|
|
|
- output = _handle_output("Success: ", split=" ")
|
|
|
- if output == "":
|
|
|
- return set([])
|
|
|
- else:
|
|
|
- return set(output.split("\n"))
|
|
|
+ output = _handle_output("Success: ", split=True)
|
|
|
+ return set(output)
|
|
|
|
|
|
def define_attribute(model_name, node, attr_name, attr_type):
|
|
|
"""Create a new attribute, which can be instantiated one meta-level below."""
|
|
|
_goto_mode(MODE_MODIFY, model_name)
|
|
|
|
|
|
_input(["define_attribute", node, attr_name, attr_type])
|
|
|
- return _handle_output("Success: ", split=" ")
|
|
|
+ return _handle_output("Success: ", split=True)[0]
|
|
|
|
|
|
def all_instances(model_name, type_name):
|
|
|
"""Returns a list of all elements of a specific type."""
|
|
|
_goto_mode(MODE_MODIFY, model_name)
|
|
|
|
|
|
_input(["all_instances", type_name])
|
|
|
- output = _handle_output("Success: ", split=" ")
|
|
|
- if output == "":
|
|
|
- return set([])
|
|
|
- else:
|
|
|
- return set(output.split("\n"))
|
|
|
+ output = _handle_output("Success: ", split=True)
|
|
|
+ return set(output)
|
|
|
|
|
|
def service_poll(port):
|
|
|
"""Checks whether or not the Modelverse side has any input ready to be processed."""
|