OSGi アプリケーションの探索
org.apache.aries.blueprint パッケージ内 のクラスを使用して、OSGi アプリケーション・プログラミング・モデルを拡張できます。 このサード・パーティー SPI は blueprint-1.0 サーバー・フィーチャー を通して提供されます。拡張を適用するには、OSGi アプリケーション・バンドルに アクセスする必要があります。Liberty プロファイルでは、OSGi アプリケーションはサブシステムとして実行されます。 OSGi アプリケーションを見つけるために、 ユーザー・フィーチャー内に ServiceTracker を作成できます。
このタスクについて
このトピックは、ユーザー・フィーチャーの開発者が、実行中の OSGi アプリケーション を見つける方法について説明します。このタスクは、OSGi アプリケーション に対するプログラミング・モデル拡張を提供する多くのユーザー・フィーチャー で必要とされます。例えば、新規ユーザー・フィーチャーがそのような拡張を提供するために、 新規バンドル・エクステンダー (コンテナー と呼ばれることもある) を実装 したり、もっと単純に、特定の OSGi アプリケーション内から公開されたサービスを 追跡して起動したりすることが考えられます。
そのようなユーザー・フィーチャー は、特定の実行中の OSGi アプリケーションの BundleContext を使用して、 新規 BundleTracker インスタンスおよび ServiceTracker インスタンスを作成する必要があります。この BundleContext は、OSGi アプリケーションと関連付けられた org.osgi.service.subsystem.Subsystem から 取得できます。以下の手順は、その SubSystem サービスを取得する方法を説明しています。
手順
ユーザー・フィーチャー内で ServiceTracker を 作成することによって OSGi アプリケーションを見つけるには、以下のステップを実行します。
- 見つけたいサブシステムをターゲットとする org.osgi.framework.Filter を作成します。
- ステップ 1 で作成したフィルターを使用して、見つけたい OSGi アプリケーションと関連付けられた org.osgi.service.subsystem.Subsystem サービス を取得する、org.osgi.util.tracker.ServiceTracker を作成します。 この Subsystem サービス・インスタンスは、 OSGi アプリケーションに関する作業に必要なものをすべて提供します。
例
import org.osgi.framework.BundleContext;
import org.osgi.service.subsystem.Subsystem;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
String SERVICE_FILTER = "(&(objectClass=org.osgi.service.subsystem.Subsystem)
(subsystem.type=osgi.subsystem.application)(subsystem.symbolicName=my.app))"
org.osgi.framework.Filter filter = ctx.createFilter(SERVICE_FILTER);
org.osgi.util.tracker.ServiceTracker<Subsystem, Subsystem> str = new ServiceTracker<Subsystem, Subsystem>(ctx, filter, null);
org.osgi.framework.Constants.OBJECTCLASS;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_SYMBOLICNAME_PROPERTY;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_APPLICATION;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_PROPERTY;