Nozioni fondamentali

Se si prevede di fornire un supporto di sincronizzazione e non si dispone di un meccanismo esistente per la gestione dello stato di sincronizzazione, questa sezione illustra come implementare un sottoscrittore da zero. Ciò significa che non esiste alcuna infrastruttura di sincronizzazione e questa sezione spiega come utilizzare alcune API fornite per gestire lo stato di sincronizzazione.

Per la parte restante di questa sezione, viene utilizzato un esempio concreto. Il codice di origine può essere individuato nel pacchetto del fornitore del file system del plugin org.eclipse.team.examples.filesystem. È necessario estrarre il progetto dal repository CVS e utilizzarlo come riferimento durante la lettura di questa esercitazione.

Implementazione di un sottoscrittore da zero

In questo primo esempio, si presuppone che non esista alcuna infrastruttura per la gestione dello stato di sincronizzazione dello spazio di lavoro locale. Quando si implementa un sottoscrittore da zero, è possibile utilizzare alcune API supplementari fornite nel plugin org.eclipse.team.core. Il pacchetto org.eclipse.team.core.variants contiene due sottoclassi di Sottoscrittore che possono essere utilizzate per semplificare l'implementazione. La prima classe è ResourceVariantTreeSubscriber che verrà esaminata nel secondo esempio in basso. La seconda è una sottoclasse della prima: ThreeWaySubscriber. L'implementazione di questo sottoscrittore fornisce varie classi utili per la gestione dello stato di sincronizzazione di uno spazio di lavoro locale. Se non si dispone di alcuna infrastruttura, è opportuno iniziare da questo punto.

L'implementazione di un sottoscrittore de zero verrà illustrata utilizzando l'esempio di file system disponibile nel plugin org.eclipse.team.examples.filesystem. Il codice presente nella seguente descrizione viene mantenuto al minimo, dal momento che è disponibile sul repository CVS di Eclipse. Nonostante non sia tecnicamente un sottoscrittore a tre vie, l'esempio di file system può ancora utilizzare al meglio questa infrastruttura. Anche i plugin FTP e WebDAV vengono generati utilizzando questa infrastruttura.

ThreeWaySubscriber

Per l'esempio di file system, si dispone già di un'implementazione di RepositoryProvider associata a un progetto locale, con un percorso di un file system in cui viene eseguito il mirroring del contenuto locale. FileSystemSubscriber è stato creato come sottoclasse di ThreeWaySubscriber per utilizzare ThreeWaySynchronizer per la gestione dello stato di sincronizzazione dello spazio di lavoro. Le sottoclassi di questa classe devono effettuare le seguenti attività:

Oltre all'implementazione del sottoscrittore, le operazioni get e put relative al fornitore del file system sono state modificate per aggiornare lo stato di sincronizzazione in ThreeWaySynchronizer. Le operazioni vengono implementate nella classe org.eclipse.team.examples.filesystem.FileSystemOperations.

ThreeWaySynchronizer

ThreeWaySynchronizer gestisce lo stato di sincronizzazione tra lo spazio di lavoro locale e il percorso remoto. Memorizza nella cache e conserva la data/ora locale, di base e remota per supportare il calcolo efficace dello stato di sincronizzazione di una risorsa. Attiva inoltre le notifiche delle modifiche per tutti i listener registrati. ThreeWaySubscriber converte questi eventi di modifica nel formato corretto da inviare ai listener registrati con il sottoscrittore.

ThreeWaySynchronizer utilizza le regole e i blocchi di pianificazione di base per garantire la sicurezza del thread e fornire il batch di notifica delle modifiche.

ThreeWayRemoteTree

ThreeWayRemoteTree è una sottoclasse di ResourceVariantTree concepita in base a ThreeWaySubscriber. Deve essere sostituita dai client, per fornire il meccanismo di recupero dello stato remoto dal server. ResourceVariantTree viene esaminato nei dettagli nell'esempio successivo.

CachedResourceVariant

CachedResourceVariant rappresenta un'implementazione parziale di IResourceVariant che memorizza nella cache il contenuto recuperato per un determinato periodo di tempo (attualmente 1 ora). Questa variante è utile perché è possibile accedere al contenuto varie volte in un breve periodo di tempo (ad esempio, per stabilire lo stato di sincronizzazione e visualizzare il contenuto in un editor di confronto). Le sottoclassi devono fornire l'identificativo di contenuto univoco e la matrice di byte, che può essere conservata per ricreare l'handle delle varianti delle risorse.

Generazione al di sopra della sincronizzazione dello spazio di lavoro esistente

Molti fornitori di repository possono già disporre di un meccanismo per la gestione dello stato di sincronizzazione (ad esempio, se dispongono di plugin esistenti). ResourceVariantTreeSubscriber e le classi correlate consentono di generare al di sopra di un'infrastruttura di sincronizzazione esistente. Ad esempio, questa è la superclasse di tutti i sottoscrittori CVS.

ResourceVariantTreeSubscriber

Come menzionato nell'esempio precedente, ThreeWaySubscriber è una sottoclasse di ResourceVariantTreeSubscriber che fornisce la sincronizzazione dello spazio di lavoro locale utilizzando ThreeWaySynchronizer. Le sottoclassi di ResourceVariantTreeSubscriber devono fornire:

Le altre attività del sottoscrittore sono implementate mediante queste funzioni.

ResourceVariantTree

ResourceVariantTree è un'implementazione concreta di IResourceVariantTree che fornisce i seguenti elementi:

Le seguenti attività devono essere implementate dalle sottoclassi:

Vengono fornite le implementazioni concrete di ResourceVariantByteStore che conservano i byte nelle chiamate del workbench (PersistantResourceVariantByteStore) o memorizzano nella cache i byte solo per la sessione corrente(SessionResourceVariantByteStore). Tuttavia, la generazione di un sottoscrittore al di sopra di un'infrastruttura di sincronizzazione dello spazio di lavoro corrente richiede in genere l'implementazione delle sottoclassi ResourceVariantByteStore che rappresentano un'interfaccia con il sincronizzatore sottostante. Ad esempio, ThreeWayRemoteTree utilizza l'implementazione di una memorizzazione in byte che memorizza i byte remoti in ThreeWaySynchronizer.

La creazione di handle delle risorse variabili per questo esempio non differisce dall'esempio precedente, eccetto che per il fatto che gli handle sono richiesti da un'istanza della struttura ad albero delle varianti delle risorse anziché del sottoscrittore.