Selaa lähdekoodia

Many fixes for manual transformations

Yentl Van Tendeloo 8 vuotta sitten
vanhempi
commit
c4f4ec77f6
4 muutettua tiedostoa jossa 55 lisäystä ja 17 poistoa
  1. 2 0
      bootstrap/modelling.alc
  2. 46 13
      core/core_algorithm.alc
  3. 1 1
      core/core_formalism.mvc
  4. 6 3
      integration/test_mvc.py

+ 2 - 0
bootstrap/modelling.alc

@@ -64,6 +64,8 @@ String function model_add_edge(model : Element, name : String, source : String,
 		log("In link " + name)
 		log("ERROR: destination of link unknown: " + destination)
 		log("Source: " + source)
+		Integer i
+		i = 1/0
 		return ""!
 
 	new_edge = create_edge(model["model"][source], model["model"][destination])

+ 46 - 13
core/core_algorithm.alc

@@ -112,6 +112,7 @@ Void function main():
 	instantiate_link(core, "owner", "", al_model, admin_user)
 
 	// Add the Manual Operation formalism
+	log("Adding manual model")
 	Element manual
 	String manual_model
 	manual = instantiate_model(scd)
@@ -122,6 +123,7 @@ Void function main():
 	instantiate_attribute(core, manual_model, "permissions", "221")
 	instance_of = instantiate_link(core, "instanceOf", "", manual_model, scd_model)
 	instantiate_attribute(core, instance_of, "type_mapping", create_node())
+	log("Added manual model")
 
 	// Make necessary links for the formalism to the owners
 	instantiate_link(core, "group", "", manual_model, admin_group)
@@ -714,10 +716,14 @@ Void function user_function_skip_init(user_id : String):
 
 							trace_links = allOutgoingAssociationInstances(core, transformation_id, "tracability")
 							merged_metamodel_id = ""
+							log("Tracability links: " + cast_v2s(read_nr_out(trace_links)))
 							while (read_nr_out(trace_links) > 0):
 								trace_link_id = set_pop(trace_links)
 								if (value_eq(read_attribute(core, trace_link_id, "type"), "operatesOn")):
 									merged_metamodel_id = readAssociationDestination(core, trace_link_id)
+								else:
+									output("Unknown tracability link: " + cast_v2s(read_attribute(core, trace_link_id, "type")))
+
 							if (merged_metamodel_id != ""):
 								merged_model = instantiate_model(get_full_model(merged_metamodel_id))
 
@@ -735,7 +741,9 @@ Void function user_function_skip_init(user_id : String):
 
 								// 3) Transform
 
+								log("Start modify")
 								modify(merged_model, True)
+								log("Modify finished")
 
 								// 4) Split in different files depending on type
 
@@ -755,7 +763,8 @@ Void function user_function_skip_init(user_id : String):
 									else:
 										// Model exists, so we overwrite
 										model_overwrite(split_off_model, get_model_id(outputs[key]))
-
+							else:
+								output("Could not find merged metamodel")
 						else:
 							output("Did not know how to interpret model of type " + exact_type)
 					else:
@@ -992,23 +1001,35 @@ Void function user_function_skip_init(user_id : String):
 			Element merged_formalism
 			String merged_formalism_id
 			String source_formalism_id
-			String type_id
 			String tracability_link
+			String type_id
+			String old_type_id
 
 			name = input()
 			source = create_node()
 			target = create_node()
 			all_formalisms = create_node()
 
+			type_id = ""
+			old_type_id = ""
 			while (name != ""):
 				model_id = get_model_id(name)
 				if (model_id != ""):
-					if (bool_not(set_in(source, model_id))):
-						set_add(source, model_id)
-						set_add(all_formalisms, create_tuple(name, get_full_model(model_id)))
-						output("Model added as source")
+					if (allow_read(user_id, model_id)):
+						if (bool_not(set_in(source, model_id))):
+							type_id = set_pop(allAssociationDestinations(core, model_id, "instanceOf"))
+							if (bool_or(old_type_id == "", type_id == old_type_id)):
+								old_type_id = type_id
+								set_add(source, model_id)
+								set_add(all_formalisms, create_tuple(name, get_full_model(model_id)))
+								output("Model added as source")
+							elif (old_type_id != type_id):
+								// Already have a previous type_id and now another: CLASH
+								output("Cannot add model as types not compatible with previous models; try again")
+						else:
+							output("Model already selected as source")
 					else:
-						output("Model already selected as source")
+						output("Permission denied")
 				else:
 					output("No such model; try again")
 				
@@ -1019,12 +1040,21 @@ Void function user_function_skip_init(user_id : String):
 			while (name != ""):
 				model_id = get_model_id(name)
 				if (model_id != ""):
-					if (bool_not(set_in(target, model_id))):
-						set_add(target, model_id)
-						set_add(all_formalisms, create_tuple(name, get_full_model(model_id)))
-						output("Model added as target")
+					if (allow_read(user_id, model_id)):
+						if (bool_not(set_in(target, model_id))):
+							type_id = set_pop(allAssociationDestinations(core, model_id, "instanceOf"))
+							if (bool_or(old_type_id == "", type_id == old_type_id)):
+								old_type_id = type_id
+								set_add(target, model_id)
+								set_add(all_formalisms, create_tuple(name, get_full_model(model_id)))
+								output("Model added as target")
+							elif (old_type_id != type_id):
+								// Already have a previous type_id and now another: CLASH
+								output("Cannot add model as types not compatible with previous models; try again")
+						else:
+							output("Model already selected as target")
 					else:
-						output("Model already selected as target")
+						output("Permission denied")
 				else:
 					output("No such model; try again")
 				
@@ -1050,7 +1080,10 @@ Void function user_function_skip_init(user_id : String):
 				while (read_nr_out(all_formalisms) > 0):
 					source_formalism_id = get_model_id(list_read(set_pop(all_formalisms), 0))
 					tracability_link = instantiate_link(core, "tracability", "", merged_formalism_id, source_formalism_id)
-					instantiate_attribute(core, tracability_link, "type", "operatesOn")
+					instantiate_attribute(core, tracability_link, "type", "merged")
+
+				tracability_link = instantiate_link(core, "tracability", "", model_id, merged_formalism_id)
+				instantiate_attribute(core, tracability_link, "type", "operatesOn")
 
 				// Extend metadata with info on source and target
 				String link

+ 1 - 1
core/core_formalism.mvc

@@ -108,7 +108,7 @@ SimpleClassDiagrams CoreFormalism {
 
     Class ExternalTool : Transformation {}
 
-    Class ManualTransformation : Transformation {}
+    Class ManualOperation : Transformation {}
 
     Association transformInput (Model, Transformation) {
         name : String

+ 6 - 3
integration/test_mvc.py

@@ -1734,10 +1734,11 @@ class TestModelverseCore(unittest.TestCase):
                      "  PetriNets_Runtime : SimpleClassDiagrams",
                      "  PetriNets : SimpleClassDiagrams",
                      "  pn_print : PetriNets_RAM",
-                     "  pn_design_to_runtime : PetriNets_RAM",
+                     "  pn_design_to_runtime : ManualOperation",
                      "  ManualOperation : SimpleClassDiagrams",
                      "  pn_runtime_to_design : PetriNets_RAM",
                      "  pn_step : PetriNets_RAM",
+                     "  __merged_pn_design_to_runtime : SimpleClassDiagrams",
                      "  __merged_PetriNets_RAM : SimpleClassDiagrams",
                      "  PetriNets_RAM : SimpleClassDiagrams",
                      "  my_pn : PetriNets",
@@ -1746,7 +1747,7 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
                 # transformation_list
                 set(["[ModelTransformation] pn_print : PetriNets_RAM",
-                     "[ModelTransformation] pn_design_to_runtime : PetriNets_RAM",
+                     "[ManualOperation] pn_design_to_runtime : ManualOperation",
                      "[ModelTransformation] pn_runtime_to_design : PetriNets_RAM",
                      "[ModelTransformation] pn_step : PetriNets_RAM"]),
                 "Ready for command...",
@@ -1763,7 +1764,9 @@ class TestModelverseCore(unittest.TestCase):
                 "Which transformation do you want to execute?",
                 "Which model to bind for source element PetriNets",
                 "Which model to create for target element PetriNets_Runtime",
-                "Transformation executed with result: True",
+                "Model loaded, ready for commands!",
+                "Use 'help' command for a list of possible commands",
+                "Please give your command.",
                 "Ready for command...",
                 # transformation_execute (pn_step)
                 "Which transformation do you want to execute?",