ServiceActivator#startメソッドとServiceActivator#stopメソッドでは、「org.osgi.framework.BundleContext」のインスタンスに対してサービスの追加・削除を行っています。「org.osgi.framework.BundleContext」インターフェースはOSGiフレームワーク全体で共有するサービスの制御や、Bundleの情報を取得するためのメソッドを規定したものです。BundleからOSGiフレームワーク全体の情報へアクセスするときは、このインターフェースを介してアクセスします。
BundleContext#registerServiceメソッドでBundleContextにサービスを追加しています。BundleContextの主要なメソッドを表1に示します。
メソッド名 |
役割 |
registerService (String,Object,Dictionary) |
BundleContextにサービスを登録します。Dictionaryにはサービスのプロパティを登録します。サービスのプロパティには優先度などが登録できます。指定できるプロパティは「org.osgi.framework.Constants」クラスに まとめられています。 |
getBundles() |
OSGiフレームワークにインストールされているすべてのBundleを取得します。他のBundleを参照するためにはBundleの名前の方が扱いやすいので、他のBundleを参照したい場合は主に使用するのはこちらでしょう。 |
getBundle(long) |
OSGiフレームワークにインストールされているBundleを取得します。残念ながらAPIにはBundleのIDを指定するものしか用意されていません。 |
getBundle() |
このBundleContextを参照しているBundleクラスを返却します。BundleContextはBundleクラスごとに用意されます。 |
表1:org.osgi.framework.BundleContextの主要なメソッド
サービスの削除には「org.osgi.framework.ServiceRegistration」インターフェースを利用します。また、ServiceRegistrationインターフェースはサービスのプロパティ情報の登録を行うなどサービスの登録情報を操作するインターフェースを規定しています。
リスト2-2で登録しているのは「jp.co.thinkit.equinox.hello.ui.INotificationService」インターフェースを実装した「jp.co.thinkit.equinox.hello.service.HelloNotificationService」クラスです。このINotificationServiceインターフェースはOSGiのインターフェースではなく、筆者が規定したインターフェースです。
このINotificationServiceインターフェースは「jp.co.thinkit.equinox.hello.ui」プロジェクトで定義しています(リスト3)。
リスト3:jp.co.thinkit.equinox.hello.ui.INotificationServiceインターフェース
(省略)
public interface INotificationService {
public List<? extends INotificationMessage> getContents();
}
INotificationMessageインターフェースはティッカーへ表示するコンテンツを保持するモデルを定義したものです。このインターフェースも「jp.co.thinkit.equinox.hello.ui」プロジェクトで定義されています。ティッカー表示に新しい通知を組み入れる場合はINotificationServiceインターフェースを実装し、BundleContextのインスタンスへ登録します。
このようにBundleContextのインスタンスへ登録するサービスはアプリケーションの開発者が作成できます。
OSGiフレームワークへ登録できるサービスには、ただのJava Objectを登録することもできます。サービスを登録するときに、そのサービスのインターフェースを明らかにしておくため、インターフェースの名前を基に登録してください。
|