|
@@ -370,11 +370,80 @@ Boolean function pm_finished(worklist : Element, pm : String):
|
|
|
return True!
|
|
|
return False!
|
|
|
|
|
|
-Element function merge_models(models_dict : Element):
|
|
|
- return create_node()!
|
|
|
+Element function merge_models(models_dict : Element, operation_id : String):
|
|
|
+ // 0) Find operation signature
|
|
|
|
|
|
-Element function split_models(metamodels_dict : Element):
|
|
|
- return create_node()!
|
|
|
+ Element input_metamodels
|
|
|
+ Element iter
|
|
|
+ String edge
|
|
|
+
|
|
|
+ input_metamodels = dict_create()
|
|
|
+ iter = allOutgoingAssociationInstances(core, operation_id, "transformInput")
|
|
|
+ while (set_len(iter) > 0):
|
|
|
+ edge = set_pop(iter)
|
|
|
+ dict_add(input_metamodels, read_attribute(core, edge, "name"), read_attribute(core, readAssociationDestination(core, edge), "name"))
|
|
|
+
|
|
|
+ String merged_metamodel_id
|
|
|
+ String trace_link_id
|
|
|
+ Element trace_links
|
|
|
+
|
|
|
+ // 1) Find merged metamodel
|
|
|
+
|
|
|
+ trace_links = allOutgoingAssociationInstances(core, operation_id, "tracability")
|
|
|
+ merged_metamodel_id = ""
|
|
|
+ while (set_len(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)
|
|
|
+
|
|
|
+ // 2) Merge source models
|
|
|
+
|
|
|
+ if (merged_metamodel_id != ""):
|
|
|
+ Element model_tuples
|
|
|
+ Element keys
|
|
|
+ String key
|
|
|
+ Element mm
|
|
|
+
|
|
|
+ model_tuples = set_create()
|
|
|
+ keys = dict_keys(models_dict)
|
|
|
+ while (set_len(keys) > 0):
|
|
|
+ key = set_pop(keys)
|
|
|
+ mm = get_full_model(get_model_id(models_dict[key]), get_model_id(input_metamodels[key]))
|
|
|
+ if (element_eq(mm, read_root())):
|
|
|
+ log("Signature mismatch in operation for tag " + key)
|
|
|
+ output("Signature mismatch in operation for tag " + key)
|
|
|
+ return read_root()!
|
|
|
+ set_add_node(model_tuples, create_tuple(key, mm))
|
|
|
+
|
|
|
+ Element merged_metamodel
|
|
|
+ merged_metamodel = get_full_model(merged_metamodel_id, get_model_id("SimpleClassDiagrams"))
|
|
|
+ if (element_eq(merged_metamodel, read_root())):
|
|
|
+ log("Merged metamodel in operation is not of type SimpleClassDiagrams")
|
|
|
+ output("Merged metamodel in operation is not of type SimpleClassDiagrams")
|
|
|
+ return read_root()!
|
|
|
+
|
|
|
+ return model_join(model_tuples, merged_metamodel, read_root())!
|
|
|
+ else:
|
|
|
+ return read_root()!
|
|
|
+
|
|
|
+Element function split_model(model : Element, metamodels_dict : Element):
|
|
|
+ Element model_tuples
|
|
|
+ Element keys
|
|
|
+ String key
|
|
|
+ Element mm
|
|
|
+
|
|
|
+ model_tuples = set_create()
|
|
|
+ keys = dict_keys(metamodels_dict)
|
|
|
+ while (set_len(keys) > 0):
|
|
|
+ key = set_pop(keys)
|
|
|
+ mm = get_full_model(get_model_id(metamodels_dict[key]), get_model_id("SimpleClassDiagrams"))
|
|
|
+ if (element_eq(mm, read_root())):
|
|
|
+ log("Output metamodel cannot be interpreted using SimpleClassDiagrams: " + key)
|
|
|
+ output("Output metamodel cannot be interpreted using SimpleClassDiagrams: " + key)
|
|
|
+ return read_root()!
|
|
|
+ set_add_node(model_tuples, create_tuple(key, mm))
|
|
|
+
|
|
|
+ return model_split(model, model_tuples, read_root())!
|
|
|
|
|
|
Element function get_model(model_name : String, metamodel_name : String):
|
|
|
return get_full_model(get_model_id(model_name), get_model_id(metamodel_name))!
|