Как вы можете загружать данные динамически с помощью FMPP Java API? - PullRequest
4 голосов
/ 23 сентября 2019

Я интегрирую преобразование FMPP в нашу кодовую базу Java.Для этого я использую FMPP Java API .Из практических соображений у меня есть два отдельных каталога:

  • , который содержит шаблон: <absolute path template>/template.ftlx
  • , который содержит данные: <absolute path data>/data.xml

Это как-то усложняет ситуацию, так как здесь я должен работать с абсолютными путями.Обычно данные находятся в каталоге шаблона (вместе с файлом ignoredir.fmpp).Однако в нашем приложении данные поступают из внешнего источника (его можно загрузить через API REST), а шаблон находится в пути к классам.Это также означает, что каталог данных не является статичным.

Я изо всех сил пытаюсь определить все это и получить преобразование, происходящее через Java API.В настоящее время у меня есть следующее:

Settings s = new Settings(new File("."));

s.set(Settings.NAME_SOURCES, new File("<absolute path template>/template.ftlx").getAbsolutePath());
s.set(Settings.NAME_OUTPUT_FILE, new File("<absolute path output>/output.xml").getAbsolutePath());
s.execute();

Приведенный выше фрагмент кода не является полным, так как я должен добавить данные.Есть свойства Settings.NAME_DATA и Settings.NAME_DATA_ROOT, но я не могу заставить их работать.Я попытался установить Settings.NAME_DATA_ROOT следующим образом:

s.set(Settings.NAME_DATA_ROOT, new File("<absolute path data>").getAbsolutePath());

Затем я получаю исключение, что FreeMarker не может найти мои данные:

The following has evaluated to null or missing:
==> d  [in template "template.ftlx" at line 4, column 12]

В шаблоне я просто делаю:

<#list d.items>...</#list>

Это имеет смысл, что это не будет работать, поскольку я нигде не определил, что данные должны быть доступны через хеш d. (что я делаю ниже в config.fmpp).Но я не знаю, как правильно определить это через Settings.NAME_DATA и / или Settings.NAME_DATA_ROOT.

Как я могу внедрить мой файл данных во все это?Он должен получить ключ d, поэтому я могу сослаться на d. в шаблоне.

ссылка

Так же, как ссылка, если я создам следующее config.fmpp файл в <absolute path config>, поместите файл данных data.xml в каталог <absolute path data> и вызовите s.load(new File("<absolute path config>/config.fmpp")) до s.execute() выше, все работает нормально.

data: {
    d: xml(<absolute path data>/data.xml)
}

Все, что мне нужно понятьOut делает это динамически через Java API.Я не могу использовать config.fmpp для этого, так как расположение данных не статично (и, насколько я знаю, config.fmpp не параметризуемо).

рабочее решение, с сомнениями

После некоторого чтения кода я получаю его, если я сделаю следующее:

Settings s = new Settings(new File("."));

s.set(Settings.NAME_SOURCES, new File("<absolute path template>/template.ftlx").getAbsolutePath());
s.set(Settings.NAME_OUTPUT_FILE, new File("<absolute path output>/output.xml").getAbsolutePath());
s.set(Settings.NAME_DATA, "{d:xml(<absolute path output>/data.xml)}");

s.execute();

Здесь мы передаем {configuration:xml(<absolute path output>/data.xml)} как TDD свойству NAME_DATA.Это путь?Это «странно» - создавать текстовое определение в нашем коде.Есть ли способ сделать это на чистой Java?

...