????????? ???????????

 
 
 
Сообщения:365
Идея: Для того, чтоб начать конкурировать с существующими уже давно форумными движками, нам нужно добавить гибкости в наш проект (сейчас рассматриваем форум). Любой популярный продукт со временем некоторые пользователи хотят заточить под себя, и эту проблему решает плагинная архитектура. Соответственно если пользователь захотел логиниться используя LDAP - он может написать плагин. Если он хочет добавить новый тип тем/сообщений (например, музыкальный форум хочет записывать ноты), он пишет плагин.

Цель: сделать возможность поиска и распознавания плагинов (они будут лежать в определенном каталоге скорей всего), возможность их включать/выключать/удалять/устанавливать. А также конфигурировать - задавать какие-то свойства, менять порядок применения.

План:
  • Сделать ресерч по существующим решениям (Atlassian, Jenkins)
  • Реализовать плагин (сначала для аутентификации через пульп) вместе с изначальным предложением об архитектуре.
  • Клепать точки расширения для разнообразных мест на форуме (постинг топиков, шапка форума, просмотр веток и т.д).

Важно обсудить:
  • Как плагины будут доступаться к БД и что будет а) если плагин может испортить базу б) если база была изменена в последующих версиях миграциями.
  • Security Management
  • Производительность. К примеру, в том же Jenkins'e когда речь идет о Security - плагины просто не имеют нужной гибкости работать как им вздумается - каждое обращение к их Security Manager'у ограничено определнным API, которое очень тормозит. Это происходит просто потому, что API сильно ограничивающий и очень общий.
  • Со временем добавлю еще пунктов...
Изменен:24 июн 2013 17:10
 
 
Сообщения:20
После копания существующих решений картинка вырисовывается следующая:

Форум предоставляет некий набор Extension Point'ов в виде интерфейсов. Плагин может реализовывать тот или иной интерфейс. Форум, используя механизм Service Providers, при старте находит список плагинов в classpath. Существует некий конфигурационный UI, позволяющий включать и выключать плагины.
Насчет Security будет довольно сложно жестко ограничивать действия плагинов. Возможные варианты:
  • Грузим все плагины отдельным загрузчиком классов и делаем собственный SecurityManager
  • Закрываем все API в три слоя аннотациями SS и вынуждаем плагин иметь роли с грантами. Тут могут возникнуть проблемы с аутентификацией и плагинов для аутентификации и всякое такое
  • Просто доверяем плагинам

Шарить спринговый контекст приложения в плагинами я бы не стал во избежание конфликтов имен и бардака с регистрацией дополнительных файлов контекста в рантайме. Вместо этого предлагается создать искусственное окружение для плагинов. Со стороны плагина это будет выглядеть как

TopicDao dao = Environment.getDatabase().getTopicDao();

Что касается меню, шапки и прочего, то эти динамические элементы отлично покрываются механизмом startup discovery, описанным выше. Т.е. на старте форум просмотрит доступные плагины и из этого сгенерит динамические компоненты.

Несколько большей возни потребует возможность плагинов определять собственные страницы на UI и поддержание целостности UI и навигации при этом. Но такую фичу можно рассматривать как следующий этап и спроектировать отдельно.

Эффективность решения будет определяться тем, насколько удачно мы сформируем набор интерфейсов для реализации плагинами
 
 
Сообщения:365
Хорошо, выходит, мы предоставляем некий Environment, который отдает плагинам те же DAO либо Service's. Вопрос: что если плагину нужно хранить данные в своих таблицах, как он будет эти данные сохранять, как он будет мигрировать базу? Я так понимаю в JIRA плагины тоже сохраняют свои данные в свои же таблицы.

По поводу секьюрити - мне кажется проще всего, да и лучше будет - доверять плагину.

По поводу UI - я заметил, что JIRA и Jenkins используют Jelly. Сам я не имел особого опыта с ним, но складывается впечатление что его используют как раз для написания плагинов.
 
 
Сообщения:20
Quote:
Вопрос: что если плагину нужно хранить данные в своих таблицах, как он будет эти данные сохранять, как он будет мигрировать базу?

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

Quote:
По поводу UI - я заметил, что JIRA и Jenkins используют Jelly. Сам я не имел особого опыта с ним, но складывается впечатление что его используют как раз для написания плагинов.


Использование Jelly я глубоко не копал, но на первый взгляд они используют его в качестве шаблонизатора. На мой взгляд в этой роли XML глубоко порочен и лучше использовать тот же velocity для генерации страниц.
 
Модераторы:katctapobepІраїдаJulia AtlyginaJulik21Julikdsafjifb
Сейчас эту тему просматривают:Нет