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.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 }