Bij de implementatie van een repositoryprovider is RepositoryProvider de centrale klasse. Deze klasse zorgt ervoor dat een project voor resourcebeheer wordt ingericht en verschaft de benodigde ingangen voor resourcewijzigingen. Providers worden aan projecten toegewezen met projectpersistente eigenschappen. U hebt kennis van de methode voor het toewijzen van providers aan projecten nodig bij het filteren van resources uit de gebruikersinterface. Meestal zult u de team-API gebruiken om met projecten te werken en deze aan de provider toe te wijzen.
U kunt een provider implementeren door een repository te definiëren met het extensiepunt org.eclipse.team.core.repository en een klasse op te geven die is afgeleid van RepositoryProvider. De CVS-client wordt gebruikt om een voorbeeld te geven.
Het extensiepunt org.eclipse.team.core.repository dient om een repository te definiëren. Dit is de markup van de CVS-client:
<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>
Zo wordt de teamprovider met de teamondersteuningsplugin geregistreerd en wordt een ID toegewezen voor het koppelen van de provider aan een project. De opgegeven klasse (class) van de repository moet RepositoryProvider uitbreiden.
De klasse die in de extensie wordt geïdentificeerd, moet een subklasse zijn van RepositoryProvider. De klasse dient vooral voor het (de)configureren van repository-ondersteuning voor een project en het verstrekken van de benodigde ingangen voor resourcewijzigingen. De CVS-client is een goed voorbeeld. De repositoryprovider hiervan is CVSTeamProvider.
public class CVSTeamProvider extends RepositoryProvider {
...
RepositoryProvider definieert twee abstracte methoden: configureProject en deconfigure. Deze methoden moeten door alle providers worden geïmplementeerd.
Een project wordt geconfigureerd zodra het voor het eerst aan een repositoryprovider wordt gekoppeld. Dit scenario treedt meestal op zodra een project wordt geselecteerd en een teamwizard wordt gebruikt voor het koppelen van het project aan de repository. Dit is het geschikte moment voor het berekenen of in de cache plaatsen van gegevens over het project ten behoeve van de repository, ongeacht de uitgevoerde bewerking. (U moet er vanuit gaan dat het project al aan de provider is toegewezen; deze taak wordt in de configuratiewizard uitgevoerd.)
De CVS-provider distribueert de melding dat een project is geconfigureerd:
public void configureProject() throws CoreException {
CVSProviderPlugin.broadcastProjectConfigured(getProject());
}
De implementatie van de distributie door de plugin wordt niet besproken: Alle onderdelen kunnen projectspecifieke gegevens in ieder geval te allen tijde berekenen of initialiseren.
Zodra de gebruiker niet langer een teamprovider voor een project wil instellen, wordt het project gedeconfigureerd. Uw plugin moet de actie van de gebruiker vervolgens verwerken (en het ontkoppelen van het project van de provider vindt daar plaats). De methode deconfigure zorgt ervoor dat cachegegevens van het project worden gewist en verwijzingen naar het project in de gebruikersinterface worden verwijderd. De CVS-provider leegt de projectcache uit de CVS-views en distribueert een melding dat het project is gedeconfigureerd.
public void deconfigure() throws CoreException {
...
try {
EclipseSynchronizer.getInstance().flush(getProject(), true, true /*grondig opschonen*/, null);
} catch(CVSException e) {
throw new CoreException(e.getStatus());
} finally {
CVSProviderPlugin.broadcastProjectDeconfigured(getProject());
}
}
De eerste stap bij het bouwen van een teamgebruikersinterface is het implementeren van een wizardpagina waarmee de gebruiker een project met teamondersteuning kan configureren. Het ID van uw teamprovider wordt hier toegevoegd aan de projecteigenschappen. U kunt bijdragen aan de configuratie van projecten door het extensiepunt org.eclipse.team.ui.configurationWizards uit te breiden. Deze wizard wordt afgebeeld via Team > Project delen...
Er wordt dieper op deze stof ingegaan op basis van de implementatie van de CVS-client. Dit is de gebruikersinterfacemarkup van CVS voor de configuratiewizard:
<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>
De plugin verstrekt opnieuw een klasse (class) voor het implementeren van de extensie en een uniek ID voor het identificeren van de extensie. De naam (name) en het pictogram (icon) worden op de eerste pagina van de projectconfiguratiewizard afgebeeld indien uit meerdere providers kan worden gekozen.
Zodra een provider is geselecteerd, worden op de volgende pagina specifieke configuratiegegevens met betrekking tot de provider afgebeeld. (Als uw provider de enige geïnstalleerde teamproviderplugin is, wordt deze pagina direct afgebeeld.) Uw wizard moet IConfigurationWizard implementeren, waarmee de wizard voor een opgegeven workbench en project wordt geïnitialiseerd. De verdere implementatie hangt af van het ontwerp van de wizard. U moet alle gegevens voor het koppelen van het project aan teamondersteuning verzamelen.
Zodra de wizard is voltooid, moet u de teamprovider aan het project koppelen met behulp van RepositoryProvider.map(IProject, String). Bij de toewijzing wordt de juiste projectpersistente eigenschap voor het project ingesteld.
Deze taak wordt door de CVS-client uitgevoerd in de methode setSharing van de bijbehorende provider, die wordt aangeroepen zodra de wizard is voltooid:
public void setSharing(IProject project, FolderSyncInfo info, IProgressMonitor monitor) throws TeamException {
// Controleren of opgegeven gegevens met projectgegevens overeenkomen.
...
// Controleren of opgegeven locatie bestuurd wordt.
...
// Project registreren met team.
RepositoryProvider.map(project, CVSProviderPlugin.getTypeId());
}
Statische methoden in RepositoryProvider vereenvoudigen het toewijzen van projecten aan providers en het ophalen van de providers die aan een opgegeven project zijn gekoppeld.
Bij het toevoegen van een repositoryplugin aan een voorziening moet de voorziening aan het ID van de repository worden toegewezen. Hieronder ziet u hoe u een repositoryprovider in twee stappen als voorziening kunt instellen:
<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>
Door de teamplugins worden twee activeringspunten voor voorzieningen verstrekt: Het eerste is de wizard Team > Project delen... waarmee u repositoryproviders kunt filteren op basis van de status van workbenchvoorzieningen (in- of uitgeschakeld). Het tweede is het automatische activeringspunt voor inschakeling van de teamplugin.
De meeste repositoryfunctionaliteit wordt uitgevoerd tijdens het werken met resources in een project dat voor de provider is geconfigureerd. De provider kan resourcewijzigingsingangen implementeren om te kunnen reageren op wijzigingen aan resources. Deze ingangen worden door de resourcesplugin verstrekt als extensiepunten. De documentatie van IMoveDeleteHook, IFileModificationValidator en ResourceRuleFactory geeft meer informatie over de implementatie van deze ingangen.
De teamplugin optimaliseert en vereenvoudigt het koppelen van ingangen aan resources door generieke ingangen te registreren voor de resourcesplugin. Deze generieke ingangen vragen de repositoryprovider van de resources op en halen vervolgens de ingang op. Het voordeel hiervan is dat slechts één provideringang hoeft te worden aangeroepen. Zo is het niet nodig voor elke providerimplementatie een ingang te registreren die controleert of de resource door de provider wordt beheerd.
Voor de plugin geeft u de benodigde ingangen op door de methoden in RepositoryProvider te vervangen. De standaardimplementatie van deze methoden geeft null als resultaat, waarmee wordt aangegeven dat een ingang niet nodig is (met uitzondering van de resourceregelfactory, die hieronder wordt beschreven):