追加情報

同期をサポートする際に、同期状態を管理する既存のメカニズムがない場合に、 サブスクライバーを最初から実装する方法について本節で説明します。 このことは、既存の同期インフラストラクチャーはないことを意味しています。 本節では、同期状態を管理するために提供されているいくつかの API の使用方法を図示します。

この例の残りの部分では、実行例を使用します。 ソース・コードは、org.eclipse.team.examples.filesystem プラグインのファイル・システム・プロバイダー・パッケージにあります。 CVS リポジトリーのプロジェクトを確認し、本チュートリアルを読む際の参考にしてください。

サブスクライバーの最初からの実装

この最初の例では、ローカル・ワークスペースの同期状態を保守するための既存のインフラストラクチャーは存在しないことが前提になっています。 サブスクライバーを最初から実装する場合には、org.eclipse.team.core プラグインに用意されている追加 API を使用できます。 org.eclipse.team.core.variants パッケージには、サブスクライバーの 2 つのサブクラスがあり、これらのサブクラスを使用して、実装を単純化することができます。 最初のサブクラスは ResourceVariantTreeSubscriber です。このサブクラスは以下の 2 番目の例で説明します。 2 番目のサブクラスは最初のサブクラスのサブクラスで ThreeWaySubscriber です。 このサブスクライバーの実装には、ローカル・ワークスペースの同期状態を管理するための、 いくつかの有用なクラスが用意されています。 既存のインフラストラクチャーがない場合には、ここから開始するのが最適です。

サブスクライバーの最初からの実装は、org.eclipse.team.examples.filesystem プラグインで使用可能なファイル・システムの例を使用して図示されています。 次の記述のコードは、Eclipse CVS リポジトリーで入手できるため、最小のコードに留めてあります。 技術的には 3 方向サブスクライバーではありませんが、このファイル・システムの例では、 このインフラストラクチャーを活用することができます。 FTP および WebDAV プラグインも、このインフラストラクチャーを使用して作成されています。

ThreeWaySubscriber

ファイル・システムの例の場合には、ローカル・プロジェクトをファイル・システムの場所 (ローカルの内容がミラーリングされている場所) に関連付けした RepositoryProvider が既に実装されています。FileSystemSubscriber は、ワークスペースの同期状態を管理するために、ThreeWaySynchronizer を使用するための ThreeWaySubscriber のサブクラスとして作成されています。 このクラスのサブクラスは、以下を行う必要があります。

サブスクライバーの実装だけでなく、ファイル・システムのプロバイダーの get および put 操作が、ThreeWaySynchronizer の同期状態を更新するために変更されています。 これらの操作はクラス org.eclipse.team.examples.filesystem.FileSystemOperations に実装されています。

ThreeWaySynchronizer

ThreeWaySynchronizer は、 ローカル・ワークスペースとリモート・ロケーションとの間の同期状態を管理します。 ThreeWaySynchronizer は、リソースの同期状態を効果的に計算できるように、ローカル・タイムスタンプ、ベース・タイムスタンプ、 およびリモート・タイムスタンプをキャッシュして保持します。 ThreeWaySynchronizer は、任意の登録されているリスナーへの変更通知も行います。 ThreeWaySubscriber は、サブスクライバーが登録されているリスナーに送信するために、これらの変更イベントを適切な形式に変換します。

ThreeWaySynchronizer は、 Core スケジューリング規則およびロックを使用して、スレッドの安全を確保し、変更通知バッチを提供します。

ThreeWayRemoteTree

ThreeWayRemoteTree は、ThreeWaySubscriber に対して調整された ResourceVariantTree のサブクラスです。 このサブクラスは、リモートの状態をサーバーから取り出すためのメカニズムを提供するために、 クライアントによってオーバーライドする必要があります。 ResourceVariantTree について詳しくは、次の例で説明します。

CachedResourceVariant

CachedResourceVariant は、 ある特定の期間 (現在は 1 時間) に取り出された任意の内容をキャッシュする IResourceVariant の部分実装です。 これは、その内容が、短時間の間に複数回アクセスされるような場合に役立ちます (例えば、同期状態を判別して、比較エディターでその内容を表示する場合)。 サブクラスは、リソース・バリアント・ハンドルの再作成のために保持可能なバイト配列と、 固有の内容識別子を提供する必要があります。

既存のワークスペースの同期をベースにした作成

多くのリポジトリー・プロバイダーには、同期状態を管理するメカニズムが既に存在する可能性があります (例えば、既存のプラグインが存在する場合)。 ResourceVariantTreeSubscriber およびその関連するクラスは、既存の同期インフラストラクチャーをベースにして作成する機能を提供します。 例えば、これはすべての CVS サブスクライバーのスーパークラスです。

ResourceVariantTreeSubscriber

直前の例の説明のように、ThreeWaySubscriber は、ThreeWaySynchronizer を使用してローカル・ワークスペースの同期を提供する ResourceVariantTreeSubscriber のサブクラスです。ResourceVariantTreeSubscriber のサブクラスは、 以下を提供する必要があります。

サブスクライバーのこの他の機能は、これらの機能を使用して実装されます。

ResourceVariantTree

ResourceVariantTree は、以下を提供する IResourceVariantTree の具象実装です。

サブクラスによって以下が実装されている必要があります。

複数のワークベンチの起動に渡ってバイトを保持 (PersistantResourceVariantByteStore) する、または現在のセッションのみのためにバイトをキャッシュ (SessionResourceVariantByteStore) するために、 ResourceVariantByteStore の具象実装が用意されています。 ただし、既存のワークスペース同期インフラストラクチャーをベースにサブスクライバーを作成する場合、 通常は、基本的なシンクロナイザーとのインターフェースを行う ResourceVariantByteStore サブクラスの実装が必要です。 例えば、ThreeWayRemoteTree は、ThreeWaySynchronizer にリモート・バイトを保管するバイト・ストア実装を使用します。

この例のリソース・バリアント・ハンドルの作成は、 ハンドルがサブスクライバーの代わりにリソース・バリアント・ツリー・インスタンスから要求されることを除いて、 直前の例との違いはありません。