From e2d41eeb9c1fa4e4ee4d5afe4a911b4cbe71c1a9 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sun, 17 Apr 2016 23:12:30 +0200 Subject: [PATCH] launch MarkPassingCalculator initialization synchronously during test execution Change-Id: I1b336553fc8b9cf86a935944cf889211e81d7169 --- .../test/markpassing/AbstractMarkPassingTest.java | 2 +- .../markpassing/StarIDM2013MarkPassingTest.java | 2 +- .../MarkPassingCalculator.java | 13 +++++++++---- .../tracking/impl/DynamicTrackedRaceImpl.java | 6 +++++- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMarkPassingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMarkPassingTest.java index bcab5fcf473..11bd52a71e2 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMarkPassingTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMarkPassingTest.java @@ -123,7 +123,7 @@ public abstract class AbstractMarkPassingTest extends OnlineTracTracBasedTest { Map> computedPasses = new HashMap<>(); // Get calculatedMarkPasses long time = System.currentTimeMillis(); - new MarkPassingCalculator(getTrackedRace(), false); + new MarkPassingCalculator(getTrackedRace(), false, /* waitForInitialMarkPassingCalculation */ true); time = System.currentTimeMillis() - time; for (Competitor c : getRace().getCompetitors()) { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/StarIDM2013MarkPassingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/StarIDM2013MarkPassingTest.java index 1d62e3c0308..a91dd72f700 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/StarIDM2013MarkPassingTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/StarIDM2013MarkPassingTest.java @@ -54,7 +54,7 @@ public class StarIDM2013MarkPassingTest extends AbstractMarkPassingTest { } private void testWholeRace5() throws InvalidDateException { - new MarkPassingCalculator(getTrackedRace(), false); // do our calculation, injecting into TrackedRace + new MarkPassingCalculator(getTrackedRace(), false, /* waitForInitialMarkPassingCalculation */ true); // do our calculation, injecting into TrackedRace final Competitor GER7897 = getCompetitorByName("Tusch, Frank,Winkelmann, Sven"); assertMarkPassing(GER7897, Util.get(getWaypoints(), 0), DateParser.parse("2013-05-04T14:50:10+0200")); assertMarkPassing(GER7897, Util.get(getWaypoints(), 1), DateParser.parse("2013-05-04T14:57:12+0200")); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingCalculator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingCalculator.java index 32fe2fc30a2..f59626ef5a1 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingCalculator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingCalculator.java @@ -34,7 +34,7 @@ import com.sap.sse.util.impl.ThreadFactoryWithPriority; * Calculates the {@link MarkPassing}s for a {@link DynamicTrackedRace} using an {@link CandidateFinder} and an * {@link CandidateChooser}. The finder evaluates the fixes and finds possible MarkPassings as {@link Candidate}s . The * chooser than finds the most likely sequence of {@link Candidate}s and updates the race with new {@link MarkPassing}s - * for this sequence. Upon calling the constructor {@link #MarkPassingCalculator(DynamicTrackedRace, boolean)} this + * for this sequence. Upon calling the constructor {@link #MarkPassingCalculator(DynamicTrackedRace, boolean, boolean)} this * happens for the current state of the race. In addition, for live races, the listen parameter of the * constructor should be true. Then a {@link MarkPassingUpdateListener} is initialized which puts new fixes into a queue * as {@link StorePositionUpdateStrategy}. A new thread will also be started to evaluate the new fixes (See @@ -58,7 +58,7 @@ public class MarkPassingCalculator { private boolean suspended = false; - public MarkPassingCalculator(DynamicTrackedRace race, boolean listen) { + public MarkPassingCalculator(DynamicTrackedRace race, boolean listen, boolean waitForInitialMarkPassingCalculation) { if (listen) { listener = new MarkPassingUpdateListener(race); } else { @@ -67,7 +67,7 @@ public class MarkPassingCalculator { this.race = race; finder = new CandidateFinderImpl(race); chooser = new CandidateChooserImpl(race); - new Thread(() -> { + Thread t = new Thread(() -> { for (Competitor c : race.getRace().getCompetitors()) { Util.Pair, Iterable> allCandidates = finder.getAllCandidates(c); chooser.calculateMarkPassDeltas(c, allCandidates.getA(), allCandidates.getB()); @@ -77,7 +77,12 @@ public class MarkPassingCalculator { listenerThread.setDaemon(true); listenerThread.start(); } - }, "MarkPassingCalculator for race "+race.getRace().getName()+" initialization").start(); + }, "MarkPassingCalculator for race "+race.getRace().getName()+" initialization"); + if (waitForInitialMarkPassingCalculation) { + t.run(); + } else { + t.start(); + } } /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 81b14b7407e..f4d60a544c8 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -1016,7 +1016,11 @@ DynamicTrackedRace, GPSTrackListener { @Override protected MarkPassingCalculator createMarkPassingCalculator() { - return new MarkPassingCalculator(this, true); + // not waiting for initial mark passing creation is essential for not holding up, e.g., + // an initial load during replication where it is perfectly fine to obtain the results from + // mark passing analysis as they become available; for test cases, however, "true" would + // be a more appropriate choice + return new MarkPassingCalculator(this, true, /* waitForInitialMarkPassingCalculation */ false); } @Override