wrappers.rst 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. Wrappers
  2. ========
  3. Several wrappers can be defined for the Modelverse, as the Modelverse is merely a service running externally.
  4. To communicate effectively, and automatically, a programming language wrapper is recommended.
  5. Nonetheless, it is possible to communicatie manually as well.
  6. These are some of the implemented wrappers.
  7. Prompt
  8. ------
  9. The simplest wrapper is the prompt wrapper, which merely sends the input and output directly to the user.
  10. This wrapper has almost no code, but requires users to manually decide which content to send next.
  11. It has no built-in integration with any model or action language compilers.
  12. Nonetheless, it is an easy way to test out the raw communication protocol manually.
  13. Python
  14. ------
  15. The first real wrapper is the Python-based wrapper.
  16. It provides a set of functions for use by Python code.
  17. These functions wrap not only the interface, but also provides simple error handling through the use of Python exceptions and contains the model and action language compilers.
  18. An overview of all functions and associatied exceptions is provided below.
  19. All operations happen *synchronously*, meaning that they block until the Modelverse has performed the requested operation.
  20. Note that some functions are only applicable in a certain *context*.
  21. In practice, this means that you should first issue the *init* and *login* operations, as otherwise your connection with the Modelverse will not have started up yet.
  22. Functions
  23. ^^^^^^^^^
  24. .. function:: init(address_param="http://127.0.0.1:8001", timeout=20.0)
  25. Start up the connection to the Modelverse, residing at *address_param*.
  26. This connection is an XML/HTTPRequest and will start up a new task at the Modelverse.
  27. Retries for *timeout* seconds until giving up.
  28. The timeout includes all HTTP errors, and will therefore keep retrying even on failed attempts.
  29. As this request is synchronous, like all others, it will block until a connection has been established.
  30. .. function:: login(username, password)
  31. Explanation
  32. Logs in the currently active Modelverse connection to the specified *username* and *password*.
  33. If the user does not exist, it will create a new user with the specified password.
  34. If the user already exists, it will try to log in with the provided password.
  35. .. function:: model_add(model_name, metamodel_name, model_code=None)
  36. Explanation
  37. Upload a new model that can later be referred to as *model_name*, conforming to *metamodel_name*.
  38. The model itself is stored in the string *model_code*.
  39. This string is parsed using the HUTN compiler and subsequently sent to the Modelverse.
  40. When *model_code* is empty, an empty model is created.
  41. .. function:: upload_code(code)
  42. Upload a string of *code* in the Action Language formalism.
  43. This piece of code is compiled with the HUTN compiler and sent to the Modelverse directly.
  44. Makes the assumption that the **construct_function()** operation is currently running on the Modelverse, as otherwise the data will be misinterpreted.
  45. This is normally only useful in model transformations, where you want to upload a piece of code on-the-fly (e.g., adding a breakpoint in Action Language).
  46. .. function:: model_delete(model_name)
  47. Delete the model referred to by name *model_name*.
  48. This is a non-cascading delete, with almost no checks: model transformations depending on this model will likely become corrupted.
  49. .. function:: model_list()
  50. Returns a list of all models existing in the Modelverse, together with their type.
  51. .. function:: model_list_full()
  52. Returns a detailed list of all models existing in the Modelverse.
  53. This list includes information on permissions, owner, and group.
  54. .. function:: verify(model_name)
  55. Verify whether *model_name* conforms to its specified metamodel, as stored in the Modelverse.
  56. Returns either "OK" if the model conforms, or a string specifying the reason for non-conformance.
  57. .. function:: model_overwrite(model_name, new_model_code=None)
  58. Overwrites the model previously known under the name *model_name* with the model code in *new_model_code*.
  59. This operation differs from first deleting the model and then recreating it, as all metadata of the model is kept, such as access permissions.
  60. The new model can be kept empty, in which case the model will be cleared.
  61. .. function:: user_logout()
  62. Logs out the current user, thereby closing the task.
  63. Subsequent operations will no longer have any effect, as the task was terminated.
  64. To log in as a different user, the *init* operation has to be executed again.
  65. .. function:: user_delete()
  66. Delete the current user and thereafter log out.
  67. This removes the current user, making it impossible to log in as this user again.
  68. Existing models tied to this user, such as those the user is an owner of, remain bound to the (removed) user.
  69. While it is possible to recreate a new user with the same name, model permissions will not be inherited to this new user with the same name.
  70. .. function:: model_render(model_name, mapper_name)
  71. Render the model by name of *model_name* using the mapper by name of *mapper_name*.
  72. Both parameters have to be known models in the Modelverse.
  73. Outputs a JSON representation of the rendered model.
  74. .. function:: transformation_between(source, target)
  75. List all transformations that originate at *source* and end at *target*.
  76. Transformations can still be selected, even if they take more source models than those specified in the parameters.
  77. .. function:: transformation_add_MT(source_metamodels, target_metamodels, operation_name, code, callback=lambda: None)
  78. Create a new model transformation operation.
  79. The new transformation takes *source_metamodels* as input, and generates *target_metamodels* as output.
  80. Both parameters are dictionaries of the form {name: metamodel_name}.
  81. The name is used later on in the model transformation as a prefix to the type.
  82. A single metamodel_name can be used for multiple names.
  83. Note that the target metamodel names may overlap with the source metamodel names, but the metamodel type should be identical.
  84. The operation is henceforth known by *operation_name* and is provided as a model in the string *code*.
  85. Optionally, a callback is defined which performs some operations on the merged metamodel, for example to define tracability links between (previously unrelated) metamodels.
  86. In the background, this operation does all necessary RAMification and model merging.
  87. .. function:: transformation_add_AL(source_metamodels, target_metamodels, operation_name, code, callback=lambda: None)
  88. Creates a new action language operation.
  89. Similar to *transformation_add_MT*, but now does not require RAMification.
  90. The *code* parameter also is not specified as a Modelverse model (.mvc), but as action language (.alc).
  91. .. function:: transformation_add_MANUAL(source_metamodels, target_metamodels, operation_name, callback=lambda: None)
  92. Creates a new manual operation.
  93. Identical to *transformation_add_AL*, but does not take any code as content.
  94. .. function:: transformation_execute_AL(operation_name, input_models_dict, output_models_dict, callback=lambda i: None)
  95. Executes the Action Language model *operation_name* with *input_models_dict* as inputs and *output_models_dict* as outputs.
  96. For both dicts, the contents describe the mapping between the parameter names of the operation to the names in the Modelverse.
  97. Values in *input_models_dict* must be existing models, whereas values in *output_models_dict* can be non-existing upon invocation.
  98. A *callback* function can be defined when the action language model requires user input or output.
  99. This callback function can be used to communicate with the executing action language directly.
  100. .. function:: transformation_execute_MANUAL(operation_name, input_models_dict, output_models_dict, callback=lambda i: None)
  101. Expl
  102. .. function:: transformation_execute_MT(operation_name, input_models_dict, output_models_dict, callback=lambda i: None)
  103. Expl
  104. .. function:: transformation_list()
  105. Expl
  106. .. function:: process_execute(process_name, prefix, callbacks)
  107. Expl
  108. .. function:: permission_modify()
  109. Expl
  110. .. function:: permission_owner()
  111. Expl
  112. .. function:: permission_group()
  113. Expl
  114. .. function:: group_create()
  115. Expl
  116. .. function:: group_delete()
  117. Expl
  118. .. function:: group_owner_add()
  119. Expl
  120. .. function:: group_owner_delete()
  121. Expl
  122. .. function:: group_join()
  123. Expl
  124. .. function:: group_kick()
  125. Expl
  126. .. function:: admin_promote()
  127. Expl
  128. .. function:: admin_demote()
  129. Expl
  130. .. function:: element_list(model_name)
  131. Expl
  132. .. function:: types(model_name)
  133. Expl
  134. .. function:: types_full(model_name)
  135. Expl
  136. .. function:: read(model_name, ID)
  137. Expl
  138. .. function:: read_attrs(model_name, ID)
  139. Expl
  140. .. function:: instantiate(model_name, typename, edge=None, ID="")
  141. Expl
  142. .. function:: delete_element(model_name, ID)
  143. Expl
  144. .. function:: attr_assign(model_name, ID, attr, value)
  145. Expl
  146. .. function:: attr_assign_code(model_name, ID, attr, code)
  147. Expl
  148. .. function:: attr_delete(model_name, ID, attr)
  149. Expl
  150. .. function:: read_outgoing(model_name, ID, typename)
  151. Expl
  152. .. function:: read_incoming(model_name, ID, typename)
  153. Expl
  154. .. function:: read_association_source(model_name, ID)
  155. Expl
  156. .. function:: read_association_destination(model_name, ID)
  157. Expl
  158. Exceptions
  159. ^^^^^^^^^^
  160. .. exception:: ModelverseException
  161. Expl
  162. .. exception:: UnknownError
  163. Expl
  164. .. exception:: UnknownIdentifier
  165. Expl
  166. .. exception:: UnknownType
  167. Expl
  168. .. exception:: NotAnAssociation
  169. Expl
  170. .. exception:: UnsupportedValue
  171. Expl
  172. .. exception:: CompilationError
  173. Expl
  174. .. exception:: NoSuchAttribute
  175. Expl
  176. .. exception:: UnknownModel
  177. Expl
  178. .. exception:: ConnectionError
  179. Expl
  180. .. exception:: ModelExists
  181. Expl
  182. .. exception:: PermissionDenied
  183. Expl
  184. .. exception:: InvalidMode
  185. Expl
  186. .. exception:: InterfaceMismatch
  187. Expl
  188. Custom
  189. ------
  190. Other wrappers can be made as desired, in whatever language required.
  191. This is due to the fact that the Modelverse communicates only through XML/HTTPRequests.
  192. As such, all languages that support this, can simply mimic the interface used by any of the implemented wrappers.