Skip to content

Commit dafa298

Browse files
committed
Add multi-hop TL
1 parent 0c5335d commit dafa298

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package edu.kit.kastel.mcse.ardoco.core.api.tracelink;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Objects;
6+
import java.util.Optional;
7+
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
11+
import edu.kit.kastel.mcse.ardoco.core.api.entity.Entity;
12+
13+
public final class MultiHopTransitiveTraceLink<A extends Entity, B extends Entity> extends TraceLink<A, B> {
14+
15+
private static final long serialVersionUID = 850583103292008395L;
16+
17+
private static final Logger logger = LoggerFactory.getLogger(MultiHopTransitiveTraceLink.class);
18+
19+
private final TraceLink<A, ?> firstTraceLink;
20+
private final TraceLink<?, B> lastTraceLink;
21+
22+
private final List<? extends TraceLink<?, ?>> allLinks;
23+
24+
private MultiHopTransitiveTraceLink(TraceLink<A, ?> firstTraceLink, TraceLink<?, B> lastTraceLink, List<? extends TraceLink<?, ?>> allLinks) {
25+
super(firstTraceLink.getFirstEndpoint(), lastTraceLink.getSecondEndpoint());
26+
this.firstTraceLink = firstTraceLink;
27+
this.lastTraceLink = lastTraceLink;
28+
this.allLinks = allLinks;
29+
}
30+
31+
public static <A extends Entity, B extends Entity> Optional<MultiHopTransitiveTraceLink<A, B>> createTransitiveTraceLink(TraceLink<A, ?> firstTraceLink,
32+
TraceLink<?, B> lastTraceLink, List<? extends TraceLink<?, ?>> intermediateLinks) {
33+
34+
if (intermediateLinks == null || intermediateLinks.isEmpty()) {
35+
throw new IllegalArgumentException("Please use " + TransitiveTraceLink.class.getSimpleName());
36+
}
37+
38+
Objects.requireNonNull(firstTraceLink);
39+
Objects.requireNonNull(lastTraceLink);
40+
41+
List<TraceLink<?, ?>> completeList = new ArrayList<>();
42+
completeList.add(firstTraceLink);
43+
completeList.addAll(intermediateLinks);
44+
completeList.add(lastTraceLink);
45+
46+
for (int i = 1; i < completeList.size(); i++) {
47+
if (!TransitiveTraceLink.isValidTransitiveTraceLink(completeList.get(i - 1), completeList.get(i))) {
48+
MultiHopTransitiveTraceLink.logger.debug("Invalid transition: {} -> {}", completeList.get(i - 1), completeList.get(i));
49+
return Optional.empty();
50+
}
51+
}
52+
53+
return Optional.of(new MultiHopTransitiveTraceLink<>(firstTraceLink, lastTraceLink, completeList));
54+
}
55+
56+
public TraceLink<A, ?> getFirstTraceLink() {
57+
return this.firstTraceLink;
58+
}
59+
60+
public TraceLink<?, B> getLastTraceLink() {
61+
return this.lastTraceLink;
62+
}
63+
64+
public List<? extends TraceLink<?, ?>> getAllLinks() {
65+
return new ArrayList<TraceLink<?, ?>>(this.allLinks);
66+
}
67+
68+
@Override
69+
public int hashCode() {
70+
return Objects.hash(this.allLinks);
71+
}
72+
73+
@Override
74+
public boolean equals(Object obj) {
75+
if (this == obj) {
76+
return true;
77+
}
78+
if (!(obj instanceof MultiHopTransitiveTraceLink<?, ?> other)) {
79+
return false;
80+
}
81+
return Objects.equals(this.allLinks, other.allLinks);
82+
}
83+
84+
@Override
85+
public String toString() {
86+
return this.asPair().toString();
87+
}
88+
89+
}

0 commit comments

Comments
 (0)