Настройки чтения 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.
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.
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. Замечание из прошлого ревью устранено.
|



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