Si vous envisagez de proposer la prise en charge de la synchronisation et que vous ne disposez pas d'un mécanisme existant pour la gestion de l'état de synchronisation, cette section explique comment implémenter un abonné en partant de zéro. Cela signifie qu'il n'y a pas d'infrastructure de synchronisation existante et illustre l'utilisation de certaines API servant à conserver l'état de synchronisation.
Dans le reste de cet exemple, nous allons utiliser un exemple fonctionnel. Le code source se trouve dans le package du fournisseur de système de fichiers du plug-in org.eclipse.team.examples.filesystem. Vous devez réserver le projet dans le référentiel CVS et l'utiliser comme référence lorsque vous lisez ce didacticiel.
Ce premier exemple considère qu'il n'y a pas d'infrastructure existante pour conserver l'état de synchronisation de l'espace de travail local. Lors de l'implémentation d'un abonné à partir de séro, vous pouvez utiliser certaines API complémentaires proposées dans le plug-in org.eclipse.team.core. Le package org.eclipse.team.core.variants contient deux sous-classes d'abonné, qui peuvent être utilisées pour simplifier l'implémentation. La première sous-classe est ResourceVariantTreeSubscriber, qui sera présentée dans le second exemple ci-dessous. La seconde sous-classe est une sous-classe de la première : ThreeWaySubscriber. Cette implémentation d'abonné met plusieurs classes utiles à disposition pour gérer l'état de synchronisation d'un espace de travail local. Si vous ne disposez pas d'une infrastructure existante, c'est le moment de vous lancer.
L'implémentation d'un abonné à partir de zéro va être illustrée à l'aide de l'exemple de système de fichiers disponibles dans le plug-in org.eclipse.team.examples.filesystem. Le code de la description ci-dessous est conservé sous une forme minimale car il est disponible dans le référentiel CVS d'Eclipse. Même s'il ne s'agit pas d'un abonné tridirectionnel d'un point de vue technique, l'exemple de système de fichiers utilise toujours de cette infrastructure. Les plug-ins FTP et WebDAV eux aussi sont créés à l'aide de cette infrastructure.
Pour l'exemple de système de fichiers, nous avions déjà une implémentation de RepositoryProvider, qui associait un projet local à un emplacement de système de fichiers dans lequel le contenu local était reflété. FileSystemSubscriber a été créé comme sous-classe de ThreeWaySubscriber pour utiliser ThreeWaySynchronizer pour gérer l'état de synchronisation de l'espace de travail. Les sous-classes de cette classe doivent réaliser l'opération suivante :
Outre l'implémentation de l'abonné, les opérations d'extraction et d'insertion pour le fournisseur de système de fichiers ont été modifiées afin de mettre à jour l'état de synchronisation dans ThreeWaySynchronizer. Les opérations sont implémentées dans la classe org.eclipse.team.examples.filesystem.FileSystemOperations.
ThreeWaySynchronizer gère l'état de synchronisation entre l'espace de travail local et un emplacement distant. Il met en mémoire cache et conserve les horodatages locaux, standard et distants afin de prendre en charge le calcul efficace de l'état de synchronisation d'une ressource. Il supprime également les notifications de modification dans les modules d'écoute enregistrés. ThreeWaySubscriber convertit ces événements de modification au format approprié à envoyer aux modules d'écoute enregistrés avec l'abonné.
ThreeWaySynchronizer utilise les règles de planification de core et procède au verrouillage pour veiller à la sécurité de l'unité d'exécution et permettre le regroupement des notifications de modification.
ThreeWayRemoteTree est une sous-classe de ResourceVariantTree adapté à ThreeWaySubscriber. Elle doit être supplantée par les clients pour mettre à disposition le mécanisme permettant d'extraire l'état distant sur le serveur. ResourceVariantTree sera traitée plus en détail dans l'exemple suivant.
CachedResourceVariant est une implémentation partielle d'IResourceVariant qui met en mémoire cache le contenu extrait pour une période (actuellement, une heure). Cela s'avère utile dans la mesure où le contenu est accessible plusieurs fois sur une période courte (par exemple, pour déterminer l'état de synchronisation et affiche le contenu dans un éditeur de comparaison). Les sous-classes doivent toujours fournir un identifiant de contenu unique avec le tableau d'octets qui peut être conservé afin de recréer le descripteur de variante de ressource.
Bon nombre de fournisseurs de référentiel peuvent déjà disposer d'un mécanisme pour gérer leur état de synchronisation (par exemple, en présence de plug-ins existants). ResourceVariantTreeSubscriber et ses classes associées offrent la possibilité de créer à partir d'une infrastructure de synchronisation existante. Par exemple, il s'agit de la superclasse de tous les abonnés CVS.
Comme il a été mentionné dans l'exemple précédent, ThreeWaySubscriber est une sous-classe de ResourceVariantTreeSubscriber qui permet la synchronisation de l'espace de travail local à l'aide ThreeWaySynchronizer. Les sous-classes de ResourceVariantTreeSubscriber doivent indiquer :
les sous-classes de ResourceVariantTree (ou AbstractResourceVariantTree) qui définissent le comportement de balayage et d'actualisation des variantes de ressources distantes et, pour les abonnés prenant en charge les comparaisons tridirectionnelles, les variantes de ressource standard.
Les autres fonctions de l'abonné sont implémentées à l'aide de ces fonctions.
ResourceVariantTree est une implémentation concrète de IResourceVariantTree qui permet :
Des sous-classes doivent implémenter ce qui suit :
Des implémentations concrètes deResourceVariantByteStore sont fournies pour conserver les octets lors des appels du plan de travail (PersistantResourceVariantByteStore) ou mettre en mémoire cache les octets uniquement pour la session courante (SessionResourceVariantByteStore). Cependant, la création d'un abonné basée sur une infrastructure de synchronisation d'espace de travail existante implique généralement l'implémentation de sous-classes de ResourceVariantByteStore, qui servent d'interface avec le synchroniseur sous-jacent. Par exemple, ThreeWayRemoteTree utilise une implémentation de mémoire d'octets qui stocke les octets distants dans ThreeWaySynchronizer.
La création des descripteurs de variante de ressource pour cet exemple ne diffère pas de celle de l'exemple précédent, à l'exception du fait que les descripteurs sont demandés dans une instance d'arborescence de variantes de ressource et non dans l'abonné.