Skip to content

Commit 294414b

Browse files
committed
Merge branch 'eclipse-main' into eclipse-docker-25
2 parents aad0740 + d0f8850 commit 294414b

94 files changed

Lines changed: 3530 additions & 450 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/AbstractCompactGPSFixMovingImpl.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,6 @@ protected abstract class AbstractCompactSpeedWithBearing extends AbstractSpeedIm
3030
@Override
3131
public abstract double getKnots();
3232

33-
@Override
34-
public Position travelTo(Position pos, TimePoint from, TimePoint to) {
35-
return pos.translateGreatCircle(getBearing(), this.travel(from, to));
36-
}
37-
3833
@Override
3934
public SpeedWithBearing applyCourseChange(CourseChange courseChange) {
4035
return AbstractSpeedWithBearingImpl.applyCourseChange(this, courseChange);

java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,8 @@ private void startTracking(RaceLogStartTrackingEvent event) {
360360
raceColumn.setRaceIdentifier(fleet, trackedRegatta.getRegatta().getRaceIdentifier(raceDef));
361361
trackedRace = raceTrackingHandler.createTrackedRace(trackedRegatta, raceDef, sidelines, windStore,
362362
params.getDelayToLiveInMillis(), WindTrack.DEFAULT_MILLISECONDS_OVER_WHICH_TO_AVERAGE_WIND,
363-
boatClass.getApproximateManeuverDurationInMilliseconds(), null, /*useMarkPassingCalculator*/ true, raceLogResolver,
363+
boatClass.getApproximateManeuverDurationInMilliseconds(), /* raceDefinitionSetToUpdate */ null,
364+
/* useMarkPassingCalculator */ true, raceLogResolver,
364365
/* Not needed because the RaceTracker is not active on a replica */ Optional.empty(),
365366
new TrackingConnectorInfoImpl(RaceLogTrackingAdapter.NAME, RaceLogTrackingAdapter.DEFAULT_URL, /* no webUrl */ null),
366367
markPassingRaceFingerprintRegistry, maneuverRaceFingerprintRegistry);
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package com.sap.sailing.domain.test;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.util.Optional;
6+
import java.util.concurrent.atomic.AtomicInteger;
7+
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.Test;
10+
11+
import com.sap.sailing.domain.base.CompetitorWithBoat;
12+
import com.sap.sailing.domain.common.TrackedRaceStatusEnum;
13+
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
14+
import com.sap.sailing.domain.tracking.TrackingDataLoader;
15+
import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl;
16+
import com.sap.sailing.domain.tracking.impl.TrackedRaceStatusImpl;
17+
import com.sap.sse.common.impl.MillisecondsTimePoint;
18+
19+
/**
20+
* Tests {@link com.sap.sailing.domain.tracking.TrackedRace#runWhenPastLoading(Runnable)}.
21+
* See bug 6241.
22+
*
23+
* @author Axel Uhl (d043530)
24+
*/
25+
public class TrackedRaceRunWhenPastLoadingTest extends TrackBasedTest {
26+
private CompetitorWithBoat competitor;
27+
private DynamicTrackedRace trackedRace;
28+
29+
@BeforeEach
30+
public void setUp() {
31+
competitor = createCompetitorWithBoat("Test Competitor");
32+
trackedRace = createTestTrackedRace("Test Regatta", "Test Race", "505",
33+
createCompetitorAndBoatsMap(competitor), MillisecondsTimePoint.now(),
34+
/* useMarkPassingCalculator */ false);
35+
}
36+
37+
/**
38+
* When the race is already past LOADING at the time of the call, the callback must
39+
* run immediately (synchronously on the caller's thread).
40+
*/
41+
@Test
42+
public void testFiresImmediatelyWhenAlreadyPastLoading() {
43+
final TrackingDataLoader loader = new TrackingDataLoader() {};
44+
trackedRace.onStatusChanged(loader, new TrackedRaceStatusImpl(TrackedRaceStatusEnum.TRACKING, 1.0));
45+
assertEquals(TrackedRaceStatusEnum.TRACKING, trackedRace.getStatus().getStatus());
46+
final AtomicInteger firings = new AtomicInteger(0);
47+
trackedRace.runWhenPastLoading(() -> firings.incrementAndGet());
48+
assertEquals(1, firings.get(), "callback must fire immediately when race is already past LOADING");
49+
}
50+
51+
/**
52+
* When the race is in PREPARED (initial state) at the time of the call, the callback
53+
* must not fire until the race transitions past LOADING. A PREPARED to TRACKING jump
54+
* without ever entering LOADING must still fire the callback -- that's the whole
55+
* point of "past LOADING" being the condition, matching, e.g., RaceLogRaceTracker
56+
* races that go straight from PREPARED to TRACKING.
57+
*/
58+
@Test
59+
public void testFiresOnPreparedToTrackingTransitionSkippingLoading() {
60+
assertEquals(TrackedRaceStatusEnum.PREPARED, trackedRace.getStatus().getStatus());
61+
final AtomicInteger firings = new AtomicInteger(0);
62+
trackedRace.runWhenPastLoading(() -> firings.incrementAndGet());
63+
assertEquals(0, firings.get(), "callback must not fire while race is in PREPARED");
64+
final TrackingDataLoader loader = new TrackingDataLoader() {};
65+
trackedRace.onStatusChanged(loader, new TrackedRaceStatusImpl(TrackedRaceStatusEnum.TRACKING, 1.0));
66+
assertEquals(1, firings.get(), "callback must fire when race transitions past LOADING");
67+
}
68+
69+
/**
70+
* Firing happens exactly once even when multiple status transitions past LOADING occur.
71+
*/
72+
@Test
73+
public void testFiresExactlyOnceAcrossMultipleTransitions() {
74+
assertEquals(TrackedRaceStatusEnum.PREPARED, trackedRace.getStatus().getStatus());
75+
final AtomicInteger firings = new AtomicInteger(0);
76+
trackedRace.runWhenPastLoading(() -> firings.incrementAndGet());
77+
final TrackingDataLoader loader = new TrackingDataLoader() {};
78+
trackedRace.onStatusChanged(loader, new TrackedRaceStatusImpl(TrackedRaceStatusEnum.LOADING, 0.5));
79+
assertEquals(TrackedRaceStatusEnum.LOADING, trackedRace.getStatus().getStatus());
80+
assertEquals(0, firings.get(), "callback must not fire while race is still in LOADING");
81+
trackedRace.onStatusChanged(loader, new TrackedRaceStatusImpl(TrackedRaceStatusEnum.TRACKING, 1.0));
82+
assertEquals(1, firings.get(), "callback must fire once when race leaves LOADING");
83+
trackedRace.onStatusChanged(loader, new TrackedRaceStatusImpl(TrackedRaceStatusEnum.FINISHED, 1.0));
84+
assertEquals(1, firings.get(), "callback must not fire again on subsequent transitions");
85+
}
86+
87+
/**
88+
* When the race is removed from its regatta before ever transitioning past LOADING,
89+
* the callback must not fire and the primitive must tear down its listeners.
90+
*/
91+
@Test
92+
public void testDoesNotFireWhenRaceIsRemovedBeforeReachingPastLoading() throws InterruptedException {
93+
// add the race to the regatta so that removeTrackedRace has an effect
94+
final DynamicTrackedRegattaImpl regatta = (DynamicTrackedRegattaImpl) trackedRace.getTrackedRegatta();
95+
regatta.addTrackedRace(trackedRace, Optional.empty());
96+
assertEquals(TrackedRaceStatusEnum.PREPARED, trackedRace.getStatus().getStatus());
97+
final AtomicInteger firings = new AtomicInteger(0);
98+
trackedRace.runWhenPastLoading(() -> firings.incrementAndGet());
99+
assertEquals(0, firings.get());
100+
regatta.removeTrackedRace(trackedRace, Optional.empty());
101+
// Give the asynchronous race-listener notification a chance to be processed.
102+
// TrackedRegattaImpl uses AsynchronousRunnableExecutor for non-synchronous
103+
// listeners, so the raceRemoved event fires on a background thread. We poll
104+
// for a moment; the callback should never fire in either case.
105+
final long deadline = System.currentTimeMillis() + 1000;
106+
while (System.currentTimeMillis() < deadline && firings.get() == 0) {
107+
Thread.sleep(20);
108+
}
109+
assertEquals(0, firings.get(), "callback must not fire when race was removed before reaching past LOADING");
110+
}
111+
112+
/**
113+
* When the race is removed <em>after</em> the callback has already fired (because
114+
* the race reached past LOADING), removal is a no-op regarding the callback -- it
115+
* must not fire a second time.
116+
*/
117+
@Test
118+
public void testRemovalAfterFiringDoesNotCauseSecondFiring() {
119+
final DynamicTrackedRegattaImpl regatta = (DynamicTrackedRegattaImpl) trackedRace.getTrackedRegatta();
120+
regatta.addTrackedRace(trackedRace, Optional.empty());
121+
final AtomicInteger firings = new AtomicInteger(0);
122+
trackedRace.runWhenPastLoading(() -> firings.incrementAndGet());
123+
final TrackingDataLoader loader = new TrackingDataLoader() {};
124+
trackedRace.onStatusChanged(loader, new TrackedRaceStatusImpl(TrackedRaceStatusEnum.TRACKING, 1.0));
125+
assertEquals(1, firings.get());
126+
regatta.removeTrackedRace(trackedRace, Optional.empty());
127+
assertEquals(1, firings.get(), "removal after firing must not cause a second firing");
128+
}
129+
}

java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,6 +1399,11 @@ public PolarDataService getPolarDataService() {
13991399
public void setWindEstimation(IncrementalWindEstimation windEstimation) {
14001400
}
14011401

1402+
@Override
1403+
public IncrementalWindEstimation getWindEstimation() {
1404+
return null;
1405+
}
1406+
14021407
@Override
14031408
public TrackingConnectorInfo getTrackingConnectorInfo() {
14041409
return null;
@@ -1408,6 +1413,10 @@ public TrackingConnectorInfo getTrackingConnectorInfo() {
14081413
public void runWhenDoneLoading(Runnable runnable) {
14091414
}
14101415

1416+
@Override
1417+
public void runWhenPastLoading(Runnable callback) {
1418+
}
1419+
14111420
@Override
14121421
public void runSynchronizedOnStatus(Runnable runnable) {
14131422
}

java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,11 @@ public PolarDataService getPolarDataService() {
912912
public void setWindEstimation(IncrementalWindEstimation windEstimation) {
913913
}
914914

915+
@Override
916+
public IncrementalWindEstimation getWindEstimation() {
917+
return null;
918+
}
919+
915920
@Override
916921
public TrackingConnectorInfo getTrackingConnectorInfo() {
917922
return null;
@@ -921,6 +926,10 @@ public TrackingConnectorInfo getTrackingConnectorInfo() {
921926
public void runWhenDoneLoading(Runnable runnable) {
922927
}
923928

929+
@Override
930+
public void runWhenPastLoading(Runnable callback) {
931+
}
932+
924933
@Override
925934
public void runSynchronizedOnStatus(Runnable runnable) {
926935
}

java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/KilometersPerHourSpeedWithBearingImpl.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import com.sap.sse.common.Position;
66
import com.sap.sse.common.Speed;
77
import com.sap.sse.common.SpeedWithBearing;
8-
import com.sap.sse.common.TimePoint;
98
import com.sap.sse.common.impl.AbstractSpeedWithAbstractBearingImpl;
109
import com.sap.sse.common.impl.AbstractSpeedWithBearingImpl;
1110
import com.sap.sse.common.impl.KilometersPerHourSpeedImpl;
@@ -24,11 +23,6 @@ public Bearing getBearing() {
2423
return bearing;
2524
}
2625

27-
@Override
28-
public Position travelTo(Position pos, TimePoint from, TimePoint to) {
29-
return pos.translateGreatCircle(getBearing(), this.travel(from, to));
30-
}
31-
3226
@Override
3327
public SpeedWithBearing add(SpeedWithBearing other) {
3428
return AbstractSpeedWithBearingImpl.add(this, other);

0 commit comments

Comments
 (0)