|
@@ -18,6 +18,7 @@ Element function model_fuse(models : Element):
|
|
|
Element selected_MM
|
|
|
String type
|
|
|
Element reverse
|
|
|
+ Integer prev_length
|
|
|
|
|
|
// Read out some data first
|
|
|
if (set_len(models) == 0):
|
|
@@ -38,6 +39,7 @@ Element function model_fuse(models : Element):
|
|
|
// Add all elements from 'model', but prepend it with the 'model_name'
|
|
|
keys = dict_keys(model["model"])
|
|
|
second_keys = set_create()
|
|
|
+ prev_length = -1
|
|
|
|
|
|
while (set_len(keys) > 0):
|
|
|
key = set_pop(keys)
|
|
@@ -58,8 +60,13 @@ Element function model_fuse(models : Element):
|
|
|
instantiate_node(new_model, type, model_name + key)
|
|
|
|
|
|
if (set_len(keys) == 0):
|
|
|
+ if (set_len(second_keys) == prev_length):
|
|
|
+ log("Cannot terminate model_fuse due to infinite recursion!")
|
|
|
+ return read_root()!
|
|
|
+
|
|
|
keys = second_keys
|
|
|
second_keys = set_create()
|
|
|
+ prev_length = set_len(keys)
|
|
|
|
|
|
return new_model!
|
|
|
|
|
@@ -69,13 +76,15 @@ Element function model_copy(src_model : Element):
|
|
|
Element keys
|
|
|
Element second_keys
|
|
|
String type
|
|
|
-
|
|
|
+ Integer prev_length
|
|
|
Element reverse
|
|
|
+
|
|
|
reverse = make_reverse_dictionary(src_model["model"])
|
|
|
|
|
|
dst_model = instantiate_model(src_model["metamodel"])
|
|
|
keys = dict_keys(src_model["model"])
|
|
|
second_keys = set_create()
|
|
|
+ prev_length = -1
|
|
|
|
|
|
while (set_len(keys) > 0):
|
|
|
name = set_pop(keys)
|
|
@@ -107,8 +116,13 @@ Element function model_copy(src_model : Element):
|
|
|
instantiate_node(dst_model, type, name)
|
|
|
|
|
|
if (set_len(keys) == 0):
|
|
|
+ if (set_len(second_keys) == prev_length):
|
|
|
+ log("Cannot terminate model_copy due to infinite recursion!")
|
|
|
+ return read_root()!
|
|
|
+
|
|
|
keys = second_keys
|
|
|
second_keys = set_create()
|
|
|
+ prev_length = set_len(keys)
|
|
|
|
|
|
return dst_model!
|
|
|
|
|
@@ -125,6 +139,7 @@ Element function model_join(models : Element, metamodel : Element, tracability_m
|
|
|
String dst
|
|
|
String key
|
|
|
String type
|
|
|
+ Integer prev_length
|
|
|
|
|
|
new_model = instantiate_model(metamodel)
|
|
|
elem_map = dict_create()
|
|
@@ -142,6 +157,7 @@ Element function model_join(models : Element, metamodel : Element, tracability_m
|
|
|
// Add all elements from 'model'
|
|
|
keys = dict_keys(model["model"])
|
|
|
second_keys = set_create()
|
|
|
+ prev_length = -1
|
|
|
|
|
|
while (set_len(keys) > 0):
|
|
|
// Copy the new element
|
|
@@ -168,8 +184,13 @@ Element function model_join(models : Element, metamodel : Element, tracability_m
|
|
|
dict_add_fast(elem_map, cast_id(model["model"][key]), new_name)
|
|
|
|
|
|
if (set_len(keys) == 0):
|
|
|
+ if (set_len(second_keys) == prev_length):
|
|
|
+ log("Cannot terminate model_join due to infinite recursion!")
|
|
|
+ return read_root()!
|
|
|
+
|
|
|
keys = second_keys
|
|
|
second_keys = set_create()
|
|
|
+ prev_length = set_len(keys)
|
|
|
|
|
|
// Now link in the tracability model
|
|
|
// Go over all TracabilityLink elements and connect them in the merged model as well
|
|
@@ -245,12 +266,14 @@ Element function model_split(merged_model : Element, models : Element, tracabili
|
|
|
String src_name
|
|
|
String dst_name
|
|
|
String new_name
|
|
|
+ Integer prev_length
|
|
|
|
|
|
result = dict_create()
|
|
|
tracability_model = instantiate_model(import_node("models/Tracability"))
|
|
|
reverse = make_reverse_dictionary(merged_model["model"])
|
|
|
mapping = dict_create()
|
|
|
second_keys = set_create()
|
|
|
+ prev_length = -1
|
|
|
|
|
|
while (set_len(models) > 0):
|
|
|
model_tuple = set_pop(models)
|
|
@@ -322,8 +345,13 @@ Element function model_split(merged_model : Element, models : Element, tracabili
|
|
|
dict_add_fast(mapping, key, instantiate_node(result[retyping_key], original_type, new_name))
|
|
|
|
|
|
if (set_len(keys) == 0):
|
|
|
+ if (set_len(second_keys) == prev_length):
|
|
|
+ log("Cannot terminate model_split due to infinite recursion!")
|
|
|
+ return read_root()!
|
|
|
+
|
|
|
keys = second_keys
|
|
|
second_keys = set_create()
|
|
|
+ prev_length = set_len(keys)
|
|
|
|
|
|
// Finally, we also add tracability information as a separate model
|
|
|
if (tracability):
|