- 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=KO
type
: type de la requête initiale (PUT
,GET
,POST
ouDELETE
)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 champclock
et :- soit un champ
description
contenant la description complète du diagramme et de ses éléments silast-clock
n'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-list
contenant un tableau JSON de modifications (telles que décrites ci-après)
- soit un champ
- Chaque requête
PUT
,POST
ouDELETE
incrémente l'horloge logique du diagramme ciblé de 1 - Les requêtes
GET
n'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-to
indiquant 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
,POST
ouDELETE
- ajoute un champ
clock
au 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
,POST
ouDELETE
, ajoute le contenu du message à la liste des modifications - si le message contient un champ
last-clock
et 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-to
vers 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
,DELETE
ouPOST
dé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
sender
et lereply-to
)
- performatif :
INFORM
- status :
200
- destinataires : valeur du champ
reply-to
, ousender
si 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
,4xx
ou5xx
) - destinataires : valeur du champ
sender
(lereply-to
est 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
clock
contenant 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-clock
spé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