Fonctionnement
Site maître - sites esclaves
Pour que le système puisse fonctionner, nous définissons un site maître et des sites esclaves. Le site maître représente la chaîne éditoriale. C'est lui qui tient à jour la liste des opérations en mémoire afin de synchroniser les sites esclaves. Nous définissons le système de commentaires au repos lorsqu'aucune opération n'est stockée en mémoire.
Un site esclave représente un document HTML permettant l'édition de commentaires. Contrairement au site maître, un site esclave est donc éphémère et dure le temps d'une session d'un utilisateur sur un navigateur web. À son initialisation, le site esclave analyse ses éléments HTML et fournit une liste de liens profonds au site maître qui analyse le graphe et fournit une liste de commentaires datée (par date, nous entendons une mesure précise de l'instant à la milliseconde près selon la technique en usage dans les systèmes informatiques, soit le nombre de millisecondes depuis le 1er janvier 1970 à 00h00:00 UTC. Cette mesure du temps est également appelée temps UNIX).
Seuls les sites esclaves peuvent générer des opérations. Lorsqu'une opération est générée, elle est envoyée au site maître sans être exécutée localement. Le site maître applique si nécessaire une transformée opérationnelle avant d’exécuter l'opération. À ce stade, le modèle de données du site esclave n'est pas modifié (les liens profonds du code HTML, la liste des commentaires et de leurs liens profonds respectifs). Une fois l'opération exécutée, le site maître envoie une réponse au site esclave contenant l'ensemble des modifications à apporter à son modèle de données. Ces modifications sont réordonnancées par le site maître dans l'ordre de leur exécution. Il n'y a donc plus de transformées à exécuter.
![](../res/OT_Comment_basic.png)
Dans cette illustration, l'initialisation d'un esclave se fait en trois temps : la transformation d'une partie du graphe en une page HTML, la demande d'initialisation de l'esclave et enfin la liste des commentaires en cours. Lorsqu'une opération O1 est générée par le site esclave, elle est envoyée au site maître sans être exécutée localement. Le site maître la réceptionne, l’exécute et renvoie la liste de toutes les opérations effectuées depuis la dernière mise à jour du site esclave. Cet exemple est trivial puisqu'un seul site esclave est mobilisé. La liste retournée n'est composée que de O1 et aucune transformée opérationnelle n'est nécessaire.
Opérateurs
Lorsqu'un esclave génère une opération, il mobilise un langage d'opérateurs variés permettant de manipuler les commentaires : création d'un fil de discussion, réponse à un commentaire, fermeture ou ré-ouverture d'un fil ou encore suppression d'un commentaire.
Le site maître exécute ces commandes et traduit ces actions dans un langage d'opérateurs plus simple, optimisé pour maintenir la validité des liens profonds. Chacun de ces opérateurs prend le lien profond et les détails du fil de discussion en paramètre. Trois opérateurs sont utilisés :
la création d'un nouveau fil de discussion est traduit par un opérateur d'ajout, noté
« + »
;la modification d'un commentaire, la réponse, la clôture ou réouverture d'un fil de discussion sont exprimées par un opérateur de modification, noté
« ~ »
;la suppression d'un fil de commentaires se traduit par un opérateur de suppression, noté
« - »
.
Lors de la réception d'une liste d'opérations, un site esclave exécute les opérations les unes après les autres. Une opération d'ajout ou de suppression nécessite la mise à jour de l'ensemble des liens profonds. Une opération de modification implique uniquement un remplacement de la structure de données du fil de commentaires et de son affichage.
Mise à jour des liens profonds
Le site esclave maintient une liste de liens profonds composée du lien de chaque fil de discussion et de chaque élément HTML disposant d'un attribut « data-origin »
. Cette liste doit être à jour pour associer un fil de discussion à son premier élément XML parent au sein du fragment de document d'origine.
Soit un opérateur « + »
ou « - »
associé au lien profond « L =id@/X/.../Y/Z »
. On notera L:id la valeur de l'identifiant et L:chemin le tableau des nombres [X, ..., Y, Z]. L:chemin.taille désigne la taille du tableau et L:chemin[i] la valeur du ième nombre.
Pour chacun des liens profonds Ln, l'algorithme de mise à jour procède comme suit :
SI (Ln:id != L:id) ALORS STOP FINSI
SI (Ln:chemin.taille < L:chemin.taille) ALORS STOP FINSI
POUR (i = 0 ; i < L:chemin.taille - 1 ; i++) FAIRE
SI (L:chemin[i] != Ln:chemin[i]) ALORS
STOP
FINSI
FINPOUR
SI (L:chemin[L:chemin.taille-1] < Ln:chemin[L:chemin.taille-1]) ALORS
SI (opérateur == +) ALORS
Ln:chemin[L:chemin.taille-1]++
FINSI
SI (opérateur == -) ALORS
Ln:chemin[L:chemin.taille-1]--
FINSI
FINSI
Stockage des listes d'opérations
Au repos, le site maître ne contient pas de liste d'opérations. Lorsqu'une opération est reçue, une liste associée à un fragment est constituée. Toute nouvelle opération sur ce fragment est ajouté à cette liste.
Il existe deux méthodes de suppression d'une liste :
lorsqu'un fragment est modifié dans l'éditeur XML par un rédacteur, aucune indication sur la nature de la modification n'est conservée, la liste d'opérations est alors supprimée ;
lorsque la chaîne éditoriale demande la libération d'espace mémoire, une fonction supprime les listes existantes en fonction de la priorité de la demande de libération de mémoire et de l'âge du dernier ajout d'opération à la liste.
Si des sites esclaves associés à une liste sont en usage lors de la suppression, leur usage devient impossible car les transformées opérationnelles ne peuvent plus être réalisées. Il est nécessaire de recommencer l'édition en réinitialisant un nouveau site.
Résolution des conflits
La situation typique de gestion de conflits s'opère comme illustrée sur le schéma suivant :
![](../res/OT_comment.png)
Deux sites esclaves s'initialisent l'un après l'autre. Le second effectue plusieurs opérations avant que le premier ne valide sa première opération. Lorsque cette opération est réceptionnée par le site maître, elle est transformée si nécessaire puis envoyée avec les autres modifications apportées depuis la dernière réponse du site maître.
Les conflits au sein d'un fil de discussion ne sont pas gérés actuellement. Pour modifier un fil de discussion, un site esclave doit nécessairement avoir la dernière version à jour avant d'effectuer l'envoi.