追加したユーザーは T.Yamamoto です。最後に編集したユーザーは T.Yamamotoで、その日時は 2009-12-23 20:07:12 です。
Groovyからサービスを利用する
GroovyのActivatorからOSGiサービスを利用するのは簡単です。次の例では、前の節で作ったサービスを発見し呼び出す方法を示していますが、これは別のサービスにも容易に適用できるでしょう。サービス自体がGroovyで書かれているか、Javaやその他の言語で書かれているかはまったく意識する必要がありません。サービスの実装の詳細は、OSGiモジュールシステムによって完全に隠蔽されているはずです。また、この例はGroovyで書かれてはいますが、Javaで書いた場合とそう大きな違いはありません。
前の節のサービスを利用するためには、Activatorのstart(BundleContext)メソッドでBundleContextからそのサービスを取得する必要があります:
package org.codehaus.groovy.osgi.harnessimport org.osgi.framework.BundleActivator
import org.osgi.framework.BundleContext
import org.osgi.framework.ServiceRegistration
import org.osgi.framework.ServiceReference
import org.codehaus.groovy.osgi.GroovyGreeterclass HarnessActivator implements BundleActivator { void start(BundleContext context) {
String serviceName = GroovyGreeter.class.name
ServiceReference[] references = context.getAllServiceReferences(serviceName, null) println "${ references ? references.size() : 0 } GroovyGreeter services found." references?.each { ServiceReference ref ->
Object serviceHandle = context.getService(ref)
GroovyGreeter service = serviceHandle
service.sayHello()
}
} void stop(BundleContext context) {
}
}サービスはインタフェース名で登録したので、このActivatorは該当インタフェースについて問い合わせを行い、見つかったすべてのプロバイダを出力しています。このActivatorは、名前とパッケージが変更されていることに注意してください。前の例ではorg.codehaus.groovy.osgiをエクスポートしていたので、この例では衝突を避けるために異なるパッケージを選ぶ必要があったのです。なお、このコード例では読みやすさのために変数の型を明示的に宣言しました。
この例をパッケージ化して実行するためには、次のようなレイアウトのJarを作成する必要があるでしょう:
hello-groovy-test-harness.jar
--META-INF
----MANIFEST.MF
--org
----codehaus
------groovy
--------osgi
----------harness
------------HarnessActivator.class
------------HarnessActivator$ start closure1.class
そしてmanifestでは、前の例のorg.codehaus.groovy.osgiをインポートする必要があります:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.0
Created-By: 10.0-b19 (Sun Microsystems Inc.)
Built-By: user
provider: org.codehaus.groovy.osgi.harness
Bundle-ManifestVersion: 2
Bundle-Name: Groovy OSGi Test Harness
Bundle-SymbolicName: org.codehaus.groovy.osgi.harness.hello-groovy-tes
t-harness
Bundle-Version: 1.0.0
Bundle-Activator: org.codehaus.groovy.osgi.harness.HarnessActivator
Bundle-Vendor: Groovy
Bundle-Localization: plugin
Import-Package: org.codehaus.groovy.runtime.typehandling;version="1.0.
0",org.codehaus.groovy.osgi;version="1.0.0",groovy.lang;version="1.7.
0.beta-1-SNAPSHOT",org.codehaus.groovy.reflection;version="1.7.0.beta
-1-SNAPSHOT",org.codehaus.groovy.runtime;version="1.7.0.beta-1-SNAPSH
OT",org.codehaus.groovy.runtime.callsite;version="1.7.0.beta-1-SNAPSH
OT",org.w3c.dom,org.osgi.framework;version="1.3.0"
Bundle-ClassPath: .
OSGiコンソールでこのバンドルをインストールしてテストしましょう。このバンドルをインストールするために、まずgroovy-allバンドルをインストールする必要があります:
osgi> install file:///home/user/dev/groovy-core/src/examples/osgi/../../../target/dist/groovy-all-1.7-beta-1-SNAPSHOT.jar
Bundle id is 6osgi> install file:///home/user/dev/groovy-core/src/examples/osgi/build/hello-groovy-test-harness.jar
Bundle id is 7osgi> ssFramework is launched.id State Bundle
0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-1900
6 INSTALLED groovy-all_1.7.0.beta-1-SNAPSHOT
7 INSTALLED org.codehaus.groovy.osgi.harness.hello-groovy-test-harness_1.0.0
バンドルを起動するためには、groovy-allバンドルが起動されていることと、hello-groovyバンドルがインストールされている必要があります:
osgi> install file:///home/user/dev/groovy-core/src/examples/osgi/build/hello-bundle-imports-groovy.jar
Bundle id is 8osgi> start 6osgi> start 7
0 GroovyGreeter services found.
GroovyGreeterサービスを見つけ、起動するには、hello-groovyバンドルを起動してからharnessを再起動してください:
osgi> ssFramework is launched.id State Bundle
0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-1900
6 ACTIVE groovy-all_1.7.0.beta-1-SNAPSHOT
7 ACTIVE org.codehaus.groovy.osgi.harness.hello-groovy-test-harness_1.0.0
8 RESOLVED org.codehaus.groovy.osgi.hello-groovy-bundle_1.0.0osgi> start 8
Groovy BundleActivator startedosgi> stop 7osgi> start 7
1 GroovyGreeter services found.
Hello from the Groovy Greeter!
OSGiコンソールを探検することは価値ある学習体験になるでしょう。すべてのバンドルをロードしたら、"bundle"、"headers"、"services"、"packages"などのコマンドを試してみましょう。"help"と打てばヘルプが利用できます。