Selaa lähdekoodia

Added implementation for the utility functions

Yentl Van Tendeloo 8 vuotta sitten
vanhempi
commit
8c18902dd8
1 muutettua tiedostoa jossa 73 lisäystä ja 4 poistoa
  1. 73 4
      bootstrap/core_algorithm.alc

+ 73 - 4
bootstrap/core_algorithm.alc

@@ -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))!