-
Notifications
You must be signed in to change notification settings - Fork 5
/
Extractor.java
99 lines (88 loc) · 3.45 KB
/
Extractor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
* © 2021. TU Dortmund University,
* Institute of Energy Systems, Energy Efficiency and Energy Economics,
* Research group Distribution grid planning and operation
*/
package edu.ie3.datamodel.io.extractor;
import edu.ie3.datamodel.exceptions.ExtractorException;
import edu.ie3.datamodel.models.Operable;
import edu.ie3.datamodel.models.input.AssetTypeInput;
import edu.ie3.datamodel.models.input.OperatorInput;
import edu.ie3.datamodel.models.input.UniqueInputEntity;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A simple utility class that can be used by sinks to extract nested elements (e.g. nodes, types)
* that should be persisted.
*
* @version 0.1
* @since 31.03.20
*/
public final class Extractor {
private static final Logger log = LoggerFactory.getLogger(Extractor.class);
private Extractor() {
throw new IllegalStateException("Utility classes cannot be instantiated");
}
public static Set<UniqueInputEntity> extractElements(NestedEntity nestedEntity)
throws ExtractorException {
CopyOnWriteArrayList<UniqueInputEntity> resultingList = new CopyOnWriteArrayList<>();
if (nestedEntity instanceof HasNodes nestedHasNode) {
resultingList.addAll(nestedHasNode.allNodes());
}
if (nestedEntity instanceof Operable nestedOperable) {
extractOperator(nestedOperable).ifPresent(resultingList::add);
}
if (nestedEntity instanceof HasType nestedHasType) {
resultingList.add(extractType(nestedHasType));
}
if (nestedEntity instanceof HasThermalBus nestedHasThermalBus) {
resultingList.add(nestedHasThermalBus.getThermalBus());
}
if (nestedEntity instanceof HasThermalStorage nestedHasThermalStorage) {
resultingList.add(nestedHasThermalStorage.getThermalStorage());
}
if (nestedEntity instanceof HasLine nestedHasLine) {
resultingList.add(nestedHasLine.getLine());
}
if (resultingList.contains(null)) {
log.warn(
"Entity of class '{}' contains null values in fields!",
nestedEntity.getClass().getSimpleName());
}
if (resultingList.isEmpty() && !(nestedEntity instanceof Operable)) {
throw new ExtractorException(
"Unable to extract entity of class '"
+ nestedEntity.getClass().getSimpleName()
+ "'. Does this class implements "
+ NestedEntity.class.getSimpleName()
+ " and one of its "
+ "sub-interfaces correctly?");
}
resultingList.stream()
.parallel()
.forEach(
element -> {
if (element instanceof NestedEntity nestedElement) {
try {
resultingList.addAll(extractElements(nestedElement));
} catch (ExtractorException e) {
log.error(
"An error occurred during extraction of nested entity '{}':{}",
element.getClass().getSimpleName(),
e);
}
}
});
return Set.copyOf(resultingList);
}
public static AssetTypeInput extractType(HasType entityWithType) {
return entityWithType.getType();
}
public static Optional<OperatorInput> extractOperator(Operable entityWithOperator) {
return entityWithOperator.getOperator().getId().equalsIgnoreCase("NO_OPERATOR_ASSIGNED")
? Optional.empty()
: Optional.of(entityWithOperator.getOperator());
}
}