From c283d9276a6fd417a9577ed4c925a07bdbf4c65d Mon Sep 17 00:00:00 2001 From: Frederik Petersen Date: Wed, 25 Mar 2015 10:51:47 +0100 Subject: [PATCH] Introduces oldStatus parameter for state change listener polar service can now listen for state changes (loading -> x) --- .../MarkPassingUpdateListener.java | 2 +- .../domain/tracking/RaceChangeListener.java | 2 +- .../impl/AbstractRaceChangeListener.java | 2 +- .../tracking/impl/DynamicTrackedRaceImpl.java | 7 +++-- .../TrackBasedEstimationWindTrackImpl.java | 2 +- .../domain/tracking/impl/TrackedLegImpl.java | 2 +- .../sap/sailing/polars/PolarDataService.java | 2 +- .../polars/impl/PolarDataServiceImpl.java | 2 +- .../sailing/polars/mining/PolarDataMiner.java | 31 ++++++------------- .../server/impl/RacingEventServiceImpl.java | 9 +++--- 10 files changed, 26 insertions(+), 35 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingUpdateListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingUpdateListener.java index c1636f24013..eb9e97dbffa 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingUpdateListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingUpdateListener.java @@ -45,7 +45,7 @@ public class MarkPassingUpdateListener extends AbstractRaceChangeListener { } @Override - public void statusChanged(TrackedRaceStatus newStatus) { + public void statusChanged(TrackedRaceStatus newStatus, TrackedRaceStatus oldStatus) { if (newStatus.getStatus() == TrackedRaceStatusEnum.FINISHED) { queue.add(end); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceChangeListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceChangeListener.java index 6dbefd5a3ca..df09d90ece0 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceChangeListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceChangeListener.java @@ -50,5 +50,5 @@ public interface RaceChangeListener extends CourseListener { void windSourcesToExcludeChanged(Iterable windSourcesToExclude); - void statusChanged(TrackedRaceStatus newStatus); + void statusChanged(TrackedRaceStatus newStatus, TrackedRaceStatus oldStatus); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/AbstractRaceChangeListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/AbstractRaceChangeListener.java index 30feacbaf26..4dbf64a1b70 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/AbstractRaceChangeListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/AbstractRaceChangeListener.java @@ -40,7 +40,7 @@ public abstract class AbstractRaceChangeListener implements RaceChangeListener { } @Override - public void statusChanged(TrackedRaceStatus newStatus) { + public void statusChanged(TrackedRaceStatus newStatus, TrackedRaceStatus oldStatus) { defaultAction(); } 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 675f70a917b..f8def06f984 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 @@ -147,8 +147,9 @@ DynamicTrackedRace, GPSTrackListener { @Override public void setStatus(TrackedRaceStatus newStatus) { + TrackedRaceStatus oldStatus = getStatus(); super.setStatus(newStatus); - notifyListeners(newStatus); + notifyListeners(newStatus, oldStatus); } @Override @@ -415,8 +416,8 @@ DynamicTrackedRace, GPSTrackListener { notifyListeners(listener -> listener.competitorPositionChanged(fix, competitor)); } - private void notifyListeners(TrackedRaceStatus status) { - notifyListeners(listener -> listener.statusChanged(status)); + private void notifyListeners(TrackedRaceStatus status, TrackedRaceStatus oldStatus) { + notifyListeners(listener -> listener.statusChanged(status, oldStatus)); } private void notifyListeners(Wind wind, WindSource windSource) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackBasedEstimationWindTrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackBasedEstimationWindTrackImpl.java index 0de72df2936..8ff7fcd2c57 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackBasedEstimationWindTrackImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackBasedEstimationWindTrackImpl.java @@ -667,7 +667,7 @@ public class TrackBasedEstimationWindTrackImpl extends VirtualWindTrackImpl { } @Override - public void statusChanged(TrackedRaceStatus newStatus) { + public void statusChanged(TrackedRaceStatus newStatus, TrackedRaceStatus oldStatus) { // This virtual wind track's cache can cope with an empty cache after the LOADING phase and populates the // cache // upon request. Invalidation happens also during the LOADING phase, preserving the cache's invariant. diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java index 9a06c8452ab..37e27570806 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java @@ -269,7 +269,7 @@ public class TrackedLegImpl implements TrackedLeg { * no-op; the leg doesn't mind the tracked race's status being updated */ @Override - public void statusChanged(TrackedRaceStatus newStatus) { + public void statusChanged(TrackedRaceStatus newStatus, TrackedRaceStatus oldStatus) { } /** diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/PolarDataService.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/PolarDataService.java index 66e493c184b..4f230462a71 100755 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/PolarDataService.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/PolarDataService.java @@ -194,5 +194,5 @@ public interface PolarDataService { */ PolynomialFunction getAngleRegressionFunction(BoatClass boatClass, LegType legType, Tack tack) throws NotEnoughDataHasBeenAddedException; - void raceFinishedTracking(TrackedRace race); + void raceFinishedLoading(TrackedRace race); } diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/impl/PolarDataServiceImpl.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/impl/PolarDataServiceImpl.java index 8ae96c222b0..716524b4e05 100755 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/impl/PolarDataServiceImpl.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/impl/PolarDataServiceImpl.java @@ -148,7 +148,7 @@ public class PolarDataServiceImpl implements PolarDataService { } @Override - public void raceFinishedTracking(TrackedRace race) { + public void raceFinishedLoading(TrackedRace race) { polarDataMiner.raceFinishedTracking(race); } } diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarDataMiner.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarDataMiner.java index c2c1ceaac29..12f4e2e4497 100755 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarDataMiner.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarDataMiner.java @@ -43,7 +43,6 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.polars.impl.CubicEquation; import com.sap.sailing.polars.regression.NotEnoughDataHasBeenAddedException; import com.sap.sse.common.Util.Pair; -import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.datamining.components.Processor; import com.sap.sse.datamining.data.ClusterGroup; import com.sap.sse.datamining.functions.Function; @@ -58,7 +57,7 @@ public class PolarDataMiner { private static final int THREAD_POOL_SIZE = Math.max((int) (Runtime.getRuntime().availableProcessors() * (3.0/4.0)), 3); private final ThreadPoolExecutor executor = createExecutor(); private final PolarSheetGenerationSettings backendPolarSheetGenerationSettings; - private final Map> fixesForReplayRacesWhichAreStillLoading = new HashMap<>(); + private final Map> fixesForRacesWhichAreStillLoading = new HashMap<>(); private final Queue fixQueue = new ConcurrentLinkedQueue(); @@ -188,22 +187,22 @@ public class PolarDataMiner { public void addFix(GPSFixMoving fix, Competitor competitor, TrackedRace trackedRace) { GPSFixMovingWithOriginInfo fixWithOriginInfo = new GPSFixMovingWithOriginInfo(fix, trackedRace, competitor); - if (isReplayAndFinishedOrLive(trackedRace)) { - processFix(trackedRace, fixWithOriginInfo); - } else { + if (trackedRace.getStatus().getStatus() == TrackedRaceStatusEnum.LOADING) { /* * logger.info("Received fix for replay race which has not finished loading. Queuing. " + * (trackedRace.getRace() != null ? trackedRace.getRace().getName() : trackedRace.getRaceIdentifier() * .getRaceName())); */ - synchronized (fixesForReplayRacesWhichAreStillLoading) { - Set fixes = fixesForReplayRacesWhichAreStillLoading.get(trackedRace); + synchronized (fixesForRacesWhichAreStillLoading) { + Set fixes = fixesForRacesWhichAreStillLoading.get(trackedRace); if (fixes == null) { fixes = new HashSet<>(); - fixesForReplayRacesWhichAreStillLoading.put(trackedRace, fixes); + fixesForRacesWhichAreStillLoading.put(trackedRace, fixes); } fixes.add(fixWithOriginInfo); } + } else { + processFix(trackedRace, fixWithOriginInfo); } } @@ -221,16 +220,6 @@ public class PolarDataMiner { } } - private boolean isReplayAndFinishedOrLive(TrackedRace trackedRace) { - boolean isLive = trackedRace.isLive(new MillisecondsTimePoint(System.currentTimeMillis())); - boolean loadingFinished = false; - if (trackedRace.getStatus().getStatus() == TrackedRaceStatusEnum.FINISHED) { - loadingFinished = true; - } - boolean replayRaceAndFinished = !isLive && loadingFinished; - return replayRaceAndFinished || isLive; - } - public boolean isCurrentlyActiveAndOrHasQueue() { boolean isActive = executor.getActiveCount() > 0; boolean hasQueue = executor.getQueue().size() > 0; @@ -399,11 +388,11 @@ public class PolarDataMiner { public void raceFinishedTracking(TrackedRace race) { Set fixes = null; - synchronized (fixesForReplayRacesWhichAreStillLoading) { - fixes = fixesForReplayRacesWhichAreStillLoading.remove(race); + synchronized (fixesForRacesWhichAreStillLoading) { + fixes = fixesForRacesWhichAreStillLoading.remove(race); } if (fixes != null) { - logger.info("All queued fixes for newly completed race will process now. " + (race.getRace() != null ? race + logger.info("All queued fixes for newly loaded race will process now. " + (race.getRace() != null ? race .getRace().getName() : race.getRaceIdentifier().getRaceName())); for (GPSFixMovingWithOriginInfo fix : fixes) { processFix(race, fix); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index b5379a259e6..fa8bc632793 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -1540,9 +1540,10 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes } @Override - public void statusChanged(TrackedRaceStatus newStatus) { - if (newStatus.getStatus() == TrackedRaceStatusEnum.FINISHED) { - polarDataService.raceFinishedTracking(race); + public void statusChanged(TrackedRaceStatus newStatus, TrackedRaceStatus oldStatus) { + if (oldStatus.getStatus() == TrackedRaceStatusEnum.LOADING + && newStatus.getStatus() != TrackedRaceStatusEnum.LOADING) { + polarDataService.raceFinishedLoading(race); } } @@ -1617,7 +1618,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes } @Override - public void statusChanged(TrackedRaceStatus newStatus) { + public void statusChanged(TrackedRaceStatus newStatus, TrackedRaceStatus oldStatus) { replicate(new UpdateTrackedRaceStatus(getRaceIdentifier(), newStatus)); }