En lagerprovider (RepositoryProvider) är den centrala klassen i implementationen av lagret. Klassen ansvarar för konfigurering av ett projekt för lagerhantering och ger nödvändiga hook-funktioner för resursmodifiering. Providers avbildas till ett projekt med hjälp av projektets permanenta egenskaper Mekanismen för att avbilda providers till ett projekt är inte central för grupp-API:t men du behöver vara känna till den när du filtrerar resurser i användargränssnittet. Det vanligaste är att du använder grupp-API för att arbeta med projekt och associera dem till din provider.
Om du vill implementera en provider måste du definiera ett lager med hjälp av org.eclipse.team.core.repository och ange en klass som hämtats från RepositoryProvider. Vi använder CVS-klienten som ett exempel på hur detta fungerar.
Utökningspunkten org.eclipse.team.core.repository används för att lägga till en lagerdefinition. Här är märkningen för 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>
Din grupprovider registreras med insticksprogrammet för gruppsupport och tilldelar ett ID som ska användas när providern associeras till ett projekt. Angiven klass för lagret måste utöka RepositoryProvider.
Klassen som identifieras i utökningen måste vara en underordnad klass till RepositoryProvider. Dess primära ansvar är att konfigurera och avkonfigurera ett projekt för lagersupport och tillhandahålla eventuella nödvändiga hook-funktioner för resursmodifiering. CVS-klienten är ett bra exempel. Dess lagerprovider är CVSTeamProvider.
public class CVSTeamProvider extends RepositoryProvider {
...
RepositoryProvider definierar två abstrakta metoder, configureProject och deconfigure. Alla providers måste implementera dessa metoder.
Ett projekt konfigureras när det först associeras till en viss lagerprovider. Detta sker vanligen när användaren väljer ett projekt och använder gruppguiderna för att associera projektet till lagret. Oavsett hur åtgärden utlöses är detta rätt tillfälle att beräkna eller cachelagra eventuella data om projektet som du behöver för lagerfunktionen. (Anta att avbildning av projektet till providern redan har gjorts. Du tar hand om det i konfigurationsguiden.)
CVS-providern sänder bara ut det faktum att ett projekt har konfigurerats:
public void configureProject() throws CoreException {
CVSProviderPlugin.broadcastProjectConfigured(getProject());
}
Vi följer inte implementationen av insticksprogrammets sändningsmekanism. Det räcker med att säga att alla parter som behöver beräkna eller initiera projektspecifika data kan göra det vid det här tillfället.
Ett projekt avkonfigureras när användaren inte längre vill associera en grupprovider till ett projekt. Det är insticksprogrammet som ska implementera användaråtgärden som får detta att hända (och ta bort avbildningen av projektet från grupprovidern). Metoden deconfigure är rätt tillfälle att ta bort alla projektrelaterade cacheminnen eller alla referenser till projektet i användargränssnittet. CVS-providern rensar projektrelaterade cacheminnen som sparats i vyerna och meddelar att projektet har avkonfigurerats.
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());
}
}
Vanligen är det första steget, för att skapa ett gruppanvändargränssnitt, att implementera en guidesida som kan användas till att konfigurera ett projekt för insticksprogrammets gruppsupport. Det är här grupproviderns ID läggs till i projektegenskaperna. Du deltar i projektkonfiguration genom att bidra utökningspunkten org.eclipse.team.ui.configurationWizards. Den här guiden visas när användaren väljer Grupp->Dela projekt...
Vi kommer att titta på detta i samband med implementationen av CVS-klienten. Här följer märkordet för konfigurationsguidens CVS-användargränssnitt:
<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 vanligt finns en klass i insticksprogrammet som implementerar utökningen och ett unikt ID för att identifiera utökningen. Namn och ikon visas på första sidan i projektets konfigurationsguide, om det finns flera providers att välja från.
När användaren har valt en provider visas specifik konfigurationsinformation för providern på nästa sida. (Om providern är det enda installerade insticksprogrammet för grupprovider hoppar guiden direkt till din sida.) Guiden måste implementera IConfigurationWizard, vilken initierar guiden för en viss arbetsmiljö och ett visst projekt. Resten av implementationen beror på guidens utformning. Du måste samla in all information som behövs för att associera projekt med din gruppsupport.
När guiden har slutförts måste du avbilda grupprovidern till projektet med hjälp av RepositoryProvider.map(IProject, String). I avbildningen hanteras tilldelning av rätt, projektpermanent egenskap till projektet.
CVS-klienten utför detta i providerns setSharing-metod, som anropas när guiden har slutförts:
public void setSharing(IProject project, FolderSyncInfo info, IProgressMonitor monitor) throws TeamException {
// Se till att angiven info matchar projektinfo
...
// Se till att angiven plats hanteras
...
// Registrera projektet med Team
RepositoryProvider.map(project, CVSProviderPlugin.getTypeId());
}
Med statiska metoder i RepositoryProvider är det lätt för klienter att avbilda projekt till providers och att hitta providers som är associerade till ett givet projekt.
Om en produkt väljer att lägga till ett lagerinsticksprogram i en funktion ska funktionen bindas till lager-ID:t. Här följer två steg som ska utföras för att aktivera RepositoryProvider som en funktion:
<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>
Det finns två punkter för utlösning av funktionen, vilket definierats i gruppinsticksprogrammet. Den första är Grupp > Dela projekt.... Guiden kan användas till att filtrera lagerproviders baserat på aktiverat/avaktiverat läge för arbetsmiljöfunktioner och den andra är gruppinsticksprogrammets utlösare för automatisk aktivering.
Den mest intressanta funktionen för en lagerprovider inträffar när användaren arbetar med resurser i projektet som har konfigurerats för providern. I syfte att vara medveten om ändringar som görs av en resurs kan providern implementera en resursmodifieringshook. I resursinsticksprogrammet finns dessa hook-funktioner som utökningspunkter. I dokumentationen för IMoveDeleteHook, IFileModificationValidator och ResourceRuleFactory finns detaljerad information om implementationen av dessa hook-funktioner.
Gruppinsticksprogrammet optimerar och förenklar associeringen av hook-funktionen med lämpliga resurser genom att registrera generiska hook-funktioner med resursinsticksprogrammet. Dessa generiska hook-funktioner söker helt enkelt i lagerprovidern efter en given resurs och hämtar hook-funktionen. Detta har fördelen att endast en provider-hook anropas i stället för att varje providerimplementation ska registrera en hook-funktion som först måste kontrollera om resursen hanteras av providern.
Det innebär för insticksprogrammet att du ger alla nödvändiga hook-funktioner genom att åsidosätta metoder i RepositoryProvider. Standardimplementationen av de här metoderna svarar null, vilket indikerar att ingen hook-funktion är nödvändig (utom för resursregelfabriken, vilket beskrivs ovan):