Un fournisseur de référentiel (RepositoryProvider) représente la classe centrale dans l'implémentation de votre référentiel. Cette classe est responsable de la configuration d'un projet pour la gestion du référentiel, ainsi que de l'apport des points d'ancrage nécessaires pour modifier les ressources. Les fournisseurs sont mappés vers un projet à l'aide des propriétés persistantes du projet. Le mécanisme de mappage de fournisseurs à un projet n'est pas essentiel dans l'API d'équipe, mais vous devez tout de même en connaître l'existence lors de l'élimination de ressources de votre interface graphique. Le plus souvent, vous utiliserez l'API d'équipe pour travailler avec des projets et les associer à votre fournisseur.
Pour implémenter un fournisseur, vous devez définir un référentiel avec org.eclipse.team.core.repository et fournir une classe dérivée de RepositoryProvider. Nous prendrons le client CVS comme exemple pour illustrer l'opération.
Le point d'extension org.eclipse.team.core.repository est utilisé pour ajouter une définition de référentiel. Voici les marques pour le 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>
Votre fournisseur d'équipe est ainsi enregistré avec le plug-in de support d'équipe et un ID est assigné pour être utilisé lorsque votre fournisseur est associé à un projet. La classe spécifiée pour le référentiel doit étendre RepositoryProvider.
La classe identifiée dans l'extension doit être une sous-classe de RepositoryProvider. Ses responsabilités premières consistent à configurer et annuler la configuration d'un projet pour le support du référentiel, ainsi que de fournir les points d'ancrage de modifications de ressources nécessaires. Le client CVS offre un bon exemple. Son fournisseur de référentiel est CVSTeamProvider.
public class CVSTeamProvider extends RepositoryProvider {
...
RepositoryProvider définit deux méthodes abstraites configureProject et deconfigure. Tous les fournisseurs doivent implémenter ces méthodes.
Un projet est configuré lorsqu'il est pour la première fois associé à un fournisseur de référentiel particulier. Tel est le cas lorsque l'utilisateur sélectionne un projet et emploie les assistants d'équipe pour associer un projet à votre référentiel. Quel que soit le mode de lancement de l'opération, il est alors opportun de calculer ou de mettre en cache toutes les données sur le projet à fournir à votre fonction de référentiel. Supposez pour cela que le projet a déjà été mappé à votre fournisseur. Vous effectuerez cette opération dans votre assistant de configuration.
Le fournisseur CVS diffuse simplement le fait qu'un projet a été configuré :
public void configureProject() throws CoreException {
CVSProviderPlugin.broadcastProjectConfigured(getProject());
}
Nous n'aborderons pas l'implémentation du mécanisme de diffusion de plug-in. Il suffit de préciser que tout élément devant calculer ou initialiser des données spécifiques à un projet peut s'exécuter à ce moment.
La configuration d'un projet est annulée lorsque l'utilisateur ne souhaite plus associer un fournisseur d'équipe à un projet. Votre plug-in peut choisir d'implémenter l'action utilisateur entraînant cette situation (le mappage du projet à partir de votre fournisseur d'équipe sera alors annulé). La méthode deconfigure est opportune pour supprimer tous les caches liés à des projets ou toute référence au projet dans l'interface graphique. Le fournisseur CVS élimine les caches liés à des projets conservés dans ses vues et diffuse le fait que la configuration du projet est annulée.
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());
}
}
En général, la première étape de la construction d'une interface graphique d'équipe consiste à implémenter une page d'assistant permettant aux utilisateurs de configurer un projet pour le support d'équipe de votre plug-in. L'ID de votre fournisseur d'équipe pourra ainsi être ajouté aux propriétés du projet. Vous participez à la configuration d'un projet en contribuant au point d'extension org.eclipse.team.ui.configurationWizards. Cet assistant s'ouvre lorsque vous choisissez Equipe->Partager un projet...
Nous allons étudier ce cas dans le contexte de l'implémentation du client CVS. Voici les marques de l'interface graphique pour son assistant de configuration :
<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>
Comme d'habitude, les plug-in fournissent une classe implémentant l'extension et un ID unique pour identifier leurs extensions. Le nom et l'icône apparaissent dans la première page de l'assistant de configuration du projet s'il existe plusieurs fournisseurs.
Une fois que l'utilisateur a sélectionné un fournisseur, la page suivant présente des informations de configuration spécifique à ce fournisseur. Si ce dernier correspond au seul plug-in installé, l'assistant passe directement à votre page. L'assistant doit implémenter IConfigurationWizard, qui initialise l'assistant pour un plan de travail et un projet spécifiés. Le reste de l'implémentation dépend de la conception de l'assistant. Vous devez rassembler les informations nécessaires à l'association du projet à la prise en charge d'équipe.
Une fois l'assistant arrivé à la fin, vous devez mapper votre fournisseur d'équipe vers le projet avec RepositoryProvider.map(IProject, String). Le mappage gère l'affectation de la propriété persistante adaptée à votre projet.
Le client CVS agit ainsi dans la méthode setSharing de son fournisseur, appelée au terme de l'assistant :
public void setSharing(IProject project, FolderSyncInfo info, IProgressMonitor monitor) throws TeamException {
// Les infos fournies correspondent à celles du projet.
...
// L'emplacement fourni est géré.
...
// Enregistre le projet avec l'équipe.
RepositoryProvider.map(project, CVSProviderPlugin.getTypeId());
}
Des méthodes statiques dans RepositoryProvider facilite le mappage de projets vers des fournisseurs et la recherche des fournisseurs associés au projet en question.
Si un produit choisit d'ajouter un plug-in de référentiel à une fonction, il doit lier la fonction à l'ID référentiel. Voici les deux étapes à suivre pour activer le fournisseur de référentiel comme fonction :
<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>
Il y a deux points de déclenchement de fonction définis par les plug-ins d'équipe. Le premier est l'assistant Equipe > Partager un projet... qui permet de filtrer les fournisseurs de référentiel en fonction de l'état activé/désactivé des fonctions du plan de travail et le second est le déclencheur d'activation automatique de plug-in.
La majeure partie de la fonction intéressante associée à un fournisseur de référentiel se produit lorsque l'utilisateur utile des ressources du projet configurées pour le fournisseur. Pour connaître les modifications que l 'utilisateur apporte aux ressources, le fournisseur peut implémenter des points d'ancrage de modification des ressources. Le plug-in de ressources met ces points d'ancrage à disposition sous forme de points d'extension. La documentation pour IMoveDeleteHook, IFileModificationValidator et ResourceRuleFactory décrit en détail l'implémentation de ces points d'ancrage.
Le plug-in d'équipe optimise et simplifie l'association du point d'ancrage avec les ressources appropriées en enregistrant des points d'ancrage génériques avec le plug-in de ressource. Ces points génériques recherchent simplement le fournisseur de référentiel pour une ressource donnée et en obtienne le point d'ancrage. L'avantage est que l'appel porte uniquement sur un point d'ancrage au lieu que chaque implémentation de fournisseur en enregistre un devant d'abord vérifier si la ressource est gérée par le fournisseur.
Cela signifie, pour le plug-in, que vous spécifiez les points d'ancrage nécessaires en supplantant les méthodes disponibles dans RepositoryProvider. L'implémentation par défaut de ces méthodes renvoie la valeur null, ce qui indique qu'aucun point d'ancrage n'est nécessaire (à l'exception de la fabrique de règles de ressource, selon les indications ci-dessous) :