Процессинг
Процессинг — это способ повлиять на процессы, проходящие в жизненном цикле N2O.
Процессинг данных
С помощью процессинга данных можно изменить входные или выходные параметры действия, фильтрацию и поля выборки, обработать ошибки или добавить сообщения.
Точки входа
Есть несколько точек входа для процессинга данных. Они делятся на:
- Процессинг действия или процессинг выборки.
- Перед отправкой данных в провайдер или после.
- Успешно выполнено или прервано с исключением.
Точки входа процессинга данных
Точка входа | Описание |
---|---|
beforeAction | Перед отправкой действия в провайдер данных |
afterSuccessAction | После успешного получения данных действия из п ровайдера. |
afterFailAction | После отправки действия в провайдер данных. Выполнение было прервано исключением. |
beforeQuery | Перед отправкой запроса за выборкой в провайдер данных. |
afterSuccessQuery | После успешного получения данных выборки из провайдера данных. |
afterFailQuery | После отправки запроса за выборкой в провайдер данных. Выполнение было прервано исключением. |
Если при выполнении процессинга происходит исключение, оно проглатывается и не доходит до пользователя. Узнать причину исключения можно будет только по стектрейсу, посмотрев логи.
Процессинг данных через Java
Для процессинга данных на Java нужно реализовать интерфейс DataProcessing
.
@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).
По умолчанию в качестве используемого кэша будет выбрана существующая реализация интерфейса 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;
}
}
Трансформировать 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;
}
}