プラグインから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
というインタフェース(とそのサブインタフェース)を実装しています。以下のような構成ですね。
プロジェクト内のリソースは
↓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 ファイルだ
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
です。でもこれだと一階層下のリソースしか取得できないですね。
'Eclipse/プラグイン開発のTIPS集/ワークスペースのリソースを取り扱う/' には、下位層のページがありません。
この記事は
現在のアクセス:48144