浏览代码

Added basic AL transformation code

Yentl Van Tendeloo 8 年之前
父节点
当前提交
65f682b6ca
共有 2 个文件被更改,包括 76 次插入19 次删除
  1. 51 19
      core/core_algorithm.alc
  2. 25 0
      integration/test_mvc.py

+ 51 - 19
core/core_algorithm.alc

@@ -21,16 +21,21 @@ Void function main():
 	String core_model
 	String core_formalism_model
 	String scd_model
+	Element al_model
 	String admin_group
 	String admin_user
 	String nobody_group
 	String instance_of
 	String core_formalism
 	Element scd
+	Element al
 
 	String scd_location
+	String al_location
 	scd_location = "models/SimpleClassDiagrams"
 	scd = import_node(scd_location)
+	al_location = "models/ActionLanguage"
+	al = import_node(al_location)
 
 	// Create the Model itself and make public
 	core_formalism = import_node(core_location)
@@ -94,6 +99,18 @@ Void function main():
 	instantiate_link(core, "group", "", scd_model, admin_group)
 	instantiate_link(core, "owner", "", scd_model, admin_user)
 
+	// Add the Action Language formalism
+	al_model = instantiate_node(core, "Model", "")
+	instantiate_attribute(core, al_model, "name", "ActionLanguage")
+	instantiate_attribute(core, al_model, "location", al_location + "/model")
+	instantiate_attribute(core, al_model, "permissions", "221")
+	instance_of = instantiate_link(core, "instanceOf", "", al_model, scd_model)
+	instantiate_attribute(core, instance_of, "type_mapping", al["type_mapping"])
+
+	// Make necessary links for the formalism to the owners
+	instantiate_link(core, "group", "", al_model, admin_group)
+	instantiate_link(core, "owner", "", al_model, admin_user)
+
 	// Add the core formalism already
 	core_formalism_model = instantiate_node(core, "Model", "")
 	instantiate_attribute(core, core_formalism_model, "name", "CoreFormalism")
@@ -618,22 +635,37 @@ Void function user_function_skip_init(user_id : String):
 							else:
 								output("Could not resolve intermediate merged metamodel")
 						elif (exact_type == "ActionLanguage"):
+							Element action_model
+							Element dictionary
+							Element input_keys
+							Element output_keys
+							Element result
+							String key
+							Element func
+
 							output("Action Language execution starts!")
 							action_model = get_full_model(transformation_id)
 
 							// 1) Group source models in dictionary
-							input_keys = dict_keys(inputs)
-							while (read_nr_out(input_keys) > 0):
-								key = set_pop(input_keys)
+							//  --> This is just the "inputs" variable
 
 							// 2) Execute action language model
 							func = get_func_AL_model(action_model)
+							result = func(inputs)
 
 							// 3) Split output dictionary back to seperate models
 							output_keys = dict_keys(outputs)
 							while (read_nr_out(output_keys) > 0):
 								key = set_pop(output_keys)
 
+								// Check if the destination model already exists
+								if (get_model_id(outputs[key]) == ""):
+									// New model
+									model_create(result[key], outputs[key], user_id, get_model_id(key), "Model")
+								else:
+									// Model exists, so we overwrite
+									model_overwrite(result[key], get_model_id(outputs[key]))
+
 						else:
 							output("Did not know how to interpret model of type " + exact_type)
 					else:
@@ -845,18 +877,21 @@ Void function user_function_skip_init(user_id : String):
 		elif (cmd == "transformation_add_AL"):
 			// Add an action language transformation model
 			output("Which metamodels do you want to use as source for the action code (empty string to finish)?")
+			String model_id
+			Element models
+			Element source
+			Element target
+			String name
+
 			name = input()
 			while (name != ""):
 				model_id = get_model_id(name)
 				if (model_id != ""):
-					if (set_in(supported, model_id)):
-						if (bool_not(set_in(source, model_id))):
-							set_add(source, model_id)
-							output("Model added as source")
-						else:
-							output("Model already selected as source")
+					if (bool_not(set_in(source, model_id))):
+						set_add(source, model_id)
+						output("Model added as source")
 					else:
-						output("Model is not supported by RAMified metamodel!")
+						output("Model already selected as source")
 				else:
 					output("No such model; try again")
 				
@@ -867,14 +902,11 @@ Void function user_function_skip_init(user_id : String):
 			while (name != ""):
 				model_id = get_model_id(name)
 				if (model_id != ""):
-					if (set_in(supported, model_id)):
-						if (bool_not(set_in(target, model_id))):
-							set_add(target, model_id)
-							output("Model added as target")
-						else:
-							output("Model already selected as target")
+					if (bool_not(set_in(target, model_id))):
+						set_add(target, model_id)
+						output("Model added as target")
 					else:
-						output("Model is not supported by RAMified metamodel!")
+						output("Model already selected as target")
 				else:
 					output("No such model; try again")
 				
@@ -887,8 +919,8 @@ Void function user_function_skip_init(user_id : String):
 				String new_model
 				// Finished with all information, now create the model itself!
 				output("Waiting for model constructors...")
-				new_model = construct_model_raw(import_node("models/ActionLanguage"))
-				model_create(new_model, name, user_id, ramified_metamodel_id, "ActionLanguage")
+				new_model = construct_model_raw(import_node(read_attribute(core, get_model_id("ActionLanguage"), "location")))
+				model_create(new_model, name, user_id, get_model_id("ActionLanguage"), "ActionLanguage")
 				model_id = get_model_id(name)
 
 				// Extend metadata with info on source and target

+ 25 - 0
integration/test_mvc.py

@@ -40,6 +40,7 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
                 set(["  SimpleClassDiagrams : SimpleClassDiagrams",
                      "  CoreFormalism : SimpleClassDiagrams",
+                     "  ActionLanguage : SimpleClassDiagrams",
                      "  core : CoreFormalism"]),
             ],
             mode))
@@ -61,6 +62,7 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root admin   core : CoreFormalism"]),
             ],
             mode))
@@ -93,12 +95,14 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
                 set(["  SimpleClassDiagrams : SimpleClassDiagrams",
                      "  CoreFormalism : SimpleClassDiagrams",
+                     "  ActionLanguage : SimpleClassDiagrams",
                      "  Empty : SimpleClassDiagrams",
                      "  core : CoreFormalism"]),
                 "Ready for command...",
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
                      "  200  root nobody   Empty : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root admin   core : CoreFormalism"]),
             ],
             mode))
@@ -139,11 +143,13 @@ class TestModelverseCore(unittest.TestCase):
                 set(["  SimpleClassDiagrams : SimpleClassDiagrams",
                      "  CoreFormalism : SimpleClassDiagrams",
                      "  Empty : SimpleClassDiagrams",
+                     "  ActionLanguage : SimpleClassDiagrams",
                      "  core : CoreFormalism"]),
                 "Ready for command...",
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
                      "  200  root nobody   Empty : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root admin   core : CoreFormalism"]),
                 "Ready for command...",
                 "Which model do you want to modify?",
@@ -157,6 +163,7 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root nobody   Empty : SimpleClassDiagrams",
                      "  200  root admin   core : CoreFormalism"]),
                 "Ready for command...",
@@ -214,6 +221,7 @@ class TestModelverseCore(unittest.TestCase):
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
                      "  200  root nobody   Empty : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root admin   core : CoreFormalism"]),
                 "Ready for command...",
                 "Which model do you want to modify?",
@@ -227,6 +235,7 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root nobody   Empty : SimpleClassDiagrams",
                      "  200  root admin   core : CoreFormalism"]),
                 "Ready for command...",
@@ -236,6 +245,7 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root nobody   Empty : SimpleClassDiagrams",
                      "  200  root admin   core : CoreFormalism"]),
                 "Ready for command...",
@@ -284,6 +294,7 @@ class TestModelverseCore(unittest.TestCase):
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
                      "  200  root nobody   PetriNets : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root admin   core : CoreFormalism"]),
                 "Ready for command...",
                 "Formalisms to include (terminate with empty string)?",
@@ -294,6 +305,7 @@ class TestModelverseCore(unittest.TestCase):
                      "  200  root nobody   PetriNets : SimpleClassDiagrams",
                      "  200  root nobody   __merged_PetriNets_RAM : SimpleClassDiagrams",
                      "  200  root nobody   PetriNets_RAM : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root admin   core : CoreFormalism"]),
                 "Ready for command...",
             ],
@@ -341,6 +353,7 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root nobody   PetriNets : SimpleClassDiagrams",
                      "  200  root admin   core : CoreFormalism"]),
                 "Ready for command...",
@@ -349,6 +362,7 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root nobody   PetriNets : SimpleClassDiagrams",
                      "  200  root nobody   __merged_PetriNets_RAM : SimpleClassDiagrams",
                      "  200  root nobody   PetriNets_RAM : SimpleClassDiagrams",
@@ -370,6 +384,7 @@ class TestModelverseCore(unittest.TestCase):
                      "  200  root nobody   PetriNets : SimpleClassDiagrams",
                      "  200  root nobody   __merged_PetriNets_RAM : SimpleClassDiagrams",
                      "  200  root nobody   PetriNets_RAM : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root nobody   PetriNets_Print : PetriNets_RAM",
                      "  200  root admin   core : CoreFormalism"]),
                 "Ready for command...",
@@ -422,6 +437,7 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root nobody   PetriNets : SimpleClassDiagrams",
                      "  200  root admin   core : CoreFormalism"]),
                 "Ready for command...",
@@ -431,6 +447,7 @@ class TestModelverseCore(unittest.TestCase):
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
                      "  200  root nobody   PetriNets : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root nobody   __merged_PetriNets_RAM : SimpleClassDiagrams",
                      "  200  root nobody   PetriNets_RAM : SimpleClassDiagrams",
                      "  200  root admin   core : CoreFormalism"]),
@@ -506,6 +523,7 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  200  root nobody   PetriNets : SimpleClassDiagrams",
                      "  200  root nobody   my_pn : PetriNets",
                      "  200  root admin   core : CoreFormalism"]),
@@ -514,6 +532,7 @@ class TestModelverseCore(unittest.TestCase):
                 "Name of the RAMified transformation metamodel?",
                 "Ready for command...",
                 set(["  221  root admin   SimpleClassDiagrams : SimpleClassDiagrams",
+                     "  221  root admin   ActionLanguage : SimpleClassDiagrams",
                      "  221  root admin   CoreFormalism : SimpleClassDiagrams",
                      "  200  root nobody   PetriNets : SimpleClassDiagrams",
                      "  200  root nobody   __merged_PetriNets_RAM : SimpleClassDiagrams",
@@ -680,6 +699,7 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
                 # model_list
                 set(["  SimpleClassDiagrams : SimpleClassDiagrams",
+                     "  ActionLanguage : SimpleClassDiagrams",
                      "  CoreFormalism : SimpleClassDiagrams",
                      "  PetriNets : SimpleClassDiagrams",
                      "  my_pn : PetriNets",
@@ -692,6 +712,7 @@ class TestModelverseCore(unittest.TestCase):
                 "Ready for command...",
                 # model_list
                 set(["  SimpleClassDiagrams : SimpleClassDiagrams",
+                     "  ActionLanguage : SimpleClassDiagrams",
                      "  CoreFormalism : SimpleClassDiagrams",
                      "  PetriNets_Runtime : SimpleClassDiagrams",
                      "  PetriNets : SimpleClassDiagrams",
@@ -805,6 +826,7 @@ class TestModelverseCore(unittest.TestCase):
                      "  __merged_PetriNets_RAM : SimpleClassDiagrams",
                      "  PetriNets_RAM : SimpleClassDiagrams",
                      "  my_pn : PetriNets",
+                     "  ActionLanguage : SimpleClassDiagrams",
                      "  core : CoreFormalism"]),
                 "Ready for command...",
                 # transformation_list
@@ -1015,6 +1037,7 @@ class TestModelverseCore(unittest.TestCase):
                      "  CoreFormalism : SimpleClassDiagrams",
                      "  PetriNets : SimpleClassDiagrams",
                      "  my_pn : PetriNets",
+                     "  ActionLanguage : SimpleClassDiagrams",
                      "  PetriNets_Runtime : SimpleClassDiagrams",
                      "  core : CoreFormalism"]),
                 "Ready for command...",
@@ -1027,6 +1050,7 @@ class TestModelverseCore(unittest.TestCase):
                      "  CoreFormalism : SimpleClassDiagrams",
                      "  PetriNets_Runtime : SimpleClassDiagrams",
                      "  PetriNets : SimpleClassDiagrams",
+                     "  ActionLanguage : SimpleClassDiagrams",
                      "  __merged_PetriNets_RAM : SimpleClassDiagrams",
                      "  PetriNets_RAM : SimpleClassDiagrams",
                      "  my_pn : PetriNets",
@@ -1130,6 +1154,7 @@ class TestModelverseCore(unittest.TestCase):
                      "  CoreFormalism : SimpleClassDiagrams",
                      "  PetriNets_Runtime : SimpleClassDiagrams",
                      "  PetriNets : SimpleClassDiagrams",
+                     "  ActionLanguage : SimpleClassDiagrams",
                      "  pn_print : PetriNets_RAM",
                      "  pn_design_to_runtime : PetriNets_RAM",
                      "  pn_runtime_to_design : PetriNets_RAM",