diff --git a/services/od.py b/services/od.py index d0eacba..4b1a505 100644 --- a/services/od.py +++ b/services/od.py @@ -5,7 +5,7 @@ from services.primitives.integer_type import Integer from services.primitives.string_type import String from services.primitives.boolean_type import Boolean from services.primitives.actioncode_type import ActionCode -from framework.conformance import Conformance +from api.cd import CDAPI from typing import Optional def get_slot_link_name(obj_name: str, attr_name: str): @@ -28,6 +28,7 @@ class OD: self.type_model = type_model self.model = model self.bottom = Bottom(state) + self.cd = CDAPI(self.bottom.state, self.type_model) def create_object(self, name: str, class_name: str): @@ -36,7 +37,11 @@ class OD: raise Exception(f"Cannot create object: No such class '{class_name}'") class_node = class_nodes[0] abstract_nodes = self.bottom.read_outgoing_elements(self.type_model, f"{class_name}.abstract") - return self._create_object(name, class_node) + try: + return self._create_object(name, class_node) + except Exception as e: + e.add_note("Class: " + class_name) + raise def _create_object(self, name: str, class_node: UUID): # Look at our `type_model` as if it's an object diagram: @@ -155,28 +160,16 @@ class OD: # The edge connecting an object to the value of a slot must be named `{object_name}_{attr_name}` def get_attr_link_name(self, class_name, attr_name): - assoc_name = f"{class_name}_{attr_name}" - type_edges = self.bottom.read_outgoing_elements(self.type_model, assoc_name) - if len(type_edges) == 1: - return assoc_name - else: - # look for attribute in the super-types - conf = Conformance(self.bottom.state, self.model, self.type_model) - conf.precompute_sub_types() # only need to know about subtypes - super_types = [s for s in conf.sub_types if class_name in conf.sub_types[s]] - for s in super_types: - assoc_name = f"{s}_{attr_name}" - if len(self.bottom.read_outgoing_elements(self.type_model, assoc_name)) == 1: - return assoc_name + return self.cd.get_attr_link_name(class_name, attr_name) def create_link(self, link_name: Optional[str], assoc_name: str, src_obj_name: str, tgt_obj_name: str): src_obj_nodes = self.bottom.read_outgoing_elements(self.model, src_obj_name) if len(src_obj_nodes) == 0: - raise Exception(f"Cannot create link '{link_name}' ({assoc_name}): source object '{src_obj_name}'' not found") + raise Exception(f"Cannot create link '{link_name}' ({assoc_name}): source object '{src_obj_name}' not found") src_obj_node = src_obj_nodes[0] tgt_obj_nodes = self.bottom.read_outgoing_elements(self.model, tgt_obj_name) if len(tgt_obj_nodes) == 0: - raise Exception(f"Cannot create link '{link_name}' ({assoc_name}): target object '{tgt_obj_name}'' not found") + raise Exception(f"Cannot create link '{link_name}' ({assoc_name}): target object '{tgt_obj_name}' not found") tgt_obj_node = tgt_obj_nodes[0] # generate a unique name for the link