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