from state.devstate import DevState from bootstrap.scd import bootstrap_scd from concrete_syntax.textual_od import renderer from concrete_syntax.plantuml.renderer import render_class_diagram from concrete_syntax.plantuml.make_url import make_url from api.od import ODAPI from transformation.topify.topify import Topifier from transformation.merger import merge_models from util import loader from examples.semantics.operational.port import models import os THIS_DIR = os.path.dirname(__file__) # get file contents as string def read_file(filename): with open(THIS_DIR+'/'+filename) as file: return file.read() if __name__ == "__main__": state = DevState() scd_mmm = bootstrap_scd(state) # Load Petri Net meta-models pn_mm_cs = read_file('../../petrinet/metamodels/mm_design.od') pn_mm_rt_cs = pn_mm_cs + read_file('../../petrinet/metamodels/mm_runtime.od') pn_mm = loader.parse_and_check(state, pn_mm_cs, scd_mmm, "Petri-Net Design meta-model") pn_mm_rt = loader.parse_and_check(state, pn_mm_rt_cs, scd_mmm, "Petri-Net Runtime meta-model") # Load Port meta-models port_mm = loader.parse_and_check(state, models.port_mm_cs, scd_mmm, "Port-MM") port_mm_rt = loader.parse_and_check(state, models.port_rt_mm_cs, scd_mmm, "Port-MM-RT") # Merge Petri Net and Port meta-models print("merging...") merged_mm_rt = merge_models(state, mm=scd_mmm, models=[pn_mm_rt, port_mm_rt]) print("done merging") print() print("topifying... (may take a while)") topifier = Topifier(state) top_merged_mm_rt = topifier.topify_cd(merged_mm_rt) print("done topifying") plantuml_url = make_url(render_class_diagram(state, top_merged_mm_rt)) print() print(plantuml_url) print() txt = renderer.render_od(state, top_merged_mm_rt, scd_mmm) filename = THIS_DIR+"/merged_mm.od" with open(filename, "w") as file: file.write(f"# Auto-generated by {__file__}.\n\n") file.write(f"# Merged run-time meta-models of 'Petri Net' and 'Port' formalisms.\n") file.write(f"# An abstract 'Top'-class (superclass of everything else), and a 'generic_link'-association (which can connect everything with everything) have also been added.\n\n") file.write(f"# PlantUML visualization: {plantuml_url}\n\n") file.write(txt) print("Wrote file", filename)