Skip to content

Commit

Permalink
Исправление загрузчика библиотеки
Browse files Browse the repository at this point in the history
  • Loading branch information
sfaqer committed Oct 15, 2023
1 parent 0e800fe commit ecca0f6
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 149 deletions.
184 changes: 36 additions & 148 deletions package-loader.os
Original file line number Diff line number Diff line change
Expand Up @@ -9,124 +9,54 @@
|ПриЗагрузкеБиблиотеки " + Путь);

Если Осень <> Неопределено Тогда
ПутьДоЗаготовки = ОбъединитьПути(Путь, "src/Заготовки/ИнициализацияСинхронизации.os");
ПодключитьСценарий(ПутьДоЗаготовки, "ИнициализацияСинхронизации");
ОбработатьКаталогКлассов(ОбъединитьПути(Путь, "src/Заготовки"), СтандартнаяОбработка, Отказ);
ОбработатьКаталогКлассов(ОбъединитьПути(Путь, "src/Классы"), СтандартнаяОбработка, Отказ);
ОбработатьКаталогМодулей(ОбъединитьПути(Путь, "src/Модули"), СтандартнаяОбработка, Отказ);

Осень.ДобавитьЗаготовкуДляАвтоИнициализации("ИнициализацияСинхронизации");
Иначе
ВызватьИсключение "Некорректный порядок импорта библиотек. Сначала подключите autumn";
КонецЕсли;

ФайлМанифеста = Новый Файл(ОбъединитьПути(Путь, "lib.config"));

Если ФайлМанифеста.Существует() Тогда
Вывести("Обрабатываем по манифесту");

СтандартнаяОбработка = Ложь;
ОбработатьМанифест(ФайлМанифеста.ПолноеИмя, Путь, Отказ);
Иначе
Вывести("Обрабатываем структуру каталогов по соглашению");
ОбработатьСтруктуруКаталоговПоСоглашению(Путь, СтандартнаяОбработка, Отказ);
ВызватьИсключение "Некорректный порядок импорта библиотек. Сначала подключите autumn";
КонецЕсли;

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

Процедура ОбработатьМанифест(Знач Файл, Знач Путь, Отказ)

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(Файл);
Чтение.ПерейтиКСодержимому();

Если Чтение.ЛокальноеИмя <> "package-def" Тогда
Отказ = Истина;
Чтение.Закрыть();
Возврат;
КонецЕсли;

Пока Чтение.Прочитать() Цикл

Если Чтение.ТипУзла = ТипУзлаXML.Комментарий Тогда

Продолжить;
Процедура ОбработатьКаталогМодулей(Знач Путь, СтандартнаяОбработка, Отказ)

КонецЕсли;
КаталогМодулей = Новый Файл(Путь);

Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда

Если Чтение.ЛокальноеИмя = "class" Тогда
ФайлКласса = Новый Файл(Путь + "/" + Чтение.ЗначениеАтрибута("file"));
Если ФайлКласса.Существует() и ФайлКласса.ЭтоФайл() Тогда
Идентификатор = Чтение.ЗначениеАтрибута("name");
Если Не ПустаяСтрока(Идентификатор) Тогда
Вывести(СтрШаблон(" класс %1, файл %2", Идентификатор, ФайлКласса.ПолноеИмя));

// ДобавитьКласс(ФайлКласса.ПолноеИмя, Идентификатор);
ДобавитьКлассЕслиРанееНеДобавляли(ФайлКласса.ПолноеИмя, Идентификатор);
КонецЕсли;
Иначе
ВызватьИсключение "Не найден файл " + ФайлКласса.ПолноеИмя + ", указанный в манифесте";
КонецЕсли;

Чтение.Прочитать(); // в конец элемента
КонецЕсли;

Если Чтение.ЛокальноеИмя = "module" Тогда
ФайлКласса = Новый Файл(Путь + "/" + Чтение.ЗначениеАтрибута("file"));
Если ФайлКласса.Существует() и ФайлКласса.ЭтоФайл() Тогда
Идентификатор = Чтение.ЗначениеАтрибута("name");
Если Не ПустаяСтрока(Идентификатор) Тогда
Вывести(СтрШаблон(" модуль %1, файл %2", Идентификатор, ФайлКласса.ПолноеИмя));
Попытка
ДобавитьМодульЕслиРанееНеДобавляли(ФайлКласса.ПолноеИмя, Идентификатор);
Исключение
Если ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей Тогда
ВызватьИсключение;
КонецЕсли;
Вывести("Предупреждение:
| " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
Иначе
ВызватьИсключение "Не найден файл " + ФайлКласса.ПолноеИмя + ", указанный в манифесте";
Если КаталогМодулей.Существует() Тогда
Файлы = НайтиФайлы(КаталогМодулей.ПолноеИмя, "*.os");
Для Каждого Файл Из Файлы Цикл
Вывести(СтрШаблон(" модуль (по соглашению) %1, файл %2", Файл.ИмяБезРасширения, Файл.ПолноеИмя));
СтандартнаяОбработка = Ложь;
Попытка
ДобавитьМодульЕслиРанееНеДобавляли(Файл.ПолноеИмя, Файл.ИмяБезРасширения);
Исключение
Если ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей Тогда
ВызватьИсключение;
КонецЕсли;

Чтение.Прочитать(); // в конец элемента
КонецЕсли;

КонецЕсли;

КонецЦикла;

Чтение.Закрыть();
СтандартнаяОбработка = Истина;
Вывести("Предупреждение:
|" + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
КонецЕсли;

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

Процедура ОбработатьСтруктуруКаталоговПоСоглашению(Путь, СтандартнаяОбработка, Отказ)
Процедура ДобавитьМодульЕслиРанееНеДобавляли(ПутьФайла, ИмяМодуля)
Вывести("Добавляю модуль, если ранее не добавляли " + ИмяМодуля);

КаталогиКлассов = Новый Массив;
КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "Классы"));
КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "Classes"));
КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "src", "Классы"));
КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "src", "Classes"));

КаталогиМодулей = Новый Массив;
КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "Модули"));
КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "Modules"));
КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "src", "Модули"));
КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "src", "Modules"));


Для Каждого мКаталог Из КаталогиКлассов Цикл

ОбработатьКаталогКлассов(мКаталог, СтандартнаяОбработка, Отказ);

КонецЦикла;

Для Каждого мКаталог Из КаталогиМодулей Цикл

ОбработатьКаталогМодулей(мКаталог, СтандартнаяОбработка, Отказ);

КонецЦикла;
МодульУжеЕсть = КэшМодулей.Найти(ИмяМодуля) <> Неопределено;
Если Не МодульУжеЕсть Тогда

Вывести("Добавляю модуль, т.к. он не найден - " + ИмяМодуля);
ДобавитьМодуль(ПутьФайла, ИмяМодуля);
КэшМодулей.Добавить(ИмяМодуля);
Иначе
Вывести("Пропускаю загрузку модуля " + ИмяМодуля);

КонецЕсли;
КонецПроцедуры

Процедура ОбработатьКаталогКлассов(Знач Путь, СтандартнаяОбработка, Отказ)
Expand All @@ -145,30 +75,6 @@

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

Процедура ОбработатьКаталогМодулей(Знач Путь, СтандартнаяОбработка, Отказ)

КаталогМодулей = Новый Файл(Путь);

Если КаталогМодулей.Существует() Тогда
Файлы = НайтиФайлы(КаталогМодулей.ПолноеИмя, "*.os");
Для Каждого Файл Из Файлы Цикл
Вывести(СтрШаблон(" модуль (по соглашению) %1, файл %2", Файл.ИмяБезРасширения, Файл.ПолноеИмя));
СтандартнаяОбработка = Ложь;
Попытка
ДобавитьМодульЕслиРанееНеДобавляли(Файл.ПолноеИмя, Файл.ИмяБезРасширения);
Исключение
Если ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей Тогда
ВызватьИсключение;
КонецЕсли;
СтандартнаяОбработка = Истина;
Вывести("Предупреждение:
|" + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
КонецЕсли;

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

Процедура ДобавитьКлассЕслиРанееНеДобавляли(ПутьФайла, ИмяКласса)
Вывести("Добавляю класс, если ранее не добавляли " + ИмяКласса);
Если ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей Тогда
Expand All @@ -179,12 +85,9 @@

КлассУжеЕсть = Ложь;
Попытка
Объект = Новый(ИмяКласса);
КлассУжеЕсть = Истина;
КлассУжеЕсть = ТипЗнч(Тип(ИмяКласса)) = Тип("Тип");
Исключение
СообщениеОшибки = ОписаниеОшибки();
ИскомаяОшибка = СтрШаблон("Конструктор не найден (%1)", ИмяКласса);
КлассУжеЕсть = СтрНайти(СообщениеОшибки, ИскомаяОшибка) = 0;
КлассУжеЕсть = Ложь;
КонецПопытки;
Если Не КлассУжеЕсть Тогда

Expand All @@ -197,21 +100,6 @@
КонецЕсли;
КонецПроцедуры

Процедура ДобавитьМодульЕслиРанееНеДобавляли(ПутьФайла, ИмяМодуля)
Вывести("Добавляю модуль, если ранее не добавляли " + ИмяМодуля);

МодульУжеЕсть = КэшМодулей.Найти(ИмяМодуля) <> Неопределено;
Если Не МодульУжеЕсть Тогда

Вывести("Добавляю модуль, т.к. он не найден - " + ИмяМодуля);
ДобавитьМодуль(ПутьФайла, ИмяМодуля);
КэшМодулей.Добавить(ИмяМодуля);
Иначе
Вывести("Пропускаю загрузку модуля " + ИмяМодуля);

КонецЕсли;
КонецПроцедуры

Процедура Вывести(Знач Сообщение)
Если ПоказатьСообщенияЗагрузки Тогда
Сообщить(Сообщение);
Expand Down
2 changes: 1 addition & 1 deletion packagedef
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Описание.Имя("autumn-synchronized")
.Версия("0.1.1")
.Версия("0.1.2")
.Автор("Кирилл Черненко")
.АдресАвтора("https://github.com/sfaqer")
.Описание("Модуль ОСени для синхронизации исполнения методов")
Expand Down

0 comments on commit ecca0f6

Please sign in to comment.