// 一覧用テンプレート
#topicpath
----

#contents

プラグインからEclipseのワークスペース上のリソースを操作する方法をまとめます。
**全体の構成 [#s9356f95]

Eclipseのワークスペース関連のAPIは
-ワークスペース全体を表すorg.eclipse.core.resources.IWorkspaceRoot
-その下の各プロジェクトorg.eclipse.core.resources.IProject
-プロジェクト内のリソースorg.eclipse.core.resources.IResource

のような構成となっています。これらへの参照を取得して、そのオブジェクトのメソッドを呼び出してワークスペースを操作するわけですね。

あ、これらのAPIを使用するには
 org.eclipse.core.resources
を依存関係に追加してください。



**ワークスペースの参照を取得する [#k467344b]
 IWorkspace workspace = ResourcesPlugin.getWorkspace();
 IWorkspaceRoot root = workspace.getRoot();

これでワークスペースへの参照を取得することができます。このIWorkspaceRoot から各プロジェクトへの参照を取得することができます。


**プロジェクトへの参照を取得する [#t157b35f]
 IWorkspaceRoot root = workspace.getRoot();
 IProject[] projects = root.getProjects();
これで現在起動しているワークスペース内のプロジェクトを配列で取得することできました。また、
 IProject project = root.getProject([プロジェクト名の文字列]);
などとしてプロジェクト名指定で参照を取得することもできます。



**プロジェクトを作成する [#t157b35f]
先のメソッドでプロジェクトを取得することができましたが、プロジェクトを作成するには以下のようにします。

 IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
 IProject project = root.getProject("hogehoge");
 if (!project.exists()) {
   try {
     project.create(null);
   } catch (CoreException e1) {
     // TODO 自動生成された catch ブロック
     e1.printStackTrace();
   }
 }
プロジェクトが存在するときにcreateを実行すると
 org.eclipse.core.internal.resources.ResourceException: リソース /hogehoge はすでに存在します。
のように例外が発生するため、存在チェックをしています。またプロジェクトを作成する
 IProject#create(IProgressMonitor monitor)
メソッドは時間がかかる場合があるため、引数にIProgressMonitorを取ります。ここではとりあえずnullを渡してますが。

**プロジェクト内の各リソース [#ea1f2338]
プロジェクト内のリソースはすべて
 org.eclipse.core.resources.IResource
というインタフェース(とそのサブインタフェース)を実装しています。以下のような構成ですね。

#ref(IResource.png)


プロジェクト内のリソースは
 ↓projectはIProjectのインスタンス
 project.accept(new IResourceVisitor() {
   public boolean visit(IResource resource) throws CoreException {
     switch (resource.getType()) {
     case IResource.FILE:
       logger.debug("飛んできたVisitor: " + resource + " ファイルだ");
       // IJavaElement file = JavaCore.create(resource);
       // if (file instanceof ICompilationUnit) {
       // logger.debug("さらにICompilationUnitだ");
       // } else {
       // logger.debug("でもICompilationUnitじゃない");
       // }
       break;
     case IResource.FOLDER:
       logger.debug("飛んできたVisitor: " + resource + " フォルダだ");
       break;
     case IResource.PROJECT:
       logger.debug("飛んできたVisitor: " + resource + " プロジェクトだ");
       break;
     case IResource.ROOT:
       logger.debug("飛んできたVisitor: " + resource + " ROOTだ");
       break;
     default:
       logger.debug("飛んできたVisitor: " + resource + " その他だ");
       break;
     }
     return true;
   }
 });

などとすることで取得できます。これはVisitorパタンになっていて、プロジェクト内のツリーを走査していきます。走査したときにvisitメソッドが呼ばれるので、引数のresourceから情報を取り出せばよいわけですね。またこのIResource#getType()を使って型のタイプを取得することができます。タイプは
  public static final int FILE = 0x1;
  public static final int FOLDER = 0x2;
  public static final int PROJECT = 0x4;
  public static final int ROOT = 0x8;
などがあるみたいですね。ROOTってのはようわからんのですが。

上のコードではたとえば以下のような結果が得られます。

 飛んできたVisitor: P/Samples プロジェクトだ
 飛んできたVisitor: F/Samples/source フォルダだ
 飛んできたVisitor: F/Samples/source/nu フォルダだ
 飛んできたVisitor: F/Samples/source/nu/mine フォルダだ
 飛んできたVisitor: F/Samples/source/nu/mine/kino フォルダだ
 飛んできたVisitor: L/Samples/source/nu/mine/kino/BL.java ファイルだ
 飛んできたVisitor: F/Samples/classes フォルダだ
 飛んできたVisitor: F/Samples/classes/nu フォルダだ
 飛んできたVisitor: F/Samples/classes/nu/mine フォルダだ
 飛んできたVisitor: F/Samples/classes/nu/mine/kino フォルダだ
 飛んできたVisitor: L/Samples/classes/nu/mine/kino/BL.class ファイルだ
 飛んできたVisitor: L/Samples/build.properties ファイルだ
 飛んできたVisitor: F/Samples/META-INF フォルダだ
 飛んできたVisitor: L/Samples/META-INF/MANIFEST.MF ファイルだ
 飛んできたVisitor: L/Samples/.project ファイルだ
 飛んできたVisitor: L/Samples/.classpath ファイルだ


***Visitor以外の方法 [#kd5c3cea]
IResourceのサブインタフェースIContainerに定義されている
 public IResource[] members() throws CoreException;
を使用して、
 IResource[] resources = project.members();
 for (IResource resource : resources) {
   System.out.println(resource);
 }
などとして子要素を取得することもできます。結果は
 L/Samples/.classpath
 L/Samples/.project
 F/Samples/META-INF
 L/Samples/build.properties
 F/Samples/classes
 F/Samples/source
です。でもこれだと一階層下のリソースしか取得できないですね。



**ディレクトリを作成する [#s73ab009]





**Javaソースコードから、対応するリソースを取得する [#v783dbb5]



***コンテンツ一覧 [#f5b87e5a]
#ls2

***関連リンク [#ee033052]
-[[プラグインでリソースを扱う>http://www13.plala.or.jp/observe/PDE/PDEResources.html]]




----
この記事は
#vote(おもしろかった,そうでもない)

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS