123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- include "primitives.alh"
- include "modelling.alh"
- include "object_operations.alh"
- Boolean function main(model : Element):
- String result
- Element nodes
- String node
- Element edges
- String edge
- String new_node
- String source
- String destination
- String name
- Element to_explore
- Element rules
- String rule
- String value
- result = "root, = yield [('RR', [])]\n"
- nodes = allInstances(model, "Rules/Root")
- while (set_len(nodes) > 0):
- node = set_pop(nodes)
- source = string_replace(node, "/", "_")
- result = result + source + " = root\n"
- // Keep following outgoing edges to find matching nodes
- to_explore = set_create()
- set_add(to_explore, node)
- while (set_len(to_explore) > 0):
- // Still explore more!
- node = set_pop(to_explore)
- source = string_replace(node, "/", "_")
- edges = allOutgoingAssociationInstances(model, node, "Rules/Edge")
- while (set_len(edges) > 0):
- edge = set_pop(edges)
- new_node = readAssociationDestination(model, edge)
- if (value_eq(read_attribute(model, new_node, "match"), True)):
- // Is a match node, so fetch the value on the edge
- name = read_attribute(model, edge, "value")
- destination = string_replace(new_node, "/", "_")
- result = result + destination + ", = yield [('RD', [" + source + ", " + name + "])]\n"
- String value
- value = read_attribute(model, new_node, "value")
- if (element_neq(value, read_root())):
- // Match node has a value we should compare as well!
- // Read out the value from the Modelverse
- result = result + destination + "_V, = yield [('RV', [" + destination + "])]\n"
- set_add(to_explore, new_node)
- rules = allInstances(model, "Rules/Rule")
- while (set_len(rules) > 0):
- // Check if this rule is applicable
- rule = set_pop(rules)
- // Fetch all elements with a "match" label and check that they are not None (and possibly, that they have a value)
- result = result + "if (True "
- nodes = allAssociationDestinations(model, rule, "Rules/contains")
- while (set_len(nodes) > 0):
- node = set_pop(nodes)
- if (value_eq(read_attribute(model, node, "match"), True)):
- // We should match on this node:
- value = read_attribute(model, node, "value")
- if (bool_and(read_type(model, node) == "Rules/NAC", element_eq(value, read_root()))):
- result = result + " and " + string_replace(node, "/", "_") + " is None "
- else:
- result = result + " and " + string_replace(node, "/", "_") + " is not None "
- if (element_neq(value, read_root())):
- // Got a value, so match that as well
- // But check if it is an action element (first character == !)
- String sign
- if (read_type(model, node) == "Rules/NAC"):
- sign = "!="
- else:
- sign = "=="
- if (string_get(value, 0) == "!"):
- result = result + " and " + string_replace(node, "/", "_") + "_V['value'] " + sign + " '" + string_replace(value, "!", "") + "'"
- else:
- result = result + " and " + string_replace(node, "/", "_") + "_V " + sign + " " + value
- result = result + "): pass # Execute rule " + string_replace(rule, "/", "_") + "\n"
- log("Got result:")
- log(result)
- return True!
|