PM_MetaModel.mvc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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. }
  39. Class Finish : Activity {
  40. lower_cardinality = 1
  41. constraint = $
  42. String function constraint(model : Element, name : String):
  43. Element incoming_edges
  44. incoming_edges = allIncomingAssociationInstances(model, name, "Next")
  45. if list_len(incoming_edges) !=1:
  46. return "A finish node should have exactly one incoming control-flow at " + name!
  47. else:
  48. return "OK"!
  49. $
  50. }
  51. Class Fork : Activity {
  52. constraint = $
  53. String function constraint(model : Element, name : String):
  54. Element incoming_edges
  55. incoming_edges = allIncomingAssociationInstances(model, name, "Next")
  56. if list_len(incoming_edges) <1:
  57. return "A Fork node should have at-least one incoming control-flow at " + name!
  58. else:
  59. return "OK"!
  60. $
  61. }
  62. Class Join : Activity {
  63. constraint = $
  64. String function constraint(model : Element, name : String):
  65. Element incoming_edges
  66. Element source
  67. String type
  68. incoming_edges = allIncomingAssociationInstances(model, name, "Next")
  69. if list_len(incoming_edges) >0:
  70. Integer i
  71. i = 0
  72. while i < list_len (incoming_edges):
  73. source = readAssociationSource(model, list_read(incoming_edges, i))
  74. type = read_type(model, source)
  75. if type == "Start":
  76. return "A join node can not have a Start node as an incoming flow at "+name!
  77. if list_len(incoming_edges) <2:
  78. return "A Join node should have at least two incoming control flows at " + name!
  79. else:
  80. return "OK"!
  81. $
  82. }
  83. Class Decision : Activity {
  84. constraint = $
  85. String function constraint(model : Element, name : String):
  86. Element incoming_edges
  87. incoming_edges = allIncomingAssociationInstances(model, name, "Next")
  88. if list_len(incoming_edges) <1:
  89. return "A Decision node should have at least one incoming control-flows at " + name!
  90. else:
  91. return "OK"!
  92. $
  93. }
  94. Class Exec : Activity {
  95. name : MvCName
  96. sccd_class_id ?: String
  97. lower_cardinality = 1
  98. constraint = $
  99. String function constraint(model : Element, name : String):
  100. Element incoming_edges
  101. incoming_edges = allIncomingAssociationInstances(model, name, "Next")
  102. if list_len(incoming_edges) <1:
  103. return "An Executable node should have at-least one incoming control-flow at " + name!
  104. else:
  105. return "OK"!
  106. $
  107. }
  108. Class Data {
  109. id : String
  110. name : MvCName
  111. type : MvCName
  112. }
  113. Association Produces : Edge (Exec, Data) {
  114. source_lower_cardinality = 1
  115. }
  116. Association Consumes : Edge (Exec, Data) {}
  117. Association DecisionConsumes : Edge (Decision, Data) {
  118. target_lower_cardinality = 1
  119. target_upper_cardinality = 1
  120. }
  121. Association Next : Edge (Activity, Activity) {
  122. value ?: MvCName
  123. }
  124. Association S2A : Next(Start, Activity){
  125. target_lower_cardinality = 1
  126. target_upper_cardinality = 1
  127. }
  128. Association E2A : Next(Exec, Activity){
  129. target_lower_cardinality = 1
  130. target_upper_cardinality = 1
  131. }
  132. Association F2A : Next(Fork, Activity){
  133. target_lower_cardinality = 2
  134. }
  135. Association J2A : Next(Join, Activity){
  136. target_lower_cardinality = 1
  137. target_upper_cardinality = 1
  138. }
  139. Association D2A : Next(Decision, Activity){
  140. target_lower_cardinality = 2
  141. }
  142. Class CanvasPosition{
  143. x1: Natural
  144. y1: Natural
  145. x2 ?: Natural
  146. y2 ?: Natural
  147. }
  148. Association activity_position (Activity, CanvasPosition){}
  149. Association data_position (Data, CanvasPosition){}
  150. Association produces_positions (Produces, CanvasPosition){
  151. order: Natural
  152. }
  153. Association consumes_positions (Consumes, CanvasPosition){
  154. order: Natural
  155. }
  156. Association decision_consumes_positions (DecisionConsumes, CanvasPosition){
  157. order: Natural
  158. }
  159. Association next_positions (Next, CanvasPosition){
  160. order: Natural
  161. }