200 lines
5.1 KiB
Text
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
|
|
```;
|
|
}
|
|
|
|
##################################################
|