PM_MetaModel.mvc 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. include "primitives.alh"
  2. include "object_operations.alh"
  3. include "modelling.alh"
  4. SimpleAttribute String {}
  5. SimpleAttribute MvCName {
  6. constraint = $
  7. String function constraint(model : Element, name : String):
  8. if (bool_not(is_physical_string(model["model"][name]))):
  9. return "MvCName has no string value"!
  10. else:
  11. return "OK"!
  12. $
  13. }
  14. SimpleAttribute Natural {
  15. constraint =$
  16. String function constraint(model: Element, id: String):
  17. if (bool_not(is_physical_int(model["model"][id]))):
  18. return "Natural has no integer value at " + id!
  19. elif (integer_lt(model["model"][id], 0)):
  20. return "Natural does not have a positive or zero value at " + id!
  21. else:
  22. return "OK"!
  23. $
  24. }
  25. Class Model {
  26. items_creation_order ?: String
  27. SCCD_id : String
  28. }
  29. Class Activity {
  30. id : String
  31. }
  32. Class Edge {
  33. id : String
  34. }
  35. Class Start : Activity {
  36. lower_cardinality = 1
  37. upper_cardinality = 1
  38. constraint = $
  39. String function constraint(model : Element, name : String):
  40. Element outgoing_edges
  41. outgoing_edges = allOutgoingAssociationInstances(model, name, "Next")
  42. if list_len(outgoing_edges) !=1:
  43. return "A start node should have one outgoing control flow"!
  44. else:
  45. return "OK"!
  46. $
  47. }
  48. Class Finish : Activity {
  49. lower_cardinality = 1
  50. constraint = $
  51. String function constraint(model : Element, name : String):
  52. Element incoming_edges
  53. incoming_edges = allIncomingAssociationInstances(model, name, "Next")
  54. if (list_len(incoming_edges) !=1):
  55. return "A finish node should have either one incoming control flow or decision flow"!
  56. else:
  57. return "OK"!
  58. $
  59. }
  60. Class Fork : Activity {
  61. constraint = $
  62. String function constraint(model : Element, name : String):
  63. Element outgoing_edges
  64. Element incoming_edges
  65. outgoing_edges = allOutgoingAssociationInstances(model, name, "Next")
  66. incoming_edges = allIncomingAssociationInstances(model, name, "Next")
  67. if bool_or(list_len(outgoing_edges) <2, list_len(incoming_edges) !=1):
  68. return "All Fork nodes should have one incoming control flow and at least two outgoing control flows"!
  69. else:
  70. return "OK"!
  71. $
  72. }
  73. Class Join : Activity {
  74. constraint = $
  75. String function constraint(model : Element, name : String):
  76. Element outgoing_edges
  77. Element incoming_edges
  78. outgoing_edges = allOutgoingAssociationInstances(model, name, "Next")
  79. incoming_edges = allIncomingAssociationInstances(model, name, "Next")
  80. if bool_or(list_len(outgoing_edges) !=1, list_len(incoming_edges) <2):
  81. return "All Join nodes should have at least two incoming and one outgoing control flow"!
  82. else:
  83. return "OK"!
  84. $
  85. }
  86. Class Decision : Activity {
  87. constraint = $
  88. String function constraint(model : Element, name : String):
  89. Element outgoing_edges
  90. Element incoming_edges
  91. Element consumes
  92. consumes = allOutgoingAssociationInstances(model, name, "DecisionConsumes")
  93. outgoing_edges = allOutgoingAssociationInstances(model, name, "Next")
  94. incoming_edges = allIncomingAssociationInstances(model, name, "Next")
  95. if bool_or(list_len(outgoing_edges) <2, list_len(incoming_edges) !=1):
  96. return "All Decision nodes should have at least one incoming flow and two outgoing flows"!
  97. elif list_len(consumes) != 1:
  98. return "All Decision nodes should have exactly one incoming data flow"!
  99. else:
  100. return "OK"!
  101. $
  102. }
  103. Class Exec : Activity {
  104. name : MvCName
  105. sccd_class_id ?: String
  106. lower_cardinality = 1
  107. constraint = $
  108. String function constraint(model : Element, name : String):
  109. Element outgoing_edges
  110. Element incoming_edges
  111. outgoing_edges = allOutgoingAssociationInstances(model, name, "Next")
  112. incoming_edges = allIncomingAssociationInstances(model, name, "Next")
  113. if bool_or(list_len(outgoing_edges) !=1, list_len(incoming_edges) !=1):
  114. return "All Executable nodes should have exactly one incoming and one outgoing control flow"!
  115. else:
  116. return "OK"!
  117. $
  118. }
  119. Class Data {
  120. id : String
  121. name : MvCName
  122. type : MvCName
  123. constraint = $
  124. String function constraint(model : Element, name : String):
  125. Element outgoing_edges
  126. Element incoming_edges
  127. outgoing_edges = allIncomingAssociationInstances(model, name, "Consumes")
  128. incoming_edges = allIncomingAssociationInstances(model, name, "Produces")
  129. if bool_or(list_len(outgoing_edges) <1, list_len(incoming_edges) <1):
  130. return "All Data nodes should have al-least one incoming Produces and one outgoing Consumes flow"!
  131. else:
  132. return "OK"!
  133. $
  134. }
  135. Association Produces : Edge (Exec, Data) {}
  136. Association Consumes : Edge (Exec, Data) {}
  137. Association DecisionConsumes : Edge (Decision, Data) {}
  138. Association Next : Edge (Activity, Activity) {
  139. value ?: MvCName
  140. }
  141. Class CanvasPosition{
  142. x1: Natural
  143. y1: Natural
  144. x2 ?: Natural
  145. y2 ?: Natural
  146. }
  147. Association activity_position (Activity, CanvasPosition){}
  148. Association data_position (Data, CanvasPosition){}
  149. Association produces_positions (Produces, CanvasPosition){
  150. order: Natural
  151. }
  152. Association consumes_positions (Consumes, CanvasPosition){
  153. order: Natural
  154. }
  155. Association decision_consumes_positions (DecisionConsumes, CanvasPosition){
  156. order: Natural
  157. }
  158. Association next_positions (Next, CanvasPosition){
  159. order: Natural
  160. }