-
Notifications
You must be signed in to change notification settings - Fork 25
Настройки чтения MDC #531
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
Настройки чтения MDC #531
Conversation
WalkthroughДобавлен класс настроек чтения Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor Client as Клиент
participant MC as MDClasses
participant MR as MDOReader
participant R as DesignerReader/EDTReader
participant Conv as Конвертеры
participant MD as MDClass
Client->>MC: create(sourcePath[, readSettings])
MC->>MR: create(sourcePath, readSettings)
MR->>MR: обнаружение конфигураций/источников
MR->>R: createReader(path, readSettings)
R->>R: init (если !readSettings.isSkipSupport() -> ParseSupportData.read)
loop Разбор ресурсов
R->>Conv: unmarshal(...)
alt Соответствующий skip-флаг = true
Conv-->>R: вернуть EMPTY / null
else
Conv-->>R: объект после парсинга
end
end
R-->>MR: собранные MDClass/ы
MR-->>MC: список MDClass
MC-->>Client: результат
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (1)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (17)
🔇 Additional comments (5)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
f030034 to
01c2545
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
🧹 Nitpick comments (5)
src/main/java/com/github/_1c_syntax/bsl/mdo/storage/DataCompositionSchema.java (2)
71-73: Рассмотрите возврат неизменяемого списка.Метод
getPlainDataSets()возвращает изменяемый список, что позволяет вызывающему коду модифицировать внутреннее состояние. Для класса, аннотированного@Value(неизменяемый), рекомендуется возвращатьCollections.unmodifiableList(plainDataSets.getOrCompute())для предотвращения случайных изменений.Примените это изменение:
public List<DataSet> getPlainDataSets() { - return plainDataSets.getOrCompute(); + return Collections.unmodifiableList(plainDataSets.getOrCompute()); }Добавьте импорт:
import java.util.Collections;
82-87: Опечатка в имени метода.В имени метода
fillPlaintDataSetByListсодержится опечатка: "Plaint" должно быть "Plain".Примените это изменение для исправления опечатки:
-private void fillPlaintDataSetByList(List<DataSet> result, List<DataSet> items) { +private void fillPlainDataSetByList(List<DataSet> result, List<DataSet> items) { items.forEach((DataSet dataSet) -> { result.add(dataSet); - fillPlaintDataSetByList(result, dataSet.getItems()); + fillPlainDataSetByList(result, dataSet.getItems()); }); }Также обновите вызов в
computePlainDataSets():private List<DataSet> computePlainDataSets() { List<DataSet> result = new ArrayList<>(); - fillPlaintDataSetByList(result, dataSets); + fillPlainDataSetByList(result, dataSets); return result; }src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/XdtoPackageDataConverter.java (1)
24-24: Неиспользуемый импорт.Импорт
RoleDataне используется в этом файле. Рекомендуется удалить.-import com.github._1c_syntax.bsl.mdo.storage.RoleData;src/jmh/java/com/github/_1c_syntax/bsl/mdclasses/benchmark/MDClassesBenchmark.java (1)
67-75: Избегайте лишних аллокаций: переиспользуйте заранее собранные настройкиСтроить MDCReadSettings билдером в каждом бенче — лишние аллокации и шум в замерах. Вынесите пресет в константу и используйте её.
Добавьте поле (рядом с путями):
private static final MDCReadSettings SKIP_ALL = MDCReadSettings.builder() .skipSupport(true) .skipRoleData(true) .skipFormElementItems(true) .skipXdtoPackage(true) .skipDataCompositionSchema(true) .build();И используйте его:
- var model = MDClasses.createConfiguration(configPathEDT, - MDCReadSettings.builder() - .skipSupport(true) - .skipRoleData(true) - .skipFormElementItems(true) - .skipXdtoPackage(true) - .skipDataCompositionSchema(true) - .build()); + var model = MDClasses.createConfiguration(configPathEDT, SKIP_ALL);- var model = MDClasses.createConfiguration(configPathDesigner, - MDCReadSettings.builder() - .skipSupport(true) - .skipRoleData(true) - .skipFormElementItems(true) - .skipXdtoPackage(true) - .skipDataCompositionSchema(true) - .build()); + var model = MDClasses.createConfiguration(configPathDesigner, SKIP_ALL);(Опционально: переименовать методы, т.к. пропускаются не только Support.)
Also applies to: 86-94
src/main/java/com/github/_1c_syntax/bsl/reader/designer/DesignerReader.java (1)
99-124: Инициализируйте readSettings до createXMLMapper()Аналогично EDTReader: this.xstream создаётся раньше, чем присваивается this.readSettings. Чтобы исключить ранние обращения к getReadSettings() с null, сперва установите настройки.
Минимальная перестановка:
- public DesignerReader(Path path, MDCReadSettings readSettings) { - this.xstream = createXMLMapper(); + public DesignerReader(Path path, MDCReadSettings readSettings) { + this.readSettings = java.util.Objects.requireNonNull(readSettings, "readSettings"); + this.xstream = createXMLMapper(); @@ - this.rootPath = path; + this.rootPath = path; } - this.readSettings = readSettings; + // readSettings уже установлен выше if (!readSettings.isSkipSupport()) {Опционально — явный override для единообразия с FakeReader:
@Override @lombok.NonNull public MDCReadSettings getReadSettings() { return readSettings; }(Для проверки ранних обращений используйте тот же скрипт, что в комментарии к EDTReader.)
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (20)
benchmark-compare.sh(1 hunks)src/jmh/java/com/github/_1c_syntax/bsl/mdclasses/benchmark/MDClassesBenchmark.java(2 hunks)src/main/java/com/github/_1c_syntax/bsl/mdclasses/MDCReadSettings.java(1 hunks)src/main/java/com/github/_1c_syntax/bsl/mdclasses/MDClasses.java(6 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/storage/DataCompositionSchema.java(3 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/FakeReader.java(2 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/MDOReader.java(5 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/MDReader.java(2 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/common/context/MDCReaderContext.java(2 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/common/context/MDReaderContext.java(1 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/DataCompositionSchemaConverter.java(2 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/RoleDataConverter.java(2 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/XdtoPackageDataConverter.java(2 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/designer/DesignerReader.java(3 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/FormElementConverter.java(1 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/edt/EDTReader.java(3 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/FormItemConverter.java(2 hunks)src/test/java/com/github/_1c_syntax/bsl/examples/ValueTypeTest.java(2 hunks)src/test/java/com/github/_1c_syntax/bsl/mdclasses/ConfigurationTest.java(4 hunks)src/test/java/com/github/_1c_syntax/bsl/test_utils/MDTestUtils.java(5 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-09-05T10:03:02.229Z
Learnt from: johnnyshut
PR: 1c-syntax/mdclasses#515
File: src/test/java/com/github/_1c_syntax/bsl/mdo/AccountingRegisterTest.java:35-37
Timestamp: 2025-09-05T10:03:02.229Z
Learning: The MDTestUtils.getMDWithSimpleTest method already correctly handles optional 4th parameter "_edt" through ArgumentsAccessor - it doesn't need modification to process the additional CSV parameter for subdirectory selection.
Applied to files:
src/test/java/com/github/_1c_syntax/bsl/mdclasses/ConfigurationTest.java
🧬 Code graph analysis (2)
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/DataCompositionSchemaConverter.java (1)
src/main/java/com/github/_1c_syntax/bsl/mdo/storage/EmptyTemplateData.java (1)
EmptyTemplateData(27-46)
src/main/java/com/github/_1c_syntax/bsl/mdclasses/MDCReadSettings.java (1)
src/main/java/com/github/_1c_syntax/bsl/mdo/storage/DataCompositionSchema.java (2)
Value(42-137)Value(89-129)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (18)
- GitHub Check: QA
- GitHub Check: build (17, windows-latest)
- GitHub Check: build (23, ubuntu-latest)
- GitHub Check: build (21, macOS-latest)
- GitHub Check: build (23, macOS-latest)
- GitHub Check: build (21, windows-latest)
- GitHub Check: build (17, ubuntu-latest)
- GitHub Check: build (23, windows-latest)
- GitHub Check: build (21, ubuntu-latest)
- GitHub Check: build (23, windows-latest)
- GitHub Check: build (21, macOS-latest)
- GitHub Check: build (23, macOS-latest)
- GitHub Check: build (17, ubuntu-latest)
- GitHub Check: build (17, macOS-latest)
- GitHub Check: build (21, ubuntu-latest)
- GitHub Check: build (23, ubuntu-latest)
- GitHub Check: build (21, windows-latest)
- GitHub Check: build (17, windows-latest)
🔇 Additional comments (17)
src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/FormItemConverter.java (2)
27-27: LGTM: импорт необходим для реализации функциональности пропуска.Импорт
ExtendXStreamкорректно добавлен для доступа к настройкам чтения черезgetCurrentMDReader.
40-42: Проверьте вручную обработку null и null-safetyСкрипты не вернули результатов; убедитесь, что:
- Все вызовы FormItemConverter.unmarshal корректно обрабатывают
null.- ExtendXStream.getCurrentMDReader(...) и
getReadSettings()не возвращаютnullи не приводят к NPE.src/main/java/com/github/_1c_syntax/bsl/mdo/storage/DataCompositionSchema.java (3)
25-25: Ленивая инициализация plainDataSets реализована корректно.Использование класса
Lazyдля отложенного вычисления плоского списка наборов данных — правильное решение для оптимизации производительности, особенно когдаgetPlainDataSets()может не вызываться.Also applies to: 53-53
61-64: Конструктор корректно упрощён.Удаление заполнения
plainDataSetsиз конструктора правильно реализует паттерн ленивой инициализации и улучшает производительность при создании объектов схемы компоновки данных.
53-53: Проверьте потокобезопасностьcom.github._1c_syntax.utils.Lazy
КлассDataCompositionSchemaиспользуетLazyдля отложенных вычислений. Убедитесь, что его реализация синхронизирована при одновременном доступе, чтобы избежать повторных вычислений и гонок данных.src/main/java/com/github/_1c_syntax/bsl/reader/common/context/MDReaderContext.java (1)
97-101: Логика корректна.Условие правильно проверяет оба требования: наличие UUID и отключенный флаг пропуска. При включённом
skipSupportвызовParseSupportData.get()пропускается, что соответствует заявленным требованиям.src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/RoleDataConverter.java (1)
42-44: Реализация соответствует общему паттерну.Ранний выход с
RoleData.EMPTYкорректен и согласован с аналогичными проверками в других конвертерах.src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/XdtoPackageDataConverter.java (1)
62-64: Реализация корректна.Ранний выход с
XdtoPackageData.EMPTYсоответствует паттерну, используемому в других конвертерах.src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/DataCompositionSchemaConverter.java (1)
49-51: Реализация соответствует интерфейсу.Использование
EmptyTemplateData.getEmpty()корректно, так какDataCompositionSchemaреализует интерфейсTemplateData.src/main/java/com/github/_1c_syntax/bsl/mdclasses/MDCReadSettings.java (1)
30-67: Класс настроек реализован корректно.Использование
@Valueобеспечивает неизменяемость и потокобезопасность. Паттерн Builder удобен для создания различных конфигураций.Обратите внимание: согласно задаче #527, требовалась также опция «отключить чтение модели табличных документов». Проверьте, покрывается ли это требование флагом
skipDataCompositionSchemaили требуется отдельный флаг.src/main/java/com/github/_1c_syntax/bsl/reader/MDReader.java (1)
61-66: Публичный API расширен корректно.Добавление метода
getReadSettings()в интерфейс является ожидаемым изменением для поддержки новой функциональности. Аннотация@NonNullгарантирует, что метод всегда возвращает валидный объект настроек.src/main/java/com/github/_1c_syntax/bsl/reader/common/context/MDCReaderContext.java (1)
81-85: Реализация согласована с MDReaderContext.Логика проверки идентична реализации в
MDReaderContext.java, что обеспечивает единообразное поведение при пропуске данных поддержки.src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/FormElementConverter.java (1)
41-43: Проверьте корректность возврата null.В отличие от других конвертеров, возвращающих пустые объекты (
RoleData.EMPTY,XdtoPackageData.EMPTY), здесь возвращаетсяnull. Убедитесь, что все вызывающие места правильно обрабатываютnullи это не приведёт к NullPointerException.src/main/java/com/github/_1c_syntax/bsl/reader/FakeReader.java (1)
73-77: LGTM: корректная реализация getReadSettings()Возврат DEFAULT для заглушки уместен, аннотации и сигнатура соответствуют API.
src/test/java/com/github/_1c_syntax/bsl/examples/ValueTypeTest.java (1)
127-133: Переход на MDCReadSettings.SKIP_SUPPORT выглядит корректноСоздание конфигурации с предустановкой SKIP_SUPPORT для теста — ок.
src/jmh/java/com/github/_1c_syntax/bsl/mdclasses/benchmark/MDClassesBenchmark.java (1)
55-57: LGTM: вызовы по умолчанию через MDClasses.createConfiguration(Path)Предзагрузка и кейсы “без пропусков” выглядят корректно.
Also applies to: 61-63
src/main/java/com/github/_1c_syntax/bsl/reader/edt/EDTReader.java (1)
97-128: EDTReader: порядок инициализации readSettings корректен
getReadSettings() не вызывается в createXMLMapper() до присвоения поля, изменений не требуется.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (1)
benchmark-compare.sh (1)
22-22: Заключение: добавьте кавычки вокруг пути.
rm -rf $RESULTS_DIRбез кавычек расколется по пробелам и может зацепить чужие пути/глобbing. Сset -eтакже ловим ошибку, если переменная вдруг пуста. Оберните переменную в кавычки.-rm -rf $RESULTS_DIR +rm -rf "$RESULTS_DIR"
🧹 Nitpick comments (1)
src/main/java/com/github/_1c_syntax/bsl/mdo/storage/DataCompositionSchema.java (1)
75-80: Рассмотрите возврат неизменяемого списка.Метод
computePlainDataSets()возвращает изменяемыйArrayList. Для предотвращения случайных модификаций результата извне рекомендуется обернуть возвращаемое значение вCollections.unmodifiableList().private List<DataSet> computePlainDataSets() { List<DataSet> result = new ArrayList<>(); fillPlainDataSetByList(result, dataSets); - return result; + return Collections.unmodifiableList(result); }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (7)
benchmark-compare.sh(1 hunks)src/jmh/java/com/github/_1c_syntax/bsl/mdclasses/benchmark/MDClassesBenchmark.java(2 hunks)src/main/java/com/github/_1c_syntax/bsl/mdclasses/MDClasses.java(6 hunks)src/main/java/com/github/_1c_syntax/bsl/mdo/storage/DataCompositionSchema.java(3 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/MDOReader.java(6 hunks)src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/XdtoPackageDataConverter.java(2 hunks)src/test/java/com/github/_1c_syntax/bsl/test_utils/MDTestUtils.java(6 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (18)
- GitHub Check: QA
- GitHub Check: build (21, ubuntu-latest)
- GitHub Check: build (23, ubuntu-latest)
- GitHub Check: build (23, macOS-latest)
- GitHub Check: build (23, windows-latest)
- GitHub Check: build (21, macOS-latest)
- GitHub Check: build (17, windows-latest)
- GitHub Check: build (21, windows-latest)
- GitHub Check: build (17, ubuntu-latest)
- GitHub Check: build (23, windows-latest)
- GitHub Check: build (17, ubuntu-latest)
- GitHub Check: build (23, macOS-latest)
- GitHub Check: build (21, ubuntu-latest)
- GitHub Check: build (21, windows-latest)
- GitHub Check: build (17, windows-latest)
- GitHub Check: build (17, macOS-latest)
- GitHub Check: build (23, ubuntu-latest)
- GitHub Check: build (21, macOS-latest)
🔇 Additional comments (17)
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/XdtoPackageDataConverter.java (3)
1-22: Обновление заголовка авторских прав.Обновление года до 2025 соответствует текущим изменениям.
25-25: Импорт ExtendXStream добавлен корректно.Импорт необходим для доступа к текущему MDReader и его настройкам чтения.
61-63: Цепочка вызовов безопасна, константа EMPTY корректна
getCurrentMDReader(reader)возвращает ненулевойmdReader(final-поле в ExtendReaderWrapper),getReadSettings()аннотирован@NonNull, аXdtoPackageData.EMPTY— неизменяемый экземпляр через Lombok‐Builder. Потребуется ручная проверка потокобезопасности MDReader при одновременном использовании.src/main/java/com/github/_1c_syntax/bsl/mdo/storage/DataCompositionSchema.java (2)
82-87: Одобряю рефакторинг на паттерн аккумулятора.Переход на статический метод с явным параметром-аккумулятором
resultделает код более понятным и упрощает тестирование.
53-73: Одобрено отложенное вычисление plainDataSets. Использование Lazy<> соответствует целям оптимизации. Поскольку реализация Lazy не найдена в репозитории, убедитесь вручную, что getOrCompute() потокобезопасен при параллельном доступе.src/main/java/com/github/_1c_syntax/bsl/reader/MDOReader.java (4)
24-24: Правильная миграция API на MDCReadSettings.Добавлены новые перегрузки с параметром
MDCReadSettings, а старые методы сboolean skipSupportкорректно помечены как устаревшие и делегируют вызовы новым перегрузкам. Метод без параметров делегирует вызов сMDCReadSettings.SKIP_SUPPORT, сохраняя обратную совместимость.Also applies to: 52-78
86-117: Согласованная миграция методов чтения объектов метаданных.Методы
readобновлены по той же схеме, что иreadConfiguration: добавлены новые перегрузки сMDCReadSettings, устаревшие методы корректно делегируют вызовы.
125-138: Корректная обработка внешних источников.Методы
readExternalSourceправильно обновлены для поддержкиMDCReadSettings.
140-156: Приватные методы согласованно обновлены.Приватные методы
createReaderкорректно обновлены для приёма и передачиMDCReadSettingsв конструкторыDesignerReaderиEDTReader.src/jmh/java/com/github/_1c_syntax/bsl/mdclasses/benchmark/MDClassesBenchmark.java (2)
51-57: Корректная конфигурация для бенчмарков.Константа
SKIP_ALLправильно объединяет все флаги пропуска для измерения максимального эффекта оптимизации при чтении конфигурации.
62-63: Бенчмарки обновлены для сравнения производительности.Методы бенчмарков корректно обновлены для сравнения чтения с настройками по умолчанию и с полным пропуском данных (
SKIP_ALL).Also applies to: 68-68, 74-74, 80-80, 86-86
src/test/java/com/github/_1c_syntax/bsl/test_utils/MDTestUtils.java (2)
26-26: Правильное обновление утилит тестирования.Добавлен импорт
MDCReadSettingsи пропуск поляplainDataSetsпри сериализации в JSON, что соответствует изменениям в структуре данных.Also applies to: 115-115
141-141: Тестовые методы согласованно мигрированы на MDCReadSettings.Методы
getMDWithSimpleTest,getMDCWithSimpleTestиreadConfigurationкорректно обновлены для использованияMDCReadSettingsвместо булевых флагов. Обратная совместимость сохранена через делегирование устаревших методов.Also applies to: 170-171, 187-208
src/main/java/com/github/_1c_syntax/bsl/mdclasses/MDClasses.java (4)
74-99: Правильная миграция методов создания конфигурации.Методы
createConfigurationкорректно обновлены:
- Метод без параметров делегирует вызов с
MDCReadSettings.DEFAULT- Новая перегрузка с
MDCReadSettingsдобавлена- Устаревший метод с
booleanкорректно делегирует вызов
117-147: Исправлена проблема игнорирования параметра skipSupport.Устаревший метод
createConfigurations(Path, boolean)теперь корректно передаёт параметрskipSupportчерезMDCReadSettings.builder().skipSupport(skipSupport).build(). Замечание из прошлого ревью устранено.
155-169: Корректное добавление поддержки настроек для внешних источников.Добавлена новая перегрузка
createExternalSources(Path, MDCReadSettings), которая правильно передаёт настройки чтения вMDOReader.readExternalSource.
204-208: Исправлена передача настроек чтения во внешние источники.Новый метод
create(Path, MDCReadSettings)теперь корректно передаётreadSettingsв оба вызова:createConfigurationsиcreateExternalSources. Замечание из прошлого ревью устранено.
src/main/java/com/github/_1c_syntax/bsl/mdclasses/MDClasses.java
Outdated
Show resolved
Hide resolved
|



Описание
Реализована возможность пропускать некоторые блоки данных при чтении:
skipSupport- пропускать чтение поставкиskipRoleData- пропускать чтение состава ролейskipXdtoPackage- пропускать чтение содержимого пакетов XDTOskipFormElementItems- пропускать чтение элементов формskipDataCompositionSchema- пропускать чтение макетов СКДСвязанные задачи
Closes #527
Чеклист
Общие
gradlew precommit)Дополнительно