我曾经使用PackageAdmin.getBundles()来查询由symbolicName和版本范围安装的bundle。但是这个课程已被弃用。
现在我知道我应该使用IdentityNamespace(在本例中)使用功能和查询包。
但是查询容器中安装的所有捆绑包提供的功能的正确和最快的方法是什么?
我应该创建一个从BundleContext.getBundles()获取所有bundle数组的方法。然后遍历这样的数组,为BundleRevision调整每个bundle,然后尝试匹配其getDeclaredCapabilities()方法返回的功能?还是有其他简单的方法?
答案 0 :(得分:2)
我应该创建一个从BundleContext.getBundles()获取所有bundle数组的方法。然后遍历这样的数组,为BundleRevision调整每个bundle,然后尝试匹配其getDeclaredCapabilities()方法返回的功能?还是有其他简单的方法?
几乎。你应该:
e.g:
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(包,状态)。
相关的代码段:
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有类似的可能性。如果你发现它是如何工作的,请与我分享,我也将为Felix创建一个HackUtil实现;)。
如果您需要通用的手工制作解决方案,则可以解析已安装的Bundle的 Provide-Capability 和 Export-Package 标头。您可以使用felix-utils解析标头。这个库嵌入到许多技术中,但我也重新打包它并将其作为OSGi bundle上传到maven-central。您的代码可能类似于以下内容:
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 。您还可以解析 Export-Package 标头,并根据OSGi规范将它们转换为功能。