فهرست منبع

Allow searching for rendered models using a specific mapper and model

Yentl Van Tendeloo 7 سال پیش
والد
کامیت
e37aed3481
1فایلهای تغییر یافته به همراه63 افزوده شده و 75 حذف شده
  1. 63 75
      bootstrap/core_algorithm.alc

+ 63 - 75
bootstrap/core_algorithm.alc

@@ -395,9 +395,6 @@ String function export_typing(model : Element, name : String):
 	instance_of = instantiate_link(core, "instanceOf", "", result, get_entry_id("formalisms/TypeMapping"))
 	instantiate_link(core, "semantics", "", instance_of, get_entry_id("models/conformance_mv"))
 
-	log("Created type mapping " + result)
-	log("   for " + name)
-
 	return result!
 
 Void function model_create(model : Element, name : String, type_id : String, kind : String):
@@ -459,61 +456,6 @@ Void function model_overwrite(model : Element, model_id : String, metamodel_id :
 
 	return!
 
-Void function model_overwrite2(model : Element, model_id : String, metamodel_id : String):
-	// TODO this should be more elegant than just hiding the old elements
-
-	String location
-	String instanceOf_link
-
-	log("Rendering1: " + cast_id2s(get_full_model(get_entry_id("rendered/formalisms/MM_render"), get_entry_id("formalisms/MM_render"))))
-	location = "models/" + cast_id2s(model)
-	export_node(location, model["model"])
-	log("Rendering2: " + cast_id2s(get_full_model(get_entry_id("rendered/formalisms/MM_render"), get_entry_id("formalisms/MM_render"))))
-
-	// Change location in meta-data
-	unset_attribute(core, model_id, "location")
-	instantiate_attribute(core, model_id, "location", location)
-	log("Changed location of model to " + location)
-	log("Changing model " + model_id)
-	log("With name: " + cast_v2s(read_attribute(core, model_id, "name")))
-	log("Rendering3: " + cast_id2s(get_full_model(get_entry_id("rendered/formalisms/MM_render"), get_entry_id("formalisms/MM_render"))))
-
-	// Update the instanceOf relation of the context in which we are working
-	String choice
-	choice = get_instanceOf_link(model_id, metamodel_id)
-	log("Rendering4: " + cast_id2s(get_full_model(get_entry_id("rendered/formalisms/MM_render"), get_entry_id("formalisms/MM_render"))))
-	if (element_neq(choice, read_root())):
-		// There was a link, so we remove it
-
-		// First remove the type mapping it referred to
-		Element tl
-		tl = allAssociationDestinations(core, choice, "typing")
-		String e
-		log("Rendering5: " + cast_id2s(get_full_model(get_entry_id("rendered/formalisms/MM_render"), get_entry_id("formalisms/MM_render"))))
-		while (set_len(tl) > 0):
-			e = set_pop(tl)
-			model_delete_element(core, e)
-			log("Deleting type mapping... " + cast_id2s(e))
-		log("Rendering6: " + cast_id2s(get_full_model(get_entry_id("rendered/formalisms/MM_render"), get_entry_id("formalisms/MM_render"))))
-
-		// Now delete the element itself
-		model_delete_element(core, choice)
-		log("Deleting choice itself " + choice)
-		log("Rendering7: " + cast_id2s(get_full_model(get_entry_id("rendered/formalisms/MM_render"), get_entry_id("formalisms/MM_render"))))
-
-	// Create a new instanceOf relation now
-	String instance_of
-	log("Created new link")
-	log("Rendering8: " + cast_id2s(get_full_model(get_entry_id("rendered/formalisms/MM_render"), get_entry_id("formalisms/MM_render"))))
-	instance_of = instantiate_link(core, "instanceOf", "", model_id, metamodel_id)
-	instantiate_link(core, "semantics", "", instance_of, get_entry_id("models/conformance_mv"))
-	log("Update semantics")
-	instantiate_link(core, "typing", "", instance_of, export_typing(model, full_name(model_id)))
-	log("Rendering9: " + cast_id2s(get_full_model(get_entry_id("rendered/formalisms/MM_render"), get_entry_id("formalisms/MM_render"))))
-	log("Update typing")
-
-	return!
-
 Boolean function check_conformance(model_id : String):
 	// TODO check if it actually conforms, considering that instanceOf link
 	//    --> in-depth check
@@ -1123,10 +1065,44 @@ String function cmd_transformation_between(source_name : String, target_name : S
 	else:
 		return "Model not found: " + source_name!
 
-String function cmd_model_render(model_name : String, mapper_name : String):
+String function cmd_model_rendered(model_name : String, mapper_name : String):
+	Element trace_links
+	String rendered
+	String trace_link_id
+	String allowed_rendered
+	Element trace_links_2
+	String trace_link_2_id
+
+	allowed_rendered = "Success: "
+	log("Find outgoing for AS " + model_name)
+	trace_links = allOutgoingAssociationInstances(core, get_entry_id(model_name), "tracability")
+	while (set_len(trace_links) > 0):
+		trace_link_id = set_pop(trace_links)
+		if (value_eq(read_attribute(core, trace_link_id, "type"), "CS_perceptualized")):
+			rendered = readAssociationDestination(core, trace_link_id)
+			log("Got rendered version: " + rendered)
+
+			log("Find outgoing for CS " + rendered)
+			trace_links_2 = allOutgoingAssociationInstances(core, rendered, "tracability")
+			while (set_len(trace_links_2) > 0):
+				trace_link_2_id = set_pop(trace_links_2)
+				log("Checking " + trace_link_2_id)
+				log("Read destination " + readAssociationDestination(core, trace_link_2_id))
+				log("Expect " + get_entry_id(mapper_name))
+				log("Name: " + cast_v2s(read_attribute(core, readAssociationDestination(core, trace_link_2_id), "name")))
+				log("Mapper name: " + mapper_name)
+				if (value_eq(read_attribute(core, readAssociationDestination(core, trace_link_2_id), "name"), mapper_name)):
+					log("Check link type: " + cast_v2s(read_attribute(core, trace_link_2_id, "type")))
+					if (value_eq(read_attribute(core, trace_link_2_id, "type"), "CS_mapper")):
+						log("Found rendered: " + rendered)
+						allowed_rendered = string_join(allowed_rendered, read_attribute(core, rendered, "name")) + "\n"
+				log("Unusable link")
+
+	return allowed_rendered!
+
+String function cmd_model_render(model_name : String, mapper_name : String, rendered_name : String):
 	String model_ID
 	String mapper_ID
-	String rendered_name
 	String tracability_name
 	Element inputs
 	Element output_map
@@ -1138,6 +1114,10 @@ String function cmd_model_render(model_name : String, mapper_name : String):
 
 	model_ID = get_entry_id(model_name)
 
+	log("Render AS: " + model_name)
+	log("Mapper: " + mapper_name)
+	log("Render CS: " + rendered_name)
+
 	if (model_ID != ""):
 		mapper_ID = get_entry_id(mapper_name)
 
@@ -1146,8 +1126,7 @@ String function cmd_model_render(model_name : String, mapper_name : String):
 				if (allow_read(current_user_id, mapper_ID)):
 					// Everything is fine; start the actual operation
 					// Find metamodel to render to
-					rendered_name = "rendered/" + model_name
-					tracability_name = "tracability/" + model_name
+					tracability_name = "tracability/" + rendered_name
 
 					// Take the abstract syntax model and the previously rendered model
 					inputs = dict_create()
@@ -1183,22 +1162,10 @@ String function cmd_model_render(model_name : String, mapper_name : String):
 							return "Tracability model not typed by Tracability metamodel: " + tracability_name!
 
 					// Do the operation itself!
-					log("PERCEPTUALIZING...")
 					result = execute_operation(mapper_ID, inputs, tracability_model)
-					log("Generated perceptualized model")
 
 					// Overwrite the previous rendered model
-					log("RENDERED:")
-					log("Model name: " + rendered_name)
-					log("Entry_id: " + get_entry_id(rendered_name))
 					model_overwrite(result["rendered"], get_entry_id(rendered_name), get_entry_id(output_map["rendered"]))
-					// TODO the following line causes rendering to fail:
-					// nonetheless, it is necessary to allow the GUI to link back to the AS elements
-					log("ABSTRACT:")
-					log("Model name: " + model_name)
-					log("Entry_id: " + get_entry_id(model_name))
-					//model_overwrite2(result["abstract"], get_entry_id(model_name), get_entry_id(output_map["abstract"]))
-					log("Overwrite OK")
 
 					// Tracability updated in-place
 					model_overwrite(tracability_model, get_entry_id(tracability_name), get_entry_id("formalisms/Tracability"))
@@ -1206,6 +1173,18 @@ String function cmd_model_render(model_name : String, mapper_name : String):
 					if (element_eq(tracability_model, read_root())):
 						return "Tracability model not typed by Tracability metamodel: " + tracability_name!
 
+					// Link all information in the megamodel
+					String tr_link
+					log("Create TL CS_perceptualized from " + model_name)
+					log("    to " + rendered_name)
+					tr_link = instantiate_link(core, "tracability", "", get_entry_id(model_name), get_entry_id(rendered_name))
+					instantiate_attribute(core, tr_link, "type", "CS_perceptualized")
+					log("Create TL CS_mapper from " + rendered_name)
+					log("    to " + mapper_name)
+					log("   ID " + get_entry_id(mapper_name))
+					tr_link = instantiate_link(core, "tracability", "", get_entry_id(rendered_name), get_entry_id(mapper_name))
+					instantiate_attribute(core, tr_link, "type", "CS_mapper")
+
 					// Also output the resulting model
 					return "Success: " + JSON_print(get_full_model(get_entry_id(rendered_name), get_entry_id(output_map["rendered"])))!
 				else:
@@ -1217,6 +1196,13 @@ String function cmd_model_render(model_name : String, mapper_name : String):
 	else:
 		return "Model not found: " + model_name!
 
+	//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)
+
 String function cmd_transformation_execute(transformation_name : String, source_models : Element, target_models : Element):
 	// Execute a transformation, whatever type it is
 	// First we detect the type, so we know how to prepare for invocation
@@ -2150,7 +2136,9 @@ Void function user_function_skip_init(user_id : String):
 		elif (cmd == "transformation_between"):
 			output(cmd_transformation_between(single_input("Source type?"), single_input("Target type?")))
 		elif (cmd == "model_render"):
-			output(cmd_model_render(single_input("Model name?"), single_input("Mapper name?")))
+			output(cmd_model_render(single_input("Model name?"), single_input("Mapper name?"), single_input("Rendered name?")))
+		elif (cmd == "model_rendered"):
+			output(cmd_model_rendered(single_input("Model name?"), single_input("Mapper name?")))
 		elif (cmd == "transformation_execute"):
 			output(cmd_transformation_execute(single_input("Transformation name?"), dict_input("Source models?"), dict_input("Target models?")))
 		elif (cmd == "verify"):