1 package io.github.magwas.inez.element;
2
3 import java.util.List;
4 import java.util.stream.Stream;
5
6 import org.springframework.beans.factory.annotation.Autowired;
7 import org.springframework.data.annotation.Id;
8
9 import io.github.magwas.inez.storage.AddReferencesService;
10 import io.github.magwas.inez.storage.model.Sumti;
11 import io.github.magwas.inez.storage.repository.BridiReferenceRepository;
12 import io.github.magwas.inez.storage.repository.SumtiRepository;
13 import io.github.magwas.konveyor.annotations.Delegate;
14 import io.github.magwas.konveyor.runtime.LogUtil;
15
16 @Delegate
17 public class BridiElement implements ElementConstants {
18 @Id
19 public String id;
20
21 @Autowired
22 GetBridiElementRepresentationService getBridiElementRepresentation;
23
24 @Autowired
25 GetRelativeForBridiElementService getRelativeForBridiElement;
26
27 @Autowired
28 GetBridiElementChildrenService getBridiElementChildren;
29
30 @Autowired
31 GetBridiElementParentService getBridiElementParent;
32
33 @Autowired
34 GetBridiElementTypeService getBridiElementType;
35
36 @Autowired
37 GetBridiElementReferencesService getBridiElementReferences;
38
39 @Autowired
40 RepresentBridiElementService representBridiElement;
41
42 @Autowired
43 SumtiRepository sumtiRepository;
44
45 @Autowired
46 BridiReferenceRepository bridiReferenceRepository;
47
48 @Autowired
49 AddReferencesService addReferences;
50
51 @Autowired
52 IsInstanceService isInstance;
53
54 @Autowired
55 CreateBridiElementService createBridiElement;
56
57 @Autowired
58 BridiElementFactory bridiElementFactory;
59
60 @Autowired
61 IsOfTypeService isOfType;
62
63 @Autowired
64 GetBridiElementReferenceIdsService getBridiElementReferenceIds;
65
66 @Autowired
67 GetBridiElementTypeIdService getBridiElementTypeId;
68
69 void fixParent() {
70 if (ROOT_ID.equals(id)) return;
71 String parent = getBridiElementParent.apply(id);
72 if (parent != null) return;
73 LogUtil.debug("fixing", id);
74 List<String> references = getBridiElementReferenceIds.apply(id).toList();
75 if (references.size() > 1) {
76 String firstSumtiID = references.get(1);
77 if (isOfType.apply(firstSumtiID, CONTAINER_ID)) parent = firstSumtiID;
78 else parent = getBridiElementParent.apply(firstSumtiID);
79 }
80 if (parent == null) {
81 parent = UNPLACED_ID;
82 }
83 String unplacedId = "unplaced:" + id;
84 sumtiRepository.save(new Sumti(unplacedId, unplacedId));
85 LogUtil.debug("reparenting", id, parent);
86 addReferences.apply(unplacedId, List.of(CONTAINS_ID, parent, id));
87 }
88
89 BridiElement(final String id) {
90 this.id = id;
91 }
92
93 public String getRepresentation() {
94 return getBridiElementRepresentation.apply(id);
95 }
96
97 public Stream<BridiElement> getChildren() {
98 return getBridiElementChildren.apply(id);
99 }
100
101 public BridiElement getType() {
102 return getBridiElementType.apply(id);
103 }
104
105 public Stream<BridiElement> getReferences() {
106 return getBridiElementReferences.apply(id);
107 }
108
109 public BridiElement getParent() {
110 return bridiElementFactory.apply(getBridiElementParent.apply(id));
111 }
112
113 public String toXml() {
114 return representBridiElement.apply(id);
115 }
116
117 @Override
118 public String toString() {
119 return "BridiElement(" + id + "," + getRepresentation() + ")";
120 }
121
122 public boolean isInstance(final String typeId) {
123 return isInstance.apply(id, typeId);
124 }
125
126 public BridiElement create(
127 final String containerId, final String typeId, final String representation, final String... references) {
128 return createBridiElement.apply(containerId, typeId, representation, references);
129 }
130 }