OD service: redirect function already implemented in ODAPI

This commit is contained in:
Joeri Exelmans 2024-11-05 13:58:02 +01:00
parent b73ca789cc
commit 16604d0f0b

View file

@ -5,7 +5,7 @@ from services.primitives.integer_type import Integer
from services.primitives.string_type import String from services.primitives.string_type import String
from services.primitives.boolean_type import Boolean from services.primitives.boolean_type import Boolean
from services.primitives.actioncode_type import ActionCode from services.primitives.actioncode_type import ActionCode
from framework.conformance import Conformance from api.cd import CDAPI
from typing import Optional from typing import Optional
def get_slot_link_name(obj_name: str, attr_name: str): def get_slot_link_name(obj_name: str, attr_name: str):
@ -28,6 +28,7 @@ class OD:
self.type_model = type_model self.type_model = type_model
self.model = model self.model = model
self.bottom = Bottom(state) self.bottom = Bottom(state)
self.cd = CDAPI(self.bottom.state, self.type_model)
def create_object(self, name: str, class_name: str): 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}'") raise Exception(f"Cannot create object: No such class '{class_name}'")
class_node = class_nodes[0] class_node = class_nodes[0]
abstract_nodes = self.bottom.read_outgoing_elements(self.type_model, f"{class_name}.abstract") abstract_nodes = self.bottom.read_outgoing_elements(self.type_model, f"{class_name}.abstract")
try:
return self._create_object(name, class_node) 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): def _create_object(self, name: str, class_node: UUID):
# Look at our `type_model` as if it's an object diagram: # 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}` # 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): def get_attr_link_name(self, class_name, attr_name):
assoc_name = f"{class_name}_{attr_name}" return self.cd.get_attr_link_name(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
def create_link(self, link_name: Optional[str], assoc_name: str, src_obj_name: str, tgt_obj_name: str): 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) src_obj_nodes = self.bottom.read_outgoing_elements(self.model, src_obj_name)
if len(src_obj_nodes) == 0: 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] src_obj_node = src_obj_nodes[0]
tgt_obj_nodes = self.bottom.read_outgoing_elements(self.model, tgt_obj_name) tgt_obj_nodes = self.bottom.read_outgoing_elements(self.model, tgt_obj_name)
if len(tgt_obj_nodes) == 0: 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] tgt_obj_node = tgt_obj_nodes[0]
# generate a unique name for the link # generate a unique name for the link