SCCD_MetaModel.mvc 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. include "primitives.alh"
  2. include "object_operations.alh"
  3. include "modelling.alh"
  4. SimpleAttribute Action {}
  5. SimpleAttribute Neutral {}
  6. SimpleAttribute Boolean {
  7. constraint = $
  8. String function constraint(model: Element, id: String):
  9. if (bool_not(is_physical_boolean(model["model"][id]))):
  10. return "Boolean has no boolean value at " + id!
  11. else:
  12. return "OK"!
  13. $
  14. }
  15. SimpleAttribute String {
  16. constraint = $
  17. String function constraint(model: Element, id: String):
  18. if (bool_not(is_physical_string(model["model"][id]))):
  19. return "String has no string value at " + id!
  20. else:
  21. return "OK"!
  22. $
  23. }
  24. SimpleAttribute Natural {
  25. constraint =$
  26. String function constraint(model: Element, id: String):
  27. if (bool_not(is_physical_int(model["model"][id]))):
  28. return "Natural has no integer value at " + id!
  29. elif (integer_lt(model["model"][id], 0)):
  30. return "Natural does not have a positive or zero value at " + id!
  31. else:
  32. return "OK"!
  33. $
  34. }
  35. SimpleAttribute PositiveFloat {
  36. constraint =$
  37. String function constraint(model: Element, id: String):
  38. if (bool_not(is_physical_float(model["model"][id]))):
  39. return "PositiveFloat has no float value at " + id!
  40. elif (integer_lt(model["model"][id], 0)):
  41. return "PositiveFloat does not have a positive or zero value at " + id!
  42. else:
  43. return "OK"!
  44. $
  45. }
  46. SimpleAttribute EventScope {
  47. constraint =$
  48. String function constraint(model: Element, id: String):
  49. String self
  50. self = model["model"][id]
  51. if (bool_not(is_physical_string(self))):
  52. return "EventScope has no string value at " + id!
  53. elif (bool_and(bool_and(bool_and(self != "broad", self != "cd"), bool_and(self != "narrow", self != "output")), self != "local")):
  54. return "EventScope can be either 'local', 'broad', 'cd', 'narrow' or 'output' and it does not have a proper value at " + id!
  55. else:
  56. return "OK"!
  57. $
  58. }
  59. Class Diagram{
  60. name : String
  61. author ?: String
  62. description ?: String
  63. top ?: String
  64. class_reference_items ?: String
  65. lower_cardinality = 1
  66. upper_cardinality = 1
  67. }
  68. Class Inport{
  69. name: String
  70. }
  71. Class Outport{
  72. name: String
  73. }
  74. Association diagram_inports(Diagram, Inport){}
  75. Association diagram_outports(Diagram, Outport){}
  76. Class Class{
  77. name : String
  78. constructor_body ?: Action
  79. destructor ?: Action
  80. default ?: Boolean
  81. external ?: Boolean
  82. class_behaviour_items ?: String
  83. }
  84. Association diagram_classes(Diagram, Class){
  85. target_lower_cardinality = 1
  86. }
  87. Class Attribute{
  88. name : String
  89. type ?: String
  90. }
  91. Association class_attributes(Class, Attribute){}
  92. Class Method{
  93. name : String
  94. body : Action
  95. return_type ?: String
  96. }
  97. Class FormalParameter{
  98. name: String
  99. type ?: String
  100. default ?: String
  101. }
  102. Association method_parameters(Method, FormalParameter){}
  103. Association class_methods(Class, Method){}
  104. Association class_constructor_parameters(Class, FormalParameter){}
  105. Class CanvasPosition{
  106. x1: Natural
  107. y1: Natural
  108. x2 ?: Natural
  109. y2 ?: Natural
  110. }
  111. Association class_ref_position(Class, CanvasPosition){
  112. target_upper_cardinality = 1
  113. }
  114. Association class_beh_position(Class, CanvasPosition){
  115. target_upper_cardinality = 1
  116. }
  117. Association association(Class, Class){
  118. name : String
  119. min ?: Natural
  120. max ?: Natural
  121. source_upper_cardinality = 1
  122. }
  123. Association association_positions(association, CanvasPosition){
  124. order: Natural
  125. }
  126. Association inheritance(Class, Class){
  127. priority ?: Natural
  128. source_upper_cardinality = 1
  129. }
  130. Class SuperClassConstructorParameter{
  131. value : Neutral
  132. }
  133. Association inheritance_parent_constructor_parameters(inheritance, SuperClassConstructorParameter){
  134. order : Natural
  135. }
  136. Association inheritance_positions(inheritance, CanvasPosition){
  137. order: Natural
  138. }
  139. Class State{
  140. name : String
  141. state_reference_path ?: String
  142. }
  143. Association state_position(State, CanvasPosition){
  144. target_upper_cardinality = 1
  145. }
  146. Class BasicState : State{
  147. isInitial ?: Boolean
  148. onEntryScript ?: Action
  149. onExitScript ?: Action
  150. }
  151. Class ActualParameter{
  152. exp: String
  153. }
  154. Class Raise{
  155. event: String
  156. scope ?: EventScope
  157. port ?: String
  158. target ?: String
  159. parameter ?: Action
  160. }
  161. Association raise_parameters(Raise, ActualParameter){
  162. order : Natural
  163. }
  164. Association onEntryRaise(BasicState, Raise){
  165. order : Natural
  166. }
  167. Association onExitRaise(BasicState, Raise){
  168. order ?: Natural
  169. }
  170. Class CompositeState : BasicState{}
  171. Association composite_children(CompositeState, State){
  172. source_upper_cardinality = 1
  173. }
  174. Association behaviour(Class, CompositeState){
  175. target_lower_cardinality = 1
  176. target_upper_cardinality = 1
  177. }
  178. Association behaviour_positions(behaviour, CanvasPosition){
  179. order: Natural
  180. }
  181. Class ParallelState : BasicState{}
  182. Association parallel_children(ParallelState, CompositeState){
  183. source_upper_cardinality = 1
  184. }
  185. Class HistoryState : State{
  186. type : String
  187. }
  188. Association transition(State, State){
  189. name ?: String
  190. cond ?: Action
  191. script ?: Action
  192. after ?: Action
  193. event ?: String
  194. port ?: String
  195. source_upper_cardinality = 1
  196. }
  197. Association transition_parameters(transition, FormalParameter){
  198. order : Natural
  199. }
  200. Association transition_raises(transition, Raise){
  201. order : Natural
  202. }
  203. Association transition_positions(transition, CanvasPosition){
  204. order: Natural
  205. }
  206. GlobalConstraint {
  207. global_constraint = $
  208. String function constraint(model : Element):
  209. Element composite_states
  210. Element parallel_states
  211. Element children
  212. String state
  213. String child
  214. String name
  215. Boolean CompInitialFound
  216. Element encountered_names
  217. composite_states = allInstances(model, "CompositeState")
  218. parallel_states = allInstances(model, "ParallelState")
  219. while (list_len(composite_states) >0):
  220. CompInitialFound = False
  221. encountered_names = create_node()
  222. state = set_pop(composite_states)
  223. children = allAssociationDestinations(model, state, "composite_children")
  224. while (list_len(children)>0):
  225. child = set_pop(children)
  226. name = read_attribute(model, child, 'name')
  227. if (set_in(encountered_names, name)):
  228. return "Unique state identifier names on the same level/parent violated"!
  229. else:
  230. set_add(encountered_names, name)
  231. if bool_and(read_type(model, child) != 'HistoryState' , read_attribute(model, child, 'isInitial')):
  232. CompInitialFound = True
  233. if CompInitialFound == False:
  234. return "Composite state does not have an initial child state"!
  235. while (list_len(parallel_states) >0):
  236. encountered_names = create_node()
  237. state = set_pop(parallel_states)
  238. children = allAssociationDestinations(model, state, "parallel_children")
  239. while (list_len(children)>0):
  240. child = set_pop(children)
  241. name = read_attribute(model, child, 'name')
  242. if (set_in(encountered_names, name)):
  243. return "Unique state identifier names on the same level/parent violated"!
  244. else:
  245. set_add(encountered_names, name)
  246. return "OK"!
  247. $
  248. }