2010-06-15 12 views
5

मैं एक्सटेंशन है कि किसी विशेष एक्सटेंशन के बिंदु को लागू रहा हूँ, और निम्न स्वीकार्य विधि का उपयोग कर रहा यह करने के लिए:ग्रहण IConfigurationElement से OSGi बंडल हो रही

IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); यदि (एक्सटेंशन रजिस्ट्री == शून्य) { वापसी टेम्पलेट; }

आईसीओफ़िगरेशन एलिमेंट [] config = extensionRegistry.get कॉन्फ़िगरेशन एलिमेंट्स ("com.ibm.im.launchpoint.templates.template");

मैं फिर परिभाषित बंडल का संस्करण प्राप्त करना चाहता हूं। मैं निम्नलिखित एपीआई का उपयोग होगा, लेकिन PluginVersionIdentifier के लिए एपीआई अब मान्य नहीं है:

के लिए (IConfigurationElement ई: config)

{ BlueprintTemplate टेम्पलेट = नए BlueprintTemplate();

आईईक्स्टेंशन घोषणाकरण एक्सटेंशन = e.getDeclaringExtension(); प्लगइनवर्सनडिएंटिफायर संस्करणइडिएंटिफायर = घोषित करना एक्सटेंशन .getDeclaringPluginDescriptor()। GetVersionIdentifier();

मुझे नई एपीआई में कोई विकल्प नहीं मिला - यानी आईसीओफ़िगरेशन एलिमेंट से, मैं बंडल के संस्करण आईडी डिस्क्रिप्टर को कैसे प्राप्त करूं। जाहिर है, बंडल से मैं बंडल.getHeaders() का उपयोग कर संस्करण प्राप्त कर सकता हूं, बंडल-संस्करण मान प्राप्त कर रहा हूं - लेकिन मैं पहली जगह में बंडल कैसे प्राप्त करूं ??? Platform.getBundle (bundleId) पर्याप्त नहीं है क्योंकि मेरे पास एक ही बंडल के कई संस्करण स्थापित हो सकते हैं, और मुझे यह जानने की ज़रूरत है कि मैं कौन हूं। फिलहाल मेरे पास एक चिकन & अंडे की स्थिति है, और मेरे पास एकमात्र समाधान उपरोक्त बहिष्कृत एपीआई है।

उत्तर

0

मैं जवाडोक बहिष्करण विवरण को थोड़ा सा ब्राउज़ करने का सुझाव देता हूं, प्रतिस्थापन दस्तावेज किया जाता है। मुझे निम्नलिखित कोड मिला, लेकिन इसका परीक्षण नहीं किया।

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

जिज्ञासा से बाहर: आपको विस्तारित प्लग-इन का संस्करण क्यों प्राप्त करने की आवश्यकता है? जहां तक ​​मुझे पता है, विस्तार बिंदु तंत्र का लक्ष्य विस्तारक के बारे में विशिष्ट जानकारी को अलग करना है, और केवल एक्सटेंशन (plugin.xml) में वर्णित जानकारी या संदर्भित कोड की आवश्यकता है।

+0

फिर से, यह वास्तव में मेरी मदद नहीं करता है, क्योंकि उस आईडी के साथ कई बंडल हो सकते हैं, लेकिन इनमें से केवल एक ही जिसमें यह एक्सटेंशन परिभाषित किया गया है। एक और बिंदु, बंडल में getVersion विधि नहीं है। मुझे इसकी आवश्यकता यह है कि मैं एक 'दस्तावेज़ टेम्पलेट' को एक विस्तार बिंदु के रूप में पंजीकृत कर रहा हूं, और इस टेम्पलेट के विभिन्न संस्करण हो सकते हैं। तो जब एक टेम्पलेट लोड होता है, तो मैं जानना चाहता हूं कि यह कौन सा संस्करण है, नोटेशन इत्यादि के लिए .. अभी के लिए, मैंने अपने विस्तार बिंदु के लिए स्कीमा में एक अतिरिक्त विशेषता का उपयोग किया है, जो शर्म की बात है। –

+0

मुझे लगता है कि, अतिरिक्त विशेषता बेहतर समाधान है। इस तरह एक्सटेंशन संस्करण को अपडेट किए बिना प्लग-इन को अपडेट करना और रिसीवर को नए संस्करण के लिए अपडेट करने के बिना संशोधित करना संभव है। यह दिलचस्प है कि बंडल में getVersion() विधि नहीं है। शायद यह ग्रहण 3.6 में एक नई विधि है, जिसका उपयोग मैं योगदानकर्ता की खोज करते समय कर रहा था। –

3

सभी इस जानकारी ग्रहण 3.6 पर आधारित है: अगर आप OSGi वातावरण जिसमें निश्चित रूप से आप कर रहे हैं में हैं या आप इस समस्या को नहीं होने दिया जाएगा

आपका IContributorRegistryContributor का एक उदाहरण होगा।

रजिस्ट्री नियंत्रक आपको दो विधियां देता है: 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 भविष्य में एक नया डिफ़ॉल्ट कार्यान्वयन हो जाता है कि एक गैर संस्करण के बारे में पता करने के लिए समाधान शान से नीचा होगा: यहाँ एक टुकड़ा है। बंडल आईडी ओएसजीआई के उदाहरण के लिए अद्वितीय है, इसलिए यह बंडल के सही संस्करण को लोड करेगा।

संबंधित मुद्दे