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

У меня есть 2 плагина eclipse, которые я создаю; назовем их плагином А и плагином Б...

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

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


person El Guapo    schedule 26.01.2009    source источник


Ответы (3)


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

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

person Olaf Kock    schedule 07.03.2009

Требования

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

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

Подходы

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

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

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

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

Сообщите о том, что вы найдете.

person jamesh    schedule 28.01.2009

Одно из возможных решений, которое я могу придумать, состоит в том, что вы добавляете класс из плагина A в плагин B. Затем, когда плагин B читает элементы вклада, он может попытаться создать экземпляр этого класса.

Затем класс из плагина А может генерировать какое-то исключение в конструкторе, если он не лицензирован. Это сообщит плагину 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
      }
    }
person Mario Ortegón    schedule 29.01.2009