SCCD_MetaModel.mvc 7.9 KB

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