限制插件之间提供的扩展点数据

时间:2009-01-26 18:07:51

标签: eclipse eclipse-plugin osgi eclipse-3.4

我正在构建2个eclipse插件;让我们称他们为插件A​​和插件B ......

插件A需要运行许可证,插件B对全世界都是免费的。我在插件B中创建了一个扩展点,插件A为其提供了(在某些情况下覆盖)数据。如果插件A未获得许可,我想找到一种方法来忽略插件B中的数据(无需检查插件是否可以启动)。

日食中是否有这样的机制可以让我完成这样的壮举?我目前的解决方法是检查插件是否已启动(通过Bundle)以及是否尝试启动它。如果插件A未经许可,我会在start()方法中抛出异常。

3 个答案:

答案 0 :(得分:1)

如果没有许可,是否应该检查其许可本身而不是覆盖/不提供任何数据(或覆盖提供相同的数据)?为什么在B基本上不关心(因为它是免费的)时将许可检查的负担放在B上。

如果找不到许可证,我会选择A以限制模式启动。您也可以 - 正如jamesh建议的那样 - 希望为用户提供提供许可证的机会,例如:使用额外的A-UI插件通知用户缺少许可证并提供许可证。

答案 1 :(得分:0)

<强>要求

所以,你正在编写两个插件。

插件B有一个扩展点。如果用户拥有插件A的包和许可证,那么插件A应该为插件B中的EP提供扩展。

<强>途径

OSGi的安全模型主要建立在默认的Java Permissions和SecurityManager之上。 Apache Felix在本演示文稿中进行了讨论。我希望能围绕这个制定许可计划。

你的解决方法听起来有点可行,但是,有一些问题:

  • 停止启动捆绑包可能会阻止任何服务被注册,但它是否会影响扩展注册表的更改?即使用plugin.xml注册的扩展名。我猜DS服务没问题,但我必须尝试一下。
  • 停止捆绑可能还不够 - 以后可以再次启动吗?我可能希望它没有安装。
  • 未经许可的捆绑包是告诉用户许可的机会。那么,你如何告诉用户该捆绑包没有被许可,并且无法使用,顺便说一句,这是你如何许可它。

到目前为止,您还没有说过如何实施许可证。我猜你会去找LicenseService,甚至可能是单身人士。

报告您找到的内容。

答案 2 :(得分:0)

我能想到的一个可能的解决方案是你从插件A贡献一个类到插件B.然后,当插件B读取贡献项时,它可以尝试创建这个类的实例。

如果没有许可,那么来自插件A的类可以在构造函数中抛出一些异常。这将告诉插件B可以忽略来自插件A的信息。

插件B中的可能实现如下所示:

    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
      }
    }