2009年6月13日土曜日

EclipsePluginのBuilder追加での疑問

plugin.xmlのNatureの定義(org.eclipse.core.resources.natures)でbuilderを記述できると思うのですが、これを記述したとしてもbuilderが追加される訳でないのがふっと疑問になった。

<extension
id="AIRFlexProjectNature"
point="org.eclipse.core.resources.natures">
<runtime>
<run class="net.sf.amateras.air.natures.AIRFlexProjectNature"/>
</runtime>
<builder id="net.sf.amateras.air.MXMLBuilder"/>
</extension>
<extension
id="MXMLBuilder"
point="org.eclipse.core.resources.builders">
<builder hasNature="true">
<run class="net.sf.amateras.air.builder.AirBuilderManager"/>
</builder>
</extension>
view raw gistfile1.xsl hosted with ❤ by GitHub

こんな定義をかいてても、Natureのconfigure()で BuilderのIDを使ってICommandを作成し、IProjectDescription#setBuildSpecで設定する必要がある。

plugin.xmlで、そのNatureで使うBuilderのIDを設定しているんだから勝手に入ってくれてもいいのになぁーなんて。思って。

せめて、plugin.xmlで記述しているBuilderIDが取得できないもんか?
....コードにもIDを書かないといけないのが2重管理で面倒だし....
と思ってちょっと調べてみた。

Natureの拡張ポイントで設定されたBuilderIDは、IProjectNatureDescriptorの実装にはいってみるみたいです。
しかしながら、このインターフェースでは取得できるメソッドがなく、
org.eclipse.core.internal.resources.ProjectNatureDescriptor
という実装にキャストする必要があるみたい。internalだ。。なんか残念。

ちなみに、IProjectNatureDescriptorにはNatureの拡張ポイントで指定するrequires-natureを取得できるメソッドが用意されていて、Workspace#validateNatureSetから呼ばれています。

IProjectNatureDescriptorを取得するのは簡単で、こんな感じでとれます。
IProjectNatureDescriptor natureDescriptor = project.getWorkspace().getNatureDescriptor(NATURE_ID);
String[] builderIds = ((ProjectNatureDescriptor) natureDescriptor).getBuilderIds();
view raw gistfile1.java hosted with ❤ by GitHub


これで、Builderの設定があるIProjectNatureついて汎用的なコードが書けそうな気がする。
Natureの制約(requires-natureとかの記述)のチェックをして、Builderとして定義されているもの上記のコードを使って取得して登録してあげればOKOK?!
...internalだけど。

※追記
Natureの制約(requires-natureとかの記述)のチェックはNature#Configureではなくて、プロジェクト作成Wizardの時が正しいかも。
• • •