Должен ли я создать себе метод, который получает массив всех связок из BundleContext.getBundles(). Затем переместите такой массив, адаптируя каждый комплект для BundleRevision, а затем попытайтесь сопоставить возможности, возвращаемые его методом 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.
Update
В случае 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;
Я предполагаю, что есть подобная возможность в Феликсе. Если вы узнаете, как это работает, поделитесь им со мной, и я также создам реализацию HackUtil для Felix;).
Если вы хотите универсальное решения ручной работы, вы можете разбор Предоставлять-Capability и Экспорта-пакет заголовков установленного Bundle. Вы можете анализировать заголовок с помощью felix-utils. Эта библиотека встроена во многие технологии, но я также повторно упаковал ее и загрузил ее в maven-central как OSGi bundle. You код может выглядеть примерно следующим образом:
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.
Ну, я понял, что у пучка нет BundleWiring, когда его состояние установлено. не так ли? – Cristiano
Вы правы. Я думал, что вам нужны только доступные возможности. Обновленный ответ со всей информацией, которую я знаю в данный момент :). –