121 lines
6.1 KiB
Python
121 lines
6.1 KiB
Python
from core.element import Element, String, Integer, Boolean
|
|
from state.base import State
|
|
from core.context.generic import GenericContext
|
|
|
|
|
|
class SCDContext(GenericContext):
|
|
def __init__(self, state: State, model: Element, metamodel: Element):
|
|
super().__init__(state, model, metamodel)
|
|
|
|
def exposed_methods(self):
|
|
yield from super().exposed_methods()
|
|
yield from [
|
|
self.create_class,
|
|
self.create_class_attribute,
|
|
self.create_association,
|
|
self.create_inheritance
|
|
]
|
|
|
|
def create_class(self, name: String, lower_cardinality: Integer = Element(), upper_cardinality: Integer = Element()):
|
|
self.instantiate(Element(value="Class"), name)
|
|
if lower_cardinality.value is not None:
|
|
self.instantiate_value(
|
|
Element(value="Class_lower_cardinality"),
|
|
Element(value=name.value + ".lower_cardinality"),
|
|
lower_cardinality
|
|
)
|
|
self.instantiate_link(
|
|
Element(value="Class_lower_cardinality_link"),
|
|
Element(value=name.value + ".lower_cardinality_link"),
|
|
name,
|
|
Element(value=name.value + ".lower_cardinality")
|
|
)
|
|
if upper_cardinality.value is not None:
|
|
self.instantiate_value(
|
|
Element(value="Class_upper_cardinality"),
|
|
Element(value=name.value + ".upper_cardinality"),
|
|
upper_cardinality
|
|
)
|
|
self.instantiate_link(
|
|
Element(value="Class_upper_cardinality_link"),
|
|
Element(value=name.value + ".upper_cardinality_link"),
|
|
name,
|
|
Element(value=name.value + ".upper_cardinality")
|
|
)
|
|
|
|
def create_class_attribute(self, class_name: String, name: String, optional: Boolean = Element(value=False)):
|
|
# create attribute
|
|
element_name = Element(value=f"{class_name.value}_{name.value}")
|
|
element_link_name = Element(value=f"{class_name.value}_{name.value}_link")
|
|
self.instantiate(Element(value="Attribute"), element_name)
|
|
self.instantiate_link(Element(value="AttributeLink"), element_link_name, class_name, element_name)
|
|
# set attribute's attributes
|
|
attr_name_name = Element(value=f"{class_name.value}_{name.value}.name")
|
|
attr_optional_name = Element(value=f"{class_name.value}_{name.value}.optional")
|
|
attr_name_link_name = Element(value=f"{class_name.value}_{name.value}.name_link")
|
|
attr_optional_link_name = Element(value=f"{class_name.value}_{name.value}.optional_link")
|
|
self.instantiate_value(Element(value="Attribute_name"), attr_name_name, name)
|
|
self.instantiate_value(Element(value="Attribute_optional"), attr_optional_name, optional)
|
|
self.instantiate_link(Element(value="Attribute_name_link"), attr_name_link_name, element_name, attr_name_name)
|
|
self.instantiate_link(Element(value="Attribute_optional_link"), attr_optional_link_name, element_name, attr_optional_name)
|
|
|
|
def create_association(self, source_class_name: String, target_class_name: String, name: String,
|
|
source_lower_cardinality: Integer = Element(), target_lower_cardinality: Integer = Element(),
|
|
source_upper_cardinality: Integer = Element(), target_upper_cardinality: Integer = Element()
|
|
):
|
|
self.instantiate_link(Element(value="Association"), name, source_class_name, target_class_name)
|
|
if source_lower_cardinality.value is not None:
|
|
self.instantiate_value(
|
|
Element(value="Association_source_lower_cardinality"),
|
|
Element(value=name.value + ".source_lower_cardinality"),
|
|
source_lower_cardinality
|
|
)
|
|
self.instantiate_link(
|
|
Element(value="Association_source_lower_cardinality_link"),
|
|
Element(value=name.value + ".source_lower_cardinality_link"),
|
|
name,
|
|
Element(value=name.value + ".source_lower_cardinality")
|
|
)
|
|
if source_upper_cardinality.value is not None:
|
|
self.instantiate_value(
|
|
Element(value="Association_source_upper_cardinality"),
|
|
Element(value=name.value + ".source_upper_cardinality"),
|
|
source_upper_cardinality
|
|
)
|
|
self.instantiate_link(
|
|
Element(value="Association_source_upper_cardinality_link"),
|
|
Element(value=name.value + ".source_upper_cardinality_link"),
|
|
name,
|
|
Element(value=name.value + ".source_upper_cardinality")
|
|
)
|
|
if target_lower_cardinality.value is not None:
|
|
self.instantiate_value(
|
|
Element(value="Association_target_lower_cardinality"),
|
|
Element(value=name.value + ".target_lower_cardinality"),
|
|
target_lower_cardinality
|
|
)
|
|
self.instantiate_link(
|
|
Element(value="Association_target_lower_cardinality_link"),
|
|
Element(value=name.value + ".target_lower_cardinality_link"),
|
|
name,
|
|
Element(value=name.value + ".target_lower_cardinality")
|
|
)
|
|
if target_upper_cardinality.value is not None:
|
|
self.instantiate_value(
|
|
Element(value="Association_target_upper_cardinality"),
|
|
Element(value=name.value + ".target_upper_cardinality"),
|
|
target_upper_cardinality
|
|
)
|
|
self.instantiate_link(
|
|
Element(value="Association_target_upper_cardinality_link"),
|
|
Element(value=name.value + ".target_upper_cardinality_link"),
|
|
name,
|
|
Element(value=name.value + ".target_upper_cardinality")
|
|
)
|
|
|
|
def create_inheritance(self, parent_class_name: String, child_class_name: String):
|
|
self.instantiate_link(
|
|
Element(value="Inheritance"),
|
|
Element(value=f"{child_class_name.value}_inherits_from_{parent_class_name.value}"),
|
|
child_class_name,
|
|
parent_class_name)
|