Bladeren bron

Fix add_MT, even with callbacks for merged model modification

Yentl Van Tendeloo 8 jaren geleden
bovenliggende
commit
db5375f19a
4 gewijzigde bestanden met toevoegingen van 27 en 17 verwijderingen
  1. 8 6
      bootstrap/core_algorithm.alc
  2. 2 0
      bootstrap/mini_modify.alc
  3. 4 4
      integration/test_mvc.py
  4. 13 7
      wrappers/modelverse.py

+ 8 - 6
bootstrap/core_algorithm.alc

@@ -1370,11 +1370,15 @@ String function cmd_transformation_add_MT(user_id : String, source_models : Elem
 				mm = read_attribute(core, readAssociationDestination(core, get_instanceOf_link(model_id)), "name")
 				if (mm == "SimpleClassDiagrams"):
 					if (bool_not(dict_in(target, key))):
-						if (bool_not(dict_in(to_ramify, key))):
+						if (dict_in(source, key)):
+							if (value_eq(model_id, source[key])):
+								dict_add(target, key, model_id)
+								// Don't add to to_ramify, as it is already in there!
+							else:
+								return "Name in output cannot have different type than input: " + key!
+						else:
 							dict_add(target, key, model_id)
 							set_add(to_ramify, create_tuple(key, get_full_model(model_id)))
-						else:
-							return "Name in output cannot have different type than input: " + key!
 					else:
 						return "Name was already assigned a metamodel: " + key!
 				else:
@@ -1385,9 +1389,7 @@ String function cmd_transformation_add_MT(user_id : String, source_models : Elem
 			return "Model not found: " + name!
 
 	merged_formalism = model_fuse(to_ramify)
-	log("Start modify")
-	//modify(merged_formalism, True)
-	log("End modify")
+	modify(merged_formalism, True)
 
 	ramified_metamodel = ramify(merged_formalism)
 	model_create(ramified_metamodel, "__RAM_" + operation_name, user_id, get_model_id("SimpleClassDiagrams"), "Model")

+ 2 - 0
bootstrap/mini_modify.alc

@@ -323,6 +323,7 @@ String function cmd_read_association_destination(write : Boolean, model : Elemen
 Element function modify(model : Element, write : Boolean):
 	String cmd
 
+	log("Start modify!")
 	output("Model loaded, ready for commands!")
 
 	while (True):
@@ -370,6 +371,7 @@ Element function modify(model : Element, write : Boolean):
 		else:
 			output("Unknown command while modelling: " + cast_v2s(cmd))
 			output("Use command 'help' to get a list of available commands")
+	log("Finish modify!")
 	return model!
 
 String function single_input(prompt : String):

+ 4 - 4
integration/test_mvc.py

@@ -134,10 +134,10 @@ class TestModelverseCore(unittest.TestCase):
             instantiate(None, "Association", ("PetriNet_Runtime/Place", "PetriNet/Place"), ID="R2D_PlaceLink")
             instantiate(None, "Association", ("PetriNet_Runtime/Transition", "PetriNet/Transition"), ID="R2D_TransitionLink")
 
-        transformation_add_MT("PetriNet_RAM", {"PetriNet": "PetriNet"}, {}, "print_pn", open("integration/code/pn_print.mvc").read())
-        transformation_add_MT("PetriNet_RAM", {"PetriNet": "PetriNet"}, {"PetriNet_Runtime": "PetriNet_Runtime"}, "pn_design_to_runtime", open("integration/code/pn_design_to_runtime.mvc").read(), add_tracability_D2R)
-        transformation_add_MT("PetriNet_RAM", {"PetriNet_Runtime": "PetriNet_Runtime"}, {"PetriNet_Runtime": "PetriNet_Runtime"}, "pn_simulate", open("integration/code/pn_simulate.mvc").read())
-        transformation_add_MT("PetriNet_RAM", {"PetriNet_Runtime": "PetriNet_Runtime"}, {"PetriNet": "PetriNet"}, "pn_runtime_to_design", open("integration/code/pn_runtime_to_design.mvc").read(), add_tracability_R2D)
+        transformation_add_MT({"PetriNet": "PetriNet"}, {}, "print_pn", open("integration/code/pn_print.mvc").read())
+        transformation_add_MT({"PetriNet": "PetriNet"}, {"PetriNet_Runtime": "PetriNet_Runtime"}, "pn_design_to_runtime", open("integration/code/pn_design_to_runtime.mvc").read(), add_tracability_D2R)
+        transformation_add_MT({"PetriNet_Runtime": "PetriNet_Runtime"}, {"PetriNet_Runtime": "PetriNet_Runtime"}, "pn_simulate", open("integration/code/pn_simulate.mvc").read())
+        transformation_add_MT({"PetriNet_Runtime": "PetriNet_Runtime"}, {"PetriNet": "PetriNet"}, "pn_runtime_to_design", open("integration/code/pn_runtime_to_design.mvc").read(), add_tracability_R2D)
 
         log = []
         assert transformation_execute_MT("print_pn", {"PetriNet": "my_pn"}, {}, callback) == True

+ 13 - 7
wrappers/modelverse.py

@@ -433,8 +433,9 @@ def transformation_between(source, target):
         return set([])
     lst = set([v for v in output.split("\n")])
 
-def transformation_add_MT(source_metamodels, target_metamodels, operation_name, code, callback=lambda: model_exit()):
+def transformation_add_MT(source_metamodels, target_metamodels, operation_name, code, callback=lambda: None):
     """Create a new model transformation."""
+    global mode
     _goto_mode(MODE_MODELLING)
 
     try:
@@ -444,14 +445,20 @@ def transformation_add_MT(source_metamodels, target_metamodels, operation_name,
 
     mv_dict_rep = _dict_to_list(source_metamodels) + [""] + _dict_to_list(target_metamodels) + [""]
     _input(["transformation_add_MT"] + mv_dict_rep + [operation_name])
-    #mode = MODE_MANUAL
-    #callback()
-    #mode = MODE_MODELLING
+
+    # Possibly modify the merged metamodel first (add tracability links)
+    mode = MODE_MANUAL
+    _output() # Model loaded, ready for commands
+    callback()
+    _input("exit")
+    mode = MODE_MODELLING
+
+    # Done, so RAMify and upload the model
     _handle_output("Waiting for model constructors...")
     _input(compiled)
     _handle_output("Success")
 
-def transformation_add_AL(source_metamodels, target_metamodels, operation_name, code, callback=lambda: model_exit()):
+def transformation_add_AL(source_metamodels, target_metamodels, operation_name, code, callback=lambda: None):
     """Create a new action language model, which can be executed."""
     _goto_mode(MODE_MODELLING)
 
@@ -466,7 +473,7 @@ def transformation_add_AL(source_metamodels, target_metamodels, operation_name,
     _input(compiled)
     _output("Success")
 
-def transformation_add_MANUAL(source_metamodels, target_metamodels, operation_name, callback=lambda: model_exit()):
+def transformation_add_MANUAL(source_metamodels, target_metamodels, operation_name, callback=lambda: None):
     """Create a new manual model operation."""
     _goto_mode(MODE_MODELLING)
 
@@ -711,7 +718,6 @@ def read(model_name, ID):
     _input(["read", ID])
     output = _handle_output("Success: ", split=" ")
     v = output.split("\n")
-    print(v)
     t = v[1].split(":")[1].strip()
     if (not v[2].startswith("Source:")):
         rval = (t, None)