Skip to content

Commit

Permalink
Merge pull request #16 from sfaqer/feature/beforeSyncInterceptor
Browse files Browse the repository at this point in the history
Добавлен новый тип перехватчика "Перед синхронизацией полей"
  • Loading branch information
nixel2007 authored Oct 11, 2023
2 parents 533f967 + 011cf4c commit bb6201f
Show file tree
Hide file tree
Showing 7 changed files with 136 additions and 26 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,12 @@ docs - todo;
#### После
Перехватчик вызывается после выполнения перехватываемого метода

#### ПослеВызоваИсключения
Перехватчик вызывается если перехватываемый метод упал в исключение, в момент перед пробросом исключения

#### ПередСинхронизациейПолей
Перехватчик вызывается в самом начале, перед синхронизацией полей декоратора и оригинального метода

### Перечисление ТипыПодключенияБибилотек

#### ПоИмени
Expand Down
2 changes: 1 addition & 1 deletion packagedef
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// BSLLS:CodeOutOfRegion-off
Описание.Имя("decorator")
.Версия("1.6.0")
.Версия("1.7.0")
.Автор("Nikita Gryzlov")
.АдресАвтора("[email protected]")
.Описание("Библиотека для создания декораторов над объектами")
Expand Down
19 changes: 4 additions & 15 deletions src/internal/Модули/КэшируемыеДанные.os
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,8 @@
|// {АннотацияМетода}
|{Функция} Декоратор_ИмяМетода(Декоратор_ОписаниеПараметровМетода) // {Экспорт}
|
| Если {Декоратор_ЭтоДекорируемыйМетод} Тогда
| ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);
| Иначе
| ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);
| КонецЕсли;
| // {Декоратор_ПередСинхронизациейПолей}
| // {Декоратор_СинхронизироватьПоляПеред}
|
| Декоратор_ВозвращаемоеИзМетодаЗначение = NULL;
|
Expand All @@ -68,23 +65,15 @@
|
| Исключение
|
| Если {Декоратор_ЭтоДекорируемыйМетод} Тогда
| ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);
| Иначе
| ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);
| КонецЕсли;
| // {Декоратор_СинхронизироватьПоляПосле}
|
| // {Декоратор_ПослеВызоваИсключения}
|
| ВызватьИсключение;
|
| КонецПопытки;
|
| Если {Декоратор_ЭтоДекорируемыйМетод} Тогда
| ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);
| Иначе
| ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);
| КонецЕсли;
| // {Декоратор_СинхронизироватьПоляПосле}
|
| Если Декоратор_ВозвращаемоеИзМетодаЗначение = Декоратор_ИсходныйОбъект Тогда
| Декоратор_ВозвращаемоеИзМетодаЗначение = ЭтотОбъект;
Expand Down
31 changes: 27 additions & 4 deletions src/Классы/КонструкторДекоратора.os
Original file line number Diff line number Diff line change
Expand Up @@ -438,9 +438,20 @@
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Экспорт}", "Экспорт");
НовыйМетод = СтрЗаменить(НовыйМетод, "{Функция}", "Функция");
НовыйМетод = СтрЗаменить(НовыйМетод, "{КонецФункции}", "КонецФункции");
НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Истина");
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ТекстМетода}", ТекстМетода);


НовыйМетод = СтрЗаменить(
НовыйМетод,
"// {Декоратор_СинхронизироватьПоляПеред}",
"ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);"
);

НовыйМетод = СтрЗаменить(
НовыйМетод,
"// {Декоратор_СинхронизироватьПоляПосле}",
"ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);"
);

ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод, Истина);

НовыйМетод = НовыйМетод + Символы.ПС;
Expand Down Expand Up @@ -473,10 +484,22 @@
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Экспорт}", "Экспорт");
НовыйМетод = СтрЗаменить(НовыйМетод, "{Функция}", "Функция");
НовыйМетод = СтрЗаменить(НовыйМетод, "{КонецФункции}", "КонецФункции");
НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Ложь");
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ВыполняемаяСтрока}", ВыполняемаяСтрока);
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ВозвращаемоеЗначение}", ВозвращаемоеЗначение);


// Для будущих археологов, если вы подумаете что нужно тут добавить
// ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);
// то проверьте что работает АктивнаяЗапись в библиотеки entity
// сейчас этого куска нет потому что при его наличии в декораторе задавятся поля
// декоратора которые были заполнены не через методы, а просто установкой свойств.
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_СинхронизироватьПоляПеред}", "");

НовыйМетод = СтрЗаменить(
НовыйМетод,
"// {Декоратор_СинхронизироватьПоляПосле}",
"ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);"
);

ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод);

ОбластьМетодов = ОбластьМетодов + НовыйМетод;
Expand Down
41 changes: 36 additions & 5 deletions src/Классы/ПостроительДекоратора.os
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,17 @@

НовыйМетод = Метод.Описание();

НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Истина");
НовыйМетод = СтрЗаменить(
НовыйМетод,
"// {Декоратор_СинхронизироватьПоляПеред}",
"ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);"
);

НовыйМетод = СтрЗаменить(
НовыйМетод,
"// {Декоратор_СинхронизироватьПоляПосле}",
"ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);"
);

ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод);

Expand All @@ -458,7 +468,18 @@

НовыйМетод = Метод.Описание();

НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Ложь");
// Для будущих археологов, если вы подумаете что нужно тут добавить
// ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);
// то проверьте что работает АктивнаяЗапись в библиотеки entity
// сейчас этого куска нет потому что при его наличии в декораторе задавятся поля
// декоратора которые были заполнены не через методы, а просто установкой свойств.
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_СинхронизироватьПоляПеред}", "");

НовыйМетод = СтрЗаменить(
НовыйМетод,
"// {Декоратор_СинхронизироватьПоляПосле}",
"ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);"
);

ДобавитьПерехватчикиМетода(Метод.ИмяМетода(), НовыйМетод);

Expand All @@ -474,7 +495,9 @@

ЗаменяемаяСтрокаПеред = "// {Декоратор_ПередВызовомМетода}";
ЗаменяемаяСтрокаПосле = "// {Декоратор_ПослеВызоваМетода}";
ЗаменяемаяСтрокаПередИсключением = "// {Декоратор_ПослеВызоваИсключения}";

ЗаменяемаяСтрокаПослеИсключения = "// {Декоратор_ПослеВызоваИсключения}";
ЗаменяемаяСтрокаПередСинхронизациейПолей = "// {Декоратор_ПередСинхронизациейПолей}";

ТекстМетода = СтрЗаменить(
ТекстМетода,
Expand All @@ -490,10 +513,16 @@

ТекстМетода = СтрЗаменить(
ТекстМетода,
ЗаменяемаяСтрокаПередИсключением,
ЗаменяемаяСтрокаПослеИсключения,
СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.ПослеВызоваИсключения), Символы.ПС)
);

ТекстМетода = СтрЗаменить(
ТекстМетода,
ЗаменяемаяСтрокаПередСинхронизациейПолей,
СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.ПередСинхронизациейПолей), Символы.ПС)
);

КонецПроцедуры

Функция ТекстыПерехватчиков(ИмяМетода)
Expand All @@ -502,7 +531,9 @@

Результат.Вставить(ТипыПерехватчиковМетода.Перед, Новый Массив);
Результат.Вставить(ТипыПерехватчиковМетода.После, Новый Массив);
Результат.Вставить(ТипыПерехватчиковМетода.ПослеВызоваИсключения, Новый Массив);

Результат.Вставить(ТипыПерехватчиковМетода.ПослеВызоваИсключения, Новый Массив);
Результат.Вставить(ТипыПерехватчиковМетода.ПередСинхронизациейПолей, Новый Массив);

Для каждого Перехватчик Из ПерехватчикиМетодов Цикл

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
Перем Перед Экспорт;
Перем После Экспорт;

Перем ПослеВызоваИсключения Экспорт;
Перем ПередСинхронизациейПолей Экспорт;

Перед = "Перед";
После = "После";
ПослеВызоваИсключения = "ПослеВызоваИсключения";

ПослеВызоваИсключения = "ПослеВызоваИсключения";
ПередСинхронизациейПолей = "ПередСинхронизациейПолей";
57 changes: 57 additions & 0 deletions tests/Тесты_ПостроительДекоратора.os
Original file line number Diff line number Diff line change
Expand Up @@ -794,3 +794,60 @@
Ожидаем.Что(Декоратор.СчетчикПерехватчикаПослеВызоваИсключения).Равно(1);

КонецПроцедуры

&Тест
Процедура ПерехватчикиПередСинхронизациейПолейДекорируемыхФункцийРаботаютКорректно() Экспорт

// Дано
МойКласс = Новый МойКласс;
МойКласс.Поле = 123;

ПерехватчикПередСинхронизациейПолей = Новый Перехватчик("ВернутьЭтотОбъект")
.ТипПерехватчика(ТипыПерехватчиковМетода.ПередСинхронизациейПолей)
.Тело("Поле = 124;");

Декоратор = Новый ПостроительДекоратора(МойКласс)
.Перехватчик(ПерехватчикПередСинхронизациейПолей)
.Построить();

// Когда

Результат = Декоратор.ВернутьЭтотОбъект();

// Тогда

Ожидаем.Что(Результат.Поле).Равно(124);
Ожидаем.Что(МойКласс.Поле).Равно(124);

КонецПроцедуры

&Тест
Процедура ПерехватчикиПередСинхронизациейПолейДобавленныхФункцийРаботаютКорректно() Экспорт

// Дано
МойКласс = Новый МойКласс;
МойКласс.Поле = 123;

НовыйМетод = Новый Метод("ВернутьСебя")
.Публичный()
.ТелоМетода("Возврат ЭтотОбъект;");

ПерехватчикПередСинхронизациейПолей = Новый Перехватчик("ВернутьСебя")
.ТипПерехватчика(ТипыПерехватчиковМетода.ПередСинхронизациейПолей)
.Тело("Поле = 124;");

Декоратор = Новый ПостроительДекоратора(МойКласс)
.Метод(НовыйМетод)
.Перехватчик(ПерехватчикПередСинхронизациейПолей)
.Построить();

// Когда

Результат = Декоратор.ВернутьСебя();

// Тогда

Ожидаем.Что(Результат.Поле).Равно(124);
Ожидаем.Что(МойКласс.Поле).Равно(124);

КонецПроцедуры

0 comments on commit bb6201f

Please sign in to comment.