同期をサポートする際に、同期状態を管理する既存のメカニズムがない場合に、
サブスクライバーを最初から実装する方法について本節で説明します。
このことは、既存の同期インフラストラクチャーはないことを意味しています。
本節では、同期状態を管理するために提供されているいくつかの 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 プラグインも、このインフラストラクチャーを使用して作成されています。
ファイル・システムの例の場合には、ローカル・プロジェクトをファイル・システムの場所 (ローカルの内容がミラーリングされている場所) に関連付けした RepositoryProvider が既に実装されています。FileSystemSubscriber は、ワークスペースの同期状態を管理するために、ThreeWaySynchronizer を使用するための ThreeWaySubscriber のサブクラスとして作成されています。 このクラスのサブクラスは、以下を行う必要があります。
サブスクライバーの実装だけでなく、ファイル・システムのプロバイダーの get および put 操作が、ThreeWaySynchronizer の同期状態を更新するために変更されています。 これらの操作はクラス org.eclipse.team.examples.filesystem.FileSystemOperations に実装されています。
ThreeWaySynchronizer は、 ローカル・ワークスペースとリモート・ロケーションとの間の同期状態を管理します。 ThreeWaySynchronizer は、リソースの同期状態を効果的に計算できるように、ローカル・タイムスタンプ、ベース・タイムスタンプ、 およびリモート・タイムスタンプをキャッシュして保持します。 ThreeWaySynchronizer は、任意の登録されているリスナーへの変更通知も行います。 ThreeWaySubscriber は、サブスクライバーが登録されているリスナーに送信するために、これらの変更イベントを適切な形式に変換します。
ThreeWaySynchronizer は、 Core スケジューリング規則およびロックを使用して、スレッドの安全を確保し、変更通知バッチを提供します。
ThreeWayRemoteTree は、ThreeWaySubscriber に対して調整された ResourceVariantTree のサブクラスです。 このサブクラスは、リモートの状態をサーバーから取り出すためのメカニズムを提供するために、 クライアントによってオーバーライドする必要があります。 ResourceVariantTree について詳しくは、次の例で説明します。
CachedResourceVariant は、 ある特定の期間 (現在は 1 時間) に取り出された任意の内容をキャッシュする IResourceVariant の部分実装です。 これは、その内容が、短時間の間に複数回アクセスされるような場合に役立ちます (例えば、同期状態を判別して、比較エディターでその内容を表示する場合)。 サブクラスは、リソース・バリアント・ハンドルの再作成のために保持可能なバイト配列と、 固有の内容識別子を提供する必要があります。
多くのリポジトリー・プロバイダーには、同期状態を管理するメカニズムが既に存在する可能性があります (例えば、既存のプラグインが存在する場合)。 ResourceVariantTreeSubscriber およびその関連するクラスは、既存の同期インフラストラクチャーをベースにして作成する機能を提供します。 例えば、これはすべての CVS サブスクライバーのスーパークラスです。
直前の例の説明のように、ThreeWaySubscriber は、ThreeWaySynchronizer を使用してローカル・ワークスペースの同期を提供する ResourceVariantTreeSubscriber のサブクラスです。ResourceVariantTreeSubscriber のサブクラスは、 以下を提供する必要があります。
リモート・リソース・バリアントを全探索およびリフレッシュするための振る舞い。 3 方向比較をサポートするサブスクライバーの場合には、ベース・リソース・バリアントを提供する ResourceVariantTree のサブクラス (つまり AbstractResourceVariantTree)。
サブスクライバーのこの他の機能は、これらの機能を使用して実装されます。
ResourceVariantTree は、以下を提供する IResourceVariantTree の具象実装です。
サブクラスによって以下が実装されている必要があります。
複数のワークベンチの起動に渡ってバイトを保持 (PersistantResourceVariantByteStore) する、または現在のセッションのみのためにバイトをキャッシュ (SessionResourceVariantByteStore) するために、 ResourceVariantByteStore の具象実装が用意されています。 ただし、既存のワークスペース同期インフラストラクチャーをベースにサブスクライバーを作成する場合、 通常は、基本的なシンクロナイザーとのインターフェースを行う ResourceVariantByteStore サブクラスの実装が必要です。 例えば、ThreeWayRemoteTree は、ThreeWaySynchronizer にリモート・バイトを保管するバイト・ストア実装を使用します。
この例のリソース・バリアント・ハンドルの作成は、 ハンドルがサブスクライバーの代わりにリソース・バリアント・ツリー・インスタンスから要求されることを除いて、 直前の例との違いはありません。