Ограничение предоставленных данных точки расширения между плагинами
У меня есть 2 плагина Eclipse, которые я создаю; давайте назовем их плагин A и плагин B...
Для работы плагина A требуется лицензия, а плагин B является бесплатным для всего мира. Я создал точку расширения в плагине B, в которую плагин A вносит (и в некоторых случаях переопределяет) данные. Я хотел бы найти способ игнорировать эти данные в плагине B, если плагин A не лицензирован (без необходимости проверять, может ли плагин запускаться).
Есть ли такой механизм в затмении, который позволяет мне совершить такой подвиг? Мой текущий обходной путь - проверить, запущен ли плагин (через Bundle) и не пытается ли он его запустить. Если плагин A нелицензионный, я выбрасываю исключение в start()
метод.
3 ответа
Разве А не должен сам проверять свою лицензию и не переопределять / не вносить какие-либо данные (или переопределять при предоставлении идентичных данных), если они не лицензированы? Зачем возлагать бремя проверки лицензии на B, когда по существу B не заботится (поскольку это бесплатно).
Я бы выбрал А для запуска в ограниченном режиме, если лицензия не найдена. Вы также можете - как предложил jamesh - захотеть предоставить пользователю возможность предоставить лицензию, например, с помощью дополнительного плагина A-UI, информирующего пользователя об отсутствующей лицензии и предлагающего лицензию.
Требования
Итак, вы пишете два плагина.
Плагин B имеет точку расширения. Если у пользователя есть пакет для плагина A и лицензия, тогда плагин A должен добавить расширения для EP в плагине B.
подходы
Модель безопасности OSGi в значительной степени построена на стандартных разрешениях Java и SecurityManager. В этой презентации обсуждается Apache Felix. Я ожидаю, что было бы возможно построить схему лицензирования вокруг этого.
Ваш обходной путь звучит так, как будто он может сработать, однако есть несколько проблем:
- остановка запуска пакета может помешать регистрации каких-либо служб, но повлияет ли это на изменение реестра расширений? то есть эти расширения, зарегистрированные с использованием plugin.xml. Я предполагаю, что службы DS будут в порядке, но я должен был бы попробовать это.
- остановки пакета может быть недостаточно - можно ли запустить его позже? Я, вероятно, хотел бы, чтобы это было УДАЛЕНО.
- нелицензионный пакет - это возможность рассказать пользователю о лицензировании. Итак, как вы скажете пользователю, что пакет не был лицензирован и не сможет использоваться, и, кстати, вот как вы его лицензируете.
До сих пор вы ничего не сказали о том, как будет реализована лицензия. Я предполагаю, что вы пойдете за LicenseService, или даже, возможно, синглтон.
Сообщите, что вы нашли.
Одно из возможных решений, которое я могу придумать, заключается в том, что вы добавляете класс из плагина 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
}
}