Ограничение предоставленных данных точки расширения между плагинами - PullRequest
1 голос
/ 26 января 2009

У меня есть 2 плагина Eclipse, которые я создаю; давайте назовем их плагин A и плагин B ...

Для работы плагина A требуется лицензия, а плагин B является бесплатным для всего мира. Я создал точку расширения в плагине B, в которую плагин A вносит (и в некоторых случаях переопределяет) данные. Я хотел бы найти способ игнорировать эти данные в плагине B, если плагин A не лицензирован (без необходимости проверять, может ли плагин запускаться).

Есть ли такой механизм в затмении, который позволяет мне совершить такой подвиг? Мой текущий обходной путь - проверить, запущен ли плагин (через Bundle) и не пытается ли он его запустить. Если плагин A нелицензионный, я выбрасываю исключение в методе start().

Ответы [ 3 ]

1 голос
/ 07 марта 2009

Разве А не должен сам проверять свою лицензию и не отменять / не вносить какие-либо данные (или отменять предоставление одинаковых данных), если они не лицензированы? Зачем возлагать бремя проверки лицензии на B, когда по существу B это не волнует (поскольку это бесплатно).

Я бы выбрал А для запуска в ограниченном режиме, если лицензия не найдена. Вы также можете - как предложил jamesh - захотеть дать пользователю возможность предоставить лицензию, например, с дополнительным плагином A-UI, информирующим пользователя об отсутствующей лицензии и предлагающим лицензию.

0 голосов
/ 29 января 2009

Одним из возможных решений, которое я могу придумать, является добавление класса из плагина 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
      }
    }
0 голосов
/ 28 января 2009

Требования

Итак, вы пишете два плагина.

Плагин B имеет точку расширения. Если у пользователя есть пакет для плагина A и лицензия, тогда плагин A должен добавить расширения для EP в плагин B.

Подходы

Модель безопасности OSGi в значительной степени построена на стандартных разрешениях Java и SecurityManager. В этой презентации обсуждается Apache Felix . Я ожидаю, что было бы возможно построить схему лицензирования вокруг этого.

Ваш обходной путь звучит так, как будто это может сработать, однако есть несколько проблем:

  • остановка запуска пакета может помешать регистрации каких-либо служб, но повлияет ли это на изменение реестра расширений? то есть эти расширения зарегистрированы с использованием plugin.xml. Я предполагаю, что службы DS будут в порядке, но я должен был бы попробовать это.
  • остановки пакета может быть недостаточно - можно ли запустить его позже? Я бы, наверное, хотел, чтобы он был УДАЛЕН.
  • нелицензионный пакет - это возможность рассказать пользователю о лицензировании. Итак, как вы скажете пользователю, что пакет не был лицензирован и не сможет использоваться, и, кстати, вот как вы его лицензируете.

Пока вы ничего не сказали о том, как будет реализована лицензия. Я предполагаю, что вы пойдете за LicenseService, или даже, возможно, один.

Сообщите, что вы нашли.

...