Ограничение предоставленных данных точки расширения между плагинами

У меня есть 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
      }
    }
Другие вопросы по тегам