En udbyder af opbevaringssteder (RepositoryProvider) er den centrale klasse i implementeringen af et opbevaringssted. Denne klasse er ansvarlig for konfigurering af et projekt til administration af opbevaringssteder og for levering af de nødvendige hooks til ressourceændringer. Udbydere tilknyttes vha. mapping til et projekt via vedvarende projektegenskaber. Mekanismen til tilknytning af udbydere vha. mapping til et projekt er ikke central for team-API'et, men du skal være opmærksom på den, når du bortfiltrerer ressourcer i brugergrænsefladen. I de fleste tilfælde bruger du team-API'et til at arbejde med projekter og tilknytte dem til din udbyder.
Når du vil implementere en udbyder, skal du definere et opbevaringssted vha. org.eclipse.team.core.repository og levere en klasse, afledt fra RepositoryProvider. Vi bruger CVS-klienten til at vise et eksempel på, hvordan dette fungerer.
Udvidelsespunktet org.eclipse.team.core.repository bruges til at tilføje en definition af et opbevaringssted. Her er koden til 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>
Denne kode registrerer din teamudbyder i plugin'en til understøttelse af team og tildeler en id, der skal bruges, når udbyderen knyttes til et projekt. Den angivne klasse for opbevaringsstedet skal udvide RepositoryProvider.
Den klasse, der identificeres i udvidelsen, skal være en underklasse til RepositoryProvider. Dens primære ansvarsområde er at konfigurere og afkonfigurere et projekt til opbevaringsstedsunderstøttelse og at levere de nødvendige ressourceændrings-hooks. CVS-klienten er et godt eksempel. Dens udbyder af opbevaringssteder er CVSTeamProvider.
public class CVSTeamProvider extends RepositoryProvider {
...
RepositoryProvider definerer to abstract-metoder, configureProject og deconfigure. Alle udbydere skal implementere disse metoder.
Et projekt konfigureres, når det første gang knyttes til en bestemt udbyder af opbevaringssteder. Dette sker typisk, når brugeren vælger et projekt og bruger teamguiderne til at knytte et projekt til dit opbevaringssted. Uanset hvordan funktionen udløses, er dette det rigtige tidspunkt at beregne eller cache de data om projektet, som du vil give opbevaringsstedsfunktionen. Vi antager, at projektet allerede er tilknyttet vha. mapping til din udbyder. Dette foretages i konfigurationsguiden.
CVS-udbyderen rundsender ganske enkelt en oplysning om, at et projekt er konfigureret:
public void configureProject() throws CoreException {
CVSProviderPlugin.broadcastProjectConfigured(getProject());
}
Vi vil ikke følge implementeringen af plugin-rundsendelsesmekanismen. Det er tilstrækkeligt at sige, at alle, der vil beregne eller initialisere projektspecifikke data, kan gøre det på dette tidspunkt.
Et projekt afkonfigureres, når brugeren ikke længere vil knytte en teamudbyder til et projekt. Det er op til plugin'en at implementere den brugerfunktion, der får dette til at ske (og frakobling af projektet fra teamudbyderen finder sted her). Metoden deconfigure er det relevante tidspunkt at slette projektrelaterede caches eller fjerne referencer til projektet i brugergrænsefladen. CVS-udbyderen sletter projektrelaterede caches, der er opbevaret i dens oversigter, og rundsender en oplysning om, at projektet er afkonfigureret.
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());
}
}
Typisk implementerer første skridt i bygning af et team-UI en guideside, der giver brugerne mulighed for at konfigurere et projekt til plugin'ens teamunderstøttelse. Det er her, at teamudbyderens id bliver tilføjet til projektets egenskaber. Du deltager i projektkonfigurationen ved at tilføre oplysninger til udvidelsespunktet org.eclipse.team.ui.configurationWizards. Denne guide vises, når brugeren vælger Team->Del projekt...
Vi ser på dette i CVS-klient-implementeringen. Her er CVS UI-koden til konfigurationsguiden:
<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 sædvanlig leverer plugins en klasse, der implementerer udvidelsen, og en entydig id, der identificerer deres udvidelse. Navn og ikon vises på første side af projektkonfigurationsguiden, hvis der er flere udbydere at vælge mellem.
Når brugeren har valgt en udbyder, viser næste side de specifikke konfigurationsoplysninger for udbyderen. Hvis udbyderen er den eneste installerede plugin, fortsætter guiden direkte til din side. Guiden skal implementere IConfigurationWizard, som initialiserer guiden til en specificeret arbejdsbænk og et specificeret projekt. Resten af implementeringen afhænger af guidens udformning. Du skal opsamle de nødvendige oplysninger til at tilknytte projektet til din teamunderstøttelse.
Når guiden er udført, skal du tilknytte din teamudbyder vha. mapping til projektet vha. RepositoryProvider.map(IProject, String). Herved bliver den korrekte vedvarende projektegenskab tildelt til dit projekt.
CVS-klienten udfører dette arbejde i udbyderens setSharing-metode, som kaldes, når guiden er færdig:
public void setSharing(IProject project, FolderSyncInfo info, IProgressMonitor monitor) throws TeamException {
// Sørg for, at leverede oplysninger matcher projektets
...
// Sørg for, at leveret placering administreres
...
// Registrér projektet Team
RepositoryProvider.map(project, CVSProviderPlugin.getTypeId());
}
Statiske metoder i RepositoryProvider gør det nemt for klienter at tilknytte projekter til udbydere vha. mapping og at finde de udbydere, der er knyttet til et bestemt projekt.
Hvis et produkt vælger at tilføje en opbevaringsstedsplugin til en mulighed, skal den binde muligheden til opbevaringssteds-id'en. Her er to trin, du kan følge for at aktivere en RepositoryProvider som en mulighed:
<activityPatternBinding
activityId="org.eclipse.team.cvs"
pattern="org\.eclipse\.team\.cvs\.core/.*cvsnature">
</activityPatternBinding>
<activityPatternBinding
activityId="org.eclipse.team.cvs"
pattern="org\.eclipse\.team\.cvs\.ui/.*">
</activityPatternBinding>
Teamplugins definerer to mulighedsudløserpunkter. Det første er guiden Team > Del projekt..., som giver mulighed for at filtrere udbydere af opbevaringssteder, baseret på arbejdsbænksmulighedernes aktiveret/deaktiveret-tilstand, og den anden er teamplugin'ens automatiske aktiveringsudløser.
Det mest interessante ved en udbyder af opbevaringssteder opstår, når brugeren arbejder med ressourcer i projektet, der er konfigureret til udbyderen. For at være opmærksom på de ændringer, brugeren foretager af en ressource, kan udbyderen implementere ressourceændrings-hooks. Ressourceplugin'en leverer disse hooks som udvidelsespunkter. Dokumentationen til IMoveDeleteHook, IFileModificationValidator og ResourceRuleFactory beskriver i detaljer, hvordan du implementerer disse hooks.
Teamplugin'en optimerer og forenkler tilknytningen af hook'en med de relevante ressourcer ved at registrere generiske hooks med ressourceplugin'en. Disse generiske hooks søger ganske enkelt i udbyderen af opbevaringssteder efter en bestemt ressource og henter den tilhørende hook. Dette har den fordel, at det kun er én hook, der kaldes, i stedet for at alle udbyderimplementeringer registrerer en hook, der først skal kontrollere, om ressourcen administreres af udbyderen.
For din plugin betyder det, at du leverer nødvendige hooks ved at tilsidesætte metoder i RepositoryProvider. Standardimplementeringen af disse metoder giver svaret NULL, hvilket angiver, at en hook ikke er nødvendig (undtagen for ressourceregelfabrikken, som beskrevet nedenfor):