Hvis du har planer om at levere understøttelse af synkronisering, og du ikke har en eksisterende mekanisme til styring af synkroniseringstilstand, kan du i dette afsnit læse, hvordan du implementerer en abonnent fra grunden. Det betyder, at der ikke er nogen eksisterende synkroniseringsinfrastruktur, og
illustrerer, hvordan du bruger et API, der skal vedligeholde synkroniseringstilstanden.
I resten af denne gennemgang bruger vi et aktivt eksempel. Kildekoden findes i pakken med filsystemudbyderen til plugin'en org.eclipse.team.examples.filesystem. Du kan tjekke projektet ud fra CVS-opbevaringsstedet og bruge det som reference, mens du læser denne øvelse.
I det første eksempel antages det, at der ikke er nogen eksisterende infrastruktur til vedligeholdelse af synkroniseringstilstanden for det lokale arbejdsområde. Når du implementerer en abonnent fra bunden, kan du udnytte et supplerende API, som findes i plugin'en org.eclipse.team.core. Pakken org.eclipse.team.core.variants indeholder to underklasser af Subscriber, som kan bruges til at gøre implementeringen nemmere. Den første er ResourceVariantTreeSubscriber, som beskrives i det andet eksempel nedenfor. Den anden er en underklasse af den første: ThreeWaySubscriber. Denne abonnentimplementering indeholder flere nyttige klasser til styring af synkroniseringstilstanden for et lokalt arbejdsområde. Hvis du ikke har en eksisterende infrastruktur, er dette et godt sted at starte.
Implementering af en abonnent fra bunden illustreres vha. eksemplet på et filsystem, som findes i plugin'en org.eclipse.team.examples.filesystem. Koden i følgende beskrivelse holdes på et minimum, da den er tilgængelig på Eclipse CVS-opbevaringsstedet. Selvom filsystemeksemplet teknisk set ikke er en trevejsabonnent, kan det stadig udnytte denne infrastruktur. De to plugins, FTP og WebDAV, er også bygget vha. denne infrastruktur.
Til filsystemeksemplet havde vi allerede en implementering af en RepositoryProvider, der knyttede et lokalt projekt sammen med en placering i filsystemet, hvor det lokale indhold blev spejlet. FileSystemSubscriber blev oprettet som en underklasse af ThreeWaySubscriber for at udnytte en ThreeWaySynchronizer til at styre arbejdsområdets synkroniseringstilstand. Underklasser af denne klasse skal udføre følgende:
Ud over abonnentimplementeringen er hent-og-placér-funktionerne for filsystemudbyderen ændret, så de opdaterer synkroniseringstilstanden i ThreeWaySynchronizer. Funktionerne er implementeret i klassen org.eclipse.team.examples.filesystem.FileSystemOperations.
ThreeWaySynchronizer styrer synkroniseringstilstanden mellem det lokale arbejdsområde og en ekstern placering. Klassen cacher og opbevarer lokale, basis- og eksterne tidsstempler for at sikre effektiv beregning af en ressources synkroniseringstilstand. Den udløser også ændringsbeskeder til registrerede lyttere. ThreeWaySubscriber oversætter disse ændringsaktiviteter til det korrekte format, der skal sendes til lyttere, der er registreret i abonnenten.
ThreeWaySynchronizer udnytter brugen af Core-planlægningsregler og -låse for at sikre programdelssikkerhed og give mulighed for ændringsbeskeder i baggrunden.
En ThreeWayRemoteTree er en underklasse af ResourceVariantTree, der er skræddersyet til ThreeWaySubscriber. Den skal tilsidesættes af klienter for at levere mekanismen til indhentning af den eksterne tilstand fra serveren. ResourceVariantTree beskrives mere detaljeret i næste eksempel.
En CachedResourceVariant er en delvis implementering af IResourceVariant, der cacher indhentet indhold i en periode (i øjeblikket 1 time). Dette er nyttigt, da det er muligt at få adgang til indholdet flere gange inden for en kort periode (f.eks. for at afgøre synkroniseringstilstanden og vise indholdet i en sammenligningseditor). Underklasser skal stadig levere den entydige indholds-id sammen med byte-arrayet, der kan opbevares med henblik på genskabelse af ressourcevariantbehandleren.
Mange udbydere af opbevaringssteder kan også have en mekanisme til styring af deres synkroniseringstilstand, f.eks. hvis de har eksisterende plugins. ResourceVariantTreeSubscriber og dens relaterede klasser giver mulighed for at bygge oven på en eksisterende synkroniseringsinfrastruktur. Dette er f.eks. superklassen for alle CVS-abonnenter.
Som nævnt i forrige eksempel er ThreeWaySubscriber en underklasse af ResourceVariantTreeSubscriber, der leverer lokal arbejdsområdesynkronisering vha. en ThreeWaySynchronizer. Underklasser af ResourceVariantTreeSubscriber skal levere:
Underklasser af ResourceVariantTree (eller AbstractResourceVariantTree), der leverer funktionalitet til gennemløb og opfriskning af de eksterne ressourcevarianter og, for abonnenter, der understøtter trevejssammenligninger, basis for ressourcevarianter.
Abonnentens andre muligheder implementeres vha. disse faciliteter.
ResourceVariantTree er en konkret implementering af IResourceVariantTree, der leverer følgende:
Følgende skal implementeres af underklasser:
Der leveres konkrete implementeringer af ResourceVariantByteStore, som opbevarer byte på tværs af arbejdsbænksstarter (PersistantResourceVariantByteStore), eller som kun cacher byte til den aktuelle session (SessionResourceVariantByteStore). Men hvis du bygger en abonnent oven på en eksisterende synkroniseringsinfrastruktur for et arbejdsområde, vil det typisk kræve, at du implementerer ResourceVariantByteStore-underklasser, der har en grænseflade til den underliggende synkroniseringsfunktion. F.eks. udnytter ThreeWayRemoteTree en implementering til lagring af byte, hvor de eksterne byte gemmes i ThreeWaySynchronizer.
Oprettelsen af ressourcevariantbehandlere til dette eksempel adskiller sig ikke fra forrige eksempel, bortset fra at det er ressourcevariantens træstrukturforekomst, der anmoder om dem, og ikke abonnenten.