Fornitore di repository

Un fornitore di repository (RepositoryProvider) rappresenta la classe centrale nell'implementazione del repository. Tale classe è responsabile della configurazione di un progetto per la gestione del repository e della fornitura degli hook necessari per la modifica delle risorse. I fornitori vengono associati a un progetto utilizzando le proprietà persistenti del progetto. Il meccanismo di associazione dei fornitori a un progetto non è fondamentale per l'API di team, ma sarà necessario conoscerlo durante le operazioni di filtraggio delle risorse nell'interfaccia utente. Nella maggior parte dei casi, verrà impiegata l'API di team per lavorare con i progetti e associarli al fornitore.  

Per implementare un fornitore, è necessario definire un repository utilizzando org.eclipse.team.core.repository e fornire una classe derivata da RepositoryProvider. Per mostrare tale funzionamento, verrà utilizzato il client CVS come esempio.

Punto di estensione

Per aggiungere una definizione di repository viene utilizzato il punto di estensione org.eclipse.team.core.repository. Di seguito è illustrato il tag per il client CVS.

<extension
point="org.eclipse.team.core.repository">
<repository
class="org.eclipse.team.internal.ccvs.core.CVSTeamProvider"
id="org.eclipse.team.cvs.core.cvsprovider">
</repository>
</extension>

Questo codice consente di registrare il fornitore di team nel plugin di supporto del team e assegnare un ID da utilizzare quando si associa il fornitore a un progetto. La classe specificata per il repository deve estendere RepositoryProvider.

Implementazione di un RepositoryProvider

La classe identificata nell'estensione deve essere una sottoclasse di RepositoryProvider. I compiti principali di tale classe consistono nel configurare e deconfigurare un progetto per il supporto del repository e nel fornire tutti gli hook necessari per la modifica delle risorse. Il client CVS fornisce un buon esempio. Il relativo fornitore di repository è CVSTeamProvider.

public class CVSTeamProvider extends RepositoryProvider {
...

RepositoryProvider definisce due metodi astratti, configureProject e deconfigure. Tutti i fornitori devono implementare tali metodi. 

Un progetto viene configurato quando viene prima associato a un particolare fornitore di repository. Ciò generalmente avviene quando l'utente seleziona un progetto e utilizza le procedure guidate dei team per associare un progetto al repository. Indipendentemente dal modo in cui viene attivata l'operazione, questo è il momento più appropriato per calcolare o memorizzare nella cache i dati relativi al progetto necessari per fornire la funzione del repository. (Si supponga che sia stata già eseguita l'associazione del progetto al fornitore. Di questo ci si occuperà nella configurazione guidata.)

Il fornitore CVS si limita a trasmettere l'avvenuta configurazione del progetto:

public void configureProject() throws CoreException {
CVSProviderPlugin.broadcastProjectConfigured(getProject());
}

L'implementazione del meccanismo di trasmissione del plugin non verrà descritta. Sarà sufficiente dire che tutte le parti che devono calcolare o inizializzare dati specifici del progetto possono eseguire tali operazioni in questa fase.

Un progetto viene deconfigurato quando l'utente non desidera più associare un fornitore di team a un progetto.  Sarà compito del plugin implementare l'operazione dell'utente che consente tale operazione (in tal modo verrà annullata l'associazione del progetto al fornitore di team). Il metodo deconfigure  consente di svuotare le cache correlate al progetto o rimuovere i riferimenti al progetto nell'interfaccia utente. Il fornitore CVS elimina le cache correlate al progetto conservate nelle viste e comunica l'avvenuta deconfigurazione del progetto.

public void deconfigure() throws CoreException {
...
try {
EclipseSynchronizer.getInstance().flush(getProject(), true, true /*flush deep*/, null);
} catch(CVSException e) {
throw new CoreException(e.getStatus());
} finally {
CVSProviderPlugin.broadcastProjectDeconfigured(getProject());
}
}

Configurazione di un progetto

In genere, la prima fase nella creazione di un'interfaccia utente di team consiste nell'implementare una pagina della procedura guidata che consenta agli utenti di configurare un progetto per il supporto di team del plugin.  È questa la fase in cui l'ID del fornitore di team verrà aggiunto alle proprietà del progetto.  Per partecipare alla configurazione del progetto, è necessario effettuare aggiunte nel punto di estensione org.eclipse.team.ui.configurationWizards.  Questa procedura guidata viene visualizzata quando l'utente sceglie Team->Condividi progetto...

Si esaminerà più in dettaglio la procedura in questione nel contesto dell'implementazione del client CVS.  Di seguito è riportato il tag dell'interfaccia utente CVS per la configurazione guidata:

<extension
point="org.eclipse.team.ui.configurationWizards">
<wizard
name="%SharingWizard.name"
icon="icons/full/wizards/newconnect_wiz.png"
class="org.eclipse.team.internal.ccvs.ui.wizards.SharingWizard"
id="org.eclipse.team.ccvs.ui.SharingWizard">
</wizard>
</extension>

Come di consueto, i plugin forniscono una classe che implementa l'estensione e un ID univoco per identificare l'estensione.  Il nome e l'icona vengono visualizzati nella prima pagina della configurazione guidata del progetto se sono disponibili più fornitori tra cui scegliere.

Una volta selezionato il fornitore desiderato, nella pagina successiva vengono visualizzate le informazioni di configurazione specifiche relative a tale fornitore.  (Se il fornitore in questione è l'unico plugin di fornitore di team installato, la procedura guidata passa direttamente alla relativa pagina).  La procedura guidata deve implementare IConfigurationWizard, che inizializza la procedura per il workbench e il progetto specificati.  Il resto dell'implementazione dipende dalla struttura della procedura guidata. È necessario raccogliere tutte le informazioni necessarie per associare il progetto al supporto di team.

Una volta completata la procedura guidata, occorre associare il fornitore di team al progetto mediante RepositoryProvider.map(IProject, String).  L'associazione gestisce l'assegnazione al progetto delle proprietà persistenti corrette.

Il client CVS esegue queste operazioni nell'ambito del metodo di fornitore setSharing, che viene richiamato al completamento della procedura guidata:

public void setSharing(IProject project, FolderSyncInfo info, IProgressMonitor monitor) throws TeamException {

// Accertarsi che le informazioni fornite corrispondano a quelle relative al progetto
...
// Accertarsi che sia gestito il percorso fornito
...
// Registrare il progetto con il Team
RepositoryProvider.map(project, CVSProviderPlugin.getTypeId());
}

Individuazione di un fornitore

I metodi statici di RepositoryProvider consentono ai client di eseguire più agevolmente l'associazione dei progetti ai fornitori e di individuare con maggiore facilità i fornitori associati a un dato progetto.

Fornitori di repository e funzionalità

Se in un prodotto si sceglie di aggiungere un plugin Repository ad una funzionalità, è necessario collegare la funzionalità all'id del repository. Di seguito è riportata la procedura per abilitare un RepositoryProvider come una funzionalità:

  1. Collegare la funzionalità all'id del fornitore di repository. Ciò consente al plugin Team di attivare/disabilitare elementi in base agli id del fornitore di repository.
    <activityPatternBinding
        activityId="org.eclipse.team.cvs"
        pattern="org\.eclipse\.team\.cvs\.core/.*cvsnature">
    </activityPatternBinding>
  2. Quindi, collegare la funzionalità a tutti i pacchetti UI relativi al fornitore:
    <activityPatternBinding
         activityId="org.eclipse.team.cvs"
         pattern="org\.eclipse\.team\.cvs\.ui/.*">
    </activityPatternBinding>

Esistono due punti di attivazione della funzionalità definiti dai plugin Team. Il primo è la procedura guidata Team > Condividi Progetto... che consente il filtraggio dei fornitori di repository in base allo stato abilitato/disabilitato delle funzionalità del workbench e l'altro è il trigger di abilitazione automatica del plugin Team.

Hook di modifica delle risorse

La maggior parte delle funzioni interessanti associate a un fornitore di repository viene eseguita quando l'utente utilizza le risorse del progetto configurate per il fornitore. Per poter monitorare le modifiche apportate dall'utente a una risorsa, il fornitore può implementare gli hook di modifica delle risorse. Il plugin delle risorse fornisce tali hook come punti di estensione.  La documentazione relativa a IMoveDeleteHook, IFileModificationValidator e ResourceRuleFactory descrive i dettagli per l'implementazione di questi hook.

Il plugin di team ottimizza e semplifica l'associazione dell'hook alle risorse appropriate registrando gli hook generici nel plugin delle risorse. Tali hook si limitano a cercare una determinata risorsa nel fornitore di repository in modo da ottenerne l'hook. Ciò offre il vantaggio di dover richiamare un solo hook di fornitore anziché registrare per ogni implementazione di fornitore un hook che deve prima verificare se la risorsa è gestita dal fornitore.

Per il plugin ciò significa che occorre fornire tutti gli hook necessari sostituendo i metodi in RepositoryProvider. L'implementazione predefinita di questi metodi restituisce null, indicando in tale modo che non è necessario alcun hook (eccetto che per il factory di regole delle risorse, come descritto in basso).