View Javadoc
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 }