2010年12月15日水曜日

5.2.3 サービスの登録 (Registering Services)

バンドルは, フレームワークサービスレジストリーにサービスオブジェクトを登録することにより, サービスを公開する. フレームワークに登録されたサービスオブジェクトは, OSGi 環境にインストールされた他のバンドルから見えるようになる.

A bundle publishes a service by registering a service object with the Framework service registry. A service object registered with the Framework is exposed to other bundles installed in the OSGi environment.

登録されたサービスオブジェクトは全て, 一意な ServiceRegistration オブジェクトと, そのサービスを参照する一つ以上の ServiceReference オブジェクトを持つ. これらの ServiceReference オブジェクト群は, 当該サービスオブジェクトが実装するサービスインターフェース群を含む登録プロパティー群を公開する. 希望するサービスインターフェースを実装するサービスオブジェクトを取得するため, ServiceReference オブジェクトを使用することができる.

Every registered service object has a unique ServiceRegistration object, and has one or more ServiceReference objects that refer to it. These ServiceReference objects expose the registration properties of the service object, including the set of service interfaces they implement. The ServiceReference object can then be used to acquire a service object that implements the desired service interface.

フレームワークは, バンドルがサービスオブジェクトを動的に登録および登録解除することを許可している. そのため, バンドルは STARTING, ACTIVE, STOPPING の状態の間はいつでもサービスオブジェクトを登録することが可能である.

The Framework permits bundles to register and unregister service objects dynamically. Therefore, a bundle is permitted to register service objects at any time during the STARTING, ACTIVE or STOPPING states.

バンドルは, BundleContext オブジェクトの BundleContext.registerService メソッドのいずれかを呼ぶことにより, サービスオブジェクトをフレームワークに登録する.

A bundle registers a service object with the Framework by calling one of the BundleContext.registerService methods on its BundleContext object.

  • registerService(String,Object,Dictionary) - 一つのサービスインターフェースのもとに登録されるサービスオブジェクト用
  • registerService(String[],Object,Dictionary) - 複数のサービスインターフェースのもとに登録されるサービスオブジェクト用
  • registerService(String,Object,Dictionary) - For a service object registered under a single service interface.
  • registerService(String[],Object,Dictionary) - For a service object registered under multiple service interfaces.

バンドルが登録しようしているサービスのサービスインターフェースの名前は, registerService メソッドの引数として渡す. フレームワークは, 渡されたオブジェクトがサービスファクトリーでない限り, そのサービスオブジェクトが実際に, 指定されたサービスインターフェース群のインスタンスであることを確認しなければならない. 134 ページの「サービスファクトリー」を参照のこと.

The names of the service interfaces under which a bundle wants to register its service are provided as arguments to the registerService methods. The Framework must ensure that the service object actually is an instance of each specified service interfaces, unless the object is a Service Factory. See Service Factory on page 134.

この確認をおこなうため, フレームワークは, 当該バンドルもしくは共有パッケージから, 指定されたサービスインターフェース群それぞれの Class オブジェクトをロードしなければならない. 各 Class オブジェクト毎に Class.isInstance が呼ばれなければならず, サービスオブジェクトを引数とした Class オブジェクトに対して, Class.isInstance は true を返さなければならない.

To perform this check, the Framework must load the Class object for each specified service interface from either the bundle or a shared package. For each Class object, Class.isInstance must be called and return true on the Class object with the service object as the argument.

登録しようとしているサービスオブジェクトについて, サービスのプロパティー群を (キー, 値) の組の集合として含んだ Dictionary オブジェクトを用いて, より詳細に記述してもよい.

The service object being registered may be further described by a Dictionary object, which contains the properties of the service as a collection of key/value pairs.

サービスオブジェクトの登録が成功したサービスインターフェース名群は, objectClass キーでサービスオブジェクトのプロパティーに自動的に追加される. この値はフレームワークにより自動的に設定され, バンドルが提供したいかなる値も上書きされなければならない.

The service interface names under which a service object has been successfully registered are automatically added to the service object's properties under the key objecClass. This value must be set automatically by the Framework and any value provided by the bundle must be overridden.

サービスオブジェクトの登録に成功したときは, フレームワークは呼び出し元に ServiceRegistration オブジェクトを返さなければならない. サービスオブジェクトは, その ServiceRegistration オブジェクトのホルダーによってのみ登録解除することができる (unregister() メソッド参照のこと). サービスオブジェクトの登録は, 同じサービスオブジェクトが複数回登録された場合でも, 成功したときには一意の ServiceRegistration オブジェクトを生成しなければならない.

If the service object is successfully registered, the Framework must regturn ServiceRegistration object to the caller. A service object can be unregistered only by the holder of its ServiceRegistration object (see the unregister() method). Every successfull service object registration must yield a unique ServiceRegistration object even if the same service object is registered multiple times.

サービスオブジェクト登録後にサービスオブジェクトのプロパティーを確実に変更する唯一の方法は, ServiceRegistration オブジェクトを使用することである (setProperties(Dictionary) 参照のこと). サービスオブジェクト登録後にサービスオブジェクトの Dictionary オブジェクトを変更しても, サービスのプロパティーに何ら影響しないかもしれない.

Using the ServiceRegistration object is the only way to reliably change the service object's properties after it has been registered (see setProperties(Dictionary)). Modifying a service object's Dictionary object after the service object is registered may not have any effect on the service's properties.

サービスオブジェクトの登録プロセスは, パーミッション検査の対象となる. 登録しようとしているバンドルは, 指定した全てのサービスインターフェースにサービスオブジェクトを登録するための ServicePermission[{name},REGISTER] パーミッションを持たなければならない. パーミッションを持たない場合は, 当該サービスオブジェクトは登録されてはならず, SecurityException が投げられなければならない.

The process of registering a service object is subject to a permission check. The registering bundle must have ServicePermission[<name>,REGISTER] to register the service object under all the service interfaces specifed. Otherwise, the service object must not be registered, and a SecurityException must be thrown.