123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- import importlib.util
- import io
- import os
- from jinja2 import FileSystemLoader, Environment
- from concrete_syntax.textual_od import parser as parser_od
- from concrete_syntax.textual_cd import parser as parser_cd
- from api.od import ODAPI
- from bootstrap.scd import bootstrap_scd
- from examples.schedule.generator import schedule_generator
- from examples.schedule.schedule_lib import End, NullNode
- from framework.conformance import Conformance, render_conformance_check_result
- from state.devstate import DevState
- class ScheduleActionGenerator:
- def __init__(self, rule_executer, schedulefile:str):
- self.rule_executer = rule_executer
- self.rule_dict = {}
- self.schedule: "Schedule"
- self.state = DevState()
- self.load_schedule(schedulefile)
- def load_schedule(self, filename):
- print("Loading schedule ...")
- scd_mmm = bootstrap_scd(self.state)
- with open("../schedule/models/scheduling_MM.od", "r") as f_MM:
- mm_cs = f_MM.read()
- with open(f"{filename}", "r") as f_M:
- m_cs = f_M.read()
- print("OK")
- print("\nParsing models")
- print(f"\tParsing meta model")
- scheduling_mm = parser_cd.parse_cd(
- self.state,
- m_text=mm_cs,
- )
- print(f"\tParsing '{filename}_M.od' model")
- scheduling_m = parser_od.parse_od(
- self.state,
- m_text=m_cs,
- mm=scheduling_mm
- )
- print(f"OK")
- print("\tmeta-meta-model a valid class diagram")
- conf = Conformance(self.state, scd_mmm, scd_mmm)
- print(render_conformance_check_result(conf.check_nominal()))
- print(f"Is our '{filename}_M.od' model a valid '{filename}_MM.od' diagram?")
- conf = Conformance(self.state, scheduling_m, scheduling_mm)
- print(render_conformance_check_result(conf.check_nominal()))
- print("OK")
- od = ODAPI(self.state, scheduling_m, scheduling_mm)
- g = schedule_generator(od)
- output_buffer = io.StringIO()
- g.generate_schedule(output_buffer)
- open(f"schedule.py", "w").write(output_buffer.getvalue())
- spec = importlib.util.spec_from_file_location("schedule", "schedule.py")
- scedule_module = importlib.util.module_from_spec(spec)
- spec.loader.exec_module(scedule_module)
- self.schedule = scedule_module.Schedule(self.rule_executer)
- self.load_matchers()
- def load_matchers(self):
- matchers = dict()
- for file in self.schedule.get_matchers():
- matchers[file] = self.rule_executer.load_match(file)
- self.schedule.init_schedule(matchers)
- def __call__(self, api: ODAPI):
- exec_op = self.schedule(api)
- yield from exec_op
- def termination_condition(self, api: ODAPI):
- if type(self.schedule.cur) == End:
- return "jay"
- if type(self.schedule.cur) == NullNode:
- return "RRRR"
- return None
- def generate_dot(self):
- env = Environment(loader=FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates')))
- env.trim_blocks = True
- env.lstrip_blocks = True
- template_dot = env.get_template('schedule_dot.j2')
- nodes = []
- edges = []
- visit = set()
- self.schedule.generate_dot(nodes, edges, visit)
- print("Nodes:")
- print(nodes)
- print("\nEdges:")
- print(edges)
- with open("test.dot", "w") as f_dot:
- f_dot.write(template_dot.render({"nodes": nodes, "edges": edges}))
|