Интеграция движка FEEL со Spin

Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine

Эта страница документирует использование Camunda Spin вместе с движком FEEL от Scala. Кроме того, здесь показано, как типы данных Spin ставятся в соответствие типам данных FEEL, а также некоторые правила преобразования структур первых в структуры последних.

Где найти интеграцию со Spin

Интеграция со Spin для двжика FEEL реализована в составе плагина Spin Process Engine, поскольку ожидается, что движок управления процессами долен иметь возможность использовать Spin, если другой компонент Camunda 7 (в данном случае, движок FEEL) поддерживает его использование.

Для случая автономного движка DMN Engine, плагин Spin Process Engine тоже должен быть добавлен к зависимостям, а движок DMN подхватит нужные классы для того, чтобы позволить произвести интеграцию Spin с движком FEEL.

Координаты Maven для плагина Spin Process Engine Plugin приведены ниже:

<dependency>
  <groupId>io.openbpm.bpm</groupId>
  <artifactId>camunda-engine-plugin-spin</artifactId>
  <version>${camunda.version}</version>
</dependency>

Как работает интеграция со Spin

Интеграция со Spin состоит из "типов данных" Spin — специальной реализации интерфейса ValueMapper из движка FEEL. Реализация SpinValueMapper перехватывает все объекты следующих типов:

  • SpinJsonNode

  • SpinXmlElement

Объект, принадлежащий к одному из этих типов, будучи передан в качестве переменной в движок FEEL, будет сконвертирован в подходящий тип данных FEEL. Ниже приведен пример того? как это можно сделать:

  // define a JSON variable
  SpinJsonNode json = Spin.JSON("{\"customer\": \"Kermit\", \"language\": \"en\"}");

  // create a variable map and store the JSON variable
  VariableMap variables = Variables.createVariables().putValue("jsonVariable", json);

  // evaluate a decision containing a FEEL expression that uses the JSON variable
  dmnEngine.evaluateDecision(decisionWithFEEL, variables);

Как выглядит маппинг JSON/XML переменных на типы данных FEEL

При конвертации JSON/XML переменных в типы данных FEEL предоставленная JSON/XML структура получит маппинг на FEEL тип Context. Актуальные значения, содержащиеся в структуре данных, получат маппинг на поддерживаемые типы данных FEEL, задокументированные во внешней документации FEEL, находящейся здесь.

Spin JSON

Переменные типа SpinJsonNode преобразуются в эквивалентный контекст, что означает, что преобразования не происходит, это практически та же самая структура JSON.

Spin JSON:

{
  "name": "Kermit",
  "address":
  {
    "city": "Berlin",
    "zip-code": 10961
  }
}

FEEL контекст:

{
  name : "Kermit",
  address :
  {
    city : "Berlin",
    zipCode : 10961
  }
}

Spin XML

Переменные типа SpinXmlElement преобразуются в контекст с применением следующих правил:

  • каждый элемент XML является вхождением контекста

  • каждый атрибут XML является вхождением контекста с префиксом @ под вхождением элемента

  • несколько XML элементов с одним и тем же именем группируются в контексте как список

  • внутреннее содержимое XML элемента становится вхождением контекста $content

  • если элемент или атрибут имеет пространство имен (namespace), то вхождение контекста получает префикс <NAMESPACE>$

Spin XML:

<customer name="Kermit">
  <address city="Berlin" zipCode="10961" />
</customer>

FEEL контекст:

{
  customer :
  {
    @name : "Kermit",
    address :
    {
      @city : "Berlin",
      @zipCode : "10961"
    }
  }
}

Лицензия и атрибуция

Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .

Оригинал документации: https://docs.camunda.org