2011-01-13 12 views
1

サービス登録を監視するバンドルを作成しようとしています。サービスインターフェイスのAPIバンドルに埋め込まれている特定のメタデータに応じて、いくつかの追加タスクが実行されます。メタデータは主に1つ以上のプロパティファイルで構成されていますので、私はBundle.findEntries()を使用することを考えましたが、メタデータはAPIバンドルに埋め込まれているため、ServiceReference.getBundle().findEntries()のような処理はできません。 APIバンドルには含まれていません。1つのバンドルがServiceReferenceから別のバンドルのBundleインスタンスを取得する方法はありますか?

私はServiceReferenceたObjectClassプロパティからサービスAPIのクラス名を取得して、パッケージ管理サービスまたはFrameworkUtil.getBundle()のいずれかを使用して考えたが、これらの両方がClassが必要です - しかし、どのように私は、サービス・インターフェースのClassを得るのですか?この作業を行っているバンドルはおそらくクラスのパッケージをインポートしていないので、Class.forName()は動作しません。

私の他の選択肢は、バンドルとサービスの両方のイベントを監視することです。最初はメタデータを含むバンドルのレジストリを作成し、2番目はサービスが登録されたときに最初のレジストリを作成します。その道を進む前に、もっと簡単な方法があるかどうかを探しています。

答えて

4

免責事項:私はこれを試していないが、私はそれが仕事をするべきだと合理的に確信しています。

ServiceReferenceObjectClassからpackagenameを得ることができるので、ここではパッケージをフレームワークで見つけることができます。 を考えると、あなたは私たちがここでやっていること

public Bundle getExporterOf(String package, ServiceReference ref) { 

    ExportedPackage[] packages = packageAdmin.getExportedPackages(packageName); 
    if (packages == null) { 
    return null; 
    } 
    for (ExportedPackage package : packages) { 
    Bundle[] importers = package.getImportingBundles()) { 
    if (importers == null) { 
     continue; 
    } 
    for (Bundle bundle : importers) { 
     if (bundle.getBundleId() == ref.getBundle().getBundleId()) { 
     return package.getExportingBundle 
     } 
    } 
    } 
} 

ような何かを行うことができ、バンドルサービスの輸入を登録してものを見つける、(複数あるかもしれません)指定したパッケージ名を持つすべてのパッケージを見つけることですそのパッケージをエクスポートしたバンドルを取得します。あなたはおそらくメソッドを少し良くすることができます。

+0

私は 'PackageAdmin'を使ってExportedPackagesを取得することは一度も考えていませんでした。ありがとう! –

関連する問題