Datalagerleverandører

En datalagerleverandør (RepositoryProvider) er den sentrale klassen i implementeringen av datalageret. Klassen konfigurerer et prosjekt for datalagerstyring og oppgir de nødvendige bindingene for ressursendring. Leverandører tilordnes til et prosjekt ved hjelp av prosjektpermanente egenskaper. Mekanismen for tilordning av leverandører til et prosjekt er ikke sentral i gruppeprogrammeringsgrensesnittet, men du må kjenne til mekanismen når du filtrerer ut ressurser i brukergrensesnittet.  Det vanligste er at du bruker gruppeprogrammeringsgrensesnitt til å arbeide med prosjekter og knytte dem til leverandøren.  

Hvis du vil implementere en leverandør, må du definere et datalager ved hjelp av org.eclipse.team.core.repository og oppgi en klasse som er avledet fra  RepositoryProvider.  Vi skal bruke CVS-klienten som et eksempel for å se hvordan dette fungerer.

Utvidelsespunkt

Utvidelsespunktet org.eclipse.team.core.repository brukes for å legge til en datalagerdefinisjon.  Her er kodetypen for CVS-klienten.

<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>

Gruppeleverandøren registreres med plugin-modulen for gruppestøtte og tilordnes en ID som skal brukes når leverandøren er tilknyttet et prosjekt.  Den oppgitte klassen (class) for datalageret må utvide RepositoryProvider.

Implementere en RepositoryProvider

Klassen som er identifisert i utvidelsen må være en subklasse for RepositoryProvider. Klassen skal først og fremst konfigurere og dekonfigurere et prosjekt for datalagerstøtte og oppgi eventuelle nødvendige bindinger for ressursendring.  CVS-klienten er et godt eksempel på dette. Den har datalagerleverandøren CVSTeamProvider.

public class CVSTeamProvider extends RepositoryProvider {
...

RepositoryProvider definerer to abstrakte metoder, configureProject og deconfigure.  Alle leverandører må implementere disse metodene. 

Et prosjekt konfigureres når det først tilknyttes en bestemt datalagerleverandør.  Dette skjer vanligvis når brukeren velger et prosjekt og bruker gruppeveiviserne til å knytte et prosjekt til datalageret. Uavhengig av hvordan operasjonen utløses, er dette et gunstig tidspunkt for å behandle eller bufre data for prosjektet som du trenger for å oppgi datalagerfunksjonen. (Anta at prosjektet allerede er tilordnet leverandøren. Dette skjer i konfigurasjonsveiviseren.)

CVS-leverandøren kunngjør bare det faktum at prosjektet er konfigurert:

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

Vi skal ikke se på implementeringen av plugin-modulens kunngjøringsmekanisme. Vi nøyer oss med å si at alle som trenger å behandle eller initialisere prosjektspesifikke data, kan gjøre dette nå.

Et prosjekt dekonfigureres når brukeren ikke lenger vil knytte en gruppeleverandør til et prosjekt.   Det er plugin-modulens ansvar å implementere brukerhandlingen som får dette til å skje (og oppheve tilordningen av prosjektet fra gruppeleverandøren). Ved bruk av deconfigure-metoden  er det hensiktsmessig å slette prosjektrelaterte hurtigbufre eller fjerne eventuelle referanser til prosjektet i brukergrensesnittet. CVS-leverandøren tømmer prosjektrelaterte hurtigbufre som oppbevares i visningene og kunngjør at prosjektet er dekonfigurert.

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());
}
}

Konfigurere et prosjekt

Det første trinnet for bygging av et gruppegrensesnitt består i å implementere en veiviserside som gjør det mulig for brukere å konfigurere et prosjekt for plugin-modulens gruppestøtte. Her legges gruppeleverandørens ID til i prosjektegenskapene.  Du deltar i prosjektkonfigurasjonen ved å bidra via utvidelsespunktet org.eclipse.team.ui.configurationWizards.  Denne veiviseren vises når brukeren velger Gruppe->Del prosjekt...

Vi kommer tilbake til dette i forbindelse med implementeringen av CVS-klienten.  Her ser du kodetypen for CVS-brukergrensesnittet for konfigurasjonsveiviseren:

<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>

Som vanlig oppgir plugin-moduler en klasse (class) som implementerer utvidelsen og en unik ID som identifiserer utvidelsen. Hvis det er flere leverandører å velge i, vises navnet (name) og ikonet (icon) på den første siden i konfigurasjonsveiviseren for prosjektet.

Når brukeren har valgt en leverandør, viser neste side den spesifikke konfigurasjonsinformasjonen for leverandøren. (Hvis leverandøren er den eneste installerte plugin-modulen for gruppeleverandør, hopper veiviseren rett til siden din.) Veiviseren må implementere IConfigurationWizard, som initialiserer veiviseren for en bestemt arbeidsbenk og et bestemt prosjekt. Den øvrige implementeringen avhenger av hvordan veiviseren er utformet. Du må samle sammen all den informasjon som trengs for å knytte prosjektet til gruppestøtten.

Når veiviseren er ferdig, må du tilordne gruppeleverandøren til prosjektet ved hjelp av RepositoryProvider.map(IProject, String). Tilordning håndterer tildeling av riktig prosjektpermanent egenskap til prosjektet.

CVS-klienten gjør dette ved hjelp av setSharing-metoden, som kalles når veiviseren er ferdig:

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

// Ensure provided info matches that of the project
...
// Ensure that the provided location is managed
...
// Register the project with Team
RepositoryProvider.map(project, CVSProviderPlugin.getTypeId());
}

Finne en leverandør

Statiske metoder i RepositoryProvider gjør det enkelt for klienter å tilordne prosjekter til leverandører og finne leverandørene som er tilknyttet et bestemt prosjekt.

Datalagerleverandører og funksjoner

Hvis et produkt legger til en plugin-modul for datalager i en funksjon, skal funksjonen knyttes til datalager-IDen. Her følger to trinn som skal utføres for å aktivere en RepositoryProvider som en funksjon:

  1. Knytt funksjonen til IDen for datalagerleverandøren. Dette gjør det mulig for plugin-modulen for gruppe å utføre aktivering/deaktivering basert på datalagerleverandør-IDer.
    <activityPatternBinding
        activityId="org.eclipse.team.cvs"
        pattern="org\.eclipse\.team\.cvs\.core/.*cvsnature">
    </activityPatternBinding>
  2. Knytt deretter funksjonen til alle brukergrensesnittpakkene for leverandøren:
    <activityPatternBinding
         activityId="org.eclipse.team.cvs"
         pattern="org\.eclipse\.team\.cvs\.ui/.*">
    </activityPatternBinding>

Plugin-modulene for gruppe definerer to punkter som utløser funksjonaliteten. Den første er veiviseren under Gruppe > Del prosjekt.... Denne veiviseren tillater filtrering av datalagerleverandører basert på aktiverings-/deaktiveringstilstanden i arbeidsbenkfunksjonene, og den andre er utløsing av automatisk aktivering for plugin-modulen for gruppe.

Bindinger for ressursendringer

Brorparten av funksjonene som er tilknyttet datalagerleverandøren utføres når brukeren arbeider med ressurser i prosjektet som konfigureres for leverandøren.  Leverandøren kan implementere bindinger for ressursendringer for å oppdage endringene som en bruker utfører i en ressurs. Plugin-modulen for ressurser oppgir disse bindingene som utvidelsespunkter.  Dokumentasjonen for IMoveDeleteHook, IFileModificationValidator og ResourceRuleFactory gir en detaljert beskrivelse av implementeringen av disse bindingene.

Plugin-modulen for gruppe optimaliserer og forenkler forbindelsen mellom bindingen og de aktuelle ressursene ved å registrere generiske bindinger til ressursenes plugin-modul.  Disse generiske bindingene søker helt enkelt etter en bestemt ressurs i datalagerleverandøren og henter bindingen. Fordelen med dette er at bare en leverandørbinding kalles i stedet for at hver leverandørimplementering registrerer en binding, som først må kontrollere om ressursen håndteres av leverandøren.

For plugin-modulen betyr dette at du oppgir de nødvendige bindingene ved å overstyre metoder i RepositoryProvider.  Standardimplementeringen for disse metodene svarer null, noe som betyr det ikke er nødvendig med binding (bortsett fra ressursregel-factory, som beskrives nedenfor):