Можно ли в шаблоне Telosys вызвать специально созданную функцию?

Aug 18 2020

Пользуюсь Телосисом (https://www.telosys.org) для генерации исходного кода Python, и он отлично работает. Но у меня есть конкретная потребность, которую можно решить, вызвав конкретную функцию преобразования.

Можно ли создать конкретную функцию и вызвать ее внутри шаблона Telosys?

Например: myFunction(“abc”)или $something.myFunction(“abc”)или что - нибудь еще

При необходимости я могу создать эту функцию на разных языках, таких как Java, Python или JavaScript.

Ответы

3 lgu Aug 19 2020 at 10:02

Telosys разработан с возможностью расширения, поэтому да, вы можете создавать свои собственные функции и вызывать их в своих шаблонах. Как Telosys написано на Java вам придется создавать эти функции в Java, а затем использовать « загрузчик » объект в файл «.vm» , чтобы загрузить свой класс и вызывать методы , определенные в этом классе.

Вот как это сделать шаг за шагом:

  1. Используйте предпочитаемую среду IDE для создания класса Java, определяющего ваш конкретный метод (ы). Этот класс может быть в любом пакете (включая «пакет по умолчанию / безымянный пакет»), метод (ы) может быть «статическим», если вам не нужен экземпляр класса.

  2. Скомпилируйте этот класс (цель - создать простой файл " .class " или файл " .jar ", если хотите)

  3. Поместите класс (или банку) в папку пакета шаблонов:

  • если у вас есть файл " .class ", поместите его в папку " классы "
  • если у вас есть файл " .jar ", поместите его в папку " lib "

Примеры :

TelosysTools/templates/my-bundle/classes/MyClass.class
TelosysTools/templates/my-bundle/lib/my-lib.jar
  1. В файле шаблона (".vm") используйте объект " $ loader " для загрузки вашего класса Java и вызова любого из его методов. См. Ссылку на "$ loader" здесь:http://www.telosys.org/templates-doc/objects/loader.html

Если все ваши методы «статические», вам не нужен экземпляр, поэтому просто используйте « $ loader.loadClass () ». Пример :

## load the class and keep it in a new “$Math” object (no instance created)
#set( $Math = $loader.loadClass("java.lang.Math")
## use the static methods of this class
$Math.random()

Если ваши методы не являются «статическими», поэтому вам нужен экземпляр, используйте « $ loader.newInstance () ». Примеры :

## create an instance of StringBuilder and put it in the context with #set
#set( $strBuilder = $loader.newInstance('java.lang.StringBuilder') )
## use the instance to call a method
$strBuilder.append('aa') ## create new instance of a specific class : MyTool.class #set( $tool = $loader.newInstance('MyTool') ) ## use the instance to call a method $tool.myFunction()

Подводя итог, вы можете использовать любой класс, предоставляемый Java-JRE (например, «Math», «StringBuilder»), вы можете повторно использовать существующие библиотеки, добавив файл «.jar» (не забудьте добавить зависимости, необходимые, если jar не является автономным) или просто добавьте один файл «.class».