Импортировать модуль в xquery с помощью Apache Camel Transformer EIP - PullRequest
1 голос
/ 05 июня 2019

У меня есть верблюжий маршрут, который довольно прост, за исключением использованного xquery, поэтому я извлек его в отдельный файл. На моем верблюжьем маршруте я вызываю xquery с помощью Transformer EIP:

.transform().xquery("resource:classpath:xquery/myCoolXQuery.xquery",String.class)

Сам XQuery работает нормально, но из-за некоторых функциональных изменений я хочу импортировать другой модуль XQuery, который я хочу использовать в качестве «библиотеки» с некоторыми вспомогательными функциями, потому что у меня есть много XQuery-файлов, которые могут их использовать .

Итак, что я сделал в своем XQuery:

xquery version "3.0" encoding "UTF-8";

declare namespace fn = 'http://www.w3.org/2005/xpath-functions';

(: Library of really helpful functions :)
import module namespace lib = "http://handofnod.com/xquery-lib" at "classpath:xquery/lib.xquery";

Вопрос:

Как настроить Apache Camel, чтобы StandardModuleURIResolver мог загружать импортированный модуль из classpath ?

Пока что исследования / проблема

К сожалению, верблюд apache теперь бросает NullpointerException в StandardModuleURIResolver в:

if ("classpath".equals(absoluteURI.getScheme())) {
    String path = absoluteURI.getPath();
    is = this.config.getDynamicLoader().getResourceAsStream(path);

Это потому, что absoluteURI (то есть "classpath:xquery/lib.xquery") не может быть конвертировано правильно, а переменная path равна NULL (это в значительной степени запах кода, но сейчас это не мое дело).

absoluteURI невозможно преобразовать, поскольку net.sf.saxon.query.XQueryParser не имеет значения, установленного в this.env.getStaticBaseURI().

Итак, я попытался во время отладки установить значение staticBaseURI равным classpath, но затем StandardModuleURIResolver также возвращает absoluteURI, значение которого NULL в getPath(), что приводит к тому же NullPointerException.

Так что теперь я понятия не имею, как использовать Transformer-EIP с XQuery, который использует модуль импорта для некоторых вспомогательных функций.

Другое возможное решение

Другим возможным решением было бы не использовать Transformer-EIP, реализованный в Apache Camel, а вместо этого использовать ToDefinition, поскольку там можно определить пользовательскую Saxon Configuration поверх параметра URL, который может использовать перезаписанный ModuleURIResolver, который не имеет проблемы.

Также, конечно, я мог бы использовать пользовательскую реализацию Processor для достижения того, чего я хочу, но не в этом смысл использовать Camel, который обеспечивает реализацию для EIP.

Было бы замечательно, если бы я мог использовать Transformer-EIP с импортом модулей в моем XQuery.

Настройка проекта:

  • Spring-Boot 2.1.0.RELEASE
  • Apache Camel 2.22.2
  • Сборка с Maven

Последний вопрос

Может кто-нибудь помочь мне, пожалуйста?

Редактировать 1:

Я скачал исходники от Camel и Saxon, чтобы иметь возможность отладки с большим пониманием того, что происходит, и попробовал некоторые вещи:

Сначала я попытался использовать абсолютный путь:

.transform().xquery("resource:classpath:/xquery/myCoolXQuery.xquery",String.class)

Таким образом, я больше не получаю NullPointerException, потому что в StandardModuleURIResolver в getQuerySource путь больше не NULL:

К сожалению, файл не может быть загружен config.getDynamicLoader().getResourceAsStream(path); и возвращает NULL.

Так что я решил переместить файлы xquery из каталога прямо под src\main\resoures, но это тоже не помогло, и у меня был тот же результат.

1 Ответ

1 голос
/ 07 июня 2019

Поскольку, похоже, нет ответа на мой вопрос, я отлаживал все дальше и дальше, и действительно просто кажется невозможным каким-либо образом настроить Transformer-EIP с XQuery. Также я не смог найти способ загрузить импортированный модуль xquery из пути к классам, поэтому я изменил свой код, и теперь я вызываю свой xquery через XQueryEndpoint, который обеспечивает поддержку пользовательской конфигурации:

.to("xquery:/xquery/myCoolXQuery.xquery?configuration=#saxonConfig&resultsFormat=String")

Таким образом, мой маршрут работает. Но было бы неплохо иметь возможность использовать transform(), потому что код легче понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...