Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new scenario ПроверкаКорректностиXML #38

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
///////////////////////////////////////////////////////////////////////////////
//
// Служебный модуль с реализацией сценариев обработки файлов <ПроверкаДублейУникальныхИдентификаторов>
//
///////////////////////////////////////////////////////////////////////////////

// Лог - Объект - Текущий лог
Перем Лог;

// ИмяСценария
// Возвращает имя сценария обработки файлов
//
// Возвращаемое значение:
// Строка - Имя текущего сценария обработки файлов
//
Функция ИмяСценария() Экспорт

Возврат "ПроверкаДублейУникальныхИдентификаторов";

КонецФункции // ИмяСценария()

// ОбработатьФайл
// Выполняет обработку файла
//
// Параметры:
// АнализируемыйФайл - Файл - Файл из журнала git для анализа
// КаталогИсходныхФайлов - Строка - Каталог расположения исходных файлов относительно каталог репозитория
// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
// Булево - Признак выполненной обработки файла
//
Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт

Лог = ДополнительныеПараметры.Лог;

Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлОписанияМетаданных(АнализируемыйФайл) Тогда

Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());

ПроверитьНаличиеДублейУникальныхИдентификаторов(АнализируемыйФайл, КаталогИсходныхФайлов);
Возврат Истина;

КонецЕсли;

Возврат Ложь;

КонецФункции // ОбработатьФайл()

Процедура ПроверитьНаличиеДублейУникальныхИдентификаторов(АнализируемыйФайл, КаталогКонфигурации)

Идентификаторы = ИдентификаторыПроверяемогоФайла(АнализируемыйФайл);
Если Идентификаторы.Количество() = 0 Тогда
Возврат;
КонецЕсли;

ЭтоEDT = ТипыФайлов.ЭтоФайлОписанияМетаданныхEDT(АнализируемыйФайл);
ПроверяемыеФайлы = ФайлыОписанияМетаданных(КаталогКонфигурации, ЭтоEDT);
Если ПроверяемыеФайлы.Количество() = 0 Тогда
Возврат;
КонецЕсли;

Для каждого ФайлНаПроверку Из ПроверяемыеФайлы Цикл

Если ФайлНаПроверку.ПолноеИмя = АнализируемыйФайл.ПолноеИмя Тогда
Продолжить;
КонецЕсли;

УникальныйИдентификатор = НайтиДубликатыУникальногоИдентификатора(ФайлНаПроверку, Идентификаторы);
Если УникальныйИдентификатор = Неопределено Тогда
Продолжить;
КонецЕсли;

ТекстОшибки = СтрШаблон("В файле '%1' обнаружен uuid %2 из проверяемого файла %3",
ФайлНаПроверку.ПолноеИмя, УникальныйИдентификатор, АнализируемыйФайл.ПолноеИмя);
Лог.Ошибка(ТекстОшибки);

ВызватьИсключение ТекстОшибки;

КонецЦикла;

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

Функция ИдентификаторыПроверяемогоФайла(АнализируемыйФайл)

Идентификаторы = Новый Массив;
ТекстМодуля = ФайловыеОперации.ПрочитатьТекстФайла(АнализируемыйФайл.ПолноеИмя);
Если ПустаяСтрока(ТекстМодуля) Тогда
Возврат Идентификаторы;
КонецЕсли;

ТекстРегулярногоВыряжения = ТекстРегулярногоВыряжения();
ШаблонПоиска = Новый РегулярноеВыражение(ТекстРегулярногоВыряжения);
ШаблонПоиска.Многострочный = Ложь;
ШаблонПоиска.ИгнорироватьРегистр = Истина;

Совпадения = ШаблонПоиска.НайтиСовпадения(ТекстМодуля);
Если Совпадения.Количество() = 0 Тогда
Возврат Идентификаторы;
КонецЕсли;

Для каждого Совпадение Из Совпадения Цикл
Если Совпадение.Группы.Количество() < 2 Тогда
Продолжить;
КонецЕсли;
НайденныйУникальныйИдентификатор = Совпадение.Группы[1].Значение;
Идентификаторы.Добавить(НайденныйУникальныйИдентификатор);
КонецЦикла;

Возврат Идентификаторы;

КонецФункции

Функция ФайлыОписанияМетаданных(КаталогКонфигурации, ЭтоEDT)

ФайлыОписания = Новый Массив;
ФильтрФайлов = ?(ЭтоEDT, "*.mdo", "*.xml");
ФайлыНаПроверку = НайтиФайлы(КаталогКонфигурации, ФильтрФайлов, Истина);
Для каждого Файл Из ФайлыНаПроверку Цикл
Если Не Файл.Существует() Или
Не ТипыФайлов.ЭтоФайлОписанияМетаданных(Файл) Тогда
Продолжить;
КонецЕсли;
ФайлыОписания.Добавить(Файл);
КонецЦикла;

Возврат ФайлыОписания;

КонецФункции

Функция НайтиДубликатыУникальногоИдентификатора(АнализируемыйФайл, УникальныеИдентификаторы)

ТекстФайла = ФайловыеОперации.ПрочитатьТекстФайла(АнализируемыйФайл.ПолноеИмя);
Если ПустаяСтрока(ТекстФайла) Тогда
Возврат Неопределено;
КонецЕсли;

Для каждого УИД Из УникальныеИдентификаторы Цикл

ТекстУИД = СтрШаблон("uuid=""%1", УИД);
Если СтрНайти(ТекстФайла, ТекстУИД) > 0 Тогда
Возврат УИД;
КонецЕсли;
КонецЦикла;
Comment on lines +143 to +149

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

можно проверять регулярным выражением, собрав UID в одну строку через |


Возврат Неопределено;

КонецФункции

Функция ТекстРегулярногоВыряжения()
Возврат "uuid=\W([0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12})";
КонецФункции
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
///////////////////////////////////////////////////////////////////////////////

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше разделить на отдельные реквесты, в каждом свой сценарий

//
// Служебный модуль с реализацией сценариев обработки файлов <ПроверкаКорректностиXML>
//
///////////////////////////////////////////////////////////////////////////////

Перем Лог;

// ИмяСценария
// Возвращает имя сценария обработки файлов
//
// Возвращаемое значение:
// Строка - Имя текущего сценария обработки файлов
//
Функция ИмяСценария() Экспорт

Возврат "ПроверкаКорректностиXML";

КонецФункции // ИмяСценария()

// ОбработатьФайл
// Выполняет обработку файла
//
// Параметры:
// АнализируемыйФайл - Файл - Файл из журнала git для анализа
// КаталогИсходныхФайлов - Строка - Каталог расположения исходных файлов относительно каталог репозитория
// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
// Булево - Признак выполненной обработки файла
//
Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт

Лог = ДополнительныеПараметры.Лог;
НастройкиСценария = ДополнительныеПараметры.Настройки.Получить(ИмяСценария());
Если АнализируемыйФайл.Существует() И (
ТипыФайлов.ЭтоФайлОписанияКонфигурации(АнализируемыйФайл) ИЛИ
ТипыФайлов.ЭтоФайлОписанияКонфигурацииEDT(АнализируемыйФайл) ИЛИ
ТипыФайлов.ЭтоФайлОписанияМетаданных(АнализируемыйФайл) ИЛИ
ТипыФайлов.ЭтоФайлОписанияФормы(АнализируемыйФайл) ИЛИ
ТипыФайлов.ЭтоФайлОписанияПланаОбмена(АнализируемыйФайл) ИЛИ
ТипыФайлов.ЭтоФайлОписанияФункциональнойОпции(АнализируемыйФайл)
) Тогда

Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());

ПроверитьНаКорректностьXML(АнализируемыйФайл.ПолноеИмя);
Возврат Истина;

КонецЕсли;

Возврат Ложь;

КонецФункции // ОбработатьФайл()

Процедура ПроверитьНаКорректностьXML(ПутьКФайлуМодуля)

ФайлXML = Новый ЧтениеXML();
Попытка
ФайлXML.ОткрытьФайл(ПутьКФайлуМодуля);
ФайлXML.ПерейтиКСодержимому();
Пока ФайлXML.Прочитать() Цикл
КонецЦикла;
ФайлXML.Закрыть();
Исключение
Инфо = ИнформацияОбОшибке();
ТекстОшибки = СтрШаблон("В файле '%1' нарушена корректность XML: %2", ПутьКФайлуМодуля, Инфо.Описание);
Лог.Ошибка(ТекстОшибки);

ВызватьИсключение ТекстОшибки;

КонецПопытки;

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