2014-01-21 4 views
2

Im разоблачение служб REST с использованием среды Sprint MVC 4.0, и я стараюсь следовать спецификации Odata для параметров запроса, таких как $ filter, $ search и $ orderBy. Каждый из них содержит выражения, которые мне нужны для синтаксического анализа, построения абстрактных деревьев синтаксиса и проверки. Все они извлекаются как String.Использование Odata4j для создания абстрактного синтаксического дерева для выражений параметров запроса

Мне не нужны все конструкции, которые определены в OData грамматики (http://docs.oasis-open.org/odata/odata/v4.0/cos01/abnf/odata-abnf-construction-rules.txt), я просто выбрать те, которые имеют отношение к моим делам использований (очень мало на самом деле)

Я хотел бы получить совет о том, для синтаксического анализа и создания абстрактного дерева, и если Odata4j можно использовать в качестве библиотеки Utility для выполнения этой работы для меня? Я бы хотел, чтобы не перетащить кучу новых зависимостей в odata4j, так как я буду использовать только небольшую часть кода.

ответ

1

Вы можете использовать odata4j для построения AST для параметров запроса. Я сделал это именно для целей, которые вы цитируете. Я отделил параметры запроса, а затем снова разделил на «&», чтобы получить параметры. Для каждого из них я проверяю имя параметра ($ select, $ filter и т. Д.), А затем на основе этого используется соответствующий staticQueryParser статический метод для значения, возвращающий число или список или AST, специфичный для этого параметра запроса. Для выражения АСТ взгляните на PrintExpressionVisitor и используйте это как образец для написания собственного посетителя, чтобы пройти AST.

+0

Том, это похоже на то, что я тоже ищу. У вас есть код, который вы можете использовать? –

+0

Надеюсь, вы можете увидеть шаблон здесь и завершить его самостоятельно. Строка queryString = uri.substring (uri.indexOf ('?') + 1); for (Строковый сегмент: queryString.split ("&")) { \t Строка [] paramPair = segment.split ("="); \t Строковое имя = paramPair [0] .trim(); \t Строковое значение = paramPair [1] .trim(); \t if (name.equals (OPTION_SELECT)) { \t \t select = ОпцииQueryParser.parseВыбрать (значение); \t} else if (name.equals (OPTION_FILTER)) { \t \t filter = ОпцииQueryParser.parseFilter (значение); \t} else if (name.equals (... – Tom

+0

Спасибо, Том. Да, это была легкая часть. Теперь я пытаюсь выполнить последнюю часть вашего ответа: пройдите фильтр AST, чтобы построить мой запрос. –