リポジトリー・プロバイダー

リポジトリー・プロバイダー (RepositoryProvider) は、 リポジトリーの実装内の中心的なクラスです。  このクラスは、リポジトリーを管理するためのプロジェクトの構成と、リソースの変更に必要なフックの提供に責任があります。  プロバイダーは、プロジェクトの永続プロパティーを使用してプロジェクトにマップされます。  プロバイダーをプロジェクトにマップするメカニズムはチーム API の中心ではありませんが、UI 内のリソースをフィルター操作で除外するときにこれに注意する必要があります。  多くの場合、プロジェクトを操作してプロバイダーに関連付けるため、チーム API を使用することになります。  

プロバイダーを実装するには、 org.eclipse.team.core.repository を使用してリポジトリーを定義し、RepositoryProvider から派生したクラスを提供する必要があります。   例として CVS クライアントを使用し、これがどのように実行されるかを見てみましょう。

拡張ポイント

リポジトリー定義を追加するには、 org.eclipse.team.core.repository 拡張ポイントが使用されます。  以下に 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>

これは、チーム・プロバイダーをチーム・サポート・プラグインに登録して、プロバイダーがプロジェクトに関連付けられるときに使用される ID を割り当てます。  指定されたリポジトリーの class は、 RepositoryProvider を拡張しなければなりません。

RepositoryProvider の実装

拡張で識別されるクラスは、 RepositoryProvider のサブクラスである必要があります。 その主な役割は、リポジトリー・サポートのためにプロジェクトを構成および構成解除して、必要なリソース変更フックを提供することです。  CVS クライアントがよい例です。  そのリポジトリー・プロバイダーは CVSTeamProvider です。

public class CVSTeamProvider extends RepositoryProvider {
...

RepositoryProvider は、 2 つの要約メソッド configureProjectdeconfigure を定義します。  すべてのプロバイダーは、これらのメソッドを実装する必要があります。 

特定のリポジトリー・プロバイダーと最初に関連付けられるときに、プロジェクトは構成されます。  これは一般に、ユーザーがプロジェクトを選択し、プロジェクトをご使用のリポジトリーに関連付けるため、チーム・ウィザードを使用するときに行われます。  操作がトリガーされる方法には関係なく、リポジトリー機能を提供する必要のあるプロジェクトに関するデータを計算またはキャッシュに入れる時間に応じます。  (プロバイダーに対するプロジェクトのマッピングは既に行われていることを前提とします。  これは、構成ウィザードで処理されることになります。)

CVS プロバイダーは、プロジェクトが構成されたという事実を単にブロードキャストするだけです。

public void configureProject() throws CoreException {

CVSProviderPlugin.broadcastProjectConfigured(getProject());
}

ここでは、プラグイン・ブロードキャスト機構の実装には言及しません。  プロジェクト特定のデータを計算または初期化する必要のある方は、そのときに行うことができるというだけにとどめておきます。

チーム・プロバイダーをプロジェクトに関連付ける必要がないとき、プロジェクトは構成解除されます。   構成解除が起こる (およびプロジェクトのチーム・プロバイダーからのマップ解除がここで起こる) 原因となる、ユーザー・アクションの実装は、 ご使用のプラグインの責任で行ってください。  deconfigure メソッドは、プロジェクト関連のキャッシュの削除、または UI 内のプロジェクトに対する参照の除去に応じた適当な時間です。   CVS プロバイダーは、ビューに保持されたプロジェクト関連のキャッシュをフラッシュし、プロジェクトが構成解除されたという事実をブロードキャストします。

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());
}
}

プロジェクトの構成

一般に、チーム UI のビルドの最初のステップは、ウィザード・ページの実装になります。  これによって、ユーザーはプラグインのチーム・サポートに応じてプロジェクトを構成できるようになります。 ここで、チーム・プロバイダーの ID がプロジェクトのプロパティーに追加されます。  org.eclipse.team.ui.configurationWizards 拡張ポイントに組み込むことによって、プロジェクト構成に参加します。  このウィザードは、ユーザーが「チーム」>「プロジェクトの共用...」を選択すると表示されます。

これを CVS クライアント実装のコンテキストで調べます。  以下は、構成ウィザードの CVS UI マークアップです。

<extension
point="org.eclipse.team.ui.configurationWizards">
<wizard
name="%SharingWizard.name"
icon="icons/full/wizards/newconnect_wiz.gif"
class="org.eclipse.team.internal.ccvs.ui.wizards.SharingWizard"
id="org.eclipse.team.ccvs.ui.SharingWizard">
</wizard>
</extension>

通常、拡張および固有の id を実装する class をプラグインが提供し、それらの拡張を識別します。  選択する複数のプロバイダーがある場合は、nameicon がプロジェクト構成ウィザードの最初のページに表示されます。

ユーザーがプロバイダーを選択すると、プロバイダーのために特定の構成情報が次のページに表示されます。  (ご使用のプロバイダーが、プラグインがインストールされた唯一のチーム・プロバイダーである場合、 ウィザードは直接ユーザーのページにスキップします。)  ご使用のウィザードは IConfigurationWizard を実装する必要があります。これは、特定のワークベンチとプロジェクトのウィザードを初期化します。 残りの実装は、ご使用のウィザードの設計によって異なります。  プロジェクトをチーム・サポートに関連付けるために必要なあらゆる情報を集める必要があります。

ウィザードが完了したら、RepositoryProvider.map(IProject, String) を使用して、ご使用のチーム・プロバイダーをプロジェクトにマップする必要があります。 マッピングは、正しいプロジェクト永続プロパティーのプロジェクトへの割り当てを処理します。 

CVS クライアントは、この作業をプロバイダーの setSharing メソッドで行います。 これは、ウィザードが終了されるときに呼び出されます。

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());
}

プロバイダーの検索

RepositoryProvider 内の静的メソッドを使用すると、 クライアントによる、プロバイダーへのプロジェクトのマップと、指定のプロジェクトに関連付けられたプロバイダーの検索が簡単になります。

リポジトリー・プロバイダーと機能

製品がリポジトリー・プラグインを機能に追加する場合は、機能をリポジトリー ID にバインドする必要があります。 RepositoryProvider を機能として使用可能にするには、2 つのステップを実行します。

1. 機能をリポジトリー・プロバイダー ID にバインドする。 これにより、リポジトリー・プロバイダー ID に基づいてチーム・プラグインを活動化したり、使用不可にしたりすることができます。

<activityPatternBinding
    activityId="org.eclipse.team.cvs"
    pattern="org\.eclipse\.team\.cvs\.core/.*cvsnature">
</activityPatternBinding>

2. 次に、機能をプロバイダーのすべての UI パッケージにバインドする。

<activityPatternBinding
     activityId="org.eclipse.team.cvs"
     pattern="org\.eclipse\.team\.cvs\.ui/.*">
</activityPatternBinding>

チーム・プラグインによって定義された 2 つの機能トリガー・ポイントがあります。 1 つ目は 「チーム」>「プロジェクトの共用...」で起動するウィザードです。 このウィザードを使用すると、ワークベンチ機能の使用可能/使用不可の状態に基づいて、 リポジトリー・プロバイダーのフィルター処理を実行できます。もう 1 つはチーム・プラグイン自動使用可能化トリガーです。

リソース変更フック

リポジトリー・プロバイダーに関連付けられた興味深い機能の大部分は、 ユーザーがプロバイダー用に構成されたプロジェクトでリソースを操作するとき使用されます。  ユーザーがリソースに対して行った変更を認識できるように、プロバイダーはリソース変更フックを実装できます。 リソース・プラグインは、これらのフックを拡張ポイントとして提供します。 IMoveDeleteHookIFileModificationValidator、および ResourceRuleFactory のドキュメンテーションで、 これらのフックの実装に関する詳細を説明しています。

チーム・プラグインは、汎用フックをリソース・プラグインに登録することによって、フックと該当するリソースとの関連付けを最適化および単純化します。  これらの汎用フックは、指定されたリソースについてリポジトリー・プロバイダーを単純に検索して、フックを取得します。  これには、各プロバイダー実装に、リソースがそのプロバイダーによって管理されているかどうかを最初に検査しなければならないフックを登録させるのではなく、 1 つのプロバイダー・フックのみを呼び出すという利点があります。

これは、プラグインにとっては、RepositoryProvider 内のメソッドをオーバーライドすることによって、 必要なフックが指定されることを意味します。これらのメソッドのデフォルト実装は、ヌル応答を返して、 フックの必要がないことを示します (以下で説明するリソース・ルール・ファクトリーは例外)。

特記事項