Skip to content

Commit 54237f6

Browse files
authored
Merge pull request #568 from johnnyshut/fix/broken-roles
fix: Улучшена обработка ошибок в RoleConverter и ExtendXStream
2 parents 3124657 + 96a415f commit 54237f6

3 files changed

Lines changed: 63 additions & 4 deletions

File tree

src/main/java/com/github/_1c_syntax/bsl/reader/common/xstream/ExtendXStream.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,13 @@ public Object fromXML(File file) {
123123
try {
124124
result = super.fromXML(file);
125125
} catch (ConversionException e) {
126-
LOGGER.error("Can't read file '{}' - it's broken (skipped) \n", file, e);
126+
LOGGER.warn("Can't read file '{}' - it's broken (skipped) \n", file, e);
127127
} catch (CannotResolveClassException e) {
128128
LOGGER.debug("Can't read file '{}' - unknown class (skipped) \n", file, e);
129129
} catch (StreamException e) {
130-
LOGGER.error("Can't read file '{}' - it's broken (skipped): {}", file, e.getCause().getMessage());
130+
LOGGER.warn("Can't read file '{}' - it's broken (skipped)", file, e);
131+
} catch (Exception e) {
132+
LOGGER.warn("Can't read file '{}' - unexpected error (skipped): {}", file, e.getMessage(), e);
131133
}
132134
}
133135
return result;

src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/RoleConverter.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,33 @@
3131
import java.nio.file.Path;
3232
import java.nio.file.Paths;
3333

34+
/**
35+
* Конвертер для чтения ролей из формата конфигуратора
36+
*/
3437
@DesignerConverter
3538
public class RoleConverter extends AbstractReadConverter {
3639

3740
private static final String DATA_FIELD = "data";
3841

42+
/**
43+
* Выполняет чтение роли из XML, включая данные прав доступа из файла Rights.xml
44+
*
45+
* @param reader Ридер XML потока
46+
* @param context Контекст десериализации
47+
* @return Прочитанный объект роли с данными прав доступа
48+
*/
3949
@Override
4050
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
4151
var readerContext = super.read(reader, context);
4252
RoleData data;
4353
try {
44-
data = (RoleData) ExtendXStream.read(reader, dataPath(readerContext.getCurrentPath(), readerContext.getName()));
54+
var readResult = ExtendXStream.read(reader, dataPath(readerContext.getCurrentPath(), readerContext.getName()));
55+
if (readResult instanceof RoleData roleData) {
56+
data = roleData;
57+
} else {
58+
// файл не прочитан или прочитан некорректно
59+
data = RoleData.EMPTY;
60+
}
4561
} catch (Exception e) {
4662
// ничего не делаем, считаем файл битым
4763
data = RoleData.EMPTY;
@@ -51,11 +67,24 @@ public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext co
5167
return readerContext.build();
5268
}
5369

70+
/**
71+
* Проверяет, может ли конвертер обработать указанный тип
72+
*
73+
* @param type Тип класса для проверки
74+
* @return true, если тип является Role или его подклассом
75+
*/
5476
@Override
5577
public boolean canConvert(Class type) {
5678
return Role.class.isAssignableFrom(type);
5779
}
5880

81+
/**
82+
* Формирует путь к файлу Rights.xml для роли
83+
*
84+
* @param path Путь к файлу описания роли
85+
* @param name Имя роли
86+
* @return Путь к файлу Rights.xml
87+
*/
5988
private static Path dataPath(Path path, String name) {
6089
return Paths.get(path.getParent().toString(), name, "Ext", "Rights.xml");
6190
}

src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/RoleConverter.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,33 @@
3030

3131
import java.nio.file.Path;
3232

33+
/**
34+
* Конвертер для чтения ролей из формата ЕДТ
35+
*/
3336
@EDTConverter
3437
public class RoleConverter extends AbstractReadConverter {
3538

3639
private static final String DATA_FIELD = "data";
3740

41+
/**
42+
* Выполняет чтение роли из XML, включая данные прав доступа из файла Rights.rights
43+
*
44+
* @param reader Ридер XML потока
45+
* @param context Контекст десериализации
46+
* @return Прочитанный объект роли с данными прав доступа
47+
*/
3848
@Override
3949
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
4050
var readerContext = super.read(reader, context);
4151
RoleData data;
4252
try {
43-
data = (RoleData) ExtendXStream.read(reader, dataPath(readerContext.getCurrentPath()));
53+
var readResult = ExtendXStream.read(reader, dataPath(readerContext.getCurrentPath()));
54+
if (readResult instanceof RoleData roleData) {
55+
data = roleData;
56+
} else {
57+
// файл не прочитан или прочитан некорректно
58+
data = RoleData.EMPTY;
59+
}
4460
} catch (Exception e) {
4561
// ничего не делаем, считаем файл битым
4662
data = RoleData.EMPTY;
@@ -50,11 +66,23 @@ public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext co
5066
return readerContext.build();
5167
}
5268

69+
/**
70+
* Проверяет, может ли конвертер обработать указанный тип
71+
*
72+
* @param type Тип класса для проверки
73+
* @return true, если тип является Role или его подклассом
74+
*/
5375
@Override
5476
public boolean canConvert(Class type) {
5577
return Role.class.isAssignableFrom(type);
5678
}
5779

80+
/**
81+
* Формирует путь к файлу Rights.rights для роли
82+
*
83+
* @param path Путь к файлу описания роли
84+
* @return Путь к файлу Rights.rights
85+
*/
5886
private static Path dataPath(Path path) {
5987
return Path.of(path.getParent().toString(), "Rights.rights");
6088
}

0 commit comments

Comments
 (0)