Eclipseプラグイン実践テクニック(6)

Eclipse開発の効率をアップするために


NTTデータ先端技術 竹添直樹
NTTデータ 基盤システム事業本部 岡本隆史
2007/2/13


 Javaオブジェクトをコントリビュートするには?

 前節の例では、文字列をコントリビュートしましたが、これまでの連載でも見てきたとおり、実際の拡張ポイントでは、何らかの機能を提供するJavaオブジェクトをコントリビュートしたいというケースの方が多いことでしょう。ここでは、次のようなインターフェイスを実装したJavaオブジェクトをコントリビュート可能な拡張ポイントを作成してみます。

リスト4 IMessageProviderインターフェイス
public interface IMessageProvider {
    public String getMessage();
}

 先ほどと同じ手順で新たな拡張ポイントを追加します。Javaオブジェクトをコントリビュートできるようにするには、属性のタイプを「java」に指定します。拡張欄に基底クラス名、実装欄に実装インターフェイス名を指定しておくこともできます。

図6 Javaオブジェクトをコントリビュート可能な拡張ポイント
図6 Javaオブジェクトをコントリビュート可能な拡張ポイント

 この拡張ポイントに対して、以下のようにコントリビュートします。class属性には、IMessageProviderインターフェイスを実装したクラスを指定します。

リスト5 jp.sf.amateras.extension.messageProviderへのコントリビュート例
<extension point="jp.sf.amateras.extension.messageProvider">
    <contributor class="jp.sf.amateras.extension.MessageProvider1"/>
    <contributor class="jp.sf.amateras.extension.MessageProvider2"/>
</extension>

 コントリビュートされた拡張を読み取るコードは以下のようになります。前節の例と異なるのは下記リスト6(1)でIConfigurationElementからcreateExecutableExtension()メソッドでclass属性で指定されたJavaクラスのインスタンスを取得している部分です。

リスト6 コントリビュートされたJavaオブジェクトを取得するコード例
IExtensionRegistry registry = Platform.getExtensionRegistry();

// 拡張ポイントを取得
IExtensionPoint point = registry.getExtensionPoint(
    Activator.getDefault().getBundle().getSymbolicName()         +".messageProvider");

// コントリビュートされた拡張を取得
IExtension[] extensions = point.getExtensions();

for(int i=0;i<extensions.length;i++){
    IConfigurationElement[] elements         = extensions[i].getConfigurationElements();

    for(int j=0;j<elements.length;j++){
        if(elements[j].getName().equals("contributor")){
            try {
                //class属性で指定されたクラスの
                //インスタンスを取得                    (1)
                IMessageProvider provider
                    = (IMessageProvider)elements[j]
                        .createExecutableExtension("class");

                String message = provider.getMessage();



            } catch(CoreException ex){
                ex.printStackTrace();
            }
        }
    }
}

 

 プラグイン内のリソースもコントリビュートできる

 拡張ポイントのスキーマで属性をresourceとしておくと、プラグイン内のリソースをコントリビュートすることが可能になります。Eclipseプラットフォームが提供している拡張ポイントでも、ビューやエディタ、アクションなどのアイコンを指定できますが、これと同じと考えるとよいでしょう。

図7 属性のタイプをresourceに指定
図7 属性のタイプをresourceに指定

 PlatformからコントリビュータであるプラグインのBundleを取得し、そのgetEntry()メソッドによってプラグイン内のリソースをURLオブジェクトとして参照できます。以下は、icon属性で指定された画像ファイルをSWT(Standard Widget Kit)のImageオブジェクトとして読み込む場合の例です。

編集部注SWTそのものについて詳しく知りたい読者は、連載米持先進技術工房−@IT分室の第2回「EclipseのVEでSWTアプリを作る(前編)」をご参照ください。

IConfigurationElement element =



IContributor contributor = element.getContributor();
String iconPath = element.getAttribute("icon");
if(iconPath!=null){
    // リソースのURLを取得
    URL url = Platform.getBundle(
        contributor.getName()).getEntry(iconPath);
    // イメージを作成
    InputStream in = url.openStream();
    ImageData data = new ImageData(in);
    Image image = new Image(Display.getDefault(), data);



}


 最後に…「Eclipse開発の効率をアップするために」

 今回作成したサンプルはここからダウンロードできます。

 さて、冒頭でも述べたとおり、本連載も今回で終了となります。長らくお付き合いいただきありがとうございました。

 EclipseはJava開発者にとって、もはやなくてはならない道具となっています。もちろん、Eclipseが標準で提供している機能だけでも十分に便利なのですが、プラグインを開発できれば、自分の必要とする機能を自由に追加できます。普段使い込んでいるツールだからこそ、より自分の作業がしやすいようカスタマイズすることで、より一層開発効率も向上するというものです。本連載では、そんな思いを込めてEclipseの拡張方法についてできるだけ多くのトピックを取り上げてきました。

 もちろん、Eclipseの提供しているAPIや拡張ポイントは膨大ですから、本連載では、それらのうち特に重要なものをごく一部取り上げたにすぎません。それでも、Eclipseプラグイン開発の一端に触れていただくことはできたのではないか、と思っています。

 本連載が少しでも皆さんのEclipseライフの手助けとなったのであれば幸いです。

2/2

 INDEX
第6回 拡張ポイントを作成してレッツ、コントリビュート!
  Page1
拡張ポイントで「Hello, World!!」
  まずは、拡張ポイントを追加する
  拡張ポイントのスキーマ定義はどうなっているか?
  コントリビュートされた内容を読み取る
Page2
Javaオブジェクトをコントリビュートするには?
プラグイン内のリソースもコントリビュートできる
最後に…「Eclipse開発の効率をアップするために」





ご意見、ご感想はJava Solution 会議室へどうぞ


Java Solution全記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間