2015-01-14 24 views
0

我曾经使用PackageAdmin.getBundles()来查询由symbolicName和version range安装的bundle。但这个班被弃用。在OSGi容器中查询功能的正确方法是什么

现在我知道我应该使用IdentityNamespace(在这种情况下)使用功能和查询包。

但是,查询容器中安装的所有软件包提供的功能的正确和最快的方法是什么?

我应该创建一个从BundleContext.getBundles()获取所有包的数组的方法。然后遍历这样的数组,使BundleRevision的每个bundle都适应,然后尝试匹配它的getDeclaredCapabilities()方法返回的功能?还是有其他简单的方法?

回答

2

我应该自己创建一个从BundleContext.getBundles()获取所有包的数组的方法。然后遍历这样的数组,使BundleRevision的每个bundle都适应,然后尝试匹配它的getDeclaredCapabilities()方法返回的功能?还是有其他简单的方法?

差不多。你应该:

  • 获得从BundleContext的
  • 可用捆束适应BundleWirings
  • 从BundleWirings

获取的能力如:

Bundle[] bundles = context.getBundles(); 
foreach(Bundle : bundles) { 
    BundleWiring bundleWiring = bundle.adapt(BundleWiring.class); 
    List<BundleCapability> capabilities = bundleWiring.getCapabilities(null); 
    myCapabilityBasedLogic(capabilities); 
} 

欲了解更多信息,请参阅documentation of BundleWiring类。

更新

如果一个Bundle处于安装状态,它没有BundleWiring。我编写了一个代码片段,以便获取已安装捆绑软件的功能:https://github.com/everit-org/osgi-lqmg/blob/master/src/main/java/org/everit/osgi/dev/lqmg/internal/EquinoxHackUtilImpl.java

查看函数getAllCapabilities(bundles,state)

相关的代码片段:

PlatformAdmin platformAdmin = systemBundleContext.getService(platformServiceSR); 
State state = platformAdmin.getState(); 
Bundle[] bundles = systemBundleContext.getBundles(); 

List<BundleCapability> availableCapabilities = new ArrayList<BundleCapability>(); 
for (Bundle bundle : bundles) { 
    BundleDescription bundleDescription = state.getBundle(bundle.getBundleId()); 
    List<BundleCapability> declaredCapabilities = bundleDescription.getDeclaredCapabilities(null); 
    availableCapabilities.addAll(declaredCapabilities); 
} 
return availableCapabilities; 

我想有一个菲利克斯类似的可能性。如果你发现它的工作原理,请与我分享,我也会为Felix创建一个HackUtil实现;)。

如果你想要一个通用手工制作的解决方案,你可以解析提供-能力出口型包装安装包的报头。你可以用felix-utils来解析头文件。这个库被嵌入到许多技术中,但我也重新打包并上传到maven-central,作为OSGi bundle。你的代码可以类似于以下内容:

Dictionary<String, String> headers = installedBundle.getHeaders(); 
String header = headers.get("Provide-Capability"); 

if (header != null) { 
    // Parse with felix-utils 
    Clause[] clauses = Parse.parseHeader(header); 
    for(Clause clause : clauses) { 
     String nameSpace = clause.getName(); 
     Attribute[] attributes = clause.getAttributes(); 
     Directive[] directives = clause.getDirectives(); 

     processCapability(nameSpace, attributes, directives); 
    } 
} 

,只要你想,你必须实现processCapability。您还可以解析导出包标题并将它们转换为基于OSGi规范的功能。

+0

嗯,我的理解是,一个bundle在其状态为Installed时没有BundleWiring。这不正确吗? – Cristiano

+0

你说得对。我以为你只需要可用的功能。用我现在知道的所有信息更新答案:)。 –

相关问题