Skip to content

Commit 0678fea

Browse files
committed
Подсистемы в дочерних элементах
1 parent f709d37 commit 0678fea

File tree

4 files changed

+581
-545
lines changed

4 files changed

+581
-545
lines changed

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

Lines changed: 157 additions & 150 deletions
Original file line numberDiff line numberDiff line change
@@ -20,153 +20,160 @@
2020
* License along with MDClasses.
2121
*/
2222
package com.github._1c_syntax.mdclasses.mdo;
23-
24-
import com.github._1c_syntax.mdclasses.mdo.metadata.Metadata;
25-
import com.github._1c_syntax.mdclasses.mdo.support.MDOType;
26-
import com.github._1c_syntax.mdclasses.unmarshal.wrapper.DesignerMDO;
27-
import com.github._1c_syntax.mdclasses.utils.MDOFactory;
28-
import com.github._1c_syntax.mdclasses.utils.MDOPathUtils;
29-
import com.github._1c_syntax.mdclasses.utils.MDOUtils;
30-
import com.thoughtworks.xstream.annotations.XStreamImplicit;
31-
import io.vavr.control.Either;
32-
import lombok.Data;
33-
import lombok.EqualsAndHashCode;
34-
import lombok.NoArgsConstructor;
35-
import lombok.ToString;
36-
37-
import java.nio.file.Path;
38-
import java.nio.file.Paths;
39-
import java.util.ArrayList;
40-
import java.util.Collections;
41-
import java.util.List;
42-
import java.util.Map;
43-
import java.util.stream.Collectors;
44-
45-
@Data
46-
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
47-
@ToString(callSuper = true, onlyExplicitlyIncluded = true)
48-
@NoArgsConstructor
49-
@Metadata(
50-
type = MDOType.SUBSYSTEM,
51-
name = "Subsystem",
52-
nameRu = "Подсистема",
53-
groupName = "Subsystems",
54-
groupNameRu = "Подсистемы"
55-
)
56-
public class MDSubsystem extends AbstractMDObjectBase {
57-
58-
/**
59-
* Дочерние объекты подсистемы, включает в себя как дочерние подсистемы, так и и другие объекты,
60-
* включенные в подсистему
61-
* Для объектов, которые не удалось прочитать (при загрузке конфигурации) хранит только строки
62-
*/
63-
@XStreamImplicit
64-
private List<Either<String, AbstractMDObjectBase>> children = Collections.emptyList();
65-
66-
/**
67-
* Признак "Включать в командный интерфейс"
68-
*/
69-
private boolean includeInCommandInterface;
70-
71-
public MDSubsystem(DesignerMDO designerMDO) {
72-
super(designerMDO);
73-
List<Either<String, AbstractMDObjectBase>> newChildren = new ArrayList<>();
74-
designerMDO.getProperties().getContent()
75-
.getItems().forEach(item -> newChildren.add(Either.left(item.getValue())));
76-
includeInCommandInterface = designerMDO.getProperties().isIncludeInCommandInterface();
77-
newChildren.addAll(designerMDO.getChildObjects().getChildren());
78-
setChildren(newChildren);
79-
}
80-
81-
@Override
82-
public void supplement() {
83-
super.supplement();
84-
computeSubsystemChildren();
85-
}
86-
87-
@Override
88-
public void supplement(AbstractMDObjectBase parent) {
89-
super.supplement(parent);
90-
computeSubsystemChildren();
91-
}
92-
93-
public void linkToChildren(Map<String, AbstractMDObjectBase> allMDO) {
94-
List<Either<String, AbstractMDObjectBase>> localChildren = new ArrayList<>();
95-
96-
children.forEach((Either<String, AbstractMDObjectBase> mdoPair) -> {
97-
if (mdoPair.isLeft()) {
98-
var mdo = allMDO.get(mdoPair.getLeft());
99-
if (mdo != null) {
100-
localChildren.add(Either.right(mdo));
101-
setSubsystemForChild(allMDO, mdo);
102-
} else {
103-
localChildren.add(mdoPair);
104-
}
105-
} else {
106-
var mdo = mdoPair.get();
107-
if (!mdo.getIncludedSubsystems().contains(this)) {
108-
localChildren.add(mdoPair);
109-
setSubsystemForChild(allMDO, mdo);
110-
}
111-
}
112-
});
113-
114-
setChildren(localChildren);
115-
}
116-
117-
private void computeSubsystemChildren() {
118-
if (children.isEmpty()) {
119-
return;
120-
}
121-
122-
var configurationSource = MDOUtils.getConfigurationSourceByMDOPath(getPath());
123-
var rootFolder = MDOPathUtils.getMDOTypeFolderByMDOPath(configurationSource, getPath());
124-
if (rootFolder.isEmpty()) {
125-
return;
126-
}
127-
128-
List<Either<String, AbstractMDObjectBase>> newChildren = new ArrayList<>();
129-
var folder = Paths.get(rootFolder.get().toString(), getName(), MDOType.SUBSYSTEM.getGroupName());
130-
final var startName = MDOType.SUBSYSTEM.getName() + ".";
131-
132-
children.stream() // параллелизм нельзя!!!! может произойти чтение подсистем из одного фала разными потоками
133-
.filter(Either::isLeft)
134-
.filter((Either<String, AbstractMDObjectBase> child) -> child.getLeft().startsWith(startName)
135-
&& !child.getLeft().contains("-")) // для исключения битых ссылок сразу
136-
137-
.forEach((Either<String, AbstractMDObjectBase> child) -> {
138-
// для обработки имен Subsystem._ДемоСервисныеПодсистемы.Subsystem._ДемоПолучениеФайловИзИнтернета
139-
var subsystemObjectLastPosition = child.getLeft().lastIndexOf(startName);
140-
var subsystemName = child.getLeft().substring(subsystemObjectLastPosition + startName.length());
141-
142-
MDOPathUtils.getMDOPath(configurationSource, folder, subsystemName)
143-
.ifPresent((Path mdoPath) -> {
144-
var childSubsystem = MDOFactory.readMDO(mdoPath);
145-
if (childSubsystem != null) {
146-
childSubsystem.supplement(this);
147-
newChildren.add(Either.right(childSubsystem));
148-
} else {
149-
if (!child.getLeft().equals(getMdoReference().getMdoRef())) {
150-
// ссылку на самого себя исключаем
151-
// вернем несуществующий объект обратно в набор
152-
newChildren.add(child);
153-
}
154-
}
155-
});
156-
});
157-
158-
newChildren.addAll(children.stream()
159-
.filter(Either::isLeft)
160-
.filter((Either<String, AbstractMDObjectBase> child) -> !child.getLeft().startsWith(startName))
161-
.collect(Collectors.toList()));
162-
163-
setChildren(newChildren);
164-
}
165-
166-
private void setSubsystemForChild(Map<String, AbstractMDObjectBase> allMDO, AbstractMDObjectBase mdo) {
167-
mdo.addIncludedSubsystem(this);
168-
if (mdo instanceof MDSubsystem) {
169-
((MDSubsystem) mdo).linkToChildren(allMDO);
170-
}
171-
}
172-
}
23+
24+
import com.github._1c_syntax.mdclasses.mdo.metadata.Metadata;
25+
import com.github._1c_syntax.mdclasses.mdo.support.MDOType;
26+
import com.github._1c_syntax.mdclasses.unmarshal.wrapper.DesignerMDO;
27+
import com.github._1c_syntax.mdclasses.utils.MDOFactory;
28+
import com.github._1c_syntax.mdclasses.utils.MDOPathUtils;
29+
import com.github._1c_syntax.mdclasses.utils.MDOUtils;
30+
import com.thoughtworks.xstream.annotations.XStreamImplicit;
31+
import io.vavr.control.Either;
32+
import lombok.Data;
33+
import lombok.EqualsAndHashCode;
34+
import lombok.NoArgsConstructor;
35+
import lombok.ToString;
36+
37+
import java.nio.file.Path;
38+
import java.nio.file.Paths;
39+
import java.util.ArrayList;
40+
import java.util.Collections;
41+
import java.util.List;
42+
import java.util.Map;
43+
import java.util.stream.Collectors;
44+
45+
@Data
46+
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
47+
@ToString(callSuper = true, onlyExplicitlyIncluded = true)
48+
@NoArgsConstructor
49+
@Metadata(
50+
type = MDOType.SUBSYSTEM,
51+
name = "Subsystem",
52+
nameRu = "Подсистема",
53+
groupName = "Subsystems",
54+
groupNameRu = "Подсистемы"
55+
)
56+
public class MDSubsystem extends AbstractMDObjectBase {
57+
58+
/**
59+
* Дочерние объекты подсистемы, включает в себя как дочерние подсистемы, так и и другие объекты,
60+
* включенные в подсистему
61+
* Для объектов, которые не удалось прочитать (при загрузке конфигурации) хранит только строки
62+
*/
63+
@XStreamImplicit
64+
private List<Either<String, AbstractMDObjectBase>> children = Collections.emptyList();
65+
66+
/**
67+
* Признак "Включать в командный интерфейс"
68+
*/
69+
private boolean includeInCommandInterface;
70+
71+
public MDSubsystem(DesignerMDO designerMDO) {
72+
super(designerMDO);
73+
List<Either<String, AbstractMDObjectBase>> newChildren = new ArrayList<>();
74+
designerMDO.getProperties().getContent()
75+
.getItems().forEach(item -> newChildren.add(Either.left(item.getValue())));
76+
includeInCommandInterface = designerMDO.getProperties().isIncludeInCommandInterface();
77+
newChildren.addAll(designerMDO.getChildObjects().getChildren());
78+
setChildren(newChildren);
79+
}
80+
81+
@Override
82+
public void supplement() {
83+
super.supplement();
84+
computeSubsystemChildren();
85+
}
86+
87+
@Override
88+
public void supplement(AbstractMDObjectBase parent) {
89+
super.supplement(parent);
90+
computeSubsystemChildren();
91+
}
92+
93+
public void linkToChildren(Map<String, AbstractMDObjectBase> allMDO) {
94+
List<Either<String, AbstractMDObjectBase>> localChildren = new ArrayList<>();
95+
96+
children.forEach((Either<String, AbstractMDObjectBase> mdoPair) -> {
97+
if (mdoPair.isLeft()) {
98+
var mdo = allMDO.get(mdoPair.getLeft());
99+
if (mdo != null) {
100+
addChildMDO(allMDO, localChildren, mdo);
101+
} else {
102+
localChildren.add(mdoPair);
103+
}
104+
} else {
105+
addChildMDO(allMDO, localChildren, mdoPair.get());
106+
}
107+
});
108+
109+
setChildren(localChildren);
110+
}
111+
112+
private void computeSubsystemChildren() {
113+
if (children.isEmpty()) {
114+
return;
115+
}
116+
117+
var configurationSource = MDOUtils.getConfigurationSourceByMDOPath(getPath());
118+
var rootFolder = MDOPathUtils.getMDOTypeFolderByMDOPath(configurationSource, getPath());
119+
if (rootFolder.isEmpty()) {
120+
return;
121+
}
122+
123+
List<Either<String, AbstractMDObjectBase>> newChildren = new ArrayList<>();
124+
var folder = Paths.get(rootFolder.get().toString(), getName(), MDOType.SUBSYSTEM.getGroupName());
125+
final var startName = MDOType.SUBSYSTEM.getName() + ".";
126+
127+
children.stream() // параллелизм нельзя!!!! может произойти чтение подсистем из одного фала разными потоками
128+
.filter(Either::isLeft)
129+
.filter((Either<String, AbstractMDObjectBase> child) -> child.getLeft().startsWith(startName)
130+
&& !child.getLeft().contains("-")) // для исключения битых ссылок сразу
131+
132+
.forEach((Either<String, AbstractMDObjectBase> child) -> {
133+
// для обработки имен Subsystem._ДемоСервисныеПодсистемы.Subsystem._ДемоПолучениеФайловИзИнтернета
134+
var subsystemObjectLastPosition = child.getLeft().lastIndexOf(startName);
135+
var subsystemName = child.getLeft().substring(subsystemObjectLastPosition + startName.length());
136+
137+
MDOPathUtils.getMDOPath(configurationSource, folder, subsystemName)
138+
.ifPresent((Path mdoPath) -> {
139+
var childSubsystem = MDOFactory.readMDO(mdoPath);
140+
if (childSubsystem != null) {
141+
childSubsystem.supplement(this);
142+
newChildren.add(Either.right(childSubsystem));
143+
} else {
144+
if (!child.getLeft().equals(getMdoReference().getMdoRef())) {
145+
// ссылку на самого себя исключаем
146+
// вернем несуществующий объект обратно в набор
147+
newChildren.add(child);
148+
}
149+
}
150+
});
151+
});
152+
153+
newChildren.addAll(children.stream()
154+
.filter(Either::isLeft)
155+
.filter((Either<String, AbstractMDObjectBase> child) -> !child.getLeft().startsWith(startName))
156+
.collect(Collectors.toList()));
157+
158+
setChildren(newChildren);
159+
}
160+
161+
162+
private void addChildMDO(Map<String, AbstractMDObjectBase> allMDO,
163+
List<Either<String, AbstractMDObjectBase>> localChildren,
164+
AbstractMDObjectBase mdo) {
165+
166+
if (!mdo.getIncludedSubsystems().contains(this)) {
167+
localChildren.add(Either.right(mdo));
168+
mdo.addIncludedSubsystem(this);
169+
170+
if (mdo instanceof MDSubsystem) {
171+
((MDSubsystem) mdo).linkToChildren(allMDO);
172+
} else if (mdo instanceof AbstractMDObjectComplex
173+
&& ((AbstractMDObjectComplex) mdo).getChildren() != null) {
174+
175+
((AbstractMDObjectComplex) mdo).getChildren().forEach(child -> addChildMDO(allMDO, localChildren, child));
176+
}
177+
}
178+
}
179+
}

0 commit comments

Comments
 (0)