Przeglądaj źródła

OD service: redirect function already implemented in ODAPI

Joeri Exelmans 1 rok temu
rodzic
commit
16604d0f0b
1 zmienionych plików z 10 dodań i 17 usunięć
  1. 10 17
      services/od.py

+ 10 - 17
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