فهرست منبع

Update the number of exceptions

Yentl Van Tendeloo 7 سال پیش
والد
کامیت
023ffbe167

BIN
bootstrap/bootstrap.m.gz


+ 5 - 8
bootstrap/compiler.alc

@@ -16,9 +16,8 @@ Element function generic_compile(code : String, port : String):
 		comm_close(port)
 		return lst!
 	else:
-		log("Compilation error: " + response)
 		comm_close(port)
-		return read_root()!
+		return response!
 
 Element function compile_code(code : String):
 	String port
@@ -31,9 +30,8 @@ Element function compile_code(code : String):
 	Element list
 	list = generic_compile(code, port)
 
-	if (element_eq(list, read_root())):
-		return read_root()!
-
+	if (is_physical_string(list)):
+		return list!
 	else:
 		return construct_function_list(list)!
 
@@ -49,8 +47,7 @@ Element function compile_model(code : String, metamodel : Element):
 	Element list
 	list = generic_compile(code, port)
 
-	if (element_eq(list, read_root())):
-		return read_root()!
-
+	if (is_physical_string(list)):
+		return list!
 	else:
 		return construct_model_list(instantiate_model(metamodel), list)!

+ 75 - 72
bootstrap/core_algorithm.alc

@@ -154,6 +154,9 @@ Boolean function is_admin(user_id : String):
 	else:
 		return False!
 	
+Boolean function allow_execute(user_id : String, model_id : String):
+	return allow_read(user_id, model_id)!
+
 Boolean function allow_read(user_id : String, model_id : String):
 	if (is_admin(user_id)):
 		// Is admin, so always allow
@@ -1111,17 +1114,17 @@ String function cmd_model_add(type : String, name : String, code : String):
 
 				new_model = compile_model(code, mm)
 
-				if (element_eq(new_model, read_root())):
-					return "Compilation error"!
+				if (is_physical_string(new_model)):
+					return "Compilation error: " + cast_string(new_model)!
 
 				model_create(new_model, name, type_id, "Model")
 				return "Success"!
 			else:
 				return "Model exists: " + name!
 		else:
-			return "Permission denied to model: " + type!
+			return "Read permission denied to: " + type!
 	else:
-		return "Model not found: " + type!
+		return "Location not found: " + type!
 
 String function cmd_process_execute(process : String, mapping : Element):
 	// Execute a process model until it reaches termination
@@ -1129,7 +1132,7 @@ String function cmd_process_execute(process : String, mapping : Element):
 
 	process_id = get_entry_id(process)
 	if (process_id != ""):
-		if (allow_read(current_user_id, process_id)):
+		if (allow_execute(current_user_id, process_id)):
 			Element pm
 			pm = get_full_model(process_id, get_entry_id("formalisms/ProcessModel"))
 			if (element_eq(pm, read_root())):
@@ -1138,9 +1141,9 @@ String function cmd_process_execute(process : String, mapping : Element):
 			enact_PM(pm, mapping)
 			return "Success"!
 		else:
-			return "Permission denied to model: " + process!
+			return "Execute permission denied to: " + process!
 	else:
-		return "Model not found: " + process!
+		return "Location not found: " + process!
 
 String function cmd_process_signature(process : String):
 	// Execute a process model until it reaches termination
@@ -1152,7 +1155,7 @@ String function cmd_process_signature(process : String):
 
 	process_id = get_entry_id(process)
 	if (process_id != ""):
-		if (allow_read(current_user_id, process_id)):
+		if (allow_execute(current_user_id, process_id)):
 			Element pm
 			pm = get_full_model(process_id, get_entry_id("formalisms/ProcessModel"))
 			if (element_eq(pm, read_root())):
@@ -1167,9 +1170,9 @@ String function cmd_process_signature(process : String):
 
 			return result!
 		else:
-			return "Permission denied to model: " + process!
+			return "Execute permission denied to model: " + process!
 	else:
-		return "Model not found: " + process!
+		return "Location not found: " + process!
 
 String function cmd_transformation_between(source_dict : String, target_dict : String):
 	Element result
@@ -1200,7 +1203,7 @@ String function cmd_transformation_between(source_dict : String, target_dict : S
 					// Correct tag, so make transformation a possibility
 					set_add(subresult, readAssociationSource(core, link))
 		else:
-			return "Model not found: " + mm!
+			return "Location not found: " + mm!
 
 		// Got a set of subresults now, which we use to find the overlap
 		result = set_overlap(result, subresult)
@@ -1221,7 +1224,7 @@ String function cmd_transformation_between(source_dict : String, target_dict : S
 					// Correct tag, so make transformation a possibility
 					set_add(subresult, readAssociationSource(core, link))
 		else:
-			return "Model not found: " + mm!
+			return "Location not found: " + mm!
 
 		// Got a set of subresults now, which we use to find the overlap
 		result = set_overlap(result, subresult)
@@ -1283,7 +1286,7 @@ String function cmd_model_render(model_name : String, mapper_name : String, rend
 
 		if (allow_read(current_user_id, model_ID)):
 			if (mapper_ID != ""):
-				if (allow_read(current_user_id, mapper_ID)):
+				if (allow_execute(current_user_id, mapper_ID)):
 					// Everything is fine; start the actual operation
 					// Find metamodel to render to
 					tracability_name = "tracability/" + rendered_name
@@ -1353,13 +1356,13 @@ String function cmd_model_render(model_name : String, mapper_name : String, rend
 					value = JSON_print(result["rendered"])
 					return ("Success: " + value) !
 				else:
-					return "Permission denied to model: " + mapper_name!
+					return "Execute permission denied to: " + mapper_name!
 			else:
-				return "Model not found: " + mapper_name!
+				return "Location not found: " + mapper_name!
 		else:
-			return "Permission denied to model: " + model_name!
+			return "Read permission denied to: " + model_name!
 	else:
-		return "Model not found: " + model_name!
+		return "Location not found: " + model_name!
 
 Boolean function do_spawn_modify(model_name : String, write : Boolean):
 	output("Please edit this model before sending next input: " + model_name)
@@ -1465,7 +1468,7 @@ String function cmd_transformation_execute(transformation_name : String, source_
 
 	transformation_id = get_entry_id(transformation_name)
 	if (transformation_id != ""):
-		if (allow_read(current_user_id, transformation_id)):
+		if (allow_execute(current_user_id, transformation_id)):
 			if (is_nominal_instance(core, transformation_id, "Transformation")):
 				// Read out source and target links
 				inputs = dict_create()
@@ -1486,9 +1489,9 @@ String function cmd_transformation_execute(transformation_name : String, source_
 							dict_add(inputs, assoc_name, source_model_name)
 							continue!
 						else:
-							return "Permission denied to model: " + source_model_name!
+							return "Read permission denied to: " + source_model_name!
 					else:
-						return "Model not found: " + source_model_name!
+						return "Location not found: " + source_model_name!
 
 				targets = allOutgoingAssociationInstances(core, transformation_id, "transformOutput")
 				outputs = dict_create()
@@ -1502,31 +1505,31 @@ String function cmd_transformation_execute(transformation_name : String, source_
 						if (get_entry_id(target_model_name) == ""):
 							// Doesn't exist yet, so we can easily create
 							if (get_entry_id(get_foldername(target_model_name)) == ""):
-								return "Folder not found: " + get_foldername(target_model_name)!
+								return "Location not found: " + get_foldername(target_model_name)!
 							else:
 								if (allow_write(current_user_id, get_entry_id(get_foldername(target_model_name)))):
 									dict_add(output_map, assoc_name, full_name(readAssociationDestination(core, target)))
 									dict_add(outputs, assoc_name, target_model_name)
 								else:
-									return "Permission denied to folder: " + get_foldername(target_model_name)!
+									return "Write permission denied to: " + get_foldername(target_model_name)!
 						else:
 							// Already exists, so we need to check for write access
 							if (allow_write(current_user_id, get_entry_id(target_model_name))):
 								dict_add(output_map, assoc_name, read_attribute(core, readAssociationDestination(core, target), "name"))
 								dict_add(outputs, assoc_name, target_model_name)
 							else:
-								return "Permission denied to model: " + target_model_name!
+								return "Write permission denied to: " + target_model_name!
 
 				if (do_spawn_activity(transformation_id, tracability_name, inputs, outputs, output_map)):
 					return "Success"!
 				else:
 					return "Failure"!
 			else:
-				return "Model is not executable: " + transformation_name!
+				return "Execute permission denied to: " + transformation_name!
 		else:
-			return "Permission denied to model: " + transformation_name!
+			return "Execute permission denied to: " + transformation_name!
 	else:
-		return "Model not found: " + transformation_name!
+		return "Location not found: " + transformation_name!
 
 String function cmd_verify(model_name : String, metamodel_name : String):
 	// Check whether a model conforms to its specification (with the selected type mapping)
@@ -1546,13 +1549,13 @@ String function cmd_verify(model_name : String, metamodel_name : String):
 
 					return string_join("Success: ", conformance_scd(m))!
 				else:
-					return "Permission denied to model: " + metamodel_name!
+					return "Read permission denied to: " + metamodel_name!
 			else:
-				return "Model not found: " + metamodel_name!
+				return "Location not found: " + metamodel_name!
 		else:
-			return "Permission denied to model: " + model_name!
+			return "Read permission denied to: " + model_name!
 	else:
-		return "Model not found: " + model_name!
+		return "Location not found: " + model_name!
 
 String function cmd_model_overwrite(model_name : String, metamodel_name : String):
 	// Overwrites an existing model without changing any metadata
@@ -1573,17 +1576,17 @@ String function cmd_model_overwrite(model_name : String, metamodel_name : String
 				output("Waiting for model constructors...")
 				new_model = compile_model(input(), mm)
 
-				if (element_eq(new_model, read_root())):
-					return "Compilation error"!
+				if (is_physical_string(new_model)):
+					return "Compilation error: " + cast_string(new_model)!
 
 				model_overwrite(new_model, model_id, get_entry_id(metamodel_name))
 				return "Success"!
 			else:
-				return string_join("Permission denied to model: ", full_name(type_id))!
+				return string_join("Read permission denied to: ", full_name(type_id))!
 		else:
-			return "Permission denied to model: " + model_name!
+			return "Write permission denied to: " + model_name!
 	else:
-		return "Model not found: " + model_name!
+		return "Location not found: " + model_name!
 
 String function cmd_model_modify(model_name : String, metamodel_name : String):
 	// Model modify operation, which uses the mini_modify.alc operations, though with extensions for access control
@@ -1606,11 +1609,11 @@ String function cmd_model_modify(model_name : String, metamodel_name : String):
 					model_overwrite(new_model, model_id, get_entry_id(metamodel_name))
 				return "Success"!
 			else:
-				return string_join("Permission denied to model: ", full_name(type_id))!
+				return string_join("Read permission denied to: ", full_name(type_id))!
 		else:
-			return "Permission denied to model: " + model_name!
+			return "Read permission denied to: " + model_name!
 	else:
-		return "Model not found: " + model_name!
+		return "Location not found: " + model_name!
 
 Void function model_delete(model_id : String):
 	if (read_type(core, model_id) == "Folder"):
@@ -1637,9 +1640,9 @@ String function cmd_model_delete(model_name : String):
 			model_delete(model_id)
 			return "Success"!
 		else:
-			return "Permission denied to model: " + model_name!
+			return "Write permission denied to: " + model_name!
 	else:
-		return "Model not found: " + model_name!
+		return "Location not found: " + model_name!
 
 String function cmd_model_list(location : String):
 	// List all models
@@ -1659,7 +1662,7 @@ String function cmd_model_list(location : String):
 					result = result + (get_filename(read_attribute(core, m, "name")) + "\n")
 			return result!
 		else:
-			return "Permission denied to folder: " + location!
+			return "Read permission denied to: " + location!
 	else:
 		return "Location not found: " + location!
 
@@ -1690,7 +1693,7 @@ String function cmd_model_list_full(location : String):
 				result = result + permissions + " " + owner + " " + group + " " + name + "\n"
 			return result!
 		else:
-			return "Permission denied to folder: " + location!
+			return "Read permission denied to: " + location!
 	else:
 		return "Location not found: " + location!
 
@@ -1746,9 +1749,9 @@ String function transformation_add(source_models : Element, target_models : Elem
 				else:
 					return "Name already selected for source: " + key!
 			else:
-				return "Permission denied to model: " + name!
+				return "Read permission denied to: " + name!
 		else:
-			return "Model not found: " + name!
+			return "Location not found: " + name!
 
 	keys = dict_keys(target_models)
 	while (set_len(keys) > 0):
@@ -1772,9 +1775,9 @@ String function transformation_add(source_models : Element, target_models : Elem
 				else:
 					return "Name already selected for target: " + key!
 			else:
-				return "Permission denied to model: " + name!
+				return "Read permission denied to: " + name!
 		else:
-			return "Model not found: " + name!
+			return "Location not found: " + name!
 
 	if (get_entry_id(operation_name) == ""):
 		// Write out a merged metamodel containing all these models: this is the MM for the manual operation
@@ -1802,8 +1805,8 @@ String function transformation_add(source_models : Element, target_models : Elem
 			output("Waiting for code constructors...")
 			Element compiled
 			compiled = compile_code(input())
-			if (element_eq(compiled, read_root())):
-				return "Compilation error"!
+			if (is_physical_string(compiled)):
+				return "Compilation error: " + cast_string(compiled)!
 
 			add_code_model(get_full_model(get_entry_id("formalisms/ActionLanguage"), get_entry_id("formalisms/SimpleClassDiagrams")), "AL/" + operation_name, compiled)
 			model_create(import_node("AL/" + operation_name), operation_name, get_entry_id("formalisms/ActionLanguage"), "ActionLanguage")
@@ -1893,9 +1896,9 @@ String function cmd_transformation_add_MT(source_models : Element, target_models
 				else:
 					return "Model not supported for RAMification: " + name!
 			else:
-				return "Permission denied: " + name!
+				return "Read permission denied to: " + name!
 		else:
-			return "Model not found: " + name!
+			return "Location not found: " + name!
 
 	keys = dict_keys(target_models)
 	while (set_len(keys) > 0):
@@ -1923,9 +1926,9 @@ String function cmd_transformation_add_MT(source_models : Element, target_models
 				else:
 					return "Model not supported for RAMification: " + name!
 			else:
-				return "Permission denied: " + name!
+				return "Read permission denied to: " + name!
 		else:
-			return "Model not found: " + name!
+			return "Location not found: " + name!
 
 	merged_formalism = model_fuse(to_ramify)
 	model_create(merged_formalism, "merged/" + operation_name, get_entry_id("formalisms/SimpleClassDiagrams"), "Model")
@@ -1943,8 +1946,8 @@ String function cmd_transformation_add_MT(source_models : Element, target_models
 		// Finished with all information, now create the model itself!
 		output("Waiting for model constructors...")
 		new_model = compile_model(input(), get_full_model(ramified_metamodel_id, get_entry_id("formalisms/SimpleClassDiagrams")))
-		if (element_eq(new_model, read_root())):
-			return "Compilation error"!
+		if (is_physical_string(new_model)):
+			return "Compilation error: " + cast_string(new_model)!
 		model_create(new_model, operation_name, ramified_metamodel_id, "ModelTransformation")
 		model_id = get_entry_id(operation_name)
 
@@ -2008,11 +2011,11 @@ String function cmd_permission_modify(model_name : String, permissions : String)
 				instantiate_attribute(core, model_id, "permissions", permissions)
 				return "Success"!
 			else:
-				return "Permission has incorrect format: must be a string of three characters, with each character being a digit between 0 and 2"!
+				return "Incorrect format: must be a string of three characters, with each character being a digit between 0 and 2"!
 		else:
-			return "Permission denied to model: " + model_name!
+			return "User permission denied to: " + model_name!
 	else:
-		return "Model not found: " + model_name!
+		return "Location not found: " + model_name!
 
 String function cmd_permission_owner(model_name : String, new_user_name : String):
 	String model_id
@@ -2029,9 +2032,9 @@ String function cmd_permission_owner(model_name : String, new_user_name : String
 			else:
 				return "No such user: " + new_user_name!
 		else:
-			return "Permission denied to model: " + model_name!
+			return "User permission denied to: " + model_name!
 	else:
-		return "Model not found: " + model_name!
+		return "Location not found: " + model_name!
 
 String function cmd_permission_group(model_name : String, new_group_name : String):
 	String model_id
@@ -2048,9 +2051,9 @@ String function cmd_permission_group(model_name : String, new_group_name : Strin
 			else:
 				return "No such group: " + new_group_name!
 		else:
-			return "Permission denied to model: " + model_name!
+			return "User permission denied to: " + model_name!
 	else:
-		return "Model not found: " + model_name!
+		return "Location not found: " + model_name!
 
 String function cmd_group_create(group_name : String):
 	// Create a new group and become its owner
@@ -2077,7 +2080,7 @@ String function cmd_group_delete(group_name : String):
 			model_delete_element(core, group_id)
 			return "Success"!
 		else:
-			return "Permission denied to group: " + group_name!
+			return "Group permission denied to: " + group_name!
 	else:
 		return "Group not found: " + group_name!
 
@@ -2103,7 +2106,7 @@ String function cmd_group_owner_add(group_name : String, other_user_name : Strin
 			else:
 				return "User not found: " + other_user_name!
 		else:
-			return "Permission denied to group: " + group_name!
+			return "Group permission denied to: " + group_name!
 	else:
 		return "Group not found: " + group_name!
 
@@ -2130,7 +2133,7 @@ String function cmd_group_owner_delete(group_name : String, other_user_name : St
 			else:
 				return "User not found: " + other_user_name!
 		else:
-			return "Permission denied to group: " + group_name!
+			return "Group permission denied to: " + group_name!
 	else:
 		return "Group not found: " + group_name!
 
@@ -2152,7 +2155,7 @@ String function cmd_group_join(group_name : String, other_user_name : String):
 			else:
 				return "User not found: " + other_user_name!
 		else:
-			return "Permission denied to group: " + group_name!
+			return "Group permission denied to: " + group_name!
 	else:
 		return "Group not found: " + group_name!
 
@@ -2182,7 +2185,7 @@ String function cmd_group_kick(group_name : String, other_user_name : String):
 			else:
 				return "User not found: " + other_user_name!
 		else:
-			return "Permission denied to group: " + group_name!
+			return "Group permission denied to: " + group_name!
 	else:
 		return "Group not found: " + group_name!
 
@@ -2219,7 +2222,7 @@ String function cmd_admin_promote(other_user_name : String):
 		else:
 			return "User not found: " + other_user_name!
 	else:
-		return "Permission denied to administrate: " + other_user_name!
+		return "Admin permission denied"!
 
 String function cmd_admin_demote(other_user_name : String):
 	// Demote a user to normal status
@@ -2234,7 +2237,7 @@ String function cmd_admin_demote(other_user_name : String):
 		else:
 			return "User not found: " + other_user_name!
 	else:
-		return "Permission denied to administrate: " + other_user_name!
+		return "Admin permission denied"!
 
 String function cmd_service_register(service_name : String):
 	// Active a service for this specific user
@@ -2264,7 +2267,7 @@ String function cmd_user_password(user_name : String, new_password : String):
 		else:
 			return "No such user: " + user_name!
 	else:
-		return "Permission denied to user: " + user_name!
+		return "User permission denied: " + user_name!
 
 String function cmd_transformation_signature(transformation_name : String):
 	String model_id
@@ -2272,7 +2275,7 @@ String function cmd_transformation_signature(transformation_name : String):
 
 	if (model_id != ""):
 		if (is_nominal_instance(core, model_id, "Transformation")):
-			if (allow_read(current_user_id, transformation_name)):
+			if (allow_execute(current_user_id, transformation_name)):
 				String result
 				String elem
 				Element inputs
@@ -2291,7 +2294,7 @@ String function cmd_transformation_signature(transformation_name : String):
 
 				return result!
 			else:
-				return "Permission denied to operation: " + transformation_name!
+				return "Execute permission denied to: " + transformation_name!
 		else:
 			return "Model is not an operation: " + transformation_name!
 	else:
@@ -2321,7 +2324,7 @@ String function cmd_folder_create(folder_name : String):
 		if (element_neq(create_folders(current_user_id, folder_name), read_root())):
 			return "Success"!
 		else:
-			return "Permission denied to folder: " + folder_name!
+			return "Write permission denied to: " + folder_name!
 	else:
 		return "Folder alreay exists: " + folder_name!
 

+ 22 - 22
bootstrap/mini_modify.alc

@@ -90,14 +90,14 @@ String function cmd_upload(write : Boolean, model : Element):
 	if (write):
 		output("Waiting for model constructors...")
 		new_model = compile_model(input(), model["metamodel"])
-		if (element_eq(new_model, read_root())):
-			return "Compilation error"!
+		if (is_physical_string(new_model)):
+			return "Compilation error: " + cast_string(new_model)!
 
 		dict_overwrite(model, "model", new_model["model"])
 		set_type_mapping(model, get_type_mapping(new_model))
 		return "Success"!
 	else:
-		return "Permission denied to write"!
+		return "Write permission denied"!
 
 String function cmd_instantiate_node(write : Boolean, model : Element, mm_type_name : String, element_name : String):
 	if (write):
@@ -106,14 +106,14 @@ String function cmd_instantiate_node(write : Boolean, model : Element, mm_type_n
 				return "Element exists: " + element_name!
 			else:
 				if (is_edge(model["metamodel"]["model"][mm_type_name])):
-					return "Element is not a node but an edge: " + mm_type_name!
+					return "Incorrect format: " + mm_type_name + " is an edge instead of a node"!
 
 				element_name = instantiate_node(model, mm_type_name, element_name)
 				return "Success: " + element_name!
 		else:
 			return "Element not found: " + mm_type_name!
 	else:
-		return "Permission denied to write"!
+		return "Write permission denied"!
 
 String function cmd_instantiate_edge(write : Boolean, model : Element, mm_type_name : String, element_name : String, source_name : String, target_name : String):
 	if (write):
@@ -131,11 +131,11 @@ String function cmd_instantiate_edge(write : Boolean, model : Element, mm_type_n
 					else:
 						return "Element not found: " + source_name!
 				else:
-					return "Element is a node not an edge: " + mm_type_name!
+					return "Incorrect format: " + mm_type_name + " is a node instead of an edge"!
 		else:
 			return "Element not found: " + mm_type_name!
 	else:
-		return "Permission denied to write"!
+		return "Write permission denied"!
 
 String function cmd_define_attribute(write : Boolean, model : Element, element_name : String, attr_name : String, type : String):
 	if (write):
@@ -147,13 +147,13 @@ String function cmd_define_attribute(write : Boolean, model : Element, element_n
 					model_define_attribute(model, element_name, attr_name, False, type)
 					return "Success"!
 				else:
-					return "Attribute already defined: " + attr_name!
+					return "Attribute exists: " + attr_name!
 			else:
 				return "Element not found: " + type!
 		else:
 			return "Element not found: " + element_name!
 	else:
-		return "Permission denied to write"!
+		return "Write permission denied"!
 
 String function cmd_attr_add(write : Boolean, model : Element, element_name : String, attr_name : String, value : Element):
 	if (write):
@@ -168,7 +168,7 @@ String function cmd_attr_add(write : Boolean, model : Element, element_name : St
 		else:
 			return "Element not found: " + element_name!
 	else:
-		return "Permission denied to write"!
+		return "Write permission denied"!
 
 String function cmd_attr_add_code(write : Boolean, model : Element, element_name : String, attr_name : String):
 	if (write):
@@ -179,8 +179,8 @@ String function cmd_attr_add_code(write : Boolean, model : Element, element_name
 				output("Waiting for code constructors...")
 				Element compiled
 				compiled = compile_code(input())
-				if (element_eq(compiled, read_root())):
-					return "Compilation error"!
+				if (is_physical_string(compiled)):
+					return "Compilation error: " + cast_string(compiled)!
 
 				instantiate_attribute_code(model, element_name, attr_name, compiled)
 				return "Success"!
@@ -189,7 +189,7 @@ String function cmd_attr_add_code(write : Boolean, model : Element, element_name
 		else:
 			return "Element not found: " + element_name!
 	else:
-		return "Permission denied to write"!
+		return "Write permission denied"!
 
 String function cmd_attr_del(write : Boolean, model : Element, element_name : String, attr_name : String):
 	if (write):
@@ -204,7 +204,7 @@ String function cmd_attr_del(write : Boolean, model : Element, element_name : St
 		else:
 			return "Element not found: " + element_name!
 	else:
-		return "Permission denied to write"!
+		return "Write permission denied"!
 
 String function cmd_attr_name(write : Boolean, model : Element, element_name : String, attr_name : String, new_attr_name : String):
 	if (write):
@@ -222,15 +222,15 @@ String function cmd_attr_name(write : Boolean, model : Element, element_name : S
 						model_define_attribute_ID(model, element_name, new_attr_name, optional, attrs[attr_name], attr_edge)
 						return "Success"!
 					else:
-						return "Attribute already defined: " + new_attr_name!
+						return "Attribute exists: " + new_attr_name!
 				else:
-					return "Attribute not defined: " + attr_name!
+					return "Attribute not found: " + attr_name!
 			else:
 				return "Attribute not found: " + attr_name!
 		else:
 			return "Element not found: " + element_name!
 	else:
-		return "Permission denied to write"!
+		return "Write permission denied"!
 
 String function cmd_attr_type(write : Boolean, model : Element, element_name : String, attr_name : String, new_attr_type : String):
 	if (write):
@@ -253,7 +253,7 @@ String function cmd_attr_type(write : Boolean, model : Element, element_name : S
 		else:
 			return "Element not found: " + element_name!
 	else:
-		return "Permission denied to write"!
+		return "Write permission denied"!
 
 String function cmd_attr_optional(write : Boolean, model : Element, element_name : String, attr_name : String, optional : Boolean):
 	if (write):
@@ -278,7 +278,7 @@ String function cmd_attr_optional(write : Boolean, model : Element, element_name
 		else:
 			return "Element not found: " + element_name!
 	else:
-		return "Permission denied to write"!
+		return "Write permission denied"!
 
 String function cmd_undefine_attribute(write : Boolean, model : Element, element_name : String, attr_name : String):
 	if (write):
@@ -297,7 +297,7 @@ String function cmd_undefine_attribute(write : Boolean, model : Element, element
 		else:
 			return "Element not found: " + element_name!
 	else:
-		return "Permission denied to write"!
+		return "Write permission denied"!
 
 String function cmd_delete(write : Boolean, model : Element, element_name : String):
 	if (write):
@@ -307,7 +307,7 @@ String function cmd_delete(write : Boolean, model : Element, element_name : Stri
 		else:
 			return "Element not found: " + element_name!
 	else:
-		return "Permission denied to write"!
+		return "Write permission denied"!
 
 String function cmd_list(model : Element):
 	Element keys_m
@@ -464,7 +464,7 @@ String function cmd_retype(write : Boolean, model : Element, element_name : Stri
 		else:
 			return "Element not found: " + element_name!
 	else:
-		return "Permission denied to write"!
+		return "Write permission denied"!
 
 String function cmd_read_association_source(write : Boolean, model : Element, element_name : String):
 	if (dict_in(model["model"], element_name)):

BIN
bootstrap/minimal.m.gz


+ 98 - 6
wrappers/classes/modelverse.xml

@@ -1340,21 +1340,113 @@
                         <transition cond="self.expect_response('Success')" target="../../wait_for_action/megamodelling"/>
                     </state>
 
+                    <transition cond="self.expect_response_partial('Compilation error: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'CompilationError'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="self.expect_response_partial('Attribute not found: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'UnknownAttribute'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="self.expect_response_partial('Model exists: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'ModelExists'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="self.expect_response_partial('Attribute exists: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'AttributeExists'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="self.expect_response_partial('Element exists: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'ElementExists'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="self.expect_response_partial('Read permission denied to: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'ReadPermissionDenied'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="self.expect_response_partial('Write permission denied to: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'WritePermissionDenied'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="self.expect_response('Write permission denied', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'WritePermissionDenied'"/>
+                            <parameter expr="self.current_model"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="self.expect_response_partial('Execute permission denied to: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'ExecutePermissionDenied'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="self.expect_response_partial('Group permission denied to: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'GroupPermissionDenied'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="self.expect_response_partial('User permission denied to: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'UserPermissionDenied'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="self.expect_response_partial('Admin permission denied', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'AdminPermissionDenied'"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="self.expect_response_partial('Incorrect format: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'InterfaceMismatch'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
                     <transition cond="self.expect_response_partial('Element not found: ', pop=False)" target="../wait_for_action/history">
                         <raise event="exception">
-                            <parameter expr="'UnknownIdentifier'"/>
-                            <parameter expr="'Element could not be found'"/>
+                            <parameter expr="'UnknownElement'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
                         </raise>
+                    </transition>
 
-                        <script>
-                            self.responses.pop(0)
-                        </script>
+                    <transition cond="self.expect_response_partial('Location not found: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'UnknownLocation'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
                     </transition>
 
                     <transition cond="self.expect_response_partial('No conformance relation can be found ', pop=False)" target="../wait_for_action/history">
                         <raise event="exception">
                             <parameter expr="'UnknownMetamodellingHierarchy'"/>
-                            <parameter expr="'Conformance relation not found'"/>
                         </raise>
 
                         <script>

+ 29 - 11
wrappers/modelverse.py

@@ -27,22 +27,46 @@ class UnknownIdentifier(ModelverseException):
 class CompilationError(ModelverseException):
     pass
 
-class NoSuchAttribute(ModelverseException):
+class UnknownAttribute(UnknownIdentifier):
     pass
 
-class UnknownModel(ModelverseException):
+class UnknownLocation(UnknownIdentifier):
+    pass
+
+class UnknownElement(UnknownIdentifier):
     pass
 
 class ConnectionError(ModelverseException):
     pass
 
-class ModelExists(ModelverseException):
+class ExistsError(ModelverseException):
+    pass
+
+class AttributeExists(ExistsError):
+    pass
+
+class ModelExists(ExistsError):
     pass
 
 class PermissionDenied(ModelverseException):
     pass
 
-class InvalidMode(ModelverseException):
+class ReadPermissionDenied(PermissionDenied):
+    pass
+
+class WritePermissionDenied(PermissionDenied):
+    pass
+
+class ExecutePermissionDenied(PermissionDenied):
+    pass
+
+class UserPermissionDenied(PermissionDenied):
+    pass
+
+class GroupPermissionDenied(PermissionDenied):
+    pass
+
+class AdminPermissionDenied(PermissionDenied):
     pass
 
 class InterfaceMismatch(ModelverseException):
@@ -163,13 +187,7 @@ def OUTPUT():
         if response.name == "result":
             return response.parameters[1]
         elif response.name == "exception":
-            if response.parameters[1] == "UnknownIdentifier":
-                raise UnknownIdentifier()
-            elif response.parameters[1] == "UnknownMetamodellingHierarchy":
-                raise UnknownMetamodellingHierarchy()
-            else:
-                print("Unknown error: " + str(response.parameters))
-                raise UnknownError()
+            raise eval(response.parameters[1])(*response.parameters[2:])
 
 def init(address_param="127.0.0.1:8001", timeout=20.0, taskname=None):
     global controller

+ 161 - 8
wrappers/modelverse_SCCD.py

@@ -1,7 +1,7 @@
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
-Date:   Wed Mar  7 08:26:22 2018
+Date:   Mon Mar 12 09:56:50 2018
 
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
@@ -1711,6 +1711,76 @@ class Modelverse(RuntimeClassBase):
         _initialized_behaviour_operations_2.setTrigger(None)
         _initialized_behaviour_operations_2.setGuard(self._initialized_behaviour_operations_2_guard)
         self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_2)
+        _initialized_behaviour_operations_3 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_3.setAction(self._initialized_behaviour_operations_3_exec)
+        _initialized_behaviour_operations_3.setTrigger(None)
+        _initialized_behaviour_operations_3.setGuard(self._initialized_behaviour_operations_3_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_3)
+        _initialized_behaviour_operations_4 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_4.setAction(self._initialized_behaviour_operations_4_exec)
+        _initialized_behaviour_operations_4.setTrigger(None)
+        _initialized_behaviour_operations_4.setGuard(self._initialized_behaviour_operations_4_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_4)
+        _initialized_behaviour_operations_5 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_5.setAction(self._initialized_behaviour_operations_5_exec)
+        _initialized_behaviour_operations_5.setTrigger(None)
+        _initialized_behaviour_operations_5.setGuard(self._initialized_behaviour_operations_5_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_5)
+        _initialized_behaviour_operations_6 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_6.setAction(self._initialized_behaviour_operations_6_exec)
+        _initialized_behaviour_operations_6.setTrigger(None)
+        _initialized_behaviour_operations_6.setGuard(self._initialized_behaviour_operations_6_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_6)
+        _initialized_behaviour_operations_7 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_7.setAction(self._initialized_behaviour_operations_7_exec)
+        _initialized_behaviour_operations_7.setTrigger(None)
+        _initialized_behaviour_operations_7.setGuard(self._initialized_behaviour_operations_7_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_7)
+        _initialized_behaviour_operations_8 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_8.setAction(self._initialized_behaviour_operations_8_exec)
+        _initialized_behaviour_operations_8.setTrigger(None)
+        _initialized_behaviour_operations_8.setGuard(self._initialized_behaviour_operations_8_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_8)
+        _initialized_behaviour_operations_9 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_9.setAction(self._initialized_behaviour_operations_9_exec)
+        _initialized_behaviour_operations_9.setTrigger(None)
+        _initialized_behaviour_operations_9.setGuard(self._initialized_behaviour_operations_9_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_9)
+        _initialized_behaviour_operations_10 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_10.setAction(self._initialized_behaviour_operations_10_exec)
+        _initialized_behaviour_operations_10.setTrigger(None)
+        _initialized_behaviour_operations_10.setGuard(self._initialized_behaviour_operations_10_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_10)
+        _initialized_behaviour_operations_11 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_11.setAction(self._initialized_behaviour_operations_11_exec)
+        _initialized_behaviour_operations_11.setTrigger(None)
+        _initialized_behaviour_operations_11.setGuard(self._initialized_behaviour_operations_11_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_11)
+        _initialized_behaviour_operations_12 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_12.setAction(self._initialized_behaviour_operations_12_exec)
+        _initialized_behaviour_operations_12.setTrigger(None)
+        _initialized_behaviour_operations_12.setGuard(self._initialized_behaviour_operations_12_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_12)
+        _initialized_behaviour_operations_13 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_13.setAction(self._initialized_behaviour_operations_13_exec)
+        _initialized_behaviour_operations_13.setTrigger(None)
+        _initialized_behaviour_operations_13.setGuard(self._initialized_behaviour_operations_13_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_13)
+        _initialized_behaviour_operations_14 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_14.setAction(self._initialized_behaviour_operations_14_exec)
+        _initialized_behaviour_operations_14.setTrigger(None)
+        _initialized_behaviour_operations_14.setGuard(self._initialized_behaviour_operations_14_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_14)
+        _initialized_behaviour_operations_15 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_15.setAction(self._initialized_behaviour_operations_15_exec)
+        _initialized_behaviour_operations_15.setTrigger(None)
+        _initialized_behaviour_operations_15.setGuard(self._initialized_behaviour_operations_15_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_15)
+        _initialized_behaviour_operations_16 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_16.setAction(self._initialized_behaviour_operations_16_exec)
+        _initialized_behaviour_operations_16.setTrigger(None)
+        _initialized_behaviour_operations_16.setGuard(self._initialized_behaviour_operations_16_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_16)
         
         # transition /initialized/behaviour/wait_for_action
         _initialized_behaviour_wait_for_action_0 = Transition(self, self.states["/initialized/behaviour/wait_for_action"], [self.states["/initialized/behaviour/wait_for_action/history"]])
@@ -2083,25 +2153,108 @@ class Modelverse(RuntimeClassBase):
         self.raiseInternalEvent(Event("request", None, ['drop']))
     
     def _initialized_behaviour_operations_0_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UnknownIdentifier', 'Element could not be found']))
-        self.responses.pop(0)
+        self.raiseInternalEvent(Event("exception", None, ['CompilationError', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_0_guard(self, parameters):
-        return self.expect_response_partial('Element not found: ', pop=False)
+        return self.expect_response_partial('Compilation error: ', pop=False)
     
     def _initialized_behaviour_operations_1_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UnknownMetamodellingHierarchy', 'Conformance relation not found']))
-        self.responses.pop(0)
+        self.raiseInternalEvent(Event("exception", None, ['UnknownAttribute', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_1_guard(self, parameters):
-        return self.expect_response_partial('No conformance relation can be found ', pop=False)
+        return self.expect_response_partial('Attribute not found: ', pop=False)
     
     def _initialized_behaviour_operations_2_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['ModelExists', self.split_response(self.responses.pop(0))[0]]))
+    
+    def _initialized_behaviour_operations_2_guard(self, parameters):
+        return self.expect_response_partial('Model exists: ', pop=False)
+    
+    def _initialized_behaviour_operations_3_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['AttributeExists', self.split_response(self.responses.pop(0))[0]]))
+    
+    def _initialized_behaviour_operations_3_guard(self, parameters):
+        return self.expect_response_partial('Attribute exists: ', pop=False)
+    
+    def _initialized_behaviour_operations_4_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['ElementExists', self.split_response(self.responses.pop(0))[0]]))
+    
+    def _initialized_behaviour_operations_4_guard(self, parameters):
+        return self.expect_response_partial('Element exists: ', pop=False)
+    
+    def _initialized_behaviour_operations_5_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['ReadPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+    
+    def _initialized_behaviour_operations_5_guard(self, parameters):
+        return self.expect_response_partial('Read permission denied to: ', pop=False)
+    
+    def _initialized_behaviour_operations_6_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['WritePermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+    
+    def _initialized_behaviour_operations_6_guard(self, parameters):
+        return self.expect_response_partial('Write permission denied to: ', pop=False)
+    
+    def _initialized_behaviour_operations_7_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['WritePermissionDenied', self.current_model]))
+    
+    def _initialized_behaviour_operations_7_guard(self, parameters):
+        return self.expect_response('Write permission denied', pop=False)
+    
+    def _initialized_behaviour_operations_8_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['ExecutePermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+    
+    def _initialized_behaviour_operations_8_guard(self, parameters):
+        return self.expect_response_partial('Execute permission denied to: ', pop=False)
+    
+    def _initialized_behaviour_operations_9_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['GroupPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+    
+    def _initialized_behaviour_operations_9_guard(self, parameters):
+        return self.expect_response_partial('Group permission denied to: ', pop=False)
+    
+    def _initialized_behaviour_operations_10_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['UserPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+    
+    def _initialized_behaviour_operations_10_guard(self, parameters):
+        return self.expect_response_partial('User permission denied to: ', pop=False)
+    
+    def _initialized_behaviour_operations_11_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['AdminPermissionDenied']))
+    
+    def _initialized_behaviour_operations_11_guard(self, parameters):
+        return self.expect_response_partial('Admin permission denied', pop=False)
+    
+    def _initialized_behaviour_operations_12_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['InterfaceMismatch', self.split_response(self.responses.pop(0))[0]]))
+    
+    def _initialized_behaviour_operations_12_guard(self, parameters):
+        return self.expect_response_partial('Incorrect format: ', pop=False)
+    
+    def _initialized_behaviour_operations_13_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['UnknownElement', self.split_response(self.responses.pop(0))[0]]))
+    
+    def _initialized_behaviour_operations_13_guard(self, parameters):
+        return self.expect_response_partial('Element not found: ', pop=False)
+    
+    def _initialized_behaviour_operations_14_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['UnknownLocation', self.split_response(self.responses.pop(0))[0]]))
+    
+    def _initialized_behaviour_operations_14_guard(self, parameters):
+        return self.expect_response_partial('Location not found: ', pop=False)
+    
+    def _initialized_behaviour_operations_15_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['UnknownMetamodellingHierarchy']))
+        self.responses.pop(0)
+    
+    def _initialized_behaviour_operations_15_guard(self, parameters):
+        return self.expect_response_partial('No conformance relation can be found ', pop=False)
+    
+    def _initialized_behaviour_operations_16_exec(self, parameters):
         #print("Unknown Error: " + self.responses[0])
         pass
         self.raiseInternalEvent(Event("exception", None, ['UnknownError', 'Error: %s' % self.responses.pop(0)]))
     
-    def _initialized_behaviour_operations_2_guard(self, parameters):
+    def _initialized_behaviour_operations_16_guard(self, parameters):
         return self.expect_response_partial('', pop=False)
     
     def _initialized_behaviour_wait_for_action_0_exec(self, parameters):