Skip to main content

Процессинг

Процессинг — это способ повлиять на процессы, проходящие в жизненном цикле N2O.

Процессинг данных#

С помощью процессинга данных можно изменить входные или выходные параметры действия, фильтрацию и поля выборки, обработать ошибки или добавить сообщения.

Точки входа#

Есть несколько точек входа для процессинга данных. Они делятся на:

  • Процессинг действия или процессинг выборки.
  • Перед отправкой данных в провайдер или после.
  • Успешно выполнено или прервано с исключением.

Точки входа процессинга данных

Точка входаОписание
beforeActionПеред отправкой действия в провайдер данных
afterSuccessActionПосле успешного получения данных действия из провайдера.
afterFailActionПосле отправки действия в провайдер данных. Выполнение было прервано исключением.
beforeQueryПеред отправкой запроса за выборкой в провайдер данных.
afterSuccessQueryПосле успешного получения данных выборки из провайдера данных.
afterFailQueryПосле отправки запроса за выборкой в провайдер данных. Выполнение было прервано исключением.
important

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

Процессинг данных через Java#

Для процессинга данных на Java нужно реализовать интерфейс DataProcessing.

Аудит действия и выборки на Java
@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;    }}