получение пакета OSGI из Eclipse IConfigurationElement - PullRequest
5 голосов
/ 15 июня 2010

Я ищу расширения, которые реализуют конкретную точку расширения, и использую следующий приемлемый метод для этого:

IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry ();if (extensionRegistry == null) {return ШАБЛОНЫ;}

IConfigurationElement [] config = extensionRegistry.getConfigurationElementsFor ("com.ibm.im.launchpoint.templates.template");

Затем я хотел бы получить версию определяющего пакета.Я бы использовал следующий API, но API для PluginVersionIdentifier устарел:

for (IConfigurationElement e: config) {BlueprintTemplate template = new BlueprintTemplate ();

IExtension declaringExtension = e.getDeclaringExtension ();PluginVersionIdentifier versionIdentifier = declaringExtension.getDeclaringPluginDescriptor (). GetVersionIdentifier ();

Я не смог найти альтернативу в новом API - то есть из IConfigurationElement, как мне получить дескриптор идентификатора версии пакета.Очевидно, что из Bundle я могу получить версию, используя Bundle.getHeaders (), получая значение Bundle-Version - но как мне получить Bundle в первую очередь ???Platform.getBundle (bundleId) недостаточно, поскольку у меня может быть установлено несколько версий одного и того же пакета, и мне нужно знать, кто я.На данный момент у меня ситуация с курицей и яйцом, и единственное решение, которое у меня есть, - это устаревший API.

Ответы [ 2 ]

4 голосов
/ 29 января 2011

Вся эта информация основана на Eclipse 3.6:

Ваш IContributor будет экземпляром RegistryContributor, если вы находитесь в среде OSGI, которая, конечно, вы есть, или у вас не будет этой проблемы.

RegistryContributor предоставляет вам два метода: getID() и getActualID(). getID() может вернуть хост-пакет, если он был загружен из фрагмента. getActualID() всегда загружает идентификатор фрагмента / пакета, который представляет автор. Вы можете использовать этот идентификатор в своем методе BundleContext.getBundle(long id). Вот фрагмент кода:

Bundle bundle;
if (contributor instanceof RegistryContributor) {
  long id = Long.parseLong(((RegistryContributor) contributor).getActualId());
  Bundle thisBundle = FrameworkUtil.getBundle(getClass());
  bundle = thisBundle.getBundleContext().getBundle(id);
} else {
  bundle = Platform.getBundle(contributor.getName());          
}

Я использую альтернативный метод, который будет постепенно переходить к решению, не поддерживающему версию, если в будущем IContributor получит новую реализацию по умолчанию. Идентификатор пакета уникален для экземпляра OSGi, поэтому он будет загружать правильную версию пакета.

0 голосов
/ 15 июня 2010

Я предлагаю немного просмотреть описания Javadoc для устаревших, замена задокументирована. Я нашел следующий код, но не проверял его.

String contributor = e.getDeclaringExtension().getContributor().getName();
Bundle bundle = Platform.getBundle(contributor);
Version versionInfo = bundle.getVersion();

Из любопытства: зачем вам нужна версия расширяемого плагина? Насколько я знаю, цель механизма точек расширения состоит в том, чтобы отделить конкретную информацию о экстендере, и необходима только информация, описанная в расширении (plugin.xml) или ссылочном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...