|
@@ -44,46 +44,64 @@ Boolean function find_type_mapping(model : Element):
|
|
|
Element elems
|
|
|
String elem
|
|
|
|
|
|
- String node_element
|
|
|
+ String node_source_element
|
|
|
+ String node_target_element
|
|
|
String edge_element
|
|
|
- node_element = read_root()
|
|
|
- edge_element = read_root()
|
|
|
|
|
|
Element nodes
|
|
|
Element edges
|
|
|
nodes = allInstances(model["metamodel"], "Class")
|
|
|
edges = allInstances(model["metamodel"], "Association")
|
|
|
|
|
|
- if (set_len(nodes) > 1):
|
|
|
- log("Got nodes: " + set_to_string(nodes))
|
|
|
- log("Multiple nodes detected!")
|
|
|
- return False!
|
|
|
- elif (set_len(edges) > 1):
|
|
|
- log("Got edges: " + set_to_string(edges))
|
|
|
- log("Multiple edges detected!")
|
|
|
- return False!
|
|
|
- elif (set_len(nodes) != 1):
|
|
|
- log("No node found!")
|
|
|
- return False!
|
|
|
- elif (set_len(edges) != 1):
|
|
|
- log("No edge found!")
|
|
|
- return False!
|
|
|
- else:
|
|
|
- node_element = set_pop(nodes)
|
|
|
+ log("Searching for type...")
|
|
|
+ if (bool_and(set_len(edges) == 1, set_len(nodes) == 1)):
|
|
|
+ // Simple allocation: this seems like conformance bottom
|
|
|
+ node_source_element = set_pop(nodes)
|
|
|
+ node_target_element = node_source_element
|
|
|
+ edge_element = set_pop(edges)
|
|
|
+ log("Found node: " + node_source_element)
|
|
|
+ log("Found edge: " + edge_element)
|
|
|
+
|
|
|
+ elif (bool_and(set_len(edges) == 1, set_len(nodes) == 2)):
|
|
|
+ // Simple allocation: this seems like a type mapping
|
|
|
+ // Make sure to check that the edge goes from one node to the other!
|
|
|
edge_element = set_pop(edges)
|
|
|
- log("Found node: " + node_element)
|
|
|
+ node_source_element = readAssociationSource(model["metamodel"], edge_element)
|
|
|
+ node_target_element = readAssociationDestination(model["metamodel"], edge_element)
|
|
|
+
|
|
|
+ if (value_eq(node_source_element, node_target_element)):
|
|
|
+ log("Source and target are the same, meaning that the second node is unknown")
|
|
|
+ return False!
|
|
|
+
|
|
|
log("Found edge: " + edge_element)
|
|
|
+ log("Found source node: " + node_source_element)
|
|
|
+ log("Found target node: " + node_target_element)
|
|
|
+
|
|
|
+ else:
|
|
|
+ log("Could not automatically deduce mapping in a trivial way!")
|
|
|
+ return False!
|
|
|
+
|
|
|
|
|
|
- // Now we have bot an edge_element and node_element of the metamodel
|
|
|
+ // Now we have both an edge_element and node_element of the metamodel
|
|
|
// Now just trivially bind all elements!
|
|
|
+ log("Searching for type...")
|
|
|
elems = dict_keys(model["model"])
|
|
|
while (set_len(elems) > 0):
|
|
|
elem = set_pop(elems)
|
|
|
|
|
|
if (is_edge(model["model"][elem])):
|
|
|
+ // An edge, and there is always exactly one, so type
|
|
|
retype(model, elem, edge_element)
|
|
|
+ elif (node_source_element == node_target_element):
|
|
|
+ // A node, and we are sure that there is only one
|
|
|
+ retype(model, elem, node_source_element)
|
|
|
else:
|
|
|
- retype(model, elem, node_element)
|
|
|
+ // We have an element and know that there is an edge connecting them
|
|
|
+ // If there is an outgoing link, we make it "node_target_element", otherwise "node_source_element"
|
|
|
+ if (read_nr_out(model["model"][elem]) > 0):
|
|
|
+ retype(model, elem, node_source_element)
|
|
|
+ else:
|
|
|
+ retype(model, elem, node_target_element)
|
|
|
|
|
|
// 3) (optional) verify that the mapping is correct with conformance checking
|
|
|
// TODO
|