我应该自己创建一个从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规范的功能。
嗯,我的理解是,一个bundle在其状态为Installed时没有BundleWiring。这不正确吗? – Cristiano
你说得对。我以为你只需要可用的功能。用我现在知道的所有信息更新答案:)。 –