Процессинг
Процессинг — это способ повлиять на процессы, проходящие в жизненном цикле N2O.
#
Процессинг данныхС помощью процессинга данных можно изменить входные или выходные параметры действия, фильтрацию и поля выборки, обработать ошибки или добавить сообщения.
#
Точки входаЕсть несколько точек входа для процессинга данных. Они делятся на:
- Процессинг действия или процессинг выборки.
- Перед отправкой данных в провайдер или после.
- Успешно выполнено или прервано с исключением.
Точки входа процессинга данных
Точка входа | Описание |
---|---|
beforeAction | Перед отправкой действия в провайдер данных |
afterSuccessAction | После успешного получения данных действия из провайдера. |
afterFailAction | После отправки действия в провайдер данных. Выполнение было прервано исключением. |
beforeQuery | Перед отправкой запроса за выборкой в провайдер данных. |
afterSuccessQuery | После успешного получения данных выборки из провайдера данных. |
afterFailQuery | После отправки запроса за выборкой в провайдер данных. Выполнение было прервано исключением. |
important
Если при выполнении процессинга происходит исключение, оно проглатывается и не доходит до пользователя. Узнать причину исключения можно будет только по стектрейсу, посмотрев логи.
#
Процессинг данных через JavaДля процессинга данных на Java нужно реализовать интерфейс DataProcessing
.
@Componentpublic class MyAuditModule implements DataProcessing {
private MyAuditService auditService;//Сервис аудита
/** * @param requestInfo - информация о запросе * @param responseInfo - информация об ответе на запрос * @param dataSet - выходной набор данных */ @Override public void processSuccessAction(ActionRequestInfo requestInfo, ActionResponseInfo responseInfo, DataSet dataSet) { auditService.logAction( requestInfo.getUser().getUsername(), requestInfo.getAction(), dataSet); }
/** * @param requestInfo - информация о запросе * @param responseInfo - информация об ответе на запрос * @param page - выборка данных */ @Override public void processSuccessQuery(QueryRequestInfo requestInfo, QueryResponseInfo responseInfo, CollectionPage<DataSet> page) { auditService.logQuery( requestInfo.getUser().getUsername(), requestInfo.getQuery(), page); }
}
#
ТрансформаторыС помощью трансформаторов можно менять метаданные по пути их к клиенту.
#
Жизненный цикл метаданныхЕсть несколько этапов жизненного цикла метаданных. В каждый из них можно вставить трансформацию.
На первом этапе метаданные считываются из исходных файлов (.xml или .groovy) в Java объекты (Source
),
валидируются и складываются в кэш первого уровня.
На втором этапе метаданные собираются в связанную структуру (Compiled
) и складываются в кэш второго уровня.
#
Трансформаторы исходных метаданныхЧтобы сделать трансформацию исходной метаданной, необходимо реализовать интерфейс SourceTransformer
и задать его в качестве Spring Bean:
@Componentclass MySourcePageTransformer implements SourceTransformer<N2oPage>, SourceClassAware {
/** * Получить класс исходной метаданной * @return Класс исходной метаданной */ public Class<N2oPage> getSourceClass() { return N2oPage.class; }
/** * Трансформировать исходные метаданные * * @param source Исходные метаданные * @param p Процессор исходных метаданных * @return Трансформированные исходные метаданные */ public N2oPage transform(N2oPage source, SourceProcessor p) { ... //изменяем страницу return source; }
/** * Подходит ли исходная метаданная для трансформации? * * @param source Исходные метаданные * @return true - подходит, false - не подходит */ public boolean matches(N2oPage source) { ... //определяем подходит ли для трансформации страница return true; }}
#
Трансформаторы собранных метаданныхЧтобы сделать трансформацию собранной метаданной, необходимо реализовать интерфейс CompileTransformer
и задать его в качестве Spring Bean:
@Componentclass MyCompiledPageTransformer implements CompileTransformer<StandardPage, PageContext>, CompiledClassAware {
/** * Получить класс собранной метаданной * @return Класс собранной метаданной */ public Class<StandardPage> getCompiledClass(); return StandardPage.class; }
/** * Трансформировать собранные метаданные * * @param compiled Собранные метаданные * @param context Контекст сборки * @return Трансформированные собранные метаданные */ public StandardPage transform(StandardPage compiled, PageContext context, CompileProcessor p); ... //изменяем страницу return compiled; }
/** * Подходит ли собранная метаданная для трансформации? * * @param compiled Собранные метаданные * @param context Контекст сборки * @return true - подходит, false - не подходит */ public boolean matches(StandardPage compiled, PageContext context) { ... //определяем подходит ли для трансформации страница return true; }}
important
Трансформировать Compiled объекты не всегда удобно, т.к. они в основном unmodified. Зато удобно анализировать, т.к. у них есть ссылочная связность между зависимыми метаданными.
#
Связывание данныхНа последнем этапе, перед самой отправкой клиенту, происходит процесс связывания метаданных с данными находящимися в URL адресе страницы. Этот этап не кешируется и выполняется для каждого клиента. На этом этапе разрешаются ссылки на контекст пользователя и ссылки на параметры родительских страниц.
Для создания своего связывания с данными необходимо реализовать интерфейс MetadataBinder
и задать его в качестве Spring Bean:
@Componentclass MyPageBinder implements MetadataBinder<StandardPage>, CompiledClassAware { /** * Получить класс собранной метаданной * @return Класс собранной метаданной */ @Override public Class<StandardPage> getCompiledClass() { return StandardPage.class; }
/** * Связать метаданные с данными * @param compiled Собранные метаданные * @param p Процессор связывания * @return Связанные метаданные с данными */ @Override public StandardPage bind(StandardPage compiled, BindProcessor p) { ... //связывание с данными страницы return compiled; }}