Skip to content

Commit 1768ee0

Browse files
authored
Merge pull request #61 from 1c-syntax/feature/optimizeReadMetadata
Feature/optimize read metadata
2 parents e30fc18 + f655539 commit 1768ee0

File tree

12 files changed

+125
-130
lines changed

12 files changed

+125
-130
lines changed

build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ repositories {
2020
val junitVersion = "5.5.2"
2121
dependencies {
2222

23-
implementation("com.fasterxml.jackson.dataformat", "jackson-dataformat-xml", "2.9.4")
24-
implementation("com.fasterxml.jackson.module", "jackson-module-parameter-names", "2.9.4")
23+
implementation("com.fasterxml.jackson.dataformat", "jackson-dataformat-xml", "2.10.3")
24+
implementation("com.fasterxml.jackson.module", "jackson-module-parameter-names", "2.10.3")
2525

2626
// логирование
2727
implementation("org.slf4j", "slf4j-api", "1.8.0-beta4")

src/main/java/com/github/_1c_syntax/mdclasses/mdo/MDObjectBase.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.github._1c_syntax.mdclasses.metadata.additional.ModuleType;
88
import lombok.Builder;
99
import lombok.Data;
10+
import lombok.EqualsAndHashCode;
11+
import lombok.ToString;
1012
import lombok.experimental.NonFinal;
1113
import lombok.experimental.SuperBuilder;
1214

@@ -21,15 +23,17 @@
2123
@NonFinal
2224
@JsonDeserialize(builder = MDObjectBase.MDObjectBaseBuilderImpl.class)
2325
@SuperBuilder
26+
@EqualsAndHashCode(exclude = {"mdoURI", "modulesByType", "forms"})
27+
@ToString(exclude = {"mdoURI", "modulesByType", "forms"})
2428
public class MDObjectBase {
2529

26-
protected String uuid;
27-
protected String name;
30+
protected final String uuid;
31+
protected final String name;
2832
@Builder.Default
2933
protected String comment = "";
34+
3035
protected URI mdoURI;
3136
protected Map<URI, ModuleType> modulesByType;
32-
3337
protected List<Form> forms;
3438

3539
public abstract static class MDObjectBaseBuilder

src/main/java/com/github/_1c_syntax/mdclasses/metadata/Configuration.java

Lines changed: 20 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import com.github._1c_syntax.mdclasses.metadata.additional.UseMode;
1212
import com.github._1c_syntax.mdclasses.metadata.utils.Common;
1313
import com.github._1c_syntax.mdclasses.metadata.utils.MDOUtils;
14-
import lombok.SneakyThrows;
1514
import lombok.Value;
1615
import lombok.extern.slf4j.Slf4j;
1716

@@ -20,35 +19,36 @@
2019
import java.util.Collections;
2120
import java.util.HashMap;
2221
import java.util.Map;
22+
import java.util.Set;
2323

2424
@Value
2525
@Slf4j
2626
public class Configuration {
2727

28-
protected String name;
29-
protected String uuid;
28+
String name;
29+
String uuid;
3030

31-
protected ConfigurationSource configurationSource;
32-
protected CompatibilityMode compatibilityMode;
33-
protected CompatibilityMode configurationExtensionCompatibilityMode;
34-
protected ScriptVariant scriptVariant;
31+
ConfigurationSource configurationSource;
32+
CompatibilityMode compatibilityMode;
33+
CompatibilityMode configurationExtensionCompatibilityMode;
34+
ScriptVariant scriptVariant;
3535

36-
protected String defaultRunMode;
37-
protected String defaultLanguage;
38-
protected String dataLockControlMode;
39-
protected String objectAutonumerationMode;
40-
protected UseMode modalityUseMode;
41-
protected UseMode synchronousExtensionAndAddInCallUseMode;
42-
protected UseMode synchronousPlatformExtensionAndAddInCallUseMode;
36+
String defaultRunMode;
37+
String defaultLanguage;
38+
String dataLockControlMode;
39+
String objectAutonumerationMode;
40+
UseMode modalityUseMode;
41+
UseMode synchronousExtensionAndAddInCallUseMode;
42+
UseMode synchronousPlatformExtensionAndAddInCallUseMode;
4343

44-
protected Map<URI, ModuleType> modulesByType;
45-
protected Map<URI, Map<SupportConfiguration, SupportVariant>> modulesBySupport;
46-
protected Map<MDOType, Map<String, MDObjectBase>> children;
47-
private Path rootPath;
44+
Map<URI, ModuleType> modulesByType;
45+
Map<URI, Map<SupportConfiguration, SupportVariant>> modulesBySupport;
46+
Set<MDObjectBase> children;
47+
Path rootPath;
4848

4949
private Configuration() {
5050
this.configurationSource = ConfigurationSource.EMPTY;
51-
this.children = Collections.emptyMap();
51+
this.children = Collections.emptySet();
5252
this.modulesByType = Collections.emptyMap();
5353
this.modulesBySupport = Collections.emptyMap();
5454

@@ -89,7 +89,7 @@ private Configuration(MDOConfiguration configurationXml, ConfigurationSource con
8989
this.synchronousExtensionAndAddInCallUseMode = configurationXml.getSynchronousExtensionAndAddInCallUseMode();
9090
this.synchronousPlatformExtensionAndAddInCallUseMode = configurationXml.getSynchronousPlatformExtensionAndAddInCallUseMode();
9191

92-
this.modulesByType = MDOUtils.getModuleTypesByPath(configurationSource, rootPath);
92+
this.modulesByType = Common.getModuleTypesByPath(this);
9393
this.modulesBySupport = Common.getModuleSupports(this);
9494
}
9595

@@ -110,30 +110,6 @@ public static Configuration create(Path rootPath) {
110110
return create();
111111
}
112112

113-
public MDObjectBase getChild(MDOType type, String childName) {
114-
MDObjectBase child = null;
115-
Map<String, MDObjectBase> childrenByType = children.get(type);
116-
if (childrenByType == null) {
117-
childrenByType = getChildren(type);
118-
}
119-
if (!childrenByType.isEmpty()) {
120-
child = childrenByType.get(childName);
121-
}
122-
return child;
123-
}
124-
125-
@SneakyThrows
126-
public Map<String, MDObjectBase> getChildren(MDOType type) {
127-
Map<String, MDObjectBase> childrenByType = children.get(type);
128-
if (childrenByType == null) {
129-
childrenByType = MDOUtils.getChildren(configurationSource, rootPath, type);
130-
}
131-
if (!childrenByType.isEmpty()) {
132-
children.put(type, childrenByType);
133-
}
134-
return childrenByType;
135-
}
136-
137113
public ModuleType getModuleType(URI uri) {
138114
return modulesByType.getOrDefault(uri, ModuleType.Unknown);
139115
}

src/main/java/com/github/_1c_syntax/mdclasses/metadata/SupportConfiguration.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
@Value
77
@AllArgsConstructor
88
public class SupportConfiguration {
9-
private String name;
10-
private String provider;
11-
private String version;
9+
protected String name;
10+
protected String provider;
11+
protected String version;
1212
}

src/main/java/com/github/_1c_syntax/mdclasses/metadata/utils/Common.java

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.github._1c_syntax.mdclasses.metadata.Configuration;
55
import com.github._1c_syntax.mdclasses.metadata.SupportConfiguration;
66
import com.github._1c_syntax.mdclasses.metadata.additional.ConfigurationSource;
7+
import com.github._1c_syntax.mdclasses.metadata.additional.ModuleType;
78
import com.github._1c_syntax.mdclasses.metadata.additional.SupportVariant;
89
import lombok.extern.slf4j.Slf4j;
910

@@ -43,47 +44,54 @@ public static Map<URI, Map<SupportConfiguration, SupportVariant>> getModuleSuppo
4344
ParseSupportData supportData = new ParseSupportData(fileParentConfiguration.toPath());
4445
final Map<String, Map<SupportConfiguration, SupportVariant>> supportMap = supportData.getSupportMap();
4546

46-
configuration.getChildren()
47-
.forEach((mdoType, stringMDObjectBaseMap) ->
48-
stringMDObjectBaseMap.forEach((name, mdObject) -> {
49-
var mdoModuleSupport = getMDObjectSupport(supportMap, mdObject);
50-
if (!mdoModuleSupport.isEmpty()) {
51-
modulesBySupport.putAll(mdoModuleSupport);
52-
}
53-
if (mdObject.getForms() != null) {
54-
mdObject.getForms().forEach(form -> {
55-
var formSupport = getMDObjectSupport(supportMap, form);
56-
if (!formSupport.isEmpty()) {
57-
modulesBySupport.putAll(formSupport);
58-
}
59-
});
60-
}
61-
})
62-
);
47+
configuration.getChildren().forEach(mdObject -> {
48+
modulesBySupport.putAll(getMDObjectSupport(supportMap, mdObject));
49+
if (mdObject.getForms() != null) {
50+
mdObject.getForms().forEach(form -> modulesBySupport.putAll(getMDObjectSupport(supportMap, form)));
51+
}
52+
});
6353
}
54+
6455
return modulesBySupport;
6556
}
6657

67-
private static Map<URI, Map<SupportConfiguration, SupportVariant>> getMDObjectSupport(Map<String, Map<SupportConfiguration, SupportVariant>> supportMap, MDObjectBase mdObject) {
58+
private static Map<URI, Map<SupportConfiguration, SupportVariant>> getMDObjectSupport(
59+
Map<String, Map<SupportConfiguration, SupportVariant>> supportMap,
60+
MDObjectBase mdObject) {
61+
6862
Map<URI, Map<SupportConfiguration, SupportVariant>> modulesBySupport = new HashMap<>();
69-
Set<URI> uris = new HashSet<>();
70-
if (mdObject.getMdoURI() != null) {
71-
uris.add(mdObject.getMdoURI());
72-
}
73-
if (mdObject.getModulesByType() != null) {
74-
mdObject.getModulesByType().forEach((uri, moduleType) -> uris.add(uri));
63+
if (mdObject.getUuid() == null || mdObject.getModulesByType() == null) {
64+
return modulesBySupport;
7565
}
7666

77-
Map<SupportConfiguration, SupportVariant> moduleSupport = Collections.emptyMap();
78-
if (mdObject.getUuid() == null) {
79-
LOGGER.info("Не удалось найти идентфикатор по объекту " + mdObject);
80-
} else {
81-
moduleSupport = supportMap.getOrDefault(mdObject.getUuid(), Collections.emptyMap());
82-
}
67+
Set<URI> uris = new HashSet<>(mdObject.getModulesByType().keySet());
68+
69+
Map<SupportConfiguration, SupportVariant> moduleSupport =
70+
supportMap.getOrDefault(mdObject.getUuid(), Collections.emptyMap());
71+
8372
for (URI uri : uris) {
8473
modulesBySupport.put(uri, moduleSupport);
8574
}
8675
return modulesBySupport;
8776
}
8877

78+
public static Map<URI, ModuleType> getModuleTypesByPath(Configuration configuration) {
79+
Map<URI, ModuleType> modulesByType = new HashMap<>();
80+
81+
configuration.getChildren().forEach(mdObject -> {
82+
if (mdObject.getModulesByType() != null) {
83+
mdObject.getModulesByType().forEach(modulesByType::put);
84+
}
85+
if (mdObject.getForms() != null) {
86+
mdObject.getForms().forEach(form -> {
87+
if (form.getModulesByType() != null) {
88+
form.getModulesByType().forEach(modulesByType::put);
89+
}
90+
});
91+
}
92+
}
93+
);
94+
return modulesByType;
95+
}
96+
8997
}

src/main/java/com/github/_1c_syntax/mdclasses/metadata/utils/MDOUtils.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -306,14 +306,14 @@ public static MDObjectBase getMDObject(ConfigurationSource configurationSource,
306306
if (configurationSource == ConfigurationSource.EDT) {
307307
try {
308308
mdo = (MDObjectBase) xmlMapper
309-
.readValue(mdoPath.toFile(),
309+
.readValue(mdoFile,
310310
Class.forName(MDObjectBase.class.getPackageName() + "." + type.getShortClassName()));
311311
} catch (IOException | ClassNotFoundException e) {
312312
LOGGER.error(e.getMessage(), e);
313313
}
314314
} else if (configurationSource == ConfigurationSource.DESIGNER) {
315315
try {
316-
MetaDataObject metaDataObject = xmlMapper.readValue(mdoPath.toFile(), MetaDataObject.class);
316+
MetaDataObject metaDataObject = xmlMapper.readValue(mdoFile, MetaDataObject.class);
317317
mdo = metaDataObject.getPropertyByType(type);
318318
} catch (IOException e) {
319319
LOGGER.error(e.getMessage(), e);
@@ -381,6 +381,7 @@ public static Map<URI, ModuleType> getModuleTypesByPath(ConfigurationSource conf
381381
}
382382

383383
getMDOFilesInFolder(configurationSource, folder)
384+
.parallelStream()
384385
.forEach(mdoPath -> {
385386
modulesByType.putAll(
386387
getModuleTypesByMDOPath(configurationSource, mdoPath, folder, mdoType));
@@ -443,11 +444,11 @@ private static Map<URI, ModuleType> getCommandsMDOModuleTypes(ConfigurationSourc
443444
* Children
444445
*/
445446

446-
public static Map<String, MDObjectBase> getChildren(ConfigurationSource configurationSource,
447-
Path rootPath,
448-
MDOType type) {
447+
public static Set<MDObjectBase> getChildren(ConfigurationSource configurationSource,
448+
Path rootPath,
449+
MDOType type) {
449450

450-
Map<String, MDObjectBase> children = new HashMap<>();
451+
Set<MDObjectBase> children = new HashSet<>();
451452
if (configurationSource == ConfigurationSource.EMPTY) {
452453
return children;
453454
}
@@ -458,22 +459,23 @@ public static Map<String, MDObjectBase> getChildren(ConfigurationSource configur
458459
}
459460

460461
getChildrenNamesInFolder(configurationSource, folder)
462+
.parallelStream()
461463
.forEach(childName -> {
462464
MDObjectBase child = getMDObject(configurationSource, rootPath, type, childName);
463465
if (child != null) {
464-
children.put(childName, child);
466+
children.add(child);
465467
}
466468
});
467469

468470
return children;
469471
}
470472

471-
public static Map<MDOType, Map<String, MDObjectBase>> getAllChildren(ConfigurationSource configurationSource,
472-
Path rootPath,
473-
boolean includeConfiguration) {
473+
public static Set<MDObjectBase> getAllChildren(ConfigurationSource configurationSource,
474+
Path rootPath,
475+
boolean includeConfiguration) {
474476

475477

476-
Map<MDOType, Map<String, MDObjectBase>> allChildren = new HashMap<>();
478+
Set<MDObjectBase> allChildren = new HashSet<>();
477479
if (configurationSource == ConfigurationSource.EMPTY) {
478480
return allChildren;
479481
}
@@ -482,7 +484,7 @@ public static Map<MDOType, Map<String, MDObjectBase>> getAllChildren(Configurati
482484
if (!includeConfiguration && type == MDOType.CONFIGURATION) {
483485
continue;
484486
}
485-
allChildren.put(type, getChildren(configurationSource, rootPath, type));
487+
allChildren.addAll(getChildren(configurationSource, rootPath, type));
486488
}
487489
return allChildren;
488490
}
@@ -563,8 +565,10 @@ private List<Path> getMDOFilesInFolder(ConfigurationSource configurationSource,
563565
if (configurationSource == ConfigurationSource.EDT) {
564566
maxDepth = 2;
565567
}
568+
566569
try (Stream<Path> files = Files.walk(folder, maxDepth)) {
567570
childrenNames = files
571+
.parallel()
568572
.filter(f -> f.toString().endsWith(extension.get()))
569573
.filter(f -> !FilenameUtils.getBaseName(f.toString()).equals("ConfigDumpInfo"))
570574
.collect(Collectors.toList());

src/main/java/com/github/_1c_syntax/mdclasses/metadata/utils/ParseSupportData.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,8 @@
66

77
import java.io.FileInputStream;
88
import java.io.FileNotFoundException;
9-
import java.io.IOException;
109
import java.nio.charset.StandardCharsets;
11-
import java.nio.file.Files;
1210
import java.nio.file.Path;
13-
import java.nio.file.Paths;
1411
import java.util.HashMap;
1512
import java.util.Map;
1613
import java.util.Scanner;
@@ -49,9 +46,9 @@ private void read() throws FileNotFoundException {
4946
String[] dataStrings;
5047
var fileInputStream = new FileInputStream(pathToBinFile.toFile());
5148
var scanner = new Scanner(fileInputStream, StandardCharsets.UTF_8);
52-
dataStrings = scanner.findAll(patternSplit)
53-
.map(matchResult -> matchResult.group(1))
54-
.toArray(String[]::new);
49+
dataStrings = scanner.findAll(patternSplit)
50+
.map(matchResult -> matchResult.group(1))
51+
.toArray(String[]::new);
5552

5653
var countConfiguration = Integer.parseInt(dataStrings[POINT_COUNT_CONFIGURATION]);
5754
LOGGER.debug("Найдено конфигураций: {}", countConfiguration);
@@ -81,11 +78,7 @@ private void read() throws FileNotFoundException {
8178
var guidObject = dataStrings[currentObjectPoint + 2];
8279
var supportVariant = getSupportVariantByInt(support);
8380

84-
Map<SupportConfiguration, SupportVariant> map = supportMap.get(guidObject);
85-
if (map == null) {
86-
map = new HashMap<>();
87-
supportMap.put(guidObject, map);
88-
}
81+
Map<SupportConfiguration, SupportVariant> map = supportMap.computeIfAbsent(guidObject, k -> new HashMap<>());
8982
map.put(supportConfiguration, supportVariant);
9083
}
9184

0 commit comments

Comments
 (0)