2010-06-15 16 views
5

Busco extensiones que implementan un punto de extensión específica, y estoy usando el siguiente método aceptable para hacer esto:conseguir OSGi paquete de Eclipse IConfigurationElement

IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); if (extensionRegistry == null) { return PLANTILLAS; }

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

Luego me gustaría obtener la versión del paquete definitorio. Utilizaría la siguiente API, pero la API para PluginVersionIdentifier está obsoleta:

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

IExtension declarando la extensión = e.getDeclaringExtension(); PluginVersionIdentifier versionIdentifier = declarando Extensión.getDeclaringPluginDescriptor(). GetVersionIdentifier();

No pude encontrar una alternativa en la nueva API, es decir, desde IConfigurationElement, cómo obtengo el descriptor de ID de la versión del paquete. Obviamente, del Bundle puedo obtener la versión usando Bundle.getHeaders(), obteniendo el valor Bundle-Version, pero ¿cómo obtengo el Bundle en primer lugar? Platform.getBundle (bundleId) no es suficiente, ya que podría tener varias versiones del mismo paquete instaladas, y necesito saber quién soy. En este momento tengo una situación de huevo de pollo &, y la única solución que tengo es la anterior API obsoleta.

Respuesta

0

Sugiero navegar un poco las descripciones de desaprobación Javadoc, el reemplazo está documentado. Encontré el siguiente código, pero no lo probé.

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

Por curiosidad: ¿por qué necesita obtener la versión del complemento extendido? Hasta donde yo sé, el objetivo del mecanismo del punto de extensión es separar la información específica sobre el extensor, y solo se necesita la información descrita en la extensión (plugin.xml) o el código al que se hace referencia.

+0

otra vez, esto realmente no me ayuda, ya que puede haber múltiples paquetes con esa ID, pero solo uno de ellos dentro de los cuales ESTA extensión está definida. Otro punto, Bundle no tiene un método getVersion. La razón por la que necesito esto es porque estoy registrando una 'plantilla de documento' como punto de extensión, y es posible que tenga diferentes versiones de esta plantilla. Entonces, cuando se carga una plantilla, me gustaría saber de qué versión se trata, para notación, etc. Por ahora, uso un atributo adicional en el esquema para mi punto de extensión, lo cual es una pena. –

+0

Creo que ese atributo adicional es la mejor solución. De esta forma, es posible actualizar el complemento sin actualizar la versión de la extensión y sin modificar el receptor para actualizar la nueva versión. Es interesante que el paquete no contenga el método getVersion(). Quizás es un método nuevo en Eclipse 3.6, que estaba usando cuando investigué al colaborador. –

3

Toda esta información se basa en Eclipse 3.6:

Su IContributor habrá una instancia de RegistryContributor si se encuentra en el entorno OSGi que por supuesto usted es o no estaríamos teniendo esta cuestión.

RegistryContributor le ofrece dos métodos: getID() y getActualID(). getID() puede devolver el paquete del host si se cargó desde un fragmento. getActualID() siempre carga la identificación del fragmento/paquete que representa el colaborador. Puede usar esta identificación en su método BundleContext.getBundle(long id). Aquí hay un fragmento:

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());   
} 

utilizo una caída a través del método que se degradan con gracia a una solución conscientes no versión si IContributor recibe una nueva aplicación por defecto en el futuro. El ID del paquete es exclusivo de una instancia de OSGi, por lo que cargará la versión correcta del paquete.