Skip to main content

Процессинг

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

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

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

Точки входа

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

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

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

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

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

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

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

Аудит действия и выборки на Java
@Component
public 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) в Java объекты (Source), валидируются и складываются в кэш первого уровня. На втором этапе метаданные собираются в связанную структуру (Compiled) и складываются в кэш второго уровня.

Кэш используется для того, чтобы при обращении к странице, каждый раз не производилось чтение из исходных файлов (этап Source) и компиляция (этап Compile).

note

По умолчанию в качестве используемого кэша будет выбрана существующая реализация интерфейса org.springframework.cache.CacheManager в проекте. Также для задания типа кэша можно воспользоваться настройкой spring.cache.type.

Трансформаторы исходных метаданных

Чтобы сделать трансформацию исходной метаданной, необходимо реализовать интерфейс SourceTransformer и задать его в качестве Spring Bean:

Трансформация исходной страницы
@Component
class 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:

Трансформация собранной страницы
@Component
class 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:

Связывание с данными страницы
@Component
class 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;
}
}