2009-01-26 30 views
1

我有2個eclipse插件,我正在構建;讓我們稱他們爲插件A​​和插件B ...限制插件之間貢獻的擴展點數據

插件A需要許可才能運行,而插件B對全世界是免費的。我在插件B中創建了一個擴展點,插件A將其貢獻給(並在某些情況下覆蓋)數據。如果插件A未獲得許可(不必檢查插件是否可以啓動),我想找到一種方法來忽略插件B中的數據。

在eclipse中是否有這樣的機制讓我能夠完成這樣的壯舉?我目前的解決方法是檢查插件是否已啓動(通過Bundle),以及是否嘗試啓動插件。如果插件A未經許可,我會在start()方法中拋出異常。

回答

0

要求

所以,你正在寫兩個插件。

插件B有一個擴展點。如果用戶對Plugin的一個捆綁,許可證,然後插件中應有助於擴展的插件,B的EP

途徑

OSGi的安全模型主要建立在默認的Java權限頂上和安全管理器。本演講從Apache Felix進行討論。我希望能夠圍繞此建立一個授權計劃。

你的解決方法聽起來像它可以工作,但是,也有一對夫婦的憂慮:

  • 停止從啓動包可以防止被註冊的任何服務,但它會影響在擴展的變化註冊表?即使用plugin.xml註冊的那些擴展。我猜想DS服務可以,但我必須嘗試一下。
  • 停止捆綁可能不夠 - 稍後可以重新啓動嗎?我可能會想要它未安裝。
  • 未經許可的捆綁包是向用戶通知許可的機會。那麼,你如何告訴用戶該軟件包沒有獲得許可,並且將無法使用,順便說一句,這是你如何許可它。

到目前爲止,您還沒有談到如何實施許可證。我猜你會去找一個LicenseService,甚至可能是一個單身人士。

請回報您找到的內容。

0

我能想到的一個可能的解決方案是您從插件A向插件B貢獻一個類。然後,當插件B讀取貢獻項時,它可以嘗試創建此類的實例。

從插件A開始,類可以在構造函數中拋出一些異常(如果未獲得許可)。這將告訴插件B,來自插件A的信息可以被忽略。

在插件B A可能的實現可以是這樣的:如果它

IExtensionPoint extensionPoint = registry.getExtensionPoint("mypoint"); 
    IConfigurationElement[] elements = extensionPoint.getConfigurationElements(); 
    for (int i = 0; i < elements.length; i++) { 
     try { 
     (License)elements[i].createExecutableExtension("class"); 
     // ..... Read any other items you need.... 
     } 
     catch(LicenceException e){ 
     // Plugin is invalid, do not use 
     } 
    } 
1

不應在檢查其自身的許可和不覆蓋/不貢獻任何數據(或者與提供覆蓋相同數據)沒有授權?基本上B不關心(因爲它是免費的),爲什麼要把許可證檢查的負擔放在B上?

如果找不到許可證,我會選擇A以有限模式啓動。您也可以 - 正如jamesh所建議的 - 想讓用戶有機會提供許可證,例如,通過額外的A-UI插件通知用戶關於丟失的許可證並提供許可證。