プロジェクトには、ローカル・ファイル・システムのプロジェクトのディレクトリー内にないリソースが 含まれている場合もあります。 このようなリソースをリンクされたリソースといいます。
リンクされたリソースは、ファイル・システムを直接操作するリポジトリー・プロバイダーに特定の難題を 投げかけます。 これは、リンクされたリソースがファイル・システム内の直接のプロジェクト・ディレクトリー・ツリーに 故意に存在しないようになっているためです。
以下の特性を示すプロバイダーは、リンクされたリソースによって影響を受ける場合があります。
最初の例では、リンクされたリソースをユーザーが選択し、それに対してプロバイダー操作を試みることを想定します。 プロバイダーはコマンド行クライアントを呼び出すため、最初に IResource.getLocation().toOSString() を 呼び出し、結果のファイル・システム・ロケーションを引数としてコマンド行プログラムに渡すと想定できます。 該当するリソースが、リンクされたリソースである場合、プロジェクト・ディレクトリー・ツリーの 外にファイル/フォルダーが作成されます。 一部のコマンド行クライアントは、この例を想定していないため、この例を処理できない場合があります。 つまり、プロバイダーはリソースのファイル・システム・ロケーションを取得すると、リンクされたリソースを処理する ための追加作業を要求する可能性があります。
2 つ目の例は、プロジェクト・リソースの構造がファイル・システムのファイル/フォルダーの構造と 1 対 1 であると 暗黙的に想定されるという点ではとても似ています。 一般に、プロバイダーが IResource and java.io.File 操作と混同すると、問題が発生する可能性があります。 例えば、リンクの場合、IFile の 親は java.io.File の親とは同じではないので、これらを同じと想定するコードは失敗します。
リンクされたリソースを導入することで、故意ではなくても既存のプロバイダーの妨げになるようなことがないようすることが 重要でした。 特に、ローカル・ファイル・システム構造がプロジェクト構造をミラーリングすると 合理的に想定するプロバイダーについては重要でした。 結果としてデフォルトでは、リンクされたリソースは、そのようなプロバイダーにマップされるプロジェクトに追加できません。 またデフォルトでは、リンクされたリソースを含むプロジェクトはそのプロバイダーと共用できません。
「リンク・フレンドリー」になるために、プロバイダーはリンクされたリソースを持つプロジェクトの バージョン管理を許可すべきですが、リンクされたリソース自体のバージョン管理は否認できます。
かなり複雑な解決方法として、実際にリンクされたリソースのバージョン管理を許可するという方法があります。 ただし、この方法は複雑なシナリオを使用するため、お勧めできません (例えば、ファイルは別のプロバイダーによって 別のプロジェクト・ツリーの下で既にバージョン管理されている場合があります)。 したがって、お勧めの方法は、バージョン管理されていないリンクされたリソースを含む、バージョン管理された プロジェクトをサポートすることです。
true を戻すように RepositoryProvider.canHandleLinkedResources() メソッドをオーバーライドすることによって、リンクされたリソースをサポートするようにリポジトリー・ プロバイダーの実装をアップグレードできます。 これを行った後に、リンクされたリソースは、該当するリポジトリー・プロバイダーと共用されるプロジェクトに 置くことができます。 ただし、リポジトリー・プロバイダーは、リンクされたリソースが適切に処理されたことを確認するための ステップを行う必要があります。 上述のように、リポジトリー・プロバイダーがすべてのリンクされたリソースを無視することを強くお勧めします。 つまり、リンクされたリソース (およびその子) は、リポジトリー・プロバイダーによって サポートされるアクションから除外されなければなりません。 さらに、リポジトリー・プロバイダー実装がデフォルトの IMoveDeleteHook を オーバーライドする場合、リポジトリー・プロバイダーは、リンクされたリソースに対するデフォルトの移動および削除の動作を使用する必要があります。
チーム・プロバイダーは IResource.isLinked() を 使用して、リソースがリンクであるかどうかを判別できます。 ただし、このメソッドはリンクのルートに対してのみ true を戻します。 次のコード・セグメントは、リソースがリンクの子であるかどうかを判別するために使用できます。
String linkedParentName = resource.getProjectRelativePath().segment(0); IFolder linkedParent = resource.getProject().getFolder(linkedParentName); boolean isLinked = linkedParent.isLinked();
リポジトリー・プロバイダーは、上記のコードが true に評価されるリソースを無視する必要があります。