ramify.alc 12 KB

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