プロジェクト作成時の自動ビルダー設定ムズっ!
最近はあちこちで「プロジェクトでEclipse作ってるよ」という話を聞くようになった。汎用的なプラグインではなく,あくまで特定のプロジェクトの開発で使えるものを作っていることが多いようだ。つまり,潜在的なプラグイン開発者は着々と増えつつあるということだ。「 Eclipseプラグイン開発」ブログのアクセス数も着々である。
知り合いのNetPenguinクンも,悩めるプラグイン開発者になっているようだ。
Eclipseプラグイン開発3日目 Java プロジェクトや Tomcat プロジェクトなどの JDT のネイチャーが絡むプロジェクトを新規に作成した場合に、Java ビルダーだけでなく自作のビルダーをプロジェクトに自動的に追加するということをしたいのですが、JDT のビルダーやネイチャーが持つ拡張ポイントにはそのようなことを可能にするものは無いようです・・・orz
Eclipse自体は柔軟性があるが,各プラグインに関しては柔軟性があるかどうかは残念ながらバラバラである。うーん,JDTにそのような拡張ポイントがないとなると,どうしたものやら・・・ということで,ちょっと考えてみた。
結局は「プロジェクトが作成されたタイミング」がわかれば良いはず。プロジェクトはワークスペースに作られるので,ワークスペースに関するイベントを補足して,追加されたプロジェクトにJDTのネイチャーが登録されているかどうかを判断すれば,何とか実現できそうである。
さっそく検証してみる。まずは自作プラグインのPluginクラス内で,ワークスペースにイベントリスナーを追加する。
public class MyPlugin extends Plugin implements IStartup {
private IResourceChangeListener listener;
public void start(BundleContext context) throws Exception {
…
IWorkspace workspace = ResourcesPlugin.getWorkspace();
listener = new MyResourceChangeListener();
workspace.addResourceChangeListener(listener);
…
}
}
そして肝心のMyResourceChangeListenerだ。
public class MyResourceChangeListener implements IResourceChangeListener {
public void resourceChanged(IResourceChangeEvent event) {
IResourceDelta delta = event.getDelta();
IResourceDelta[] children = delta.getAffrectedChildren();
for (int i = 0; i < children.length; i++) {
if (children[i].getKind() & IResourceDelta.ADDED == 1) {
IResource resource = children[i].getResource();
if (resource instanceof IProject) {
IProject project = (IProject)resource;
// JDTネイチャーチェック&自作ネイチャー登録
}
}
}
}
}
ワークスペースに何らかの変更が生じたときに,その変更の差分を調査して,差分の種類が追加(IResourceDelta.ADDED)でそのリソースがプロジェクトだったと判断されれば,プロジェクトが新規に追加されたとわかる。あとは,JDTネイチャーが登録されているかどうかを見て,自作ネイチャーを足してあげればよい。
というわけで,一件落着!・・・と思いきや,結果として上記は完全にダメダメコードである。
単純なプロジェクトの作成時なら上記のコードでOKだが,例えばJavaプロジェクトの場合はうまく動作しない。Javaプロジェクト作成のウィザードでは,2枚目に移った時点で既に単純なプロジェクトが作成されてしまい,ウィザードの完了時に初めてJDTネイチャーが登録される。つまり,プロジェクトの作成とJDTネイチャーの登録のタイミングが異なるため,上記コードのIResourceDelta.ADDEDの監視だけでは足りないのだ。
IResourceDelta.CHANGEDも監視すればいいじゃん,と思ってしまうが,そうするとプロジェクトに関する修正をするたびにイベントが発火してしまい,「JDTネイチャーを持つプロジェクト作成時に」ということではなくなってしまう。
結局,単純にイベント発火とその種別を見ているだけではダメで,例えばMyResourceChangeListenerにて受け取ったイベントからIProjectオブジェクトと種別を取得してコレクションに覚えておき,IResourceDelta.ADDEDの次にIResourceDelta.CHANGEDになった時点を自前で判断する,ということをすれば,一応「JDTネイチャーを持つプロジェクト作成時に」というタイミングを判断できる。でも,将来にわたってJavaプロジェクト作成ウィザードの動作が同じとは限らないので,目先の工夫でしかないだろう。
今のEclipseのプロジェクト作成は,「プロジェクト=ネイチャーの組み合わせ」が完全に固定されたものであり,ちょっとダメダメかも。作りたいプロジェクトの特徴(ネイチャー)を自由に組み合わせてプロジェクトを作る,なんていうプロジェクト作成ウィザードの方が実はかっこいいかもしれない。