2010-06-15 2 views
5

ich für Erweiterungen suchen, das eine bestimmte Nebenstelle zu implementieren, und bin mit der folgenden akzeptable Methode, dies zu tun:bekommen OSGi-Bundle von Eclipse-IConfigurationElement

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

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

Ich möchte dann die Version des definierenden Bundle erhalten. Ich würde die folgende API verwenden, aber die API für PluginVersionIdentifier ist veraltet:

für (IConfigurationElement e: config) { BlueprintTemplate Vorlage = neue BlueprintTemplate();

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

Ich konnte keine Alternative in der neuen API finden - d. H. Von einem IConfigurationElement, wie bekomme ich den Versions-ID-Deskriptor des Bundles. Natürlich kann ich aus dem Bundle die Version mit Bundle.getHeaders() bekommen, die den Bundle-Version Wert bekommt - aber wie bekomme ich das Bundle an erster Stelle ??? Platform.getBundle (bundleId) ist nicht genug, da ich möglicherweise mehrere Versionen desselben Bundles installiert habe und ich muss wissen, wer ich bin. Im Moment habe ich ein Huhn & Ei-Situation, und die einzige Lösung, die ich habe, ist die oben veraltete API.

Antwort

0

Ich schlage vor, ein wenig die Javadoc Deprecation Beschreibungen zu durchsuchen, der Ersatz ist dokumentiert. Ich habe den folgenden Code gefunden, habe ihn aber nicht getestet.

Aus Neugier: Warum brauchen Sie die Version des Plug-in zu verlängern? Soweit ich weiß, besteht das Ziel des Erweiterungspunktmechanismus darin, spezifische Informationen über den Extender zu entfernen, und nur die Informationen, die in der Erweiterung (plugin.xml) oder dem referenzierten Code beschrieben sind, werden benötigt.

+0

wieder hilft mir das nicht wirklich, da es möglicherweise mehrere Bundles mit dieser ID gibt, aber nur eine davon, in der diese Erweiterung definiert ist. Ein weiterer Punkt, Bundle hat keine getVersion-Methode. Der Grund, warum ich das brauche, ist, dass ich eine 'Dokumentvorlage' als Erweiterungspunkt registriere und möglicherweise verschiedene Versionen dieser Vorlage habe. Wenn also ein Template geladen wird, würde ich gerne wissen, welche Version es ist, für die Notation usw. Vorläufig habe ich ein extra Attribut im Schema für meinen Erweiterungspunkt verwendet, was sehr schade ist. –

+0

Ich denke, dieses zusätzliche Attribut ist die bessere Lösung. Auf diese Weise ist es möglich, das Plug-In zu aktualisieren, ohne die Erweiterungsversion zu aktualisieren, und ohne den Empfänger für die Aktualisierung auf die neue Version zu ändern. Es ist interessant, dass das Bündel die Methode getVersion() nicht enthält. Vielleicht ist es eine neue Methode in Eclipse 3.6, die ich bei der Recherche des Beitragenden verwendet habe. –

3

Alle diese Informationen basiert auf Eclipse 3.6:

Ihre IContributor wird eine Instanz von RegistryContributor sein, wenn Sie in der OSGi-Umgebung sind die natürlich Sie sind, oder würden Sie nicht dieses Problem werden muss.

RegistryContributor gibt Ihnen zwei Methoden: getID() und getActualID(). getID() kann das Host-Paket zurückgeben, wenn dieses von einem Fragment geladen wurde. getActualID() lädt immer die ID des Fragments/Pakets, das der Beitragende repräsentiert. Sie können diese ID in Ihrer BundleContext.getBundle(long id) Methode verwenden. Hier ist ein Ausschnitt:

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

ich einen Sturz durch Methode verwenden, die elegant auf eine nicht-Version bewusst Lösung abgebaut werden, wenn IContributor eine neue Default-Implementierung in der Zukunft geht. Die Paket-ID ist für eine Instanz von OSGi eindeutig und lädt die richtige Version des Pakets.