Ein Repository-Provider (RepositoryProvider) stellt die zentrale Klasse bei der Implementierung Ihres Repositories dar. Diese Klasse ist für die Konfigurierung eines Projekts für die Repository-Verwaltung und die Bereitstellung der erforderlichen Hooks für die Ressourcenänderung verantwortlich . Provider werden einem Projekt mit Hilfe der persistenten Projekteigenschaften zugeordnet. Der Mechanismus für die Zuordnung von Providern zu einem bestimmten Projekt ist für die Team-API nicht von zentraler Bedeutung, er muss jedoch berücksichtigt werden, wennRessourcen in der Benutzerschnittstelle herausgefiltert werden. Meistens werden Sie die Team-API verwenden, um mit Projekten zu arbeiten und diese Ihrem Provider zuzuordnen.
Für die Implementierung eines Providers müssen Sie mit Hilfe von org.eclipse.team.core.repository ein Repository definieren und anschließend eine Klasse angeben, die von RepositoryProvider abgeleitet wurde. Als Beispiel für diese Operation wird der CVS-Client verwendet.
Am Erweiterungspunkt org.eclipse.team.core.repository können Sie eine Definition für ein Repository hinzufügen. Das entsprechende Befehlsformat für den CVS-Client sieht folgendermaßen aus:
<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>
Hierdurch wird der Team-Provider beim Plug-in für die Teamunterstützung registriert. Außerdem wird ihm eine ID zugeteilt, die für die Zuordnung des Providers zu einem bestimmten Projekt verwendet werden sollte. Die angegebene Klasse des Repositories muss eine Erweiterung von RepositoryProvider darstellen.
Die in der Erweiterung angegebene Klasse muss eine Unterklasse von RepositoryProvider sein. Sie dient hauptsächlich der Konfigurierung und Dekonfigurierung eines Projekts für die Repository-Unterstützung sowie der Bereitstellung aller erforderlichen Hooks für die Ressourcenänderung. Der CVS-Client ist hierfür ein gutes Beispiel . Sein Repository-Provider ist CVSTeamProvider.
public class CVSTeamProvider extends RepositoryProvider {
...
Der RepositoryProvider definiert die beiden abstrakten Methoden configureProject und deconfigure. Alle Provider müssen diese Methoden implementieren.
Ein Projekt wird dann konfiguriert, wenn es zum ersten Mal einem bestimmten Repository-Provider zugeordnet wird. Dies geschieht normalerweise, wenn ein Benutzer ein Projekt auswählt und dann über einen Teamassistenten Ihrem Repository zuordnet. Ganz gleich, wie die Operation ausgelöst wird: dies ist der geeignete Zeitpunkt, um diejenigen Daten über das Projekt zu berechnen oder zwischenzuspeichern, die Sie ihrer Repository-Funktion bereitstellen müssen. (Gehen Sie einfach davon aus, dass das Projekt Ihrem Provider bereits zugeordnet wurde. Um diesen Aspekt kümmern Sie sich später noch in Ihrem Konfigurationsassistenten.)
Der CVS-Provider überträgt die Meldung über die Konfiguration des Projekts im Broadcastbetrieb:
public void configureProject() throws CoreException {
CVSProviderPlugin.broadcastProjectConfigured(getProject());
}
Die Implementierung des Broadcastmechanismus des Plug-ins wird an dieser Stelle nicht weiter erläutert. Alle Teilnehmer, die projektspezifische Daten berechnen oder initialisieren müssen, können diesen Arbeitsschritt an dieser Stelle ausführen.
Ein Projekt wird dekonfiguriert, wenn der Benutzer die Zuordnung zwischen einem Team-Provider und einem Projekt aufhebt. Die Implementierung der hierzu erforderlichen Benutzeraktion richtet sich nach dem verwendeten Plug-in (die Aufhebung der Zuordnung des Projekts zum Team-Provider wird an dieser Stelle ausgeführt). Die Methode für die Dekonfigurierung gibt die korrekte Zeit zum Löschen aller projektspezifischen Zwischenspeicher bzw. zum Entfernen aller Referenzen auf das Projekt in der Benutzerschnittstelle an. Der CVS-Provider löscht den Inhalt der projektspezifischen Zwischenspeicher, die in den Sichten geführt werden, und sendet eine Broadcastmeldung über die Dekonfigurierung des Projekts.
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());
}
}
Der erste Schritt bei der Erstellung einer Team-Benutzerschnittstelle ist normalerweise die Implementierung einer Assistentenseite, über die Benutzer ein Projekt für die Teamunterstützung Ihres Plug-ins konfigurieren können. Dies ist die Stelle, an der die ID Ihres Team-Providers zu den Eigenschaften des Projekts hinzugefügt wird. Ihre Rolle bei der Konfigurierung eines Projekts besteht in der Ergänzung des Erweiterungspunktes org.eclipse.team.ui.configurationWizards. Dieser Assistent wird angezeigt, wenn der Benutzer Team->Projekt gemeinsam benutzen... auswählt.
Dieses Thema wird im Zusammenhang mit der CVS-Client-Implementierung erläutert. Im Folgenden ist das Befehlsformat der CVS-Benutzerschnittstelle für den Konfigurationsassistenten aufgeführt:
<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>
Normalerweise stellen Plug-ins eine Klasse (class) bereit, die die Erweiterung und eine eindeutige Kennung (id) implementiert, mit deren Hilfe die Erweiterung identifiziert werden kann. Der Name (name) und das Symbol (icon) werden auf der ersten Seite des Projektkonfigurationsassistenten angezeigt, wenn mehrere Provider zur Auswahl stehen.
Nachdem der Benutzer einen Provider ausgewählt hat, werden auf der nächsten Seite die spezifischen Konfigurationsdaten für den gewünschten Provider angezeigt. (Wenn Ihr Provider das einzige Plug-in für Team-Provider ist, das auf dem System installiert ist, ruft der Assistent direkt Ihre Seite auf.) Ihr Assistent muss IConfigurationWizard implementieren, wodurch der Assistent für eine angegebene Workbench und ein entsprechendes Projekt initialisiert wird. Die restliche Implementierung hängt vom Design des verwendeten Assistenten ab. Sie müssen alle Informationen erfassen, die für die Zuordnung des Projektes zu Ihrer Teamunterstützung erforderlich sind.
Nach Abschluss des Assistenten müssen Sie eine Zuordnung zwischen Ihrem Team-Provider und dem Projekt erstellen. Verwenden Sie hierzu RepositoryProvider.map(IProject, String). Durch diese Operation werden Ihrem Projekt die korrekten persistenten Projekteigenschaften zugeordnet.
Der CVS-Client führt diesen Arbeitsschritt in der Methode setSharing des zugehörigen Providers aus. Diese wird aufgerufen, wenn der Assistent abgeschlossen ist:
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());
}
Die statischen Methoden in RepositoryProvider ermöglichen Clients die einfache Zuordnung von Projekten zu Providern und das Auffinden der Provider, die einem bestimmten Projekt zugeordnet sind.
Wenn ein Produkt ein Repository-Plug-in zu seiner Funktionalität hinzufügt, sollte es die Funktion mit der Repository-ID verbinden. Die folgenden zwei Schritte müssen ausgeführt werden, um einen RepositoryProvider als Funktion zu aktivieren:
<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>
Team-Plug-ins definieren zwei Auslösepunkte für Funktionen. Der erste ist der Assistent Team >Projekt gemeinsam benutzen..., über den Repository-Provider auf Basis des Status aktiviert/deaktiviert der Workbench-Funktionalität gefiltert wird. Der zweite ist das Team-Plug-in 'Auslöser Selbstaktivierung'.
Ein Großteil der interessanten Funktionalität eines Repository-Providers tritt auf, wenn der Benutzer im Projekt, das für den Provider konfiguriert ist, mit Ressourcen arbeitet. Um die Änderungen zu verfolgen, die ein Benutzer an einer Ressource vornimmt, kann der Provider Hooks für Ressourcenänderungen implementieren. Das Ressourcen-Plug-in stellt diese Hooks als Erweiterungspunkte bereit. Die Dokumentation für IMoveDeleteHook, IFileModificationValidator und ResourceRuleFactory beschreiben detailliert die Implementierung dieser Hooks.
Das Team-Plug-in optimiert und vereinfacht die Zuordnung des Hooks mit entsprechenden Ressourcen, indem es generische Hooks mit dem Ressourcen-Plug-in registriert. Diese generischen Hooks dienen zur Ermittlung des Repository-Providers einer bestimmten Ressource und zum Abrufen des zugehörigen Hooks. Dies bietet den Vorteil, dass nur ein Provider-Hook aufgerufen werden muss und nicht mehr jede Provider-Implementierung einen Hook registrieren muss, mit dem vorab geprüft wird, ob die Ressource von dem Provider verwaltet wird.
Dies bedeutet für Ihr Plug-in, dass die erforderlichen Hooks durch das Überschreiben von Methoden in RepositoryProvider bereitgestellt werden. Die Standardimplementierung dieser Methoden gibt den Wert Null zurück und zeigt damit an, dass kein Hook erforderlich ist (Ausnahme ist die unten beschriebene Ressourcenregel-Factory):