Top / Eclipse / プラグイン開発のTIPS集 / ワークスペースのリソースを取り扱う

プラグインからEclipseのワークスペース上のリソースを操作する方法をまとめます。

全体の構成

Eclipseのワークスペース関連のAPIは

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

あ、これらのAPIを使用するには

org.eclipse.core.resources

を依存関係に追加してください。

ワークスペースの参照を取得する

IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();

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

プロジェクトへの参照を取得する

IWorkspaceRoot root = workspace.getRoot();
IProject[] projects = root.getProjects();

これで現在起動しているワークスペース内のプロジェクトを配列で取得することできました。また、

IProject project = root.getProject([プロジェクト名の文字列]);

などとしてプロジェクト名指定で参照を取得することもできます。

プロジェクトを作成する

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

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を渡してますが。

プロジェクト内の各リソース

プロジェクト内のリソースはすべて

org.eclipse.core.resources.IResource

というインタフェース(とそのサブインタフェース)を実装しています。以下のような構成ですね。

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以外の方法

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

です。でもこれだと一階層下のリソースしか取得できないですね。

ディレクトリを作成する

Javaソースコードから、対応するリソースを取得する

コンテンツ一覧

'Eclipse/プラグイン開発のTIPS集/ワークスペースのリソースを取り扱う/' には、下位層のページがありません。

関連リンク


この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

Top / Eclipse / プラグイン開発のTIPS集 / ワークスペースのリソースを取り扱う

現在のアクセス:48144


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