1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2024-12-03 08:45:31 +02:00
Асинхронная установка компонент
This commit is contained in:
alkoleft 2023-09-03 02:47:54 +03:00
parent 6e1031928c
commit 7350014bbc
8 changed files with 196 additions and 84 deletions

View File

@ -0,0 +1,64 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
Процедура ВызватьОбработчик(Обработчик, Результат = Неопределено) Экспорт
Если Обработчик <> Неопределено Тогда
ВыполнитьОбработкуОповещения(Обработчик, Результат);
КонецЕсли;
КонецПроцедуры
Процедура ВызватьСледующийОбработчик(ПараметрыИсполнения, Результат = Неопределено) Экспорт
Обработчик = СледующийОбработчик(ПараметрыИсполнения);
ЮТЛогирование.Отладка("Вызов обработчика исполнителя: " + Обработчик.ИмяПроцедуры);
ВызватьОбработчик(Обработчик, Результат);
КонецПроцедуры
Функция СледующийОбработчик(ПараметрыИсполнения) Экспорт
ПараметрыИсполнения.ИндексСледующегоОбработчика = ПараметрыИсполнения.ИндексСледующегоОбработчика + 1;
Обработчик = ПараметрыИсполнения.Цепочка[ПараметрыИсполнения.ИндексСледующегоОбработчика];
ЮТЛогирование.Отладка("Следующий обработчик исполнителя: " + Обработчик.ИмяПроцедуры);
Возврат Обработчик;
КонецФункции
Процедура ДобавитьОбработчикЦепочки(ПараметрыИсполнения, Модуль, ИмяМетода) Экспорт
Обработчик = Новый ОписаниеОповещения(ИмяМетода, Модуль, ПараметрыИсполнения);
ПараметрыИсполнения.Цепочка.Добавить(Обработчик);
КонецПроцедуры
Функция ЦепочкаАсинхроннойОбработки() Экспорт
Параметры = Новый Структура();
Параметры.Вставить("Цепочка", Новый Массив());
Параметры.Вставить("ИндексСледующегоОбработчика", -1);
Возврат Параметры;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="cb3274e3-1931-4354-be2c-7ad3e56b3042">
<name>ЮТАсинхроннаяОбработкаСлужебныйКлиент</name>
<synonym>
<key>ru</key>
<value>Асинхронная обработка служебный</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -33,7 +33,7 @@
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьКодВозврата");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗавершить");
ВызватьСледующийОбработчик(ПараметрыИсполнения);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыИсполнения);
КонецПроцедуры
@ -47,25 +47,15 @@
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикВыполнитьТестирование");
ПараметрыИсполнения.Цепочка.Добавить(ОбработчикЗавершения);
ВызватьСледующийОбработчик(ПараметрыИсполнения);
КонецПроцедуры
Процедура ВызватьОбработчик(Обработчик, Результат = Неопределено) Экспорт
Если Обработчик <> Неопределено Тогда
ВыполнитьОбработкуОповещения(Обработчик, Результат);
КонецЕсли;
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыИсполнения);
КонецПроцедуры
Функция ПараметрыИсполнения() Экспорт
Параметры = Новый Структура();
Параметры = ЮТАсинхроннаяОбработкаСлужебныйКлиент.ЦепочкаАсинхроннойОбработки();
Параметры.Вставить("АргументыЗапуска");
Параметры.Вставить("ПараметрыЗапуска");
Параметры.Вставить("Цепочка", Новый Массив());
Параметры.Вставить("ИндексСледующегоОбработчика", -1);
Параметры.Вставить("ИсполняемыеТестовыеМодули");
Параметры.Вставить("РезультатыТестирования");
@ -137,7 +127,7 @@
Процедура ОбработчикЗагрузитьПараметры(Результат, ДополнительныеПараметры) Экспорт
Обработчик = СледующийОбработчик(ДополнительныеПараметры);
Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ДополнительныеПараметры);
ЮТПараметрыЗапуска.ПараметрыЗапуска(ДополнительныеПараметры.АргументыЗапуска, Обработчик);
КонецПроцедуры
@ -150,7 +140,7 @@
Возврат;
КонецЕсли;
ВызватьСледующийОбработчик(ДополнительныеПараметры);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецПроцедуры
@ -158,7 +148,7 @@
ЮТСобытия.Инициализация(ДополнительныеПараметры.ПараметрыЗапуска);
ВызватьСледующийОбработчик(ДополнительныеПараметры);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецПроцедуры
@ -179,7 +169,7 @@
ЮТСобытия.ПослеФормированияИсполняемыхНаборовТестов(ИсполняемыеТестовыеМодули);
ДополнительныеПараметры.ИсполняемыеТестовыеМодули = ИсполняемыеТестовыеМодули;
ВызватьСледующийОбработчик(ДополнительныеПараметры, ИсполняемыеТестовыеМодули);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры, ИсполняемыеТестовыеМодули);
КонецПроцедуры
@ -199,17 +189,17 @@
ЮТСобытия.ПослеВыполненияТестов(РезультатыТестирования);
ДополнительныеПараметры.РезультатыТестирования = РезультатыТестирования;
ВызватьСледующийОбработчик(ДополнительныеПараметры, РезультатыТестирования);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры, РезультатыТестирования);
КонецПроцедуры
Процедура ОбработчикСохранитьОтчет(Результат, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(ДополнительныеПараметры.ПараметрыЗапуска.reportPath) Тогда
Обработчик = СледующийОбработчик(ДополнительныеПараметры);
Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ДополнительныеПараметры);
ЮТОтчет.СформироватьОтчет(ДополнительныеПараметры.РезультатыТестирования, ДополнительныеПараметры.ПараметрыЗапуска, Обработчик);
Иначе
ВызватьСледующийОбработчик(ДополнительныеПараметры);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
@ -217,7 +207,7 @@
Процедура ОбработчикСохранитьКодВозврата(Результат, ДополнительныеПараметры) Экспорт
ЗаписатьКодВозврата(ДополнительныеПараметры.РезультатыТестирования, ДополнительныеПараметры.ПараметрыЗапуска);
ВызватьСледующийОбработчик(ДополнительныеПараметры);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецПроцедуры
@ -236,8 +226,8 @@
Процедура ОбработчикПодключитьКомпоненты(Результат, ДополнительныеПараметры) Экспорт
ЮТКомпонентыКлиент.ТихаяУстановкаКомпонент();
ВызватьСледующийОбработчик(ДополнительныеПараметры);
Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ДополнительныеПараметры);
ЮТКомпонентыКлиент.ТихаяУстановкаКомпонент(Обработчик);
КонецПроцедуры
@ -262,28 +252,6 @@
#КонецОбласти
Процедура ВызватьСледующийОбработчик(ПараметрыИсполнения, Результат = Неопределено)
Обработчик = СледующийОбработчик(ПараметрыИсполнения);
ЮТЛогирование.Отладка("Вызов обработчика исполнителя: " + Обработчик.ИмяПроцедуры);
ВыполнитьОбработкуОповещения(Обработчик, Результат);
КонецПроцедуры
Функция СледующийОбработчик(ПараметрыИсполнения)
Если ТипЗнч(ПараметрыИсполнения) = Тип("ОписаниеОповещения") Тогда
Возврат ПараметрыИсполнения;
КонецЕсли;
ПараметрыИсполнения.ИндексСледующегоОбработчика = ПараметрыИсполнения.ИндексСледующегоОбработчика + 1;
Обработчик = ПараметрыИсполнения.Цепочка[ПараметрыИсполнения.ИндексСледующегоОбработчика];
ЮТЛогирование.Отладка("Следующий обработчик исполнителя: " + Обработчик.ИмяПроцедуры);
Возврат Обработчик;
КонецФункции
Процедура ДобавитьОбработчикЦепочки(ПараметрыИсполнения, ИмяМетода)
Обработчик = Новый ОписаниеОповещения(ИмяМетода, ЭтотОбъект, ПараметрыИсполнения, "ОбработчикОшибки", ЭтотОбъект);

View File

@ -18,28 +18,49 @@
#Область СлужебныйПрограммныйИнтерфейс
Функция ТихаяУстановкаКомпонент() Экспорт
Процедура ТихаяУстановкаКомпонент(ОбработчикЗавершения) Экспорт
Успешно = Истина;
#Если Клиент И НЕ ВебКлиент Тогда
ПараметрыТихойУстановки = ПараметрыТихойУстановки();
ПараметрыТихойУстановки.Компоненты.Добавить(ЮТКомпоненты.ОписаниеКомпонентыПауза());
Компоненты = ЮТОбщий.ЗначениеВМассиве(ЮТКомпоненты.ОписаниеКомпонентыПауза());
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ДобавитьОбработчикЦепочки(ПараметрыТихойУстановки,
ЭтотОбъект,
"УстановитьПараметрыОкружения");
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ДобавитьОбработчикЦепочки(ПараметрыТихойУстановки,
ЭтотОбъект,
"ТихаяУстановкаВнешнихКомпонент");
Для Каждого Компонента Из Компоненты Цикл
ТихаяУстановкаВнешнейКомпоненты(Компонента.ИмяМакета);
КонецЦикла;
#КонецЕсли
ПараметрыТихойУстановки.Цепочка.Добавить(ОбработчикЗавершения);
Возврат Успешно;
Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ПараметрыТихойУстановки);
НачатьПолучениеРабочегоКаталогаДанныхПользователя(Обработчик);
КонецФункции
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ТихаяУстановкаВнешнейКомпоненты(ИмяМакета)
Функция ПараметрыТихойУстановки()
ПараметрыТихойУстановки = ЮТАсинхроннаяОбработкаСлужебныйКлиент.ЦепочкаАсинхроннойОбработки();
ПараметрыТихойУстановки.Вставить("Компоненты", Новый Массив());
ПараметрыТихойУстановки.Вставить("РабочийКаталог", "");
ПараметрыТихойУстановки.Вставить("ОперационнаяСистема", "");
ПараметрыТихойУстановки.Вставить("Архитектура", "");
ПараметрыТихойУстановки.Вставить("ДанныеРеестра", "");
ПараметрыТихойУстановки.Вставить("ИзмененРеестр", Ложь);
Возврат ПараметрыТихойУстановки;
КонецФункции
Процедура УстановитьПараметрыОкружения(Результат, ПараметрыТихойУстановки) Экспорт
КорневойКаталог = ЮТФайлы.ОбъединитьПути(Результат, "..", "..", "..");
КаталогКомпонент = ЮТФайлы.ОбъединитьПути(КорневойКаталог, "ExtCompT");
ПараметрыТихойУстановки.РабочийКаталог = КаталогКомпонент;
Информация = Новый СистемнаяИнформация();
ОперационнаяСистема = Неопределено;
Архитектура = Неопределено;
@ -47,6 +68,7 @@
Linux = "Linux";
Windows = "Windows";
MacOS = "MacOS";
x86 = "i386";
x64 = "x86_64";
@ -71,43 +93,90 @@
ОперационнаяСистема = MacOS;
Архитектура = x64;
Иначе
ВызватьИсключение "Неподдерживаемый тип платформы";
ЮТИсполнительКлиент.ОбработкаОшибки("Неподдерживаемый тип платформы");
КонецЕсли;
ДанныеФайла = ЮТКомпонентыВызовСервера.ФайлКомпоненты(ИмяМакета, ОперационнаяСистема, Архитектура);
Путь = РабочийКаталогДанныхПользователя();
КорневойКаталог = ЮТФайлы.ОбъединитьПути(Путь, "..", "..", "..");
КаталогКомпонент = ЮТФайлы.ОбъединитьПути(КорневойКаталог, "ExtCompT");
ФайлРеестра = ЮТФайлы.ОбъединитьПути(КаталогКомпонент, "registry.xml");
ФайлКомпоненты = ЮТФайлы.ОбъединитьПути(КаталогКомпонент, ДанныеФайла.ИмяФайла);
ДанныеФайла.Данные.Записать(ФайлКомпоненты);
ЗаписатьВРеестр(ФайлРеестра, ДанныеФайла.ИмяФайла);
ПараметрыТихойУстановки.ОперационнаяСистема = ОперационнаяСистема;
ПараметрыТихойУстановки.Архитектура = Архитектура;
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыТихойУстановки);
КонецПроцедуры
Процедура ЗаписатьВРеестр(ФайлРеестра, ИмяФайла)
Процедура ПрочитатьФайлRegistry(ПараметрыТихойУстановки) Экспорт
Данные = Новый ДвоичныеДанные(ФайлРеестра);
Текст = ПолучитьСтрокуИзДвоичныхДанных(Данные);
#Если ВебКлиент Тогда
ЮТИсполнительКлиент.ОбработкаОшибки(ЮТОбщий.МетодНеДоступен("ЮТКомпонентыКлиент.ПрочитатьФайлRegistry"));
Возврат;
#Иначе
ФайлРеестра = ЮТФайлы.ОбъединитьПути(ПараметрыТихойУстановки.РабочийКаталог, "registry.xml");
Чтение = Новый ЧтениеТекста(ФайлРеестра);
Данные = Чтение.Прочитать();
Чтение.Закрыть();
ПараметрыТихойУстановки.ДанныеРеестра = Данные;
Если СтрНайти(Текст, "<component") = 0 Тогда // Файл пустой
Текст = СтрШаблон("<?xml version=""1.0"" encoding=""UTF-8""?>
#КонецЕсли
КонецПроцедуры
Процедура ЗаписатьФайлRegistry(ПараметрыТихойУстановки) Экспорт
#Если ВебКлиент Тогда
ЮТИсполнительКлиент.ОбработкаОшибки(ЮТОбщий.МетодНеДоступен("ЮТКомпонентыКлиент.ЗаписатьФайлRegistry"));
Возврат;
#Иначе
Если ПараметрыТихойУстановки.ИзмененРеестр Тогда
ФайлРеестра = ЮТФайлы.ОбъединитьПути(ПараметрыТихойУстановки.РабочийКаталог, "registry.xml");
Запись = Новый ЗаписьТекста(ФайлРеестра);
Запись.Записать(ПараметрыТихойУстановки.ДанныеРеестра);
Запись.Закрыть();
КонецЕсли;
#КонецЕсли
КонецПроцедуры
Процедура ТихаяУстановкаВнешнихКомпонент(Результат, ПараметрыТихойУстановки) Экспорт
ПрочитатьФайлRegistry(ПараметрыТихойУстановки);
Для Каждого Компонента Из ПараметрыТихойУстановки.Компоненты Цикл
ТихаяУстановкаВнешнейКомпоненты(Компонента, ПараметрыТихойУстановки);
КонецЦикла;
ЗаписатьФайлRegistry(ПараметрыТихойУстановки);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыТихойУстановки);
КонецПроцедуры
Процедура ТихаяУстановкаВнешнейКомпоненты(Компонента, Параметры) Экспорт
ДанныеФайла = ЮТКомпонентыВызовСервера.ФайлКомпоненты(Компонента.ИмяМакета, Параметры.ОперационнаяСистема, Параметры.Архитектура);
Если ЗаписатьВРеестр(Параметры.ДанныеРеестра, ДанныеФайла.ИмяФайла) Тогда
Параметры.ИзмененРеестр = Истина;
КонецЕсли;
ФайлКомпоненты = ЮТФайлы.ОбъединитьПути(Параметры.РабочийКаталог, ДанныеФайла.ИмяФайла);
ДанныеФайла.Данные.Записать(ФайлКомпоненты);
КонецПроцедуры
Функция ЗаписатьВРеестр(ДанныеРеестра, ИмяФайла)
Если СтрНайти(ДанныеРеестра, "<component") = 0 Тогда // Файл пустой
ДанныеРеестра = СтрШаблон("<?xml version=""1.0"" encoding=""UTF-8""?>
|<registry xmlns=""http://v8.1c.ru/8.2/addin/registry"">
| <component path=""%1"" type=""native""/>
|</registry>", ИмяФайла);
ИначеЕсли СтрНайти(Текст, СтрШаблон("path=""%1""", ИмяФайла)) <> 0 Тогда // Компонента уже зарегистрированна
Возврат;
ИначеЕсли СтрНайти(ДанныеРеестра, СтрШаблон("path=""%1""", ИмяФайла)) <> 0 Тогда // Компонента уже зарегистрированна
Возврат Ложь;
Иначе // Добавляем компоненту
Запись = СтрШаблон(" <component path=""%1"" type=""native""/>", ИмяФайла);
Текст = СтрЗаменить(Текст, "</registry>", Запись + Символы.ПС + "</registry>");
ДанныеРеестра = СтрЗаменить(ДанныеРеестра, "</registry>", Запись + Символы.ПС + "</registry>");
КонецЕсли;
Данные = ПолучитьДвоичныеДанныеИзСтроки(Текст, КодировкаТекста.UTF8, Истина);
Данные.Записать(ФайлРеестра);
Возврат Истина;
КонецПроцедуры
КонецФункции
#КонецОбласти

View File

@ -85,7 +85,7 @@
ДанныеОтчета.Записать(ИмяФайлаОтчета);
КонецЕсли;
ЮТИсполнительКлиент.ВызватьОбработчик(Параметры.Обработчик);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Параметры.Обработчик);
КонецПроцедуры
@ -98,7 +98,7 @@
ИмяФайла = ПутьКОтчету;
КонецЕсли;
ЮТИсполнительКлиент.ВызватьОбработчик(Параметры.Обработчик, ИмяФайла);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Параметры.Обработчик, ИмяФайла);
КонецПроцедуры

View File

@ -69,7 +69,7 @@
Параметры = ЮТФабрика.ПараметрыЗапуска();
Если Не ЗначениеЗаполнено(ПараметрыЗапускаСтрокой) Тогда
ЮТИсполнительКлиент.ВызватьОбработчик(Обработчик, Параметры);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Обработчик, Параметры);
Возврат Параметры;
КонецЕсли;
@ -111,7 +111,7 @@
КонецЕсли;
ЮТИсполнительКлиент.ВызватьОбработчик(Обработчик, Параметры);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Обработчик, Параметры);
Возврат Параметры;

View File

@ -165,7 +165,7 @@
Процедура ПолучитьАтрибутФайла(Результат, Параметры) Экспорт
Если НЕ Результат Тогда
ВыполнитьОбработкуОповещения(Параметры.Обработчик, Параметры.ЗначениеПоУмолчанию);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Параметры.Обработчик, Параметры.ЗначениеПоУмолчанию);
Возврат;
КонецЕсли;

View File

@ -49,6 +49,7 @@
<commonModules>CommonModule.МокитоОбучение</commonModules>
<commonModules>CommonModule.МокитоПроверки</commonModules>
<commonModules>CommonModule.МокитоСлужебный</commonModules>
<commonModules>CommonModule.ЮТАсинхроннаяОбработкаСлужебныйКлиент</commonModules>
<commonModules>CommonModule.ЮТест</commonModules>
<commonModules>CommonModule.ЮТЗапросы</commonModules>
<commonModules>CommonModule.ЮТЗапросыВызовСервера</commonModules>