123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- include "primitives.alh"
- include "modelling.alh"
- include "object_operations.alh"
- include "conformance_scd.alh"
- include "utils.alh"
- include "typing.alh"
- include "mini_modify.alh"
- String function map_P2F(model : Element, name : String):
- Element destinations
- String pick
- destinations = allAssociationDestinations(model, name, "P2F_state")
- pick = name
- while (pick == name):
- pick = set_pop(destinations)
- return pick!
- Boolean function main(model : Element):
- Element all_states
- String element_name
- Boolean found_current
- Boolean flag_initial
- String new_current
- found_current = False
- new_current = read_root()
- if (set_len(allInstances(model, "FullRuntime/State")) == 0):
- // No execution in full runtime, so just flag the initial state
- flag_initial = True
- log("Searching for new initial state...")
- // And add a new time
- element_name = instantiate_node(model, "NewFullRuntime/Time", "")
- instantiate_attribute(model, element_name, "current_time", 0.0)
- else:
- flag_initial = False
- log("No searching for state!")
- // Copy the time though
- element_name = instantiate_node(model, "NewFullRuntime/Time", "")
- instantiate_attribute(model, element_name, "current_time", read_attribute(model, set_pop(allInstances(model, "FullRuntime/Time")), "current_time"))
- log("Time copied OK")
- log("Reading existing data")
- all_states = allInstances(model, "PartialRuntime/State")
- while (set_len(all_states) > 0):
- element_name = set_pop(all_states)
- if (set_len(allOutgoingAssociationInstances(model, element_name, "P2F_state")) > 0):
- // Element already exists in full, so check whether this is the current state
- log("Found existing state")
- if (read_attribute(model, map_P2F(model, element_name), "current")):
- found_current = True
- new_current = element_name
- else:
- // New state, so assume that it is not current
- log("Read value: " + cast_value(read_attribute(model, element_name, "initial")))
- if (bool_and(flag_initial, read_attribute(model, element_name, "initial"))):
- log("FOUND IT!")
- new_current = element_name
- instantiate_link(model, "P2F_state", "", element_name, element_name)
-
- log("Deleting elements...")
- all_states = allInstances(model, "NewFullRuntime/State")
- while (set_len(all_states) > 0):
- element_name = set_pop(all_states)
- model_delete_element(model, element_name)
- log("Copying elements...")
- Element all_elements
- String elem
- all_elements = dict_keys(model["model"])
- while (set_len(all_elements) > 0):
- elem = set_pop(all_elements)
- if (string_startswith(read_type(model, elem), "PartialRuntime/")):
- retype(model, elem, "NewFullRuntime/" + cast_string(list_read(string_split_nr(read_type(model, elem), "/", 1), 1)))
- if (read_type(model, elem) == "NewFullRuntime/State"):
- instantiate_attribute(model, elem, "current", elem == new_current)
- log("Setting current state...")
- String new_state
- if (found_current == False):
- if (False):
- // Prompt for new state
- output("FIX_NEW_STATE")
- new_state = input()
- all_states = allInstances(model, "NewFullRuntime/State")
- while (set_len(all_states) > 0):
- element_name = set_pop(all_states)
- if (value_eq(read_attribute(model, element_name, "name"), new_state)):
- instantiate_attribute(model, element_name, "current", True)
- break!
- else:
- // Reset to initial
- log("Resetting to initial state!")
- all_states = allInstances(model, "NewFullRuntime/State")
- while (set_len(all_states) > 0):
- element_name = set_pop(all_states)
- if (value_eq(read_attribute(model, element_name, "initial"), True)):
- log("Found initial state: " + cast_value(read_attribute(model, element_name, "name")))
- instantiate_attribute(model, element_name, "current", True)
- break!
- log("DONE!")
- return True!
|