ramify.alc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. include "primitives.alh"
  2. include "object_operations.alh"
  3. include "modelling.alh"
  4. include "metamodels.alh"
  5. include "model_management.alh"
  6. Element function ramify(model : Element):
  7. // Create new model structure
  8. Element new_model
  9. new_model = create_node()
  10. dict_add(new_model, "model", create_node())
  11. dict_add(new_model, "type_mapping", create_node())
  12. dict_add(new_model, "metamodel", model["metamodel"])
  13. dict_add(new_model, "source", model)
  14. dict_add(new_model, "target", model)
  15. // Get local variables for parts
  16. Element old_m
  17. Element new_m
  18. Element mm
  19. new_m = new_model["model"]
  20. old_m = model["model"]
  21. mm = new_model["metamodel"]["model"]
  22. // Add in some primitives
  23. instantiate_node(new_model, "Class", "Natural")
  24. instantiate_node(new_model, "Class", "String")
  25. instantiate_node(new_model, "Class", "Any")
  26. // Add in the complete AL metamodel
  27. add_AL_to_MM(new_model)
  28. // Add some default elements
  29. // Class LHS_Root {
  30. // constraint : funcdef {
  31. // target_upper_cardinality = 1
  32. // }
  33. // upper_cardinality = 1
  34. // lower_cardinality = 1
  35. // }
  36. instantiate_node(new_model, "Class", "LHS_Root")
  37. instantiate_attribute(new_model, "LHS_Root", "lower_cardinality", 1)
  38. instantiate_attribute(new_model, "LHS_Root", "upper_cardinality", 1)
  39. instantiate_link(new_model, "Association", "LHS_constraint", "LHS_Root", "funcdef")
  40. instantiate_attribute(new_model, "LHS_constraint", "name", "constraint")
  41. instantiate_attribute(new_model, "LHS_constraint", "target_upper_cardinality", 1)
  42. // Class LHS : LHS_Root {}
  43. instantiate_node(new_model, "Class", "LHS")
  44. instantiate_link(new_model, "Inheritance", "", "LHS", "LHS_Root")
  45. // Class NAC : LHS_Root {}
  46. instantiate_node(new_model, "Class", "NAC")
  47. instantiate_link(new_model, "Inheritance", "", "NAC", "LHS_Root")
  48. // Class Pre_Element {
  49. // label : String {
  50. // target_lower_cardinality = 1
  51. // target_upper_cardinality = 1
  52. // }
  53. // constraint : funcdef {
  54. // target_upper_cardinality = 1
  55. // }
  56. // }
  57. instantiate_node(new_model, "Class", "Pre_Element")
  58. instantiate_link(new_model, "Association", "Pre_Element_label", "Pre_Element", "String")
  59. instantiate_attribute(new_model, "Pre_Element_label", "name", "label")
  60. instantiate_attribute(new_model, "Pre_Element_label", "target_lower_cardinality", 1)
  61. instantiate_attribute(new_model, "Pre_Element_label", "target_upper_cardinality", 1)
  62. instantiate_link(new_model, "Association", "Pre_Element_constraint", "Pre_Element", "funcdef")
  63. instantiate_attribute(new_model, "Pre_Element_constraint", "name", "constraint")
  64. instantiate_attribute(new_model, "Pre_Element_constraint", "target_upper_cardinality", 1)
  65. // Association LHS_contains (LHS_Root, Pre_Element) {}
  66. instantiate_link(new_model, "Association", "LHS_contains", "LHS_Root", "Pre_Element")
  67. instantiate_attribute(new_model, "LHS_contains", "name", "contains")
  68. // Class RHS {
  69. // action : FuncDef {
  70. // target_upper_cardinality = 1
  71. // }
  72. // upper_cardinality = 1
  73. // lower_cardinality = 1
  74. // }
  75. instantiate_node(new_model, "Class", "RHS")
  76. instantiate_attribute(new_model, "RHS", "lower_cardinality", 1)
  77. instantiate_attribute(new_model, "RHS", "upper_cardinality", 1)
  78. instantiate_link(new_model, "Association", "RHS_action", "RHS", "funcdef")
  79. instantiate_attribute(new_model, "RHS_action", "name", "action")
  80. instantiate_attribute(new_model, "RHS_action", "target_upper_cardinality", 1)
  81. // Class Post_Element {
  82. // label : String {
  83. // target_lower_cardinality = 1
  84. // target_upper_cardinality = 1
  85. // }
  86. // value : funcdef {
  87. // target_upper_cardinality = 1
  88. // }
  89. // action : funcdef {
  90. // target_upper_cardinality = 1
  91. // }
  92. // }
  93. instantiate_node(new_model, "Class", "Post_Element")
  94. instantiate_link(new_model, "Association", "Post_Element_label", "Post_Element", "String")
  95. instantiate_attribute(new_model, "Post_Element_label", "name", "label")
  96. instantiate_attribute(new_model, "Post_Element_label", "target_lower_cardinality", 1)
  97. instantiate_attribute(new_model, "Post_Element_label", "target_upper_cardinality", 1)
  98. instantiate_link(new_model, "Association", "Post_Element_value", "Post_Element", "funcdef")
  99. instantiate_attribute(new_model, "Post_Element_value", "name", "value")
  100. instantiate_attribute(new_model, "Post_Element_value", "target_upper_cardinality", 1)
  101. instantiate_link(new_model, "Association", "Post_Element_action", "Post_Element", "funcdef")
  102. instantiate_attribute(new_model, "Post_Element_action", "name", "action")
  103. instantiate_attribute(new_model, "Post_Element_action", "target_upper_cardinality", 1)
  104. // Association RHS_contains (RHS, Post_Element) {}
  105. instantiate_link(new_model, "Association", "RHS_contains", "RHS", "Post_Element")
  106. instantiate_attribute(new_model, "RHS_contains", "name", "contains")
  107. // Basics are added, now we need to add each node and transition, but slightly modified
  108. Element keys
  109. String key
  110. Element new_entry
  111. Element entry
  112. keys = dict_keys(old_m)
  113. String type_name
  114. String old_source
  115. String old_target
  116. Element to_link
  117. to_link = create_node()
  118. while (read_nr_out(keys) > 0):
  119. key = set_pop(keys)
  120. entry = old_m[key]
  121. type_name = reverseKeyLookup(model["metamodel"]["model"], dict_read_node(model["type_mapping"], entry))
  122. if (type_name == "Class"):
  123. log("Added Pre_" + key)
  124. instantiate_node(new_model, type_name, "Pre_" + key)
  125. instantiate_node(new_model, type_name, "Post_" + key)
  126. // Also make it inherit from the "root element"
  127. instantiate_link(new_model, "Inheritance", "", "Pre_" + key, "Pre_Element")
  128. instantiate_link(new_model, "Inheritance", "", "Post_" + key, "Post_Element")
  129. elif (type_name == "Association"):
  130. old_source = reverseKeyLookup(model["model"], read_edge_src(entry))
  131. old_target = reverseKeyLookup(model["model"], read_edge_dst(entry))
  132. instantiate_link(new_model, type_name, "Pre_" + key, "Pre_" + old_source, "Pre_" + old_target)
  133. instantiate_link(new_model, type_name, "Post_" + key, "Post_" + old_source, "Post_" + old_target)
  134. // 1) Make it inherit from the Root Element (Pre_Element or Post_Element)
  135. instantiate_link(new_model, "Inheritance", "", "Pre_" + key, "Pre_Element")
  136. instantiate_link(new_model, "Inheritance", "", "Post_" + key, "Post_Element")
  137. elif (type_name == "Inheritance"):
  138. old_source = reverseKeyLookup(model["model"], read_edge_src(entry))
  139. old_target = reverseKeyLookup(model["model"], read_edge_dst(entry))
  140. instantiate_link(new_model, type_name, "Pre_" + key, "Pre_" + old_source, "Pre_" + old_target)
  141. instantiate_link(new_model, type_name, "Post_" + key, "Post_" + old_source, "Post_" + old_target)
  142. elif (bool_not(has_value(entry))):
  143. create_edge(to_link, entry)
  144. while (read_nr_out(to_link) > 0):
  145. entry = set_pop(to_link)
  146. type_name = reverseKeyLookup(model["metamodel"]["model"], dict_read_node(model["type_mapping"], entry))
  147. // Primitive values themselves are not copied, so skip that here
  148. // An instance link, so just copy over (don't make element of Root Element), and don't even copy if it is lower cardinality
  149. // It is probably an attribute at the meta-language level, so check which one it is
  150. String name
  151. name = read_attribute(model["metamodel"], type_name, "name")
  152. if (bool_not(bool_or(bool_or(name == "lower_cardinality", name == "source_lower_cardinality"), bool_or(name == "constraint", name == "target_lower_cardinality")))):
  153. // Not a lower cardinality or constraint, so copy
  154. old_source = reverseKeyLookup(model["model"], read_edge_src(entry))
  155. if (bool_or(bool_or(name == "name", name == "upper_cardinality"), bool_or(name == "source_upper_cardinality", name == "target_upper_cardinality"))):
  156. // Keep the old name for the physical attributes!
  157. instantiate_attribute(new_model, "Pre_" + old_source, name, read_edge_dst(entry))
  158. instantiate_attribute(new_model, "Post_" + old_source, name, read_edge_dst(entry))
  159. else:
  160. // Rename the attributes as well
  161. instantiate_attribute(new_model, "Pre_" + old_source, "Pre_" + name, read_edge_dst(entry))
  162. instantiate_attribute(new_model, "Post_" + old_source, "Post_" + name, read_edge_dst(entry))
  163. // Define schedule over these elements
  164. // Class Entry {}
  165. instantiate_node(new_model, "Class", "Entry")
  166. // Class Success : Entry {}
  167. instantiate_node(new_model, "Class", "Success")
  168. instantiate_link(new_model, "Inheritance", "", "Success", "Entry")
  169. // Class Failure : Entry {}
  170. instantiate_node(new_model, "Class", "Failure")
  171. instantiate_link(new_model, "Inheritance", "", "Failure", "Entry")
  172. // Class Rule : Entry {}
  173. instantiate_node(new_model, "Class", "Rule")
  174. instantiate_link(new_model, "Inheritance", "", "Rule", "Entry")
  175. // Association OnSuccess(Rule, Entry){
  176. // target_lower_cardinality = 1
  177. // target_upper_cardinality = 1
  178. // }
  179. instantiate_link(new_model, "Association", "OnSuccess", "Rule", "Entry")
  180. instantiate_attribute(new_model, "OnSuccess", "target_lower_cardinality", 1)
  181. instantiate_attribute(new_model, "OnSuccess", "target_upper_cardinality", 1)
  182. // Association OnFailure(Rule, Entry){
  183. // target_lower_cardinality = 1
  184. // target_upper_cardinality = 1
  185. // }
  186. instantiate_link(new_model, "Association", "OnFailure", "Rule", "Entry")
  187. instantiate_attribute(new_model, "OnFailure", "target_lower_cardinality", 1)
  188. instantiate_attribute(new_model, "OnFailure", "target_upper_cardinality", 1)
  189. // Class LHSRule : Rule {}
  190. instantiate_node(new_model, "Class", "LHSRule")
  191. instantiate_link(new_model, "Inheritance", "", "LHSRule", "Rule")
  192. // Association LHSLink (LHSRule, LHS) {
  193. // target_lower_cardinality = 1
  194. // target_upper_cardinality = 1
  195. // }
  196. instantiate_link(new_model, "Association", "LHSLink", "LHSRule", "LHS")
  197. instantiate_attribute(new_model, "LHSLink", "target_lower_cardinality", 1)
  198. instantiate_attribute(new_model, "LHSLink", "target_upper_cardinality", 1)
  199. // Association NACLink (LHSRule, NAC) {}
  200. instantiate_link(new_model, "Association", "NACLink", "LHSRule", "NAC")
  201. // Class RHSRule : Rule {}
  202. instantiate_node(new_model, "Class", "RHSRule")
  203. instantiate_link(new_model, "Inheritance", "", "RHSRule", "Rule")
  204. // Association RHSLink (RHSRule, RHS) {
  205. // target_lower_cardinality = 1
  206. // target_upper_cardinality = 1
  207. // }
  208. instantiate_link(new_model, "Association", "RHSLink", "RHSRule", "RHS")
  209. instantiate_attribute(new_model, "RHSLink", "target_lower_cardinality", 1)
  210. instantiate_attribute(new_model, "RHSLink", "target_upper_cardinality", 1)
  211. // Class Query : LHSRule {}
  212. instantiate_node(new_model, "Class", "Query")
  213. instantiate_link(new_model, "Inheritance", "", "Query", "LHSRule")
  214. // Class Atomic : LHSRule, RHSRule {}
  215. instantiate_node(new_model, "Class", "Atomic")
  216. instantiate_link(new_model, "Inheritance", "", "Atomic", "LHSRule")
  217. instantiate_link(new_model, "Inheritance", "", "Atomic", "RHSRule")
  218. // Class ForAll : LHSRule, RHSRule {}
  219. instantiate_node(new_model, "Class", "ForAll")
  220. instantiate_link(new_model, "Inheritance", "", "ForAll", "LHSRule")
  221. instantiate_link(new_model, "Inheritance", "", "ForAll", "RHSRule")
  222. // Class Composite : Rule {}
  223. instantiate_node(new_model, "Class", "Composite")
  224. instantiate_link(new_model, "Inheritance", "", "Composite", "Rule")
  225. // Association Initial(Composite, Entry){
  226. // target_lower_cardinality = 1
  227. // target_upper_cardinality = 1
  228. // }
  229. instantiate_link(new_model, "Association", "Initial", "Composite", "Entry")
  230. instantiate_attribute(new_model, "Initial", "target_lower_cardinality", 1)
  231. instantiate_attribute(new_model, "Initial", "target_upper_cardinality", 1)
  232. // Association Contains(Composite, Entry){
  233. // source_upper_cardinality = 1
  234. // target_lower_cardinality = 1
  235. // }
  236. instantiate_link(new_model, "Association", "Contains", "Composite", "Entry")
  237. instantiate_attribute(new_model, "Contains", "source_upper_cardinality", 1)
  238. instantiate_attribute(new_model, "Contains", "target_lower_cardinality", 1)
  239. return new_model!