Eclipse/プラグイン開発のTIPS集/ワークスペースのリソースを取り扱う
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
// 一覧用テンプレート
#topicpath
----
#contents
プラグインからEclipseのワークスペース上のリソースを操作す...
**全体の構成 [#s9356f95]
Eclipseのワークスペース関連のAPIは
-ワークスペース全体を表すorg.eclipse.core.resources.IWork...
-その下の各プロジェクトorg.eclipse.core.resources.IProject
-プロジェクト内のリソースorg.eclipse.core.resources.IReso...
のような構成となっています。これらへの参照を取得して、そ...
あ、これらのAPIを使用するには
org.eclipse.core.resources
を依存関係に追加してください。
**ワークスペースの参照を取得する [#k467344b]
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
これでワークスペースへの参照を取得することができます。こ...
**プロジェクトへの参照を取得する [#t157b35f]
IWorkspaceRoot root = workspace.getRoot();
IProject[] projects = root.getProjects();
これで現在起動しているワークスペース内のプロジェクトを配...
IProject project = root.getProject([プロジェクト名の文字...
などとしてプロジェクト名指定で参照を取得することもできま...
**プロジェクトを作成する [#t157b35f]
先のメソッドでプロジェクトを取得することができましたが、...
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().get...
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: ...
のように例外が発生するため、存在チェックをしています。ま...
IProject#create(IProgressMonitor monitor)
メソッドは時間がかかる場合があるため、引数にIProgressMoni...
**プロジェクト内の各リソース [#ea1f2338]
プロジェクト内のリソースはすべて
org.eclipse.core.resources.IResource
というインタフェース(とそのサブインタフェース)を実装して...
#ref(IResource.png)
プロジェクト内のリソースは
↓projectはIProjectのインスタンス
project.accept(new IResourceVisitor() {
public boolean visit(IResource resource) throws CoreEx...
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 + " ...
break;
default:
logger.debug("飛んできたVisitor: " + resource + " ...
break;
}
return true;
}
});
などとすることで取得できます。これはVisitorパタンになって...
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.cla...
飛んできた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以外の方法 [#y79c79d0]
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]
プロジェクト内にディレクトリやファイルを作成する方法です...
-プロジェクトを取得
-プロジェクトのルートから相対的なパスを取得
-実際に生成する
といった手順となります。たとえばプロジェクトHogeProjectに...
/HogeProject/tmp/xml
というディレクトリを掘るコードは以下のようなります。
IFolder tmpDir = project.getFolder(new Path("tmp")); <-...
if (!tmpDir.exists()) {
tmpDir.create(false, true, null); <-実際に作成
}
IFolder xmlDir = tmpDir.getFolder(new Path("xml"));
if (!xmlDir.exists()) {
xmlDir.create(true, true, null);
}
IFolder tmpDir = project.getFolder(new Path("tmp"));
で、プロジェクト直下にディレクトリtmpを作成します。作成と...
tmpDir.create(false, true, null);
です。またサンプルコードは、ファイルが存在しない場合作成...
このIFolderのメソッド
public void create(boolean force, boolean local,
IProgressMonitor monitor) throws CoreException;
の引数ですが、意味は以下の通りみたいです。
:boolean force|ワークスペース内のリソースと、実際のファイ...
:boolean local|実際のファイルシステムにもディレクトリを作...
:IProgressMonitor monitor|GUIのモニタを表示する場合にセッ...
第一引数の指定で挙動がどう変わるかを、とりあえずワークス...
localがtrueの場合
|BGCOLOR(#CCFFFF):LEFT:ファイルシステム上に|>|BGCOLOR(#CC...
|BGCOLOR(#CCFFFF):LEFT:ワークスぺース上に|BGCOLOR(#CCFFFF...
|BGCOLOR(#CCFFFF):LEFT:force = true|LEFT:例外|LEFT:ワーク...
|BGCOLOR(#CCFFFF):LEFT:force = false|LEFT:例外|LEFT:例外|...
ファイルシステム上になくて、ワークスペース上にある場合、f...
localがfalseの場合
|BGCOLOR(#CCFFFF):LEFT:ファイルシステム上に|>|BGCOLOR(#CC...
|BGCOLOR(#CCFFFF):LEFT:ワークスぺース上に|BGCOLOR(#CCFFFF...
|BGCOLOR(#CCFFFF):LEFT:force = true|LEFT:例外|LEFT:ワーク...
|BGCOLOR(#CCFFFF):LEFT:force = false|LEFT:例外|LEFT:例外|...
ようするにlocalがfalseの場合、ファイルシステム上には何も...
まあワークスペースとファイルシステムが同期がとれてない場...
**ファイルを作成する [#p709bf89]
次にファイルです。ファイル作成時はファイルの中身を渡して...
public void create(InputStream source, boolean force,
IProgressMonitor monitor) throws CoreException;
の引数InputStreamですね。通常ファイルの内容からStringを作...
String contents = "Hello World."; <-ファイルの中身
InputStream is = new ByteArrayInputStream(contents.getBy...
ディレクトリの場合と同様、挙動を調べてみました。
|BGCOLOR(#CCFFFF):LEFT:ファイルシステム上に|>|BGCOLOR(#CC...
|BGCOLOR(#CCFFFF):LEFT:ワークスぺース上に|BGCOLOR(#CCFFFF...
|BGCOLOR(#CCFFFF):LEFT:force = true|LEFT:例外|LEFT:ワーク...
|BGCOLOR(#CCFFFF):LEFT:force = false|LEFT:例外|LEFT:例外|...
あれ、でもこれだと普通にファイルを上書きすることができな...
file.delete(false, null);
を呼んでワークスペースとファイルシステムからファイルを消...
**Javaソースコードから、対応するリソースを取得する [#v783...
[[JDTまわりをやってて>Eclipse/プラグイン開発のTIPS集/Java...
// ソースコードに対応するファイルのIResource
IResource resource = cu.getCorrespondingResource();
対応するIResourceが取得できます。
***コンテンツ一覧 [#f5b87e5a]
#ls2
***関連リンク [#ee033052]
-[[Builderの作り方>http://www.limy.org/program/eclipse/pl...
toFile
-[[プラグインでリソースを扱う>http://www13.plala.or.jp/ob...
-Eclipse/プラグイン開発のTIPS集/Javaプロジェクトを操作する
-Eclipse/プラグイン開発のTIPS集/ソースコードを解析するパ...
-Eclipse/プラグイン開発のTIPS集/ソースコードを解析するパ...
----
この記事は
#vote(おもしろかった[11],そうでもない[0])
- 削除 -- &new{2014-12-25 (木) 16:38:20};
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
終了行:
// 一覧用テンプレート
#topicpath
----
#contents
プラグインからEclipseのワークスペース上のリソースを操作す...
**全体の構成 [#s9356f95]
Eclipseのワークスペース関連のAPIは
-ワークスペース全体を表すorg.eclipse.core.resources.IWork...
-その下の各プロジェクトorg.eclipse.core.resources.IProject
-プロジェクト内のリソースorg.eclipse.core.resources.IReso...
のような構成となっています。これらへの参照を取得して、そ...
あ、これらのAPIを使用するには
org.eclipse.core.resources
を依存関係に追加してください。
**ワークスペースの参照を取得する [#k467344b]
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
これでワークスペースへの参照を取得することができます。こ...
**プロジェクトへの参照を取得する [#t157b35f]
IWorkspaceRoot root = workspace.getRoot();
IProject[] projects = root.getProjects();
これで現在起動しているワークスペース内のプロジェクトを配...
IProject project = root.getProject([プロジェクト名の文字...
などとしてプロジェクト名指定で参照を取得することもできま...
**プロジェクトを作成する [#t157b35f]
先のメソッドでプロジェクトを取得することができましたが、...
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().get...
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: ...
のように例外が発生するため、存在チェックをしています。ま...
IProject#create(IProgressMonitor monitor)
メソッドは時間がかかる場合があるため、引数にIProgressMoni...
**プロジェクト内の各リソース [#ea1f2338]
プロジェクト内のリソースはすべて
org.eclipse.core.resources.IResource
というインタフェース(とそのサブインタフェース)を実装して...
#ref(IResource.png)
プロジェクト内のリソースは
↓projectはIProjectのインスタンス
project.accept(new IResourceVisitor() {
public boolean visit(IResource resource) throws CoreEx...
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 + " ...
break;
default:
logger.debug("飛んできたVisitor: " + resource + " ...
break;
}
return true;
}
});
などとすることで取得できます。これはVisitorパタンになって...
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.cla...
飛んできた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以外の方法 [#y79c79d0]
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]
プロジェクト内にディレクトリやファイルを作成する方法です...
-プロジェクトを取得
-プロジェクトのルートから相対的なパスを取得
-実際に生成する
といった手順となります。たとえばプロジェクトHogeProjectに...
/HogeProject/tmp/xml
というディレクトリを掘るコードは以下のようなります。
IFolder tmpDir = project.getFolder(new Path("tmp")); <-...
if (!tmpDir.exists()) {
tmpDir.create(false, true, null); <-実際に作成
}
IFolder xmlDir = tmpDir.getFolder(new Path("xml"));
if (!xmlDir.exists()) {
xmlDir.create(true, true, null);
}
IFolder tmpDir = project.getFolder(new Path("tmp"));
で、プロジェクト直下にディレクトリtmpを作成します。作成と...
tmpDir.create(false, true, null);
です。またサンプルコードは、ファイルが存在しない場合作成...
このIFolderのメソッド
public void create(boolean force, boolean local,
IProgressMonitor monitor) throws CoreException;
の引数ですが、意味は以下の通りみたいです。
:boolean force|ワークスペース内のリソースと、実際のファイ...
:boolean local|実際のファイルシステムにもディレクトリを作...
:IProgressMonitor monitor|GUIのモニタを表示する場合にセッ...
第一引数の指定で挙動がどう変わるかを、とりあえずワークス...
localがtrueの場合
|BGCOLOR(#CCFFFF):LEFT:ファイルシステム上に|>|BGCOLOR(#CC...
|BGCOLOR(#CCFFFF):LEFT:ワークスぺース上に|BGCOLOR(#CCFFFF...
|BGCOLOR(#CCFFFF):LEFT:force = true|LEFT:例外|LEFT:ワーク...
|BGCOLOR(#CCFFFF):LEFT:force = false|LEFT:例外|LEFT:例外|...
ファイルシステム上になくて、ワークスペース上にある場合、f...
localがfalseの場合
|BGCOLOR(#CCFFFF):LEFT:ファイルシステム上に|>|BGCOLOR(#CC...
|BGCOLOR(#CCFFFF):LEFT:ワークスぺース上に|BGCOLOR(#CCFFFF...
|BGCOLOR(#CCFFFF):LEFT:force = true|LEFT:例外|LEFT:ワーク...
|BGCOLOR(#CCFFFF):LEFT:force = false|LEFT:例外|LEFT:例外|...
ようするにlocalがfalseの場合、ファイルシステム上には何も...
まあワークスペースとファイルシステムが同期がとれてない場...
**ファイルを作成する [#p709bf89]
次にファイルです。ファイル作成時はファイルの中身を渡して...
public void create(InputStream source, boolean force,
IProgressMonitor monitor) throws CoreException;
の引数InputStreamですね。通常ファイルの内容からStringを作...
String contents = "Hello World."; <-ファイルの中身
InputStream is = new ByteArrayInputStream(contents.getBy...
ディレクトリの場合と同様、挙動を調べてみました。
|BGCOLOR(#CCFFFF):LEFT:ファイルシステム上に|>|BGCOLOR(#CC...
|BGCOLOR(#CCFFFF):LEFT:ワークスぺース上に|BGCOLOR(#CCFFFF...
|BGCOLOR(#CCFFFF):LEFT:force = true|LEFT:例外|LEFT:ワーク...
|BGCOLOR(#CCFFFF):LEFT:force = false|LEFT:例外|LEFT:例外|...
あれ、でもこれだと普通にファイルを上書きすることができな...
file.delete(false, null);
を呼んでワークスペースとファイルシステムからファイルを消...
**Javaソースコードから、対応するリソースを取得する [#v783...
[[JDTまわりをやってて>Eclipse/プラグイン開発のTIPS集/Java...
// ソースコードに対応するファイルのIResource
IResource resource = cu.getCorrespondingResource();
対応するIResourceが取得できます。
***コンテンツ一覧 [#f5b87e5a]
#ls2
***関連リンク [#ee033052]
-[[Builderの作り方>http://www.limy.org/program/eclipse/pl...
toFile
-[[プラグインでリソースを扱う>http://www13.plala.or.jp/ob...
-Eclipse/プラグイン開発のTIPS集/Javaプロジェクトを操作する
-Eclipse/プラグイン開発のTIPS集/ソースコードを解析するパ...
-Eclipse/プラグイン開発のTIPS集/ソースコードを解析するパ...
----
この記事は
#vote(おもしろかった[11],そうでもない[0])
- 削除 -- &new{2014-12-25 (木) 16:38:20};
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
ページ名: