Манифесты плагина

JAR-файлы плагинов содержат манифест плагина — файл верхнего уровня с названием metabase-plugin.yaml. При запуске Glarus BI перебирает каждый JAR-файл в каталоге плагинов и ищет манифест в каждом из них. Этот манифест сообщает Glarus BI, что реализует плагин и как его инициализировать.

Пример манифеста

info:
  name: Glarus BI SQLite Driver
  version: 1.0.0-SNAPSHOT-3.25.2
  description: Allows Glarus BI to connect to SQLite databases.
contact-info:
  name: Toucan McBird
  address: toucan.mcbird@example.com
driver:
  name: sqlite
  display-name: SQLite
  lazy-load: true
  parent: sql-jdbc
  connection-properties:
    - name: db
      display-name: Filename
      placeholder: /home/camsaul/toucan_sightings.sqlite
      required: true
init:
  - step: load-namespace
    namespace: metabase.driver.sqlite
  - step: register-jdbc-driver
    class: org.sqlite.JDBC

Раздел driver сообщает Glarus BI, что подключаемый модуль определяет драйвер с именем :sqlite, который имеет :sql-jdbc в качестве родителя. Система плагинов Glarus BI использует эти данные для вызова driver/register!. Плагин также перечисляет отображаемое имя и свойства подключения для драйвера, которые система плагинов Glarus BI использует для создания реализаций для driver/display-name и driver/connection-properties.

Ленивая загрузка

Драйвер в примере выше указан как lazy-load: true, что означает, что несмотря на то что упомянутая выше реализация метода создаётся при запуске Glarus BI, Glarus BI не будет инициализировать драйвер до тех пор, пока кто-то не попытается подключиться к базе данных, использующей этот драйвер.

Вы можете (но не обязаны) установить для драйвера значение lazy-load: false, но это увеличит время запуска Glarus BI и займёт больше памяти.

Инициализация плагина

Glarus BI автоматически инициализирует плагины по мере необходимости. Инициализация происходит примерно так: Glarus BI добавляет драйвер в classpath, затем по порядку выполняет раздел init манифеста плагина. В примере манифеста выше есть два шага: шаг load-namespace и шаг register-jdbc-driver:

init:
  - step: load-namespace
    namespace: metabase.driver.sqlite
  - step: register-jdbc-driver
    class: org.sqlite.JDBC

Загрузка пространств имён

Вам нужно будет добавить один или несколько шагов load-namespace в манифест вашего драйвера, чтобы сообщить Glarus BI, какие пространства имён содержат реализации вашего метода драйвера. В приведённом выше примере пространство имён — metabase.driver.sqlite load-namespace вызывает require обычным способом, что означает, что он будет загружать другие пространства имен, перечисленные в разделе :require его объявления пространства имён по мере необходимости. Если реализации методов вашего драйвера разделены на несколько пространств имен, убедитесь, что они также будут загружены — вы можете либо сделать так, чтобы основное пространство имён обрабатывало их (например, включив их в форму :require в объявлении пространства имен), либо путём добавления дополнительных шагов load-namespace.

Дополнительную информацию о пространствах имён см. в разделе «Пространства имён Clojure».

Регистрация драйверов JDBC

Драйверы, которые под капотом используют драйвер JDBC, также должны будут добавить шаг register-jdbc-driver.

Причина заключается в том, что Java JDBC DriverManager не будет использовать драйверы JDBC, загруженные чем-то другим, кроме системного ClassLoader, что фактически означает только то, что Drivermanager будет использовать только классы драйверов JDBC, которые упакованы как часть ядра Glarus BI uberjar. Поскольку системный загрузчик классов не позволяет вам загружать путь к классам во время выполнения, Glarus BI использует пользовательский ClassLoader для инициализации плагинов. Чтобы обойти это ограничение, Glarus BI поставляется с классом прокси-драйвера JDBC, который может заключать в себе другие драйверы JDBC. Когда Glarus BI вызывает register-jdbc-driver, Glarus BI фактически регистрирует новый экземпляр прокси-класса, который перенаправляет вызовы методов фактическому драйверу JDBC. DriverManager прекрасно с этим справляется.

Сборка драйвера

Чтобы собрать драйвер в виде JAR-файла плагина, ознакомьтесь с README скриптов сборки драйвера.

Поместите JAR, который вы создали, в каталог /plugins, и всё готово.

Справочник по манифесту плагина Glarus BI

Вот пример манифеста плагина с комментариями, который поможет вам начать писать свой собственный.

# Основная информация о драйвере для пользователя находится под ключом info:
info:

   # Обязательно дайте вашему плагину имя. В будущем оно будет показано
   # для пользователя на странице администрирования «управления плагинами».
   name: Glarus BI SQLite Driver

   # Для согласованности с основным проектом Glarus BI вам
   # следует использовать семантическое управление версиями. Неплохо было бы включить
   # версию его основной зависимости (например, драйвера JDBC), когда
   # используется часть «патча» версии, в этом случае мы сможем
   # обновить зависимости и отразить это в номере версии
   #
   # На данный момент основные модули Glarus BI должны иметь версию
   # 1.0.0-SNAPSHOT-x до выхода версии 1.0 и заморозки версии API для плагинов
  version: 1.0.0-SNAPSHOT-3.25.2

   # Опишите, что делает ваш плагин. В настоящее время не используется, но в
   # в будущем мы можем использовать это описание на странице администрирования плагинов.
  description: Позволяет Glarus BI подключаться к базам данных SQLite.

# Вы можете перечислить любые зависимости, необходимые плагину, указав
# список зависимостей. Если все зависимости не соблюдены, плагин
# не будет инициализирован.
#
# Зависимостью может быть либо "класс", либо (в будущем) "плагин"
dependencies:

   # Зависимость класса проверяет, доступен ли данный класс. Класс при этом не инициализируется;
   # Glarus BI откладывает инициализацию,
   # пока не потребуется использовать драйвер.
   # Не используйте это для классов, которые поставляются как часть самого плагина;
   # используйте его только для внешних зависимостей.
   - class: oracle.jdbc.OracleDriver

     # Вы можете дополнительно добавить сообщение, которое будет отображаться
     # в логах и возможно в будущем на странице управления плагином

     message: >
      Glarus BI requires the Oracle JDBC driver to connect to JDBC databases. See
      https://metabase.com/docs/latest/administration-guide/databases/oracle.html
      for more details

   # Зависимость 'plugin' проверяет, доступен ли данный плагин.
   # Значением для 'plugin' является то, что этот плагин имеет в качестве 'name:'
   # убедитесь в точном соответствии.
   #
   # Если зависимость недоступна при первой загрузке этого модуля,
   # попытка загрузки будет повторена позже, после загрузки дополнительных модулей. Это означает, что система будет
   # работать так, как мы ожидаем, даже если, скажем, мы сначала пытаемся загрузить
   # драйвер BigQuery *до* загрузки его зависимости, общего драйвера Google.
   # Загрузив после этого общий драйвер Google, Glarus BI обнаружит, что зависимость драйвера BigQuery
   # теперь выполнена и инициализируют плагин.
   #
   # В будущем мы также добавим ограничения по версиям
   - plugin: Glarus BI SQLHeavy Driver

# Если плагин добавляет драйвер, он должен определить блок driver:
#
# Чтобы определить несколько драйверов, вы можете передать список словарей.
# Множественные драйвера в настоящее время все ещё должны использовать один и тот же набор
# зависимостей и шагов инициализации. Таким образом, регистрация нескольких драйверов является наиболее
# полезной в случае использования небольших вариаций одного и того же драйвера или включения абстрактного
# родительского драйвера. Обратите внимание, что шаги инициализации будут выполняться один раз для каждого драйвера
# который загружается. Это может привести к дублированию зарегистрированных экземпляров драйвера в DriverManager
# Это не самый оптимальный вариант, но он вполне рабочий.

driver:

   # Имя драйвера; соответствует используемому ключевому слову (например, :sqlite)
   # в кодовой базе
   name: sqlite

   # Красивое отображаемое имя, которое будет показано администраторам при подключении к базе данных
   display-name: SQLite

   # Можно ли отложить загрузку этого драйвера до первой
   # попытки подключения к базе данных этого типа. По умолчанию: true.
   # установите значение false, только если это абсолютно необходимо.
   lazy-load: true

   # Родительский драйвер, если есть.
   parent: sql-jdbc

   # В качестве альтернативы вы можете указать список родителей для драйвера, если их
   # больше одного:
   parent:
    - google
    - sql

  # Является ли этот драйвер абстрактным. По умолчанию: false
   abstract: false

   # Список атрибутов подключения, для использования в этом драйвере
   connection-properties:
     # Свойства подключения могут быть одним из значений по умолчанию, найденных в
     # metabase.driver.common, перечисленные по имени:
     - dbname
     - host

    # Или полная карта для пользовательского варианта. Полная схема для пользовательского
     # варианта может быть найдена в metabase.driver.
    - name: db
      display-name: Filename
      placeholder: /home/camsaul/toucan_sightings.sqlite
      required: true

     # Наконец, вы можете использовать merge: для объединения нескольких словарей. Это
     # полезно для переопределения некоторых свойств в одном из значений по умолчанию.
    - merge:
      - port
      - placeholder: 1433

# Шаги для инициализации плагина. Для драйверов с отложенной загрузкой это
# откладывается до инициализации драйвера при первом подключении
# к базе данных
init:

   # load-namespace сообщает Glarus BI, что требуется пространство имён из JAR.
   # вы можете делать любые операции внутри этого пространства имён
  - step: load-namespace
    namespace: metabase.driver.sqlite

   # register-jdbc-driver указывает Glarus BI необходимость зарегистрировать драйвер JDBC, который
   # будет использоваться этим драйвером. (Он фактически регистрирует прокси,
   # так как DriverManager не разрешает загрузку драйверов
   # другим загрузчиком классов, отличным от того которым он был загружен
   # Не беспокойтесь об этом, но знайте что для
   # драйверов на основе JDBC, вам нужно указать здесь свою зависимость)
  - step: register-jdbc-driver
    class: org.sqlite.JDBC

Дополнительная информация

Реализация мультиметодов для вашего драйвера.