- entrées/sorties communes à tous les requêtes/modifications
- output :
status: code indiquant le statut de la requête (cf ci-dessous)error: message d'erreur sistatus=KOtype: type de la requête initiale (PUT,GET,POSTouDELETE)clock: horloge logique de la dernière modification du diagramme
- input :
last-clock: dernière horloge logique reçue par le client ayant envoyé la requête (optionnel)
- succès (
2xx) :200: OK
- redirection (
3xx) :304: non modifié
- erreur client (
4xx) :400: requête mal formée401: existe déjà404: non trouvé
- erreur serveur (
5xx) :500: erreur interne
- les sorties présentées ci-dessous sont celles des modifications apportées au diagramme et pas le retour de la requête REST
- le retour de la requête REST contient un champ
status, un champclocket :- soit un champ
descriptioncontenant la description complète du diagramme et de ses éléments silast-clockn'a pas été spécifié dans la requête ou si l'historique ne peut pas retourner la liste de modification désirée - soit un champ
modification-listcontenant un tableau JSON de modifications (telles que décrites ci-après)
- soit un champ
- Chaque requête
PUT,POSTouDELETEincrémente l'horloge logique du diagramme ciblé de 1 - Les requêtes
GETn'induisent aucune modification de la valeur de l'horloge
- création d'un diagramme :
- uri :
<addr>/<diagram> - output :
{path:<diagram name in json array>}
- uri :
- création d'un sous-élément dans un diagramme/élément :
- uri :
<addr>/<diagram>/[<element> ...]/<element> - input :
properties=<properties as json map> - output :
{path:<path as json array>, properties:<properties as json map>}
- uri :
- liste des diagrammes disponibles :
- uri :
<adrr> - output :
{list:<diagram list as json>}
- uri :
- récupération de la description (propriétés et descriptions des sous-éléments) d'un diagramme/élément
- uri :
<adrr>/<diagram>[/<element> ...] - output :
{path:<path as json array>, description:<properties and sub elements as json map>}
- uri :
- suppression récursive d'un diagramme ou d'un élément :
- uri :
<adrr>/<diagram>[/<element> ...] - output :
{path:<path as json array>}
- uri :
- suppression de propriétés :
- uri :
<adrr>/<diagram>[/<element> ...] - input :
properties-list=<properties to remove as json array> - output :
{path:<path as json array>, properties-list:<properties removed as json array>}
- uri :
- modification/ajout de propriétés à un élément :
- uri :
<adrr>/<diagram>[/<element> ...] - input :
properties=<properties to add/modify as json map> - output :
{path:<path as json array>, properties:<properties added/modified as json map>}
- uri :
- auto-positionnement des éléments fils :
- uri :
<adrr>/<diagram>[/<element> ...] - input :
options= "[\"auto-positioning\"]" - output : une modification par élément respectant le format suivant
{path:<path as json array>, properties:<properties added/modified as json map>}
- uri :
- MainCt : conteneur principal
- agents standards JADE
- 1 couple RestAgt + RestServer
- 1 SaveAgt
- DiaCt : conteneur pour les agents des diagrammes
- 1+ EltAgt par diagramme (au moins un elément représentant le diagramme)
- 1 ClockAgt par diagramme
- 1 HistAgt par diagramme
- chargé de récupérer et de traiter les requêtes REST
- les requêtes sont ensuite transférées sous forme d'ACLMessage au EltAgt racine correspondant si besoin
- création des nouveaux diagrammes (EltAgt racine + ClockAgt + HistAgt)
- liste des diagrammes disponibles
- RestServer :
- != comportement JADE
- attente d'une requête client puis :
- création d'un diagramme ou liste des diagrammes disponibles
- ou envoie d'un message vers le EltAgt racine correspondant pour exécution de la requête
- le message est envoyé avec un champ
reply-toindiquant le ClockAgt du diagramme
- le message est envoyé avec un champ
- ReceiveBhv :
- après envoi d'une requête à un EltAgt racine, attente de la réponse
- après réception de la réponse et traitement, le résultat est envoyé au client REST
- stocke l'état courant d'un élément du diagramme ou du diagramme lui-même
- pour chaque diagramme, les EltAgt forment une arborescence dont la racine est le EltAgt s'occupant du diagramme
- si à sa création l'EltAgt n'a pas de parent (racine), il s'enregistre auprès du DF
- implémente les fonctions de recherche, ajout, suppression, modification etc. d'éléments sur l'arborescence
- ReceiveBhv :
- attend une requête du RestAgt ou d'un EltAgt parent
- execute les opérations nécéssaires à la réalisation de la requête (transfert à un/plusieurs fils, instructions locales etc.)
- retourne éventuellement une réponse à l'expéditeur de la requête initiale (requête REST)
- PUT :
- si l'élément courant est l'avant-dernier élément de l'uri :
- ajoute un nouvel élément si celui-ci n'existe pas déjà (création d'un EltAgt et ajout à l'arborescence)
- sinon :
- transfert du message au fils correspondant au prochain élément dans l'uri si il existe ou retourne une erreur
- si l'élément courant est l'avant-dernier élément de l'uri :
- GET :
- si l'élément courant a une profondeur dans l'arborescence strictement inférieure à celle de la cible de l'uri :
- transfert du message au fils correspondant au prochain élément dans l'uri si il existe ou retourne une erreur
- sinon :
- si l'élément est une feuille :
- répond au message en envoyant la liste des propriétés et leurs valeures
- sinon :
- transfert le message à tous les sous-éléments et lance un behaviour WaitDescriptionBhv pour attendre les réponses
- si l'élément est une feuille :
- si l'élément courant a une profondeur dans l'arborescence strictement inférieure à celle de la cible de l'uri :
- DELETE :
- si la requête contient un champ
properties-list(suppression de propriété) :- si l'élément courant est le dernier élément de l'uri :
- suppression des propriétés dans l'élément si elles existent
- sinon :
- transfert du message au fils correspondant au prochain élément dans l'uri si il existe ou retourne une erreur
- si l'élément courant est le dernier élément de l'uri :
- sinon (suppression d'élément) :
- si l'élément courant a une profondeur dans l'arborescence strictement inférieure à celle de la cible de l'uri :
- transfert du message au fils correspondant au prochain élément dans l'uri si il existe ou retourne une erreur
- sinon :
- si l'élément courant est le dernier élément de l'uri :
- envoie une réponse à l'expéditeur initiale de la requête
- transfert du message à tous les fils
- autodestruction
- si l'élément courant est le dernier élément de l'uri :
- si l'élément courant a une profondeur dans l'arborescence strictement inférieure à celle de la cible de l'uri :
- si la requête contient un champ
- POST :
- si l'élément courant est le dernier élément de l'uri :
- modification des propriétés de l'élément
- envoie une réponse à l'expéditeur initiale de la requête
- sinon :
- transfert du message au fils correspondant au prochain élément dans l'uri si il existe ou retourne une erreur
- si l'élément courant est le dernier élément de l'uri :
- WaitDescriptionBhv :
- après avoir envoyé un message à chaque fils pour obtenir leur description, attend les retours
- une fois une réponse à chaque message reçu, formule une réponse à l'agent ayant envoyé la requête (EltAgt parent ou ClockAgt à cause du
reply-to)
- agent responsable de la sauvegarde et de la restauration des diagrammes du serveur après redémarrage
- chaque diagramme est sauvegardé dans un fichier au format JSON
- RestoreBhv :
- comportement one-shot lancé au démarrage de l'agent
- à partir des fichiers sauvegardés, créé les différents diagrammes (EltAgt racine + ClockAgt + HistAgt) et envoie un message au nouveau EltAgt racine pour restaurer la valeur de ses différents sous-éléments (type RESTORE)
- une fois terminé, lance le TickerBhv et le ReceiveBhv
- TickerBhv :
- comportement qui envoie régulièrement un message à tous les EltAgt racine leur demandant de communiquer leur description complète
- ReceiveBhv :
- comportement cyclique chargé de récupérer les réponses des EltAgt aux messages envoyé par le TickerBhv
- à la réception de la description d'un diagramme, écrit cette dernière dans un fichier .json
- agent chargé de gérer l'horloge logique d'un diagramme
- ReceiveBhv :
- comportement cyclique qui, à la réception d'un message INFORM (venant d'un EltAgt) :
- incrémente l'horloge logique si le type de la requête initiale était
PUT,POSTouDELETE - ajoute un champ
clockau message qui contient la valeur courante de l'horloge du diagramme - envoie ensuite le message au HistAgt du diagramme
- incrémente l'horloge logique si le type de la requête initiale était
- comportement cyclique qui, à la réception d'un message INFORM (venant d'un EltAgt) :
- agent chargé de stocker l'historique des modifications du diagramme
- ReceiveBhv :
- comportement cyclique qui, à la réception d'un message INFORM (venant du ClockAgt) :
- si le type de la requête initiale était
PUT,POSTouDELETE, ajoute le contenu du message à la liste des modifications - si le message contient un champ
last-clocket que sa valeur est supérieure à l'horloge la première modification encore stockée dans la liste des modifications, renvoie la liste des modifications appliquée depuis celle portant l'horlogelast-clock - sinon envoie un message au EltAgt racine pour récupérer la description complète du diagramme en ajoutant un champ
reply-tovers le RestAgt
- si le type de la requête initiale était
- comportement cyclique qui, à la réception d'un message INFORM (venant du ClockAgt) :
- content : dictionnaire JSON sérialisé
- les champs décrits ci-dessous n'appartenant pas au format ACL sont des champs de ce dictionnaire
- conversation-id : id unique généré pour chaque requête REST et conservé durant tout le traitement de cette dernière
- performatif :
REQUEST - destinataires : EltAgt racine
- reply-to : ClockAgt
- type :
PUT,GET,DELETEouPOSTdépendant du type de la requête REST initiale - path : chemin du diagramme/élément visé par la requête
- properties : liste des propriétés et de leurs valeurs dans le cas d'une modification/création d'un élément
- properties-list : liste des propriétés à supprimer au sein d'un élément pour certaines requêtes
DELETE - last-clock : dernière horloge reçue par le client si spécifiée dans la requête REST
- Les messages envoyés d'un EltAgt vers un autre EltAgt ne sont que des transferts d'une requête initiale reçue.
- Tous les champs du messages et du contenu sont convervés (incluant le
senderet lereply-to)
- performatif :
INFORM - status :
200 - destinataires : valeur du champ
reply-to, ousendersi le premier est inexistant - le contenu du message est celui de la requête, plus les éventuels champs suivants :
- description : description récursive des propriétés et éléments d'un diagramme/élément
- performatif :
FAILURE - status : un code d'erreur (
3xx,4xxou5xx) - destinataires : valeur du champ
sender(lereply-toest ignoré) - error : message d'erreur
- performatif :
REQUEST - destinataires : tous les EltAgt racine (une fois créés)
- type :
RESTORE - description : description recursive des propriétés du diagramme et de ses éléments
- performatif :
REQUEST - destinataires : tous les EltAgt racine
- type :
GET - path :
[](liste vide --> retourne la description complète du diagramme)
- performatif :
INFORM - destinataires : HistAgt
- le contenu du message est le même que celui du message reçu plus un champ
clockcontenant la valeur de l'horloge logique du diagramme
- performatif :
INFORM - destinataires : RestAgt
- status :
200 - clock : valeur de l'horloge logique insérée dans le contenu du message par le ClockAgt
- modification-list : liste des modifications appliquées au diagramme depuis l'horloge
last-clockspécifiée par le client
- performatif :
INFORM - destinataires : EltAgt racine
- reply-to : RestAgt
- type :
GET - path :
[](liste vide --> retourne la description complète du diagramme) - clock : valeur de l'horloge logique insérée dans le contenu du message par le ClockAgt