Poskytovatel úložišť (RepositoryProvider) představuje centrální třídu v rámci implementace vašeho úložiště. Tato třída je odpovědná za konfiguraci projektu pro správu úložišť a poskytnutí nezbytných záchytných bodů pro úpravu prostředků. Poskytovatelé jsou mapováni na projekt za použití trvalých vlastností projektu. Mechanizmus mapování poskytovatelů na projekt není z pohledu týmového rozhraní API klíčový, ale musíte o něm vědět kvůli odfiltrování prostředků ve svém uživatelském rozhraní. Většinou budete používat týmové rozhraní API pro práci s projekty a tyto asociovat se svým poskytovatelem.
K implementaci poskytovatele musíte nadefinovat úložiště pomocí org.eclipse.team.core.repository a dodat třídu odvozenou od poskytovatele úložiště RepositoryProvider. Jako funkční příklad použijeme klienta CVS.
Bod rozšíření org.eclipse.team.core.repository se používá pro přidání definice úložiště. Zde je markup pro klienta 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>
Tímto se zaregistruje váš týmový poskytovatel u modulu plug-in týmové podpory a přiřadí se ID, které by se mělo používat, když je váš poskytovatel přiřazen s projektem. Třída uvedená pro úložiště musí rozšiřovat poskytovatele RepositoryProvider.
Třída definovaná v rozšíření musí být podtřídou třídy RepositoryProvider. Je primárně zodpovědná za konfiguraci a odstranění konfigurace projektu pro podporu úložišť, a zajištění všech nezbytných záchytných bodů pro úpravy prostředků. Dobrým příkladem je klient CVS. Poskytovatelem úložiště tohoto klienta je CVSTeamProvider.
public class CVSTeamProvider extends RepositoryProvider {
...
Třída RepositoryProvider definuje dvě abstraktní metody, configureProject a deconfigure. Tyto metody musí implementovat všichni poskytovatelé.
Projekt je konfigurován v okamžiku, kdy je poprvé přidružen s konkrétním poskytovatelem úložiště. K tomuto dochází zpravidla tehdy, když uživatel vybere projekt a použije týmové průvodce pro přiřazení projektu k vašemu úložišti. Bez ohledu na to, jak je tato operace spuštěna, je to správný okamžik pro výpočet nebo uložení do mezipaměti veškerých dat o projektu, která bude třeba poskytnout vašemu úložišti. (Předpokládá se, že mapování projektu na vašeho poskytovatele již proběhlo. Toto zajistíte pomocí průvodce konfigurací.)
Poskytovatel CVS jednoduše vyšle zprávu o tom, že projekt byl nakonfigurován:
public void configureProject() throws CoreException {
CVSProviderPlugin.broadcastProjectConfigured(getProject());
}
Implementací mechanizmu vysílání modulu plug-in se zde zabývat nebudeme. Omezíme se na konstatování, že výpočet nebo inicializace dat konkrétního projektu se provádí v tomto okamžiku, je-li to potřeba.
Konfigurace projektu se odstraňuje tehdy, když uživatel nadále nepotřebuje přidružovat týmového poskytovatele s projektem. Váš modul plug-in musí implementovat akci uživatele, která toto zajistí (provede se zde zrušení mapování projektu na vašeho týmového poskytovatele). V rámci metody odstranění z konfigurace je vhodné taktéž odstranit veškeré mezipaměti projektu či odebrat odkazy na projekt z uživatelského rozhraní. Poskytovatel CVS vyprázdní mezipaměti konkrétního projektu uchovávané v příslušných pohledech a vyšle plošnou zprávu o tom, že projekt byl odstraněn z konfigurace.
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());
}
}
Prvním krokem při sestavování týmového uživatelského rozhraní je zpravidla implementace stránky průvodce, která umožní uživatelům nakonfigurovat projekt pro týmovou podporu vašeho modulu plug-in. Na tomto místě se do vlastností projektu přidá vaše ID týmového poskytovatele. Konfigurace projektu se účastníte přispěním do bodu rozšíření org.eclipse.team.ui.configurationWizards. Tento průvodce se zobrazí tehdy, když uživatel vybere příkaz Tým->Sdílet projekt...
Na tuto věc se podíváme v kontextu implementace klienta CVS. Zde je markup uživatelského rozhraní CVS pro tohoto průvodce konfigurací:
<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>
Moduly plug-in jako obvykle dodávají třídu, která implementuje rozšíření a jedinečné ID pro identifikaci příslušných rozšíření. Pokud je možné vybírat z několika poskytovatelů, na první stránce průvodce konfigurací projektu je zobrazen název a ikona.
Poté, co uživatel vybere poskytovatele, se na další stránce zobrazí konkrétní informace o konfiguraci vašeho poskytovatele. (Pokud je váš poskytovatel jediným nainstalovaným modulem plug-in týmového poskytovatele, průvodce přeskočí rovnou na vaši stránku.) Váš průvodce musí implementovat IConfigurationWizard, jenž inicializuje průvodce pro zadanou pracovní plochu a projekt. Zbytek implementace závisí na návrhu vašeho průvodce. Je třeba shromáždit veškeré informace potřebné pro přiřazení projektu k vaší týmové podpoře.
Po dokončení průvodce musíte namapovat vašeho týmového poskytovatele na projekt pomocí RepositoryProvider.map(IProject, String). Mapování ošetří přiřazení správné trvalé vlastnosti projektu k vašemu projektu.
Klient CVS tuto práci zajistí v rámci metody setSharing svého poskytovatele, jenž je volána po skončení příslušného průvodce:
public void setSharing(IProject project, FolderSyncInfo info, IProgressMonitor monitor) throws TeamException {
// Zajistit, aby poskytnuté informace odpovídaly informacím projektu
...
// Zajistit, aby poskytnuté umístění bylo řízeno
...
// Registrovat projekt u týmu
RepositoryProvider.map(project, CVSProviderPlugin.getTypeId());
}
Díky statickým metodám ve třídě RepositoryProvider mohou klienti snadno mapovat projekty na poskytovatele a najít poskytovatele přidružené s daným projektem.
Pokud se produkt rozhodne přidat do schopnosti modul plug-in úložiště, měl by vytvořit vazbu mezi schopností a ID úložiště. Zde jsou dva kroky ke zpřístupnění třídy RepositoryProvider jako schopnosti:
<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>
Týmové moduly plug-in definují dva spouštěcí impulsy schopností: Prvním je průvodce Tým > Sdílet projekt..., jenž umožňuje filtrování poskytovatelů úložišť na základě stavu zpřístupnění/znepřístupnění schopností pracovní plochy. Druhým je spouštěcí impuls automatického zpřístupnění týmového modulu plug-in.
Většina zajímavých funkcí spojených s poskytovatelem úložiště se realizuje tehdy, když uživatel pracuje s prostředky v projektu, jenž je nakonfigurován pro poskytovatele. Pokud si poskytovatel chce být vědom změn, které uživatel na prostředku provedl, může k tomuto účelu implementovat záchytné body úpravy prostředků. Modul plug-in prostředků poskytuje tyto záchytné body jako body rozšíření. V dokumentaci pro IMoveDeleteHook, IFileModificationValidator a ResourceRuleFactory najdete podrobnosti týkající se implementace těchto záchytných bodů.
Týmový modul plug-in optimalizuje a zjednodušuje přiřazení záchytného bodu k odpovídajícím prostředkům tím, že registruje generické záchytné body u modulu plug-in prostředků. Tyto generické záchytné body jednoduše vyhledají daný prostředek u poskytovatele úložiště a získají jeho záchytný bod. Tento postup má výhodu v tom, že se volá pouze jeden záchytný bod poskytovatele, namísto toho, aby každá implementace poskytovatele registrovala záchytný bod, který musí nejprve zkontrolovat, zda je prostředek poskytovatelem řízen.
Pro váš modul plug-in to znamená, že musíte poskytnout nezbytné záchytné body potlačením metod ve třídě RepositoryProvider. Výchozí implementace těchto metod vrací null, což značí, že není třeba žádný záchytný bod (s výjimkou továrny pravidel prostředku, jak je popsáno níže):