2010-06-15 5 views
5

je me extensions qui mettent en œuvre un point d'extension spécifique, et emploie le procédé suivant acceptable pour ce faire:obtenir OSGI Bundle de Eclipse IConfigurationElement

IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); if (extensionRegistry == null) { return MODÈLES; }

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

Je voudrais ensuite obtenir la version du bundle de définition. J'utiliserais l'API suivante, mais l'API pour PluginVersionIdentifier est obsolète:

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

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

Je ne trouvais pas d'alternative dans la nouvelle API, c'est-à-dire d'un IConfigurationElement, comment puis-je obtenir le descripteur d'id de version de l'ensemble. Évidemment, à partir du Bundle, je peux obtenir la version en utilisant Bundle.getHeaders(), obtenant la valeur Bundle-Version - mais comment puis-je obtenir le Bundle en premier lieu? Platform.getBundle (bundleId) n'est pas suffisant car il se peut que plusieurs versions du même bundle soient installées, et j'ai besoin de savoir qui je suis. En ce moment j'ai une situation d'oeuf & de poulet, et la seule solution que j'ai est l'API désapprouvée ci-dessus.

Répondre

0

Je suggère de parcourir un peu les descriptions de dépréciation de Javadoc, le remplacement est documenté. J'ai trouvé le code suivant, mais je ne l'ai pas testé. Par curiosité: pourquoi avez-vous besoin de la version du plug-in d'extension? Pour autant que je sache, le but du mécanisme de point d'extension est de détacher des informations spécifiques sur l'extension, et seules les informations décrites dans l'extension (plugin.xml) ou le code référencé sont nécessaires.

+0

encore, cela ne m'aide pas vraiment, car il pourrait y avoir plusieurs paquets avec cet ID, mais seulement l'un d'entre eux dans lequel cette extension est définie. Autre point, Bundle n'a pas de méthode getVersion. La raison pour laquelle j'en ai besoin est que je suis en train d'enregistrer un «modèle de document» en tant que point d'extension, et que ce modèle peut avoir différentes versions. Donc, quand un template se charge, j'aimerais savoir quelle version il est, pour la notation, etc. Pour l'instant, j'ai utilisé un attribut supplémentaire dans le schéma pour mon point d'extension, ce qui est dommage. –

+0

Je pense que cet attribut supplémentaire est la meilleure solution. De cette façon, il est possible de mettre à jour le plug-in sans mettre à jour la version de l'extension, et sans modifier le récepteur pour mettre à jour pour la nouvelle version. Il est intéressant que le bundle ne contienne pas la méthode getVersion(). Peut-être que c'est une nouvelle méthode dans Eclipse 3.6, que j'utilisais lorsque j'ai recherché le contributeur. –

3

Toutes ces informations sont basées sur Eclipse 3.6:

Votre IContributor sera une instance de RegistryContributor si vous êtes dans l'environnement OSGi qui bien sûr vous êtes ou vous ne seriez pas rencontrez ce problème. RegistryContributor vous donne deux méthodes: getID() et getActualID().

getID() peut renvoyer le bundle hôte s'il a été chargé à partir d'un fragment. getActualID() charge toujours l'ID du fragment/faisceau que le contributeur représente. Vous pouvez utiliser cet identifiant dans votre méthode BundleContext.getBundle(long id). Voici un extrait:

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

J'utilise une chute par la méthode qui se dégradera grâce à une solution non-consciente version si IContributor obtient une nouvelle implémentation par défaut à l'avenir. L'identifiant du bundle est unique à une instance d'OSGi, il chargera donc la version correcte du bundle.

Questions connexes