Az Eclipse 3.0 verzióban új, hogy a munkaterület-erőforrások és más helyen lévő erőforrások közötti szinkronizációs állapot kezelésére és megjelenítésére szolgáló alkalmazás programozási felületeket tartalmaz. A munkaterületen kívüli erőforrásra változóként hivatkozunk. A szinkronizál a különböző helyeken lévő erőforrások módosításának megjelenítése, és esetlegesen annak engedélyezése, hogy a felhasználó hatással legyen a szinkronizációs állapotra egy művelet végrehajtásával. A szinkronizálási alkalmazás programozási felületek ortogonálisak a RepositoryProvider alkalmazás programozási felületekhez, és használhatók lerakatszolgáltató nélkül. Az szinkronizációz API célja az erőforrások szinkronizációs állapotának különböző megjelenítési módjának egyszerűsítése. Az alkalmazás programozási felületnek egy eszközre van szüksége az erőforrások szinkronizációs állapotának lekérdezéséhez, de az állapot befolyásolásához nincs. Az állapot befolyásolásáért a megvalósító felelős (az UI csatlakozópontokat biztosít a szolgáltató-specifikus menüpontok menühöz adásához).
A szinkronizálási API leírása előtt hasznos megjeleníteni néhány terminológiát és alapelvet, amely a munkaterület-szinkronizálás leírásakor kerül alkalmazásra.
Erőforrás-változó: Egy más helyen lévő erőforrásra leképezett helyi erőforrásra az erőforrás változójaként lehet hivatkozni. Azaz az erőforrások általában nagyon hasonlóak, de némileg különbözhetnek (a helyi erőforrás módosításai miatt, vagy a távoli másolat más felhasználók által végzett változtatásai miatt). Vesszük ennek helyi munkaterület központú nézetét, a helyi másolatra erőforrásként, a távoli másolatra pedig erőforrás-változókként hivatkozva.
Szinkronizálás: A szinkronizálásra az erőforrás-változók közötti különbségek megjelenítési tevékenységeként hivatkozunk a felhasználó számára. A szinkronizálás nincs hatássa a változók állapotára, de ehelyett biztosít egy nézetet annak elősegítségéhez, hogy a felhasználók megértésék a különböző változóhalmazok közötti különbségeket. Általános annak engedélyezése, hogy a felhasználók a szinkronizálás során befolyásolhassák a változók állapotát (például a beiktatás vagy visszaállítás engedélyezése).
Kétlépéses - háromlépéses szinkronizálás: A szinkronizálási állapot-meghatározásnak két alaptípusa van: két- és háromlépéses. A kétlépéses összehasonlítás csak a helyi erőforrásra és erőforrás-változóra vonatkozik, amelyre távoli erőforrás-változóként hivatkozunk. Ezen típusú összehasonlítás csak a két erőforrás közötti különbséget jeleníti meg, de nem ad tippeket arra vonatkozóan, hogy a változástatások milyen kapcsolatban vannak. A legtöbb kódlerakat-rendszer támogatja a háromlépéses összehasonlítást a szinkronizálási állapotmeghatározáshoz. Ez a fajta összehasonlítás vonatkozik a helyi erőforrásra, a távoli erőforrás-változóra és az alap erőforrás-változóra. Az alap erőforrás-változó egy közös őst ábrázol a helyi és távoli erőforrásokhoz. Ez kifinomultabb szinkronizálási állapotokat tesz lehetővé, amelyek jelzik a változás irányát.
1. táblázat: A szinkronizálási állapotok
Kétlépéses Háromlépéses Módosított
Törölt
HozzáadottKimenő módosítás
Bejövő módosítás
Kimenő törlés
Bejövő törlés
Kimenő hozzáadás
Bejövő hozzáadás
Ütköző módosítás
Ütköző törlés
Ütköző hozzáadás
Az org.eclipse.team.core.synchronize osztályai a szinkronizálási állapotot írják le. A legfontosabb osztály a SyncInfo, mivel valójában ez adja meg a szinkronizációs állapotot. Ez az alábbi módon használható:
SyncInfo info = getSyncInfo(resource); // this is a simulated method of obtaining the sync info for a resource
int changekind = info.getKind();
if(info.getResourceComparator().isThreeWay()) {
if((changeKind &
SyncInfo.DIRECTION_MASK) == SyncInfo.INCOMING) {
// valamit végrehajt
}
} else if(changeKind == SyncInfo.CHANGE) {
// valami mást csinál
}
A SyncInfo osztály két- és hárlépéses összehasonlítási algoritmust egyaránt biztosít, az ügyfélnek kell biztosítania az erőforrásokat és az osztályt, amely össze tudja hasonlítani az erőforrásokat (IResourceVariantComparator). Az alábbiakban látható egy példa változó-összehasonlító:
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(); // a szinkronizációs információk kiszámítása
Ez a csomag a SyncInfo és szűrők tartalmazásához kialakított gyűjteményeket is tartalmazza, amelyek alkalmazhatók a SyncInfo példányokra.
Ahogy a fenti példában láthattuk, a SyncInfo és IResourceVariantComparator osztályok hozzáférést biztosítanak az erőforrások szinkronizációs állapotához. De azt eddig nem láttuk, hogy az állapotot hogyan kezeli a rendszer. A Subscriber hozzáférést biztosít a helyi munkaterület és ezen erőforrások erőforrás-változói közötti szinkronizálási állapot eléréséhez két- vagy háromlépéses összehasonlítás segítségével, az előfizető jellegétől függően. Az előfizető az alábbi képességeket biztosítja:
Az alkalmazás programozási felületek nem adják meg az Előfizető létrehozási módját, ez az adott megvalósításra marad. A CVS bedolgozó például az összefésülés végrehajtásakor létrehoz egy előfizetőt, egy másikat az összehasonlításhoz, és egyet a helyi munkaterület aktuális ággal szinkronizálásakor.
Tekintsük meg újra a SyncInfo használatának első példáját, és nézzük meg, hogy az előfizető segítségével hogy érhető el a SyncInfo.
// Fájlrendszer létrehozása és annak megadása,
// hogy az előfizető szinkronizálásra kerül a megadott fájlrendszer-hellyel
Subscriber subscriber = new FileSystemSubscriber("c:\temp\repo");
// Lehetővé teszi az előfizető állapotának frissítését
subscriber.refresh(subscriber.roots(), IResource.DEPTH_INFINITE, monitor);
// Összegyűjti a szinkronizálási állapotokat és kinyomtatja
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() + " doesn't exist in the workspace");
}
printSyncState(subscriber, children[i]);
}
}
Amit meg kell jegyezni, hogy az előfizető tudja, hogy mely erőforrások nem léteznek a munkaterületen, és a nem létező erőforrásokat a Subscriber#members() és SyncInfo#getLocal() adhatja vissza.
Több időt is szánhatnánk az szinkronizációs állapot kezelésének bemutatására, de ehelyett inkább tekintsük meg, hogy valójában hogyan kérhető le a felhasználó számára megjelenített állapot. Az ISynchronizeParticipant egy felhasználói felület összetevő, amely megjeleníti a szinkronizációs állapotot, és lehetővé teszi, hogy a felhasználók befolyásolják ezt. A Szinkronizációs nézet megjeleníti a szinkronizálás résztvevőit, de ezek a párbeszédablakokban és varázslókban is megjeleníthetők. Annak támogatásához, hogy a felhasználók megjeleníthessék a szinkronizálási állapot típusát, a SyncInfora és előfizetőkre nem épülőket is beleértve, a résztvevő egy nagyon általános összetevő.
Egy org.eclipse.team.ui.synchronizeWizards nevű kiterjesztési pont is rendelkezésre áll a szinkronizálás létrehozási varázsló hozzáadásához. Ez a varázslót a globális szinkronizálási műveletbe és a Szinkronizálás nézetbe helyezi, így a felhasználók egyszerűen létrehozhatják a saját típusú szinkronizálást.
Ha megvalósított egy előfizetőt, akkor kihasználhatja a SubscriberParticipant nevű konkrét résztvevő előnyeit, amely az alábbi funkciókat biztosítja:
Ezen fogalmak elmagyarázásának legjobb módja, ha megtekintjük az
egyszerű példa kontextusában használatát. Menjen a helyi előzmény
szinkronizálás példára annak megtekintéséhez, hogy ezek a részek
hogyan használhatók együtt. Vagy ha a speciálisabb alkalmazás programozási
felületek használatát kívánja megtekinteni, akkor menjen az Alapokon túl részre.