« 拡張ポイントの自作(1) | トップページ | なぜcreateExecutableExtensionを用いるべきか? »

2004.01.29

拡張ポイントの自作(2)

さて,拡張ポイントの自作(1)まででとりあえずの準備は完了。観測者,つまり拡張ポイントを使用して機能を追加する側のプラグインでは,以下のような記述が可能になる。

  <plugin id="yoichiro.observer" ...>
    <requires>
      <import plugin="yoichiro.subject"/>
    </requires>
    <extension point="yoichiro.subject.observers">
      <observer
        class="yoichiro.observer.ConcreteObserver"
      </observer>
    </extension>
  </plugin>

class属性で指定しているConcreteObserverクラスは,先ほどのIObserverインタフェースの実装クラスである。

さて被観測者は,上記のように各プラグインが拡張ポイントに登録してきた情報を取得し,class属性で指定されたクラスのインスタンスを生成して,IObserverインタフェースで規定したupdateメソッドを呼び出さなければならない。それは以下のコードで実現できる。

  private static final String observerId = "yoichiro.subject.observers";
  public void notify() {
    IPluginRegistry registry = Platform.getPluginRegistry();
    IExtensionPoint extensionPoint =
      registry.getExtensionPoint(observerId);
    IExtension[] extensions = extensionPoint.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("observer")) {
          try {
            Object observer =
              elements[j].createExecutableExtension("class");
            if (observer instanceof IObserver) {
              ((IObserver)observer).update();
            }
          } catch (CoreException e) {
            e.printStackTrace();
          }
        }
      }
    }
  }

PlatformクラスからgetPluginRegistryメソッドを使ってIPluginRegistryオブジェクトを取得する。そしてgetExtensionPointメソッドに拡張ポイントIDを渡すことにより,拡張ポイント自体の情報を持つIExtensionPointオブジェクトを取得する。これは,<extension-point>定義の情報を取得しているというイメージである。そして更にgetExtensionsメソッドを呼び出して,各種プラグインが拡張ポイントに提供してきた情報をIExtensionオブジェクトの配列として取得する。IExtensionオブジェクトは,extension要素全体の情報を持つとイメージすればよい。

個々のIExtensionオブジェクトに対して,getConfigurationElementsメソッドを呼び出し,extension要素の子要素群をIConfigurationElementオブジェクトの配列として取得する。今回は子要素としてobserver要素しか相手にしないので,getNameメソッドを使って要素名を取得し,observer要素かどうかを検査している。

さて,observer要素の情報を取得できたので,次はclass属性で指定されたクラスのインスタンスを生成し,updateメソッドを呼び出すのだが,安易に属性値を取得してClass.forName().newInstance()などを行うべきではない。ちゃんとEclipseが用意してくれている。それがcreateExecutableExtensionメソッド。これに属性名を渡すことで,属性値で指定されたクラスのインスタンスを生成し返却してくれる。あとはそれをIObserverインタフェース型にキャストし,updateメソッドを呼び出してめでたしめでたしとなる。

|

« 拡張ポイントの自作(1) | トップページ | なぜcreateExecutableExtensionを用いるべきか? »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/12631/148003

この記事へのトラックバック一覧です: 拡張ポイントの自作(2):

« 拡張ポイントの自作(1) | トップページ | なぜcreateExecutableExtensionを用いるべきか? »