Informatie voor gevorderden

Als u met synchronisatie wilt gaan werken, maar nog geen enkel synchronisatiesysteem ter beschikking hebt, kunt u in dit onderwerp lezen hoe u een geheel nieuwe subscriber kunt opzetten. Er wordt dus uitgelegd hoe u zonder bestaande synchronisatie-infrastructuur enkele API's kunt gebruiken voor het instellen van synchronisatie.

Het vervolg van dit zelfstudiedocument omvat een doorlopend voorbeeld. De broncode kunt u vinden in het pakket voor de bestandssysteemprovider van de plugin org.eclipse.team.examples.filesystem. U kunt het project uit de CVS-repository reserveren en als naslag gebruiken tijdens het lezen van deze zelfstudie.

Een geheel nieuwe subscriber opzetten

In het eerste voorbeeld wordt er vanuit gegaan dat er geen bestaande infrastructuur is voor het bijhouden van de synchronisatiestatus van het lokale werkgebied. U kunt bij het implementeren van een geheel nieuwe subscriber enkele aanvullende API's gebruiken uit de plugin org.eclipse.team.core. Het pakket org.eclipse.team.core.variants bevat twee subklassen van Subscriber, waarmee u de implementatie kunt vereenvoudigen. De eerste klasse is ResourceVariantTreeSubscriber, die in het tweede voorbeeld verderop wordt besproken. De tweede klasse is een subklasse van de eerste: ThreeWaySubscriber. In deze subscriber-implementatie staan u diverse nuttige klassen ter beschikking voor het beheren van de synchronisatiestatus van het lokale werkgebied. Indien u niet over een bestaande infrastructuur beschikt, vindt u in dit onderwerp alle benodigde informatie.

Het implementeren van een geheel nieuwe subscriber wordt geïllustreerd aan de hand van het bestandssysteemvoorbeeld uit de plugin org.eclipse.team.examples.filesystem. De code in de onderstaande beschrijving is zo beknopt mogelijk gehouden; u kunt deze immers ook bekijken in de CVS-repository van Eclipse. Hoewel het bestandssysteemvoorbeeld in technisch opzicht geen drierichtings-subscriber is, komt deze infrastructuur nog steeds goed van pas. De FTP- en WebDAV-plugins zijn gebouwd op basis van deze infrastructuur.

ThreeWaySubscriber

Met het bestandssysteemvoorbeeld beschikte u al over een implementatie van RepositoryProvider, waarmee een lokaal project werd gekoppeld aan een locatie in het bestandssysteem voor het bijhouden van een schaduwkopie van de lokale inhoud. FileSystemSubscriber is als subklasse gemaakt van ThreeWaySubscriber, zodat gebruik kon worden gemaakt van ThreeWaySynchronizer voor het beheren van de synchronisatiestatus van het werkgebied. Voor subklassen van deze klasse geldt het volgende:

Naast de subscriber-implementatie zijn de ophaal- en doorvoerbewerkingen van de bestandssysteemprovider gewijzigd voor het bijwerken van de synchronisatiestatus in ThreeWaySynchronizer. De bewerkingen zijn geïmplementeerd in de klasse org.eclipse.team.examples.filesystem.FileSystemOperations.

ThreeWaySynchronizer

ThreeWaySynchronizer beheert de synchronisatiestatus tussen het lokale werkgebied en een locatie op afstand. De datum/tijd van de lokale en de basisresource en de resource op afstand worden in de cache geplaatst en bevroren, zodat de synchronisatiestatus efficiënt kan worden berekend. Ook worden geregistreerde listeners op de hoogte gesteld van wijzigingen. Deze wijzigingsevents worden door ThreeWaySubscriber in de juiste indeling omgezet en aan de listeners doorgegeven die voor de subscriber geregistreerd zijn.

ThreeWaySynchronizer maakt gebruik van de Core-planningsregels en -vergrendelingen om threads te beveiligen en wijzigingskennisgevingen als batch te verwerken.

ThreeWayRemoteTree

ThreeWayRemoteTree is een subklasse van ResourceVariantTree, die is aangepast voor ThreeWaySubscriber. Clients moeten de klasse vervangen, zodat de status op afstand kan worden opgehaald van de server. In het volgende voorbeeld wordt ResourceVariantTree verder uitgelegd.

CachedResourceVariant

CachedResourceVariant is een gedeeltelijke implementatie van IResourceVariant, waarmee opgehaalde gegevens een bepaalde tijd (nu 1 uur) in de cache bewaard blijven. Omdat de gegevens meerdere keren in een kort tijdsbestek kunnen worden opgevraagd (bijvoorbeeld voor het vaststellen van de synchronisatiestatus en het afbeelden van de inhoud van een vergelijkingseditor), is deze techniek nuttig. Subklassen moeten nog steeds de unieke contentidentificatie opgeven in combinatie met de byte-array, die vastgehouden kan worden voor het opnieuw maken van de ingang van de resourcevariant.

De bestaande werkgebiedssynchronisatie verder uitbreiden

Veel repositoryproviders bevatten wellicht al een systeem voor het beheren van de synchronisatiestatus (bijvoorbeeld met behulp van bestaande plugins). ResourceVariantTreeSubscriber en de bijbehorende klassen bieden de mogelijkheid de bestaande synchronisatie-infrastructuur verder uit te breiden. Dit is bijvoorbeeld de superklasse van alle CVS-subscribers.

ResourceVariantTreeSubscriber

Zoals al eerder is uitgelegd in het vorige voorbeeld, is ThreeWaySubscriber een subklasse van ResourceVariantTreeSubscriber voor synchronisatie van het lokale werkgebied met behulp van ThreeWaySynchronizer. Door subklassen van ResourceVariantTreeSubscriber moeten de volgende items verstrekken:

Verdere mogelijkheden van de subscriber worden met deze voorzieningen geïmplementeerd.

ResourceVariantTree

ResourceVariantTree is een concrete implementatie van IResourceVariantTree, die de volgende taken afhandelt:

Subklassen moeten de volgende items implementeren:

Concrete implementaties van ResourceVariantByteStore worden verstrekt die bytes tussen workbenchoproepen vasthouden (PersistantResourceVariantByteStore) of bytes alleen tijdens de huidige sessie in de cache plaatsen (SessionResourceVariantByteStore). Voor het bouwen van een subscriber als uitbreiding van een bestaande synchronisatie-infrastructuur van de workbench moet u doorgaans subklassen van ResourceVariantByteStore implementeren die een interface bieden voor de onderliggende synchronisatiefunctie. Zo maakt ThreeWayRemoteTree bijvoorbeeld gebruik van een byteopslagimplementatie waarmee de bytes op afstand worden bewaard in ThreeWaySynchronizer.

Het maken van de ingangen van de resourcevarianten verloopt in dit voorbeeld op dezelfde wijze als in het vorige voorbeeld. Alleen worden de ingangen nu wel opgevraagd van een structuurinstance van de resourcevarianten en niet van de subscriber.