リソースおよびファイル・システムに関する前の記述 (ディスク・ロケーションへのリソースのマッピング) では、プロジェクト内のリソースすべてがファイル・システムで同じ場所にあることが条件でした。通常、これは正しいことです。 ただし、プロジェクト内のファイルおよびフォルダーをプロジェクトのロケーションの外にあるファイル・システムに保管できるよう、ワークベンチにはリンクされたリソースの概念が用意されています。
リンクされたリソースは、実質的にファイル・システムのどの場所にも置くことができます。また、プロジェクト・ロケーションの外に (別のプロジェクト内にも) 存在することができます。リンクされたリソースのロケーションには、いくつか制限があります。メソッド IWorkspace.validateLinkLocation は、リンクされたリソースを作成するため、与えられたロケーションが有効であることを確実にします。
リンクされたリソースは、メソッド IFolder.createLink
または IFile.createLink を使用して作成されます。与えられたリソースがリンクされたリソースであるかどうかプログラマチックに判別するには、メソッド IResource.isLinked を使用することができます。このメソッドは、リンクされたリソースについてのみ true
を返しますが、リンクされたリソースの子の場合は返しません。
リンクされたリソースを作成するため、またリソースがリンクされているかどうか調べるためのこれらの特殊なメソッドとは別に、リンクされたリソースを操作するときに通常のワークスペース API を使用することができます。最も考慮すべきことは、リンクされたリソースが、実際にはワークスペース内のその他のリソースのように機能することです。ただし、リンクされたリソースを移動、コピー、または削除する際には、いくつかの制限があります。それぞれの操作およびその制限に関する情報については、IResource およびそのサブクラスを参照してください。
リンクされたリソースのロケーションを指定するとき、パス変数を使用できます。 パス変数とは、ファイル・システム内のロケーションにショートカットを定義する単純なマッピング (ストリング -> IPath またはストリング -> URI) です。変数は、ハードコーディングされた絶対ファイル・システム・パスが使用される場所の数を減らすことによって、リンクされたリソースの管理を簡単にします。
パス変数は、以下の方法でユーザーのリンク済みリソースの管理を合理化します。
このリストの最後の項目は、簡単な説明になっています。ユーザーがリンク済みリソースをプロジェクト内に作成すると、そのリンク済みリソースの説明が、プロジェクトのロケーションにあるプロジェクト記述ファイル (".project") に追加されます。パス変数を使用することによって、ユーザーはプロジェクトを共用 (プロジェクトの内容のコピー、またはリポジトリーの使用によって) でき、それぞれのワークステーションに適合するよう変数を再定義できます。たとえば、あるユーザーが外部リソースをあるシステムの c:¥temp に保管し、別のユーザーが Unix を使用して同じリソースを /home/username/tmp に保管できます。
それぞれのワークスペース (TEMP=c:¥temp
および TEMP=/home/userb/tmp
) でパス変数を定義することによって、ユーザーはこの相違を回避し、リンク済みリソースの入ったプロジェクトをそのまま共用できます。
IPathVariableManager は、パス変数を作成、操作、および解決するための API を定義します。また、変数名および値を作成する前に、それらを検査し、パス変数定義が変更されたときに通知を受けるリスナーをインストールするためのメソッドを提供します。 IWorkspace.getPathVariableManager を使用すると、このクラスのインスタンスを入手することができます。詳しくは、このセクションの最後にあるコード・サンプルを参照してください。
メソッド IResource.getRawLocationURI を使用すると、リンク済みリソースの未解決のロケーションを見つけることができます。つまり、実際のパス変数名を値に解決せず、そのパス変数名を得ることができます。 リソース・ロケーションがパス変数で定義されていない場合は、getRawLocationURI メソッドが getLocationURI メソッドのように機能します。
リソースをプログラマチックに操作するクライアントは、壊れたリンクの可能性について知っておかなければなりません。壊れたリンクは、リンク済みリソースのロケーションが存在しない場合、またはロケーションが未定義のパス変数に相対して指定されている場合に起こります。以下の特殊なケースは、IResource の使用時に適用されます。
null
を返す。
いくつかのプラグインはリンク済みリソースを操作できないため、それらを使用不可にするためにいくつかの手段があります。プロジェクトの内容すべてがそのプロジェクトのデフォルト・ロケーションに置かれていることを常に必要とするプラグインを作成する場合、これらの手段を使用して、リンク済みリソースを置きたくない場所にそれらを作成することをユーザーに禁止することができます。
最初の手段はプロジェクト・ネーチャー拒否 と呼ばれます。自身のプロジェクト・ネーチャーを定義すると、そのネーチャーがリンク済みリソースと互換性を持たないことをネーチャー定義に指定できます。ネーチャー拒否を使用するネーチャー定義の例は以下のとおりです。
<extension id="myNature" name="My Nature" point="org.eclipse.core.resources.natures"> <runtime> <run class="com.xyz.MyNature"/> </runtime> <options allowLinking="false"/> </extension>
リンク済みリソースの作成を禁止する 2 つ目の手段はチーム・フック です。自身のリポジトリー・インプリメンテーションを定義すると、リポジトリー・タイプと共用されているプロジェクトでリンク済みリソースの作成を禁止するため、org.eclipse.core.resources.teamHook 拡張ポイントを使用することができます。デフォルトでリポジトリー・プロバイダーは、リポジトリーに接続されているプロジェクトでリンク済みリソースを 許可していません。
リポジトリー・サポートが、リンク済みリソースを認識しない古いプラグインによって提供されている場合、それらのプロジェクトにリンク済みリソースを作成することはできません。
最後に、ワークスペース全体でリンク済みリソースを使用不可にするために使用できる設定があります。前の 2 つの拒否手段がプロジェクトごとの基準で動作するのに対し、この設定はワークスペース内のプロジェクトすべてに影響します。この設定をプログラマチックに設定するには、設定
ResourcesPlugin.PREF_DISABLE_LINKING
を使用してください。これが設定されていても、ユーザーまたはプラグインは、この設定をオフにすることによって上書きできます。
コードでのリンク済みリソースの使用例です。まず、パス変数の定義から始めます。
IWorkspace workspace = ResourcesPlugin.getWorkspace(); IPathVariableManager pathMan = workspace.getPathVariableManager(); String name = "TEMP"; IPath value = new Path("c:¥¥temp"); if (pathMan.validateName(name).isOK() && pathMan.validateValue(value).isOK()) { pathMan.setValue(name, value); } else { //invalid name or value, throw an exception or warn user }
これで、定義されたパス変数に対応するリンク済みリソースを作成できます。
IProject project = workspace.getProject("Project");//assume this exists IFolder link = project.getFolder("Link"); IPath location = new Path("TEMP/folder"); if (workspace.validateLinkLocation(location).isOK()) { link.createLink(location, IResource.NONE, null); } else { //invalid location, throw an exception or warn user }
以上です。これで、ワークスペース内のリンク済みフォルダー "Link" が "c:¥temp¥folder" に作成されました。
最後に、リンク済みリソースに関連する他のメソッドの動作を示すため、このリンク済みリソースのコードスニペットの例をあげます。
link.getFullPath() ==> "/Project/Link" link.getLocation() ==> "c:¥temp¥folder" link.getRawLocation() ==> "TEMP/folder" link.isLinked() ==> "true" IFile child = link.getFile("abc.txt"); child.create(...); child.getFullPath() ==> "/Project/Link/abc.txt" child.getLocation() ==> "c:¥temp¥folder¥abc.txt" child.getRawLocation() ==> "c:¥temp¥folder¥abc.txt" child.isLinked() ==> "false"