2015-01-14 3 views
0

Раньше я использовал PackageAdmin.getBundles() для запроса пакетов, установленных символьным именем и диапазоном версий. Но этот класс был устаревшим.Каков правильный способ запроса возможностей в контейнере OSGi

Теперь я знаю, что я должен использовать возможности и пакеты запросов, используя IdentityNamespace (в данном случае).

Но каков правильный и быстрый способ запроса возможностей, предоставляемых всеми связями, установленными в контейнере?

Должен ли я создать себе метод, который получает массив из всех пакетов из BundleContext.getBundles(). Затем переместите такой массив, адаптируя каждый комплект для BundleRevision, а затем попытайтесь сопоставить возможности, возвращаемые его методом getDeclaredCapabilities()? или есть другие простые способы?

ответ

2

Должен ли я создать себе метод, который получает массив всех связок из 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.

+0

Ну, я понял, что у пучка нет BundleWiring, когда его состояние установлено. не так ли? – Cristiano

+0

Вы правы. Я думал, что вам нужны только доступные возможности. Обновленный ответ со всей информацией, которую я знаю в данный момент :). –

Смежные вопросы