瀏覽代碼

Test if input is a model instead of a folder in transformation_add and transformation_execute

Yentl Van Tendeloo 7 年之前
父節點
當前提交
eba90ad579
共有 2 個文件被更改,包括 111 次插入7 次删除
  1. 27 7
      bootstrap/core_algorithm.alc
  2. 84 0
      unit/test_all.py

+ 27 - 7
bootstrap/core_algorithm.alc

@@ -1499,9 +1499,12 @@ String function cmd_transformation_execute(transformation_name : String, source_
 					source_model_ID = get_entry_id(source_model_name)
 					if (source_model_ID != ""):
 						if (allow_read(current_user_id, source_model_ID)):
-							// Check for conformance to the requested metamodel
-							dict_add(inputs, assoc_name, source_model_name)
-							continue!
+							if (read_type(core, source_model_ID) != "Folder"):
+								// Check for conformance to the requested metamodel
+								dict_add(inputs, assoc_name, source_model_name)
+								continue!
+							else:
+								return "Not a model: " + source_model_name!
 						else:
 							return "Read permission denied to: " + source_model_name!
 					else:
@@ -1533,11 +1536,15 @@ String function cmd_transformation_execute(transformation_name : String, source_
 									return "Write permission denied to: " + get_foldername(target_model_name)!
 						else:
 							// Already exists, so we need to check for write access
-							if (allow_write(current_user_id, get_entry_id(target_model_name))):
-								dict_add(output_map, assoc_name, read_attribute(core, readAssociationDestination(core, target), "name"))
-								dict_add(outputs, assoc_name, target_model_name)
+							if (read_type(core, get_entry_id(target_model_name)) == "Folder"):
+								// Is a folder, so reject
+								return "Not a model: " + target_model_name!
 							else:
-								return "Write permission denied to: " + target_model_name!
+								if (allow_write(current_user_id, get_entry_id(target_model_name))):
+									dict_add(output_map, assoc_name, read_attribute(core, readAssociationDestination(core, target), "name"))
+									dict_add(outputs, assoc_name, target_model_name)
+								else:
+									return "Write permission denied to: " + target_model_name!
 
 				diff = set_difference(dict_keys(target_models), dict_keys(outputs))
 				if (set_len(diff) > 0):
@@ -1771,6 +1778,10 @@ String function transformation_add(source_models : Element, target_models : Elem
 			if (allow_read(current_user_id, model_id)):
 				if (bool_not(dict_in(source, key))):
 					dict_add(source, key, model_id)
+
+					if (read_type(core, model_id) == "Folder"):
+						return "Not a model: " + name!
+
 					mm = get_full_model(model_id, get_entry_id("formalisms/SimpleClassDiagrams"))
 					if (element_eq(mm, read_root())):
 						return "Type cannot be typed as formalisms/SimpleClassDiagrams: " + key!
@@ -1796,6 +1807,9 @@ String function transformation_add(source_models : Element, target_models : Elem
 		if (model_id != ""):
 			if (allow_read(current_user_id, model_id)):
 				if (bool_not(dict_in(target, key))):
+					if (read_type(core, model_id) == "Folder"):
+						return "Not a model: " + name!
+
 					if (dict_in(source, key)):
 						if (value_neq(source[key], model_id)):
 							return "Input and output signature differ for same key: " + key!
@@ -1917,6 +1931,9 @@ String function cmd_transformation_add_MT(source_models : Element, target_models
 		if (model_id != ""):
 			if (allow_read(current_user_id, model_id)):
 				// Check whether or not it is formalisms/SimpleClassDiagrams
+				if (read_type(core, model_id) == "Folder"):
+					return "Not a model: " + name!
+
 				mm = get_full_model(model_id, get_entry_id("formalisms/SimpleClassDiagrams"))
 				if (element_neq(mm, read_root())):
 					if (bool_not(dict_in(source, key))):
@@ -1938,6 +1955,9 @@ String function cmd_transformation_add_MT(source_models : Element, target_models
 		model_id = get_entry_id(name)
 		if (model_id != ""):
 			if (allow_read(current_user_id, model_id)):
+				if (read_type(core, model_id) == "Folder"):
+					return "Not a model: " + name!
+
 				mm = get_full_model(model_id, get_entry_id("formalisms/SimpleClassDiagrams"))
 				if (element_neq(mm, read_root())):
 					if (bool_not(dict_in(target, key))):

+ 84 - 0
unit/test_all.py

@@ -3911,6 +3911,20 @@ class TestModelverse(unittest.TestCase):
         except ModelExists:
             assert sig == transformation_signature("users/user/test/c")
 
+        # Source metamodel is folder
+        try:
+            transformation_add_MANUAL({"MODEL_A": "users"}, {"MODEL_B": "formalisms/SimpleClassDiagrams"}, "users/user/test/p")
+            self.fail()
+        except NotAModel:
+            pass
+
+        # Target metamodel is folder
+        try:
+            transformation_add_MANUAL({"MODEL_A": "formalisms/SimpleClassDiagrams"}, {"MODEL_B": "users"}, "users/user/test/q")
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_transformation_add_AL(self):
         # Add models for transformation
         model_add("users/user/test/A", "formalisms/SimpleClassDiagrams", """
@@ -4051,6 +4065,20 @@ class TestModelverse(unittest.TestCase):
         except CompilationError:
             assert "o" not in model_list("users/user/test")
 
+        # Source metamodel is folder
+        try:
+            transformation_add_AL({"MODEL_A": "users"}, {"MODEL_B": "formalisms/SimpleClassDiagrams"}, "users/user/test/p", default_function)
+            self.fail()
+        except NotAModel:
+            pass
+
+        # Target metamodel is folder
+        try:
+            transformation_add_AL({"MODEL_A": "formalisms/SimpleClassDiagrams"}, {"MODEL_B": "users"}, "users/user/test/q", default_function)
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_transformation_add_MT(self):
         # Add models for transformation
         model_add("users/user/test/A", "formalisms/SimpleClassDiagrams", """
@@ -4195,6 +4223,20 @@ class TestModelverse(unittest.TestCase):
         except CompilationError:
             assert "o" not in model_list("users/user/test")
 
+        # Source metamodel is folder
+        try:
+            transformation_add_MT({"MODEL_A": "users"}, {"MODEL_B": "formalisms/SimpleClassDiagrams"}, "users/user/test/p", default_function)
+            self.fail()
+        except NotAModel:
+            pass
+
+        # Target metamodel is folder
+        try:
+            transformation_add_MT({"MODEL_A": "formalisms/SimpleClassDiagrams"}, {"MODEL_B": "users"}, "users/user/test/q", default_function)
+            self.fail()
+        except NotAModel:
+            pass
+
     def test_op_transformation_execute_MANUAL(self):
         # Add models for transformation
         model_add("users/user/test/A", "formalisms/SimpleClassDiagrams", """
@@ -4315,6 +4357,20 @@ class TestModelverse(unittest.TestCase):
         except TypeMismatch:
             assert element_list_nice("users/user/test/c") > 0
 
+        # Source model is folder
+        try:
+            transformation_execute_MANUAL("users/user/test/d", {"MODEL_A": "users"}, {"MODEL_B": "users/user/test/f"})
+            self.fail()
+        except NotAModel:
+            pass
+
+        # Target model is folder
+        try:
+            transformation_execute_MANUAL("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users"})
+            self.fail()
+        except NotAModel:
+            pass
+
         # Execute activity with colliding models, which means that it is copied
         transformation_add_MANUAL({"MODEL_A": "users/user/test/A"}, {"MODEL_A": "users/user/test/A"}, "users/user/test/f")
         transformation_execute_MANUAL("users/user/test/f", {"MODEL_A": "users/user/test/a"}, {"MODEL_A": "users/user/test/aaa"}, lambda i: i)
@@ -4444,6 +4500,20 @@ class TestModelverse(unittest.TestCase):
         except TypeMismatch:
             assert element_list("users/user/test/c") > 0
 
+        # Source model is folder
+        try:
+            transformation_execute_AL("users/user/test/d", {"MODEL_A": "users"}, {"MODEL_B": "users/user/test/f"})
+            self.fail()
+        except NotAModel:
+            pass
+
+        # Target model is folder
+        try:
+            transformation_execute_AL("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users"})
+            self.fail()
+        except NotAModel:
+            pass
+
         # Execute activity with colliding models, which means that it is copied
         transformation_add_AL({"MODEL_A": "users/user/test/A"}, {"MODEL_A": "users/user/test/A"}, "users/user/test/f", default_code_empty)
         transformation_execute_AL("users/user/test/f", {"MODEL_A": "users/user/test/a"}, {"MODEL_A": "users/user/test/aaa"})
@@ -4657,6 +4727,20 @@ class TestModelverse(unittest.TestCase):
         except TypeMismatch:
             assert element_list_nice("users/user/test/d") > 0
 
+        # Source model is folder
+        try:
+            transformation_execute_MT("users/user/test/d", {"MODEL_A": "users"}, {"MODEL_B": "users/user/test/f"})
+            self.fail()
+        except NotAModel:
+            pass
+
+        # Target model is folder
+        try:
+            transformation_execute_MT("users/user/test/d", {"MODEL_A": "users/user/test/b"}, {"MODEL_B": "users"})
+            self.fail()
+        except NotAModel:
+            pass
+
         # Execute activity with colliding models, which means that it is copied
         transformation_add_MT({"MODEL_A": "users/user/test/A"}, {"MODEL_A": "users/user/test/A"}, "users/user/test/f", default_code_empty)
         transformation_execute_MT("users/user/test/f", {"MODEL_A": "users/user/test/a"}, {"MODEL_A": "users/user/test/aaa"})