我正在构建2个eclipse插件;让我们称他们为插件A和插件B ......
插件A需要运行许可证,插件B对全世界都是免费的。我在插件B中创建了一个扩展点,插件A为其提供了(在某些情况下覆盖)数据。如果插件A未获得许可,我想找到一种方法来忽略插件B中的数据(无需检查插件是否可以启动)。
日食中是否有这样的机制可以让我完成这样的壮举?我目前的解决方法是检查插件是否已启动(通过Bundle)以及是否尝试启动它。如果插件A未经许可,我会在start()
方法中抛出异常。
答案 0 :(得分:1)
如果没有许可,是否应该检查其许可本身而不是覆盖/不提供任何数据(或覆盖提供相同的数据)?为什么在B基本上不关心(因为它是免费的)时将许可检查的负担放在B上。
如果找不到许可证,我会选择A以限制模式启动。您也可以 - 正如jamesh建议的那样 - 希望为用户提供提供许可证的机会,例如:使用额外的A-UI插件通知用户缺少许可证并提供许可证。
答案 1 :(得分:0)
<强>要求强>
所以,你正在编写两个插件。
插件B有一个扩展点。如果用户拥有插件A的包和许可证,那么插件A应该为插件B中的EP提供扩展。
<强>途径强>
OSGi的安全模型主要建立在默认的Java Permissions和SecurityManager之上。 Apache Felix在本演示文稿中进行了讨论。我希望能围绕这个制定许可计划。
你的解决方法听起来有点可行,但是,有一些问题:
到目前为止,您还没有说过如何实施许可证。我猜你会去找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
}
}