Преглед на файлове

More complete check for writing model to root

Yentl Van Tendeloo преди 7 години
родител
ревизия
aac7e5b81a

+ 19 - 18
bootstrap/core_algorithm.alc

@@ -267,6 +267,7 @@ Void function new_task():
 				// Now create a folder for this user's models!
 				current_user_id = get_user_id("admin")
 				create_folders(user_id, "users/" + username)
+				log("User folder created for " + username)
 				current_user_id = user_id
 				break!
 			else:
@@ -1164,34 +1165,34 @@ String function cmd_model_add(type : String, name : String, code : String):
 	String type_id
 	Element new_model
 	String new_model_id
+	Element mm
 
 	type_id = get_entry_id(type)
 	if (type_id != ""):
 		// Type exists
 		if (allow_read(current_user_id, type_id)):
 			// And is readable
-			if (element_neq(create_folders(current_user_id, get_foldername(name)), read_root())):
-				if (allow_write(current_user_id, get_entry_id(get_foldername(name)))):
-					if (get_entry_id(name) == ""):
-						// Model doesn't exist yet
-						Element mm
-						mm = get_full_model(type_id, get_entry_id("formalisms/SimpleClassDiagrams"))
-						if (element_eq(mm, read_root())):
-							return "Type is not typed by formalisms/SimpleClassDiagrams: " + type!
-
-						new_model = compile_model(code, mm)
-
-						if (is_physical_string(new_model)):
-							return "Compilation error: " + cast_string(new_model)!
-
-						model_create(new_model, name, type_id, "Model")
-						return "Success"!
+			mm = get_full_model(type_id, get_entry_id("formalisms/SimpleClassDiagrams"))
+			if (element_neq(mm, read_root())):
+				if (element_neq(create_folders(current_user_id, get_foldername(name)), read_root())):
+					if (allow_write(current_user_id, get_entry_id(get_foldername(name)))):
+						if (get_entry_id(name) == ""):
+							// Model doesn't exist yet
+							new_model = compile_model(code, mm)
+
+							if (is_physical_string(new_model)):
+								return "Compilation error: " + cast_string(new_model)!
+
+							model_create(new_model, name, type_id, "Model")
+							return "Success"!
+						else:
+							return "Model exists: " + name!
 					else:
-						return "Model exists: " + name!
+						return "Write permission denied to: " + name!
 				else:
 					return "Write permission denied to: " + name!
 			else:
-				return "Write permission denied to: " + name!
+				return "Type is not typed by formalisms/SimpleClassDiagrams: " + type!
 		else:
 			return "Read permission denied to: " + type!
 	else:

+ 1 - 0
bootstrap/task_manager.alc

@@ -19,6 +19,7 @@ Void function task_management():
 	while (True):
 		while (True):
 			if (bool_not(other_has_output("task_manager"))):
+				log("Output is gone...")
 				while (dict_in(read_root(), taskname)):
 					taskname = cast_string(random_string(20))
 				break!

+ 2 - 0
hybrid_server/classes/mvkcontroller.xml

@@ -150,6 +150,8 @@
                                     self.forward = (data["taskname"], "input", value)
                                     self.HTTP_reply = "OK"
                                 elif data["op"] == "get_output":
+                                    if data["taskname"] == "task_manager":
+                                        print("Get output for " + str(data["taskname"]))
                                     self.forward = (data["taskname"], "output", self.source)
                                     self.HTTP_reply = None
                                 elif data["op"] == "pause":

+ 1 - 0
hybrid_server/classes/socket.xml

@@ -133,6 +133,7 @@
                             try:
                                 params = dict([p.split('=') for p in data.split('&')])
                                 data = {k: unquote_plus(v) for k, v in params.items()}
+                                print("Received data: " + str(data))
                             except Exception as e:
                                 print("Problem receiving data in socket: ")
                                 print(str(e))

+ 2 - 0
hybrid_server/classes/task.xml

@@ -151,6 +151,8 @@
                             <state id="output">
                                 <onentry>
                                     <script>
+                                        if self.taskname == "task_manager":
+                                            print("Output queue: " + str(self.output_queue))
                                         if self.output_queue:
                                             if self.execute_modelverse(self.taskname, "get_output", []):
                                                 if self.mvk.success:

+ 7 - 0
unit/test_all.py

@@ -269,6 +269,13 @@ class TestModelverse(unittest.TestCase):
         except WritePermissionDenied:
             assert model_list("users/") == set(["user/", "admin/", "LoLA/", "pypdevs_batch_service/", "HUTN/", "JSON/", "file/", "pypdevs_service/"])
 
+        model_add("users/user/test/c", "users/user/test/a")
+        try:
+            model_add("users/user/test/d", "users/user/test/c")
+            self.fail()
+        except UnknownM3:
+            assert model_list("users/user/test") == set(["a", "b", "c"])
+
     """
     def test_op_model_move(self):
     def test_op_model_delete(self):

+ 8 - 1
wrappers/classes/http_client.xml

@@ -54,6 +54,9 @@
                         <parameter expr="self.socket"/>
                         <parameter expr="self.address"/>
                     </raise>
+                    <script>
+                        print("Connecting ...")
+                    </script>
                 </onentry>
 
                 <transition port="socket_in" event="error_socket" target="../cooldown"/>
@@ -65,7 +68,11 @@
             </state>
 
             <state id="cooldown">
-                <transition after="0.1" target="../connecting"/>
+                <transition after="0.1" target="../connecting">
+                    <script>
+                        print("COOLDOWN")
+                    </script>
+                </transition>
             </state>
 
             <transition after="self.timeout" target="../waiting">

+ 14 - 0
wrappers/classes/modelverse.xml

@@ -160,6 +160,7 @@
                             #print("Got input (%s): %s" % (self.taskname, data))
                             if self.taskname == "task_manager":
                                 self.controller.taskname = self.taskname = json.loads(data)
+                                print("Got taskname: " + data)
                             else:
                                 self.responses.append(json.loads(data))
                         </script>
@@ -175,6 +176,7 @@
                             #print("Got input (%s): %s" % (self.taskname, data))
                             if self.taskname == "task_manager":
                                 self.controller.taskname = self.taskname = json.loads(data)
+                                print("Got taskname: " + data)
                             else:
                                 self.responses.append(json.loads(data))
                         </script>
@@ -211,6 +213,9 @@
                                 <parameter expr="self.address"/>
                                 <parameter expr="self.timeout"/>
                             </raise>
+                            <script>
+                                print("CONNECT HTTP")
+                            </script>
                         </transition>
 
                         <transition cond="self.i == 2 and self.taskname != 'task_manager'" target="../../wait_for_action/connected">
@@ -225,12 +230,14 @@
                         <transition event="http_client_ready" cond="self.i == 0" target="../connect_http_client">
                             <script>
                                 self.i += 1
+                                print("Got first HTTP ready")
                             </script>
                         </transition>
 
                         <transition event="http_client_ready" cond="self.i == 1" target="../connect_http_client">
                             <script>
                                 self.i += 1
+                                print("RAISE get output")
                             </script>
                             <raise event="HTTP_input" target="self.http_clients[1]">
                                 <parameter expr='urlencode({"op": "get_output", "taskname": self.taskname})'/>
@@ -1382,6 +1389,13 @@
                         </raise>
                     </transition>
 
+                    <transition cond="self.expect_response_partial('Type is not typed by formalisms/SimpleClassDiagrams: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'UnknownM3'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
                     <transition cond="self.expect_response_partial('Element exists: ', pop=False)" target="../wait_for_action/history">
                         <raise event="exception">
                             <parameter expr="'ElementExists'"/>

+ 3 - 0
wrappers/modelverse.py

@@ -21,6 +21,9 @@ class ModelverseException(Exception):
 class UnknownError(ModelverseException):
     pass
 
+class UnknownM3(ModelverseException):
+    pass
+
 class UnknownIdentifier(ModelverseException):
     pass
 

+ 47 - 26
wrappers/modelverse_SCCD.py

@@ -1,7 +1,7 @@
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
-Date:   Thu Jun  7 16:08:00 2018
+Date:   Thu Jun  7 16:50:26 2018
 
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
@@ -1798,6 +1798,11 @@ class Modelverse(RuntimeClassBase):
         _initialized_behaviour_operations_16.setTrigger(None)
         _initialized_behaviour_operations_16.setGuard(self._initialized_behaviour_operations_16_guard)
         self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_16)
+        _initialized_behaviour_operations_17 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_17.setAction(self._initialized_behaviour_operations_17_exec)
+        _initialized_behaviour_operations_17.setTrigger(None)
+        _initialized_behaviour_operations_17.setGuard(self._initialized_behaviour_operations_17_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_17)
         
         # transition /initialized/behaviour/wait_for_action
         _initialized_behaviour_wait_for_action_0 = Transition(self, self.states["/initialized/behaviour/wait_for_action"], [self.states["/initialized/behaviour/wait_for_action/history"]])
@@ -2188,83 +2193,89 @@ class Modelverse(RuntimeClassBase):
         return self.expect_response_partial('Attribute exists: ', pop=False)
     
     def _initialized_behaviour_operations_4_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['ElementExists', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['UnknownM3', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_4_guard(self, parameters):
-        return self.expect_response_partial('Element exists: ', pop=False)
+        return self.expect_response_partial('Type is not typed by formalisms/SimpleClassDiagrams: ', pop=False)
     
     def _initialized_behaviour_operations_5_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['ReadPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['ElementExists', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_5_guard(self, parameters):
-        return self.expect_response_partial('Read permission denied to: ', pop=False)
+        return self.expect_response_partial('Element exists: ', pop=False)
     
     def _initialized_behaviour_operations_6_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['WritePermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['ReadPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_6_guard(self, parameters):
-        return self.expect_response_partial('Write permission denied to: ', pop=False)
+        return self.expect_response_partial('Read permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_7_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['WritePermissionDenied', self.current_model]))
+        self.raiseInternalEvent(Event("exception", None, ['WritePermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_7_guard(self, parameters):
-        return self.expect_response('Write permission denied', pop=True)
+        return self.expect_response_partial('Write permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_8_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['ExecutePermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['WritePermissionDenied', self.current_model]))
     
     def _initialized_behaviour_operations_8_guard(self, parameters):
-        return self.expect_response_partial('Execute permission denied to: ', pop=False)
+        return self.expect_response('Write permission denied', pop=True)
     
     def _initialized_behaviour_operations_9_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['GroupPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['ExecutePermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_9_guard(self, parameters):
-        return self.expect_response_partial('Group permission denied to: ', pop=False)
+        return self.expect_response_partial('Execute permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_10_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UserPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['GroupPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_10_guard(self, parameters):
-        return self.expect_response_partial('User permission denied to: ', pop=False)
+        return self.expect_response_partial('Group permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_11_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['AdminPermissionDenied', 'Admin permissions are required for this operation!']))
+        self.raiseInternalEvent(Event("exception", None, ['UserPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_11_guard(self, parameters):
-        return self.expect_response_partial('Admin permission denied', pop=True)
+        return self.expect_response_partial('User permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_12_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['InterfaceMismatch', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['AdminPermissionDenied', 'Admin permissions are required for this operation!']))
     
     def _initialized_behaviour_operations_12_guard(self, parameters):
-        return self.expect_response_partial('Incorrect format: ', pop=False)
+        return self.expect_response_partial('Admin permission denied', pop=True)
     
     def _initialized_behaviour_operations_13_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UnknownElement', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['InterfaceMismatch', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_13_guard(self, parameters):
-        return self.expect_response_partial('Element not found: ', pop=False)
+        return self.expect_response_partial('Incorrect format: ', pop=False)
     
     def _initialized_behaviour_operations_14_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UnknownLocation', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['UnknownElement', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_14_guard(self, parameters):
-        return self.expect_response_partial('Location not found: ', pop=False)
+        return self.expect_response_partial('Element not found: ', pop=False)
     
     def _initialized_behaviour_operations_15_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UnknownMetamodellingHierarchy', 'Metamodelling hierarchy could not be resolved or automatically inferred: there is no typing relation between your specified model and metamodel (%s)' % self.responses.pop(0)]))
+        self.raiseInternalEvent(Event("exception", None, ['UnknownLocation', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_15_guard(self, parameters):
-        return self.expect_response_partial('Conformance hierarchy unknown for: ', pop=False)
+        return self.expect_response_partial('Location not found: ', pop=False)
     
     def _initialized_behaviour_operations_16_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['UnknownMetamodellingHierarchy', 'Metamodelling hierarchy could not be resolved or automatically inferred: there is no typing relation between your specified model and metamodel (%s)' % self.responses.pop(0)]))
+    
+    def _initialized_behaviour_operations_16_guard(self, parameters):
+        return self.expect_response_partial('Conformance hierarchy unknown for: ', pop=False)
+    
+    def _initialized_behaviour_operations_17_exec(self, parameters):
         #print("Unknown Error: " + self.responses[0])
         pass
         self.raiseInternalEvent(Event("exception", None, ['UnknownError', 'Error: %s' % self.responses.pop(0)]))
     
-    def _initialized_behaviour_operations_16_guard(self, parameters):
+    def _initialized_behaviour_operations_17_guard(self, parameters):
         return self.expect_response_partial('', pop=False)
     
     def _initialized_behaviour_wait_for_action_0_exec(self, parameters):
@@ -2452,6 +2463,7 @@ class Modelverse(RuntimeClassBase):
         #print("Got input (%s): %s" % (self.taskname, data))
         if self.taskname == "task_manager":
             self.controller.taskname = self.taskname = json.loads(data)
+            print("Got taskname: " + data)
         else:
             self.responses.append(json.loads(data))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.http_clients[1], Event("HTTP_input", None, [urlencode({"op": "get_output", "taskname": self.taskname}), "parent"])]))
@@ -2465,6 +2477,7 @@ class Modelverse(RuntimeClassBase):
         #print("Got input (%s): %s" % (self.taskname, data))
         if self.taskname == "task_manager":
             self.controller.taskname = self.taskname = json.loads(data)
+            print("Got taskname: " + data)
         else:
             self.responses.append(json.loads(data))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.http_clients[1], Event("HTTP_input", None, [urlencode({"op": "get_output", "taskname": self.taskname}), "parent"])]))
@@ -2475,6 +2488,7 @@ class Modelverse(RuntimeClassBase):
     
     def _initialized_behaviour_init_connect_http_client_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.http_clients[self.i], Event("connect", None, [self.address, self.timeout])]))
+        print("CONNECT HTTP")
     
     def _initialized_behaviour_init_connect_http_client_0_guard(self, parameters):
         return self.i < 2
@@ -2487,12 +2501,14 @@ class Modelverse(RuntimeClassBase):
     
     def _initialized_behaviour_init_waiting_http_client_0_exec(self, parameters):
         self.i += 1
+        print("Got first HTTP ready")
     
     def _initialized_behaviour_init_waiting_http_client_0_guard(self, parameters):
         return self.i == 0
     
     def _initialized_behaviour_init_waiting_http_client_1_exec(self, parameters):
         self.i += 1
+        print("RAISE get output")
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.http_clients[1], Event("HTTP_input", None, [urlencode({"op": "get_output", "taskname": self.taskname}), "parent"])]))
     
     def _initialized_behaviour_init_waiting_http_client_1_guard(self, parameters):
@@ -3580,6 +3596,7 @@ class HTTPClient(RuntimeClassBase):
         
         # transition /connecting/cooldown
         _connecting_cooldown_0 = Transition(self, self.states["/connecting/cooldown"], [self.states["/connecting/connecting"]])
+        _connecting_cooldown_0.setAction(self._connecting_cooldown_0_exec)
         _connecting_cooldown_0.setTrigger(Event("_1after"))
         self.states["/connecting/cooldown"].addTransition(_connecting_cooldown_0)
         
@@ -3654,6 +3671,7 @@ class HTTPClient(RuntimeClassBase):
     
     def _connecting_connecting_enter(self):
         self.big_step.outputEvent(Event("connect_socket", "socket_out", [self.socket, self.address]))
+        print("Connecting ...")
     
     def _connecting_cooldown_enter(self):
         self.addTimer(1, 0.1)
@@ -3694,6 +3712,9 @@ class HTTPClient(RuntimeClassBase):
         socket = parameters[0]
         return self.socket == socket
     
+    def _connecting_cooldown_0_exec(self, parameters):
+        print("COOLDOWN")
+    
     def _connected_listening_listen_0_exec(self, parameters):
         socket = parameters[0]
         data = parameters[1]