muMLE/examples/ftg_pm_pt/pm/metamodels/mm_design.od

200 lines
5.1 KiB
Text

##################################################
pm_Model:Class
##################################################
pm_Stateful:Class
##################################################
pm_ModelElement:Class {
abstract = True;
}
##################################################
pm_Activity:Class
:Inheritance (pm_Activity -> pm_ModelElement)
pm_Activity_name:AttributeLink (pm_Activity -> String) {
name = "name";
optional = False;
}
pm_Activity_composite:AttributeLink (pm_Activity -> Boolean) {
name = "composite";
optional = False;
}
pm_Activity_subworkflow_path:AttributeLink (pm_Activity -> String) {
name = "subworkflow_path";
optional = True;
}
pm_AutomatedActivity:Class {
abstract = True;
} :Inheritance (pm_AutomatedActivity -> pm_Activity)
pm_AutomatedActivity_input_or:AttributeLink (pm_AutomatedActivity -> Boolean) {
name = "input_or";
optional = False;
}
pm_PythonAutomatedActivity:Class
:Inheritance (pm_PythonAutomatedActivity -> pm_AutomatedActivity)
pm_PythonAutomatedActivity_func:AttributeLink (pm_PythonAutomatedActivity -> ActionCode) {
name = "func";
optional = False;
}
##################################################
pm_Artefact:Class
:Inheritance (pm_Artefact -> pm_ModelElement)
:Inheritance (pm_Artefact -> pm_Stateful)
##################################################
pm_CtrlPort:Class {
abstract = True;
} :Inheritance (pm_CtrlPort -> pm_Stateful)
pm_CtrlIn:Class {
abstract = True;
} :Inheritance (pm_CtrlIn -> pm_CtrlPort)
pm_CtrlSink:Class {
# 1) A control sink port must have at least one incoming control flow
# 2) A control sink port can't have any control flow output
constraint = ```
has_incoming = len(get_incoming(this, "pm_CtrlFlow")) > 0
no_outgoing = len(get_outgoing(this, "pm_CtrlFlow")) == 0
# Return constraint
has_incoming and no_outgoing
```;
} :Inheritance (pm_CtrlSink -> pm_CtrlIn)
pm_CtrlActivityIn:Class {
# 1) Must have at least one incoming control flow
constraint = ```
has_incoming = len(get_incoming(this, "pm_CtrlFlow")) > 0
# Return constraint
has_incoming
```;
} :Inheritance (pm_CtrlActivityIn -> pm_CtrlIn)
pm_CtrlOut:Class {
abstract = True;
} :Inheritance (pm_CtrlOut -> pm_CtrlPort)
pm_CtrlSource:Class {
# 1) A control source port can't have any control flow inputs
# 2) A control source port must have at least one outgoing control flow
constraint = ```
no_incoming = len(get_incoming(this, "pm_CtrlFlow")) == 0
has_outgoing = len(get_outgoing(this, "pm_CtrlFlow")) > 0
# Return constraint
no_incoming and has_outgoing
```;
} :Inheritance (pm_CtrlSource -> pm_CtrlOut)
pm_CtrlActivityOut:Class {
# 1) Must have at least one outgoing control flow
constraint = ```
has_outgoing = len(get_outgoing(this, "pm_CtrlFlow")) > 0
# Return constraint
has_outgoing
```;
} :Inheritance (pm_CtrlActivityOut -> pm_CtrlOut)
##################################################
pm_DataPort:Class {
abstract = True;
}
pm_DataIn:Class {
abstract = True;
} :Inheritance (pm_DataIn -> pm_DataPort)
pm_DataSink:Class
:Inheritance (pm_DataSink -> pm_DataIn)
pm_DataActivityIn:Class
:Inheritance (pm_DataActivityIn -> pm_DataIn)
pm_DataOut:Class {
abstract = True;
} :Inheritance (pm_DataOut -> pm_DataPort)
pm_DataSource:Class
:Inheritance (pm_DataSource -> pm_DataOut)
pm_DataActivityOut:Class
:Inheritance (pm_DataActivityOut -> pm_DataOut)
##################################################
##################################################
pm_Owns:Association (pm_Model -> pm_ModelElement) {
source_lower_cardinality = 1;
source_upper_cardinality = 1;
}
##################################################
pm_CtrlFlow:Association (pm_CtrlPort -> pm_CtrlPort)
##################################################
pm_HasCtrlIn:Association (pm_Activity -> pm_CtrlIn) {
source_upper_cardinality = 1;
target_lower_cardinality = 1;
}
pm_HasCtrlOut:Association (pm_Activity -> pm_CtrlOut) {
source_upper_cardinality = 1;
target_lower_cardinality = 1;
}
pm_HasDataIn:Association (pm_Activity -> pm_DataIn) {
source_upper_cardinality = 1;
}
pm_HasDataOut:Association (pm_Activity -> pm_DataOut) {
source_upper_cardinality = 1;
}
##################################################
pm_DataFlowIn:Association (pm_DataOut -> pm_Artefact) {
source_lower_cardinality = 1;
target_lower_cardinality = 1;
}
pm_DataFlowOut:Association (pm_Artefact -> pm_DataIn) {
source_lower_cardinality = 1;
target_lower_cardinality = 1;
}
##################################################
##################################################
has_source_and_sink:GlobalConstraint {
# There should be at least one source and sink control port
constraint = ```
contains_source = len(get_all_instances("pm_CtrlSource")) > 0
contains_sink = len(get_all_instances("pm_CtrlSink")) > 0
# return constraint
contains_source and contains_sink
```;
}
##################################################