今度は「jp.co.thinkit.equinox.hello.ui」プロジェクトにある「META-INF/MANIFEST.MF」を開いてください(リスト4)。
リスト4:jp.co.thinkit.equinox.hello.uiのMANIFEST.MF
(省略)
Bundle-Name: Ui Plug-in
Bundle-SymbolicName: jp.co.thinkit.equinox.hello.ui
Bundle-Version: 1.0.0
Bundle-Activator: jp.co.thinkit.equinox.hello.ui.internal.UIActivator
Import-Package: org.osgi.framework;version="1.3.0",
org.osgi.util.tracker;version="1.3.3"
Eclipse-LazyStart: true
Require-Bundle: org.eclipse.jface
Export-Package: jp.co.thinkit.equinox.hello.ui
「jp.co.thinkit.equinox.hello.ui」プロジェクトでは「Bundle-Activator」として「jp.co.thinkit.equinox.hello.ui.internal.UIActivator」クラスを指定しています。
それでは「jp.co.thinkit.equinox.hello.ui.internal.UIActivator」クラスを開いてください(リスト5)。
※注1:
今回はティッカー表示に使用しているSWTやJFaceの部分の説明は割愛します。
リスト5:jp.co.thinkit.equinox.hello.ui.internal.UIActivatorクラス
(画像をクリックすると別ウィンドウに拡大図を表示します)
startメソッドにて「org.osgi.framework.ServiceTracker」クラスのインスタンスを作成しています。このServiceTrackerクラスはその名の通り、OSGiフレームワークに登録されているServiceを追跡するクラスです。
コンストラクタにはBundleContextのインスタンス、サービス名、フィルタを指定します。
インスタンスを作成後、ServiceTracker#open()メソッドを呼び出すことでOSGiフレームワークに登録されているサービスの追跡を開始します。サービスの取得はUIActivatorクラスの43行目で行っています(リスト6)。
リスト6:jp.co.thinkit.equinox.hello.ui.internal.UIActivatorクラスの43行目
Object[] services = tracker.getServices();
このように呼び出すことでServiceTrackerクラスが追跡しているサービスをすべて取得しています。ServiceTrackerの主要なメソッドを表2に示します。
メソッド名 |
役割 |
open() |
サービスの追跡を開始します。 |
getService() |
追跡しているサービスの中で一番優先度の高いサービスを返却します。同じ優先度だった場合はIDが小さい方(先に登録された方)を返却します。 |
getServices() |
追跡しているサービスをすべて取得します。 |
close() |
サービスの追跡を終了します。 |
表2:org.osgi.framework.ServiceTrackerの主要なメソッド
OSGiではBundleContextインターフェースとServiceRegistrationインターフェース、ServiceTrackerクラスを操作することでサービスの動的な追加を実現しています。
|