Eclipse biedt API's voor het beheren en afbeelden van de synchronisatiestatus tussen resources in het werkgebied en resources op een andere locatie. Een resource buiten het werkgebied wordt ook wel een variant genoemd. Bij synchronisatie worden de wijzigingen tussen resources op verschillende locaties afgebeeld en kan de synchronisatiestatus optioneel worden gewijzigd door het uitvoeren van een bepaalde actie. De synchronisatie-API's zijn orthogonaal ten opzichte van de API's van RepositoryProvider en kunnen zonder respositoryprovider worden gebruikt. U kunt met synchronisatie-API de implementatie van diverse manieren voor het presenteren van de synchronisatiestatus van resources vereenvoudigen. In de API moet u een methode opgeven voor het opvragen van de synchronisatiestatus, maar u hoeft geen methode op te geven voor het beïnvloeden van de status. Het beïnvloeden wordt door de implementer uitgevoerd. (U kunt echter ook providerspecifieke items aan menu's toevoegen in de gebruikersinterface.)
Voordat de synchronisatie-API nader wordt uitgelegd, is het nuttig enkele termen en concepten op het gebied van werkgebiedssynchronisatie door te nemen.
Resourcevariant: een lokale resource die wordt toegewezen aan een resource op een andere locatie. Dat wil zeggen dat de resources vrijwel identiek zijn, maar niet helemaal (als gevolg van wijzigingen aan de lokale resource of de resource op afstand). Het lokale exemplaar (in het werkgebied) wordt als resource beschouwd en alle exemplaren op afstand zijn resourcevarianten.
Synchroniseren: het afbeelden van de verschillen tussen resourcevarianten. Tijdens de synchronisatie wordt de status van de varianten niet gewijzigd, maar worden de verschillen tussen de varianten afgebeeld in een view. Een gebruiker kan de status van een variant echter vaak beïnvloeden als beschikbaar maken (versiebeheer) of het terugzetten naar een eerdere versie zijn toegestaan.
Twee- en drierichtingssynchronisatie: De synchronisatiestatus kan met twee- of drierichtingssynchronisatie worden vastgesteld. Bij een tweerichtingsvergelijking worden alleen een lokale resource en één resourcevariant (de resourcevariant op afstand) met elkaar vergeleken. Met dit type vergelijking kunnen alleen de verschillen tussen resources worden afgebeeld, maar kan het verband tussen de wijzigingen niet worden aangeduid. De meeste coderepository-systemen ondersteunen een vergelijking in drie richtingen voor het vaststellen van de synchronisatiestatus. Met dit type vergelijking worden een lokale resource, een resourcevariant op afstand en een basisresourcevariant met elkaar vergeleken. De basisresourcevariant is een gemeenschappelijk item op hoger niveau voor de lokale resource en de resource op afstand. Zo kunt u een complexere synchronisatiestatus bepalen, waarbij de richting van de wijzigingen wordt aangegeven.
Tabel 1: de synchronisatiestatussen
Twee richtingen Drie richtingen Gewijzigd
Gewist
ToegevoegdGewijzigd, uitgaand
Gewijzigd, inkomend
Gewist, uitgaand
Gewist, inkomend
Toegevoegd, uitgaand
Toegevoegd, inkomend
Wijzigingsconflict
Wisconflict
Toevoegingsconflict
De klassen in org.eclipse.team.core.synchronize worden gebruikt voor het beschrijven van de synchronisatiestatus. De belangrijkste klasse is SyncInfo, omdat deze de synchronisatiestatus daadwerkelijk aanduidt. U gebruikt de klasse als volgt:
SyncInfo info = getSyncInfo(resource); // Dit is een gesimuleerde methode voor het ophalen van de synchronisatiegegevens van een resource.
int changekind = info.getKind();
if(info.getResourceComparator().isThreeWay()) {
if((changeKind & SyncInfo.DIRECTION_MASK) == SyncInfo.INCOMING) {
// Iets uitvoeren.
}
} else if(changeKind == SyncInfo.CHANGE) {
// Iets anders uitvoeren.
}
De klasse SyncInfo bevat algoritmen voor twee- en drierichtingsvergelijkingen. De resources en een klasse voor het vergelijken van de resources (IResourceVariantComparator) moeten door een client worden verstrekt. Hier ziet u een voorbeeld van een variantcomparator:
public class TimestampVariantComparator implements IResourceVariantComparator {
protected boolean compare(IResourceVariant e1, IResourceVariant e2) {
if(e1.isContainer()) {
if(e2.isContainer()) {
return true;
}
return false;
}
if(e1 instanceof MyResourceVariant && e2 instanceof MyResourceVariant) {
MyResourceVariant myE1 = (MyResourceVariant)e1;
MyResourceVariant myE2 = (MyResourceVariant)e2;
return myE1.getTimestamp().equals(myE2.getTimestamp());
}
return false;
}
protected boolean compare(IResource e1, IResourceVariant e2) {
}
public boolean isThreeWay() {
return true;
}
}
SyncInfo info = new SyncInfo(resource, variant1, variant2, new TimestampComparator());
info.init(); // Synchronisatiegegevens berekenen.
Het pakket bevat ook collecties die specifiek ontworpen zijn voor SyncInfo en filters die kunnen worden toegepast op SyncInfo-instances.
Zoals u in de bovenstaande voorbeelden al hebt gezien, kunt u met de klassen SyncInfo en IResourceVariantComparator de synchronisatiestatus van resources opvragen. Nu wordt uitgelegd hoe de status kan worden beheerd. Door middel van een subscriber hebt u toegang tot de synchronisatiestatus tussen de resources in het lokale werkgebied en een reeks resourcevarianten met behulp van een twee- of drierichtingsvergelijking, afhankelijk van het type subscriber. Een subscriber biedt de volgende mogelijkheden:
De API's definiëren niet hoe subscribers worden gemaakt, omdat deze taak aan de specifieke implementaties wordt overgelaten. De CVS-plugin maakt bijvoorbeeld verschillende subscribers voor samenvoegingen, vergelijkingen en synchronisaties.
Hieronder volgt nogmaals het eerste voorbeeld van SyncInfo, waarin u ziet hoe u SyncInfo kunt benaderen met een subscriber.
// Een bestandssysteem-subscriber maken en aangeven dat deze de synchronisatie
// met de opgegeven locatie in het bestandssysteem moet uitvoeren.
Subscriber subscriber = new FileSystemSubscriber("c:\temp\repo");
// Subscriber de status laten vernieuwen.
subscriber.refresh(subscriber.roots(), IResource.DEPTH_INFINITE, monitor);
// Alle synchronisatiestatussen ophalen en afdrukken.
IResource[] children = subscriber.roots();
for(int i=0; i < children.length; i++) {
printSyncState(children[i]);
}
...
void printSyncState(Subscriber subscriber, IResource resource) {
System.out.println(subscriber.getSyncInfo(resource).toString());
IResource[] children = subscriber.members(resource);
for(int i=0; i < children.length; i++) {
IResource child = children[i];
if(! child.exists()) {
System.out.println(resource.getFullPath() + " bestaat niet in het werkgebied.");
}
printSyncState(subscriber, children[i]);
}
}
Het is belangrijk te onthouden dat de subscriber resources kan opsporen die niet in het werkgebied bestaan. U kunt niet-bestaande resources ophalen met Subscriber#members() en SyncInfo#getLocal().
Nu kunt u lezen hoe de status wordt afgebeeld op het scherm. Het gebruikersinterface-onderdeel ISynchronizeParticipant zorgt ervoor dat de synchronisatiestatus wordt afgebeeld en geeft de gebruiker de mogelijkheid deze te beïnvloeden. De view Synchroniseren bevat de synchronisatiedeelnemers, maar deze kunnen ook in dialoogvensters en wizards worden bekeken. Deelnemers zijn zeer generieke onderdelen, zodat alle synchronisatiestatustypen, ook de typen die niet op SyncInfo en subscribers zijn gebaseerd, kunnen worden afgebeeld.
U kunt een wizard voor het instellen van een synchronisatie toevoegen met het extensiepunt org.eclipse.team.ui.synchronizeWizards. De wizard wordt gekoppeld aan de globale synchronisatie-actie en toegevoegd in de view Synchroniseren, zodat synchronisaties eenvoudig kunnen worden gemaakt.
Als u een subscriber hebt geïmplementeerd, kunt u van de concrete deelnemer SubscriberParticipant profiteren, waarmee de volgende functionaliteit wordt geboden:
Deze concepten kunnen het best worden uitgelegd aan de hand van een eenvoudig voorbeeld. Bekijk het voorbeeld van de lokale historie als u de precieze werking wilt weten. U kunt ook Informatie voor gevorderden raadplegen voor verdere informatie over de meer geavanceerde API's.