bug 4387: fix for comment #4, making gpsTrack transient on BravoFixTrackImpl, filling when track is added to TrackedRace

Change-Id: Icba632c7cf033aeadf7db8cffaa1010be6183e69
This commit is contained in:
Axel Uhl committed 2017-12-03 15:07:02 +01:00
1 parent dc24184baa
commit 28ffdac19f
7 files changed
+59 -14

No files matched your search

@@ -10,7 +10,7 @@ import com.sap.sailing.domain.racelog.tracking.SensorFixMapper;
import com.sap.sailing.domain.tracking.BravoFixTrack;
import com.sap.sailing.domain.tracking.DynamicSensorFixTrack;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.impl.BravoFixTrackImpl;
import com.sap.sailing.domain.tracking.impl.CompetitorBravoFixTrackImpl;
/**
* {@link SensorFixMapper} implementation to handle {@link BravoFix}es.
@@ -20,7 +20,7 @@ public class BravoDataFixMapper implements SensorFixMapper<BravoFix, DynamicSens
@Override
public DynamicSensorFixTrack<Competitor, BravoFix> getTrack(DynamicTrackedRace race, Competitor key) {
return race.getOrCreateSensorTrack(key, BravoFixTrack.TRACK_NAME,
() -> new BravoFixTrackImpl<Competitor>(key, BravoFixTrack.TRACK_NAME, /* hasExtendedFixes */ false,
() -> new CompetitorBravoFixTrackImpl(key, BravoFixTrack.TRACK_NAME, /* hasExtendedFixes */ false,
race.getTrack(key)));
}
@@ -11,7 +11,7 @@ import com.sap.sailing.domain.racelog.tracking.SensorFixMapper;
import com.sap.sailing.domain.tracking.BravoFixTrack;
import com.sap.sailing.domain.tracking.DynamicSensorFixTrack;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.impl.BravoFixTrackImpl;
import com.sap.sailing.domain.tracking.impl.CompetitorBravoFixTrackImpl;
/**
* {@link SensorFixMapper} implementation to handle {@link BravoExtendedFix}es.
@@ -21,7 +21,7 @@ public class BravoExtendedDataFixMapper implements SensorFixMapper<BravoFix, Dyn
@Override
public DynamicSensorFixTrack<Competitor, BravoFix> getTrack(DynamicTrackedRace race, Competitor key) {
return race.getOrCreateSensorTrack(key, BravoFixTrack.TRACK_NAME,
() -> new BravoFixTrackImpl<Competitor>(key, BravoFixTrack.TRACK_NAME, /* hasExtendedFixes */ true,
() -> new CompetitorBravoFixTrackImpl(key, BravoFixTrack.TRACK_NAME, /* hasExtendedFixes */ true,
race.getTrack(key)));
}
@@ -11,7 +11,7 @@ import com.sap.sailing.domain.racelog.tracking.SensorFixMapper;
import com.sap.sailing.domain.tracking.BravoFixTrack;
import com.sap.sailing.domain.tracking.DynamicSensorFixTrack;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.impl.BravoFixTrackImpl;
import com.sap.sailing.domain.tracking.impl.CompetitorBravoFixTrackImpl;
/**
* {@link SensorFixMapper} implementation to product {@link BravoExtendedFix}es from {@link DoubleVectorFix}es
@@ -25,7 +25,7 @@ public class ExpeditionExtendedDataFixMapper implements SensorFixMapper<BravoFix
@Override
public DynamicSensorFixTrack<Competitor, BravoFix> getTrack(DynamicTrackedRace race, Competitor key) {
return race.getOrCreateSensorTrack(key, BravoFixTrack.TRACK_NAME,
() -> new BravoFixTrackImpl<Competitor>(key, BravoFixTrack.TRACK_NAME, /* hasExtendedFixes */ true,
() -> new CompetitorBravoFixTrackImpl(key, BravoFixTrack.TRACK_NAME, /* hasExtendedFixes */ true,
race.getTrack(key)));
}
@@ -13,5 +13,9 @@ import com.sap.sse.common.WithID;
*/
public interface DynamicSensorFixTrack<ItemType extends WithID & Serializable, FixT extends SensorFix> extends
SensorFixTrack<ItemType, FixT>, DynamicTrack<FixT> {
/**
* Invoked when this track is added to a tracked race. This default implementation
* does nothing.
*/
default void addedToTrackedRace(TrackedRace trackedRace) {}
}
@@ -45,7 +45,7 @@ public class BravoFixTrackImpl<ItemType extends WithID & Serializable> extends S
* If a GPS track was provided at construction time, remember it non-transiently. It is needed when restoring
* the object after de-serialization, so the cache invalidation listener can be re-established.
*/
private GPSFixTrack<ItemType, GPSFixMoving> gpsTrack;
private transient GPSFixTrack<ItemType, GPSFixMoving> gpsTrack;
private class CacheInvalidationGpsTrackListener implements GPSTrackListener<ItemType, GPSFixMoving> {
private static final long serialVersionUID = 6395529765232404414L;
@@ -89,6 +89,23 @@ public class BravoFixTrackImpl<ItemType extends WithID & Serializable> extends S
this.foilingTimeCache = createFoilingTimeCache(trackedItem);
this.foilingDistanceCache = createFoilingDistanceCache(trackedItem);
this.averageRideHeightCache = createAverageRideHeightCache(trackedItem);
setGpsTrack(gpsTrack);
}
protected GPSFixTrack<ItemType, GPSFixMoving> getGpsTrack() {
return gpsTrack;
}
/**
* Sets the {@link #gpsTrack} field and registers a cache invalidation listener
* on the {@code gpsTrack} to ensure that the foiling distance is invalidated if needed.<p>
*
* Must be called only once for a non-{@code null} {@code gpsTrack}.
*/
protected void setGpsTrack(GPSFixTrack<ItemType, GPSFixMoving> gpsTrack) {
if (gpsTrack != null) {
assert this.gpsTrack == null;
}
this.gpsTrack = gpsTrack;
if (gpsTrack != null) {
gpsTrack.addListener(new CacheInvalidationGpsTrackListener());
@@ -119,9 +136,6 @@ public class BravoFixTrackImpl<ItemType extends WithID & Serializable> extends S
this.foilingTimeCache = createFoilingTimeCache(getTrackedItem());
this.foilingDistanceCache = createFoilingDistanceCache(getTrackedItem());
this.averageRideHeightCache = createAverageRideHeightCache(getTrackedItem());
if (gpsTrack != null) {
gpsTrack.addListener(new CacheInvalidationGpsTrackListener());
}
}
@Override
@@ -215,8 +229,8 @@ public class BravoFixTrackImpl<ItemType extends WithID & Serializable> extends S
@Override
public Distance getDistanceSpentFoiling(TimePoint from, TimePoint to) {
assert gpsTrack != null;
return getValueSum(from, to, /* nullElement */ Distance.NULL, Distance::add, foilingDistanceCache,
return getGpsTrack() == null ? null :
getValueSum(from, to, /* nullElement */ Distance.NULL, Distance::add, foilingDistanceCache,
/* valueCalculator */ new Track.TimeRangeValueCalculator<Distance>() {
@Override
public Distance calculate(TimePoint from, TimePoint to) {
@@ -226,7 +240,7 @@ public class BravoFixTrackImpl<ItemType extends WithID & Serializable> extends S
for (final BravoFix fix : getFixes(from, true, to, true)) {
final boolean fixFoils = isFoiling(fix);
if (isFoiling && fixFoils) {
result = result.add(gpsTrack.getDistanceTraveled(last, fix.getTimePoint()));
result = result.add(getGpsTrack().getDistanceTraveled(last, fix.getTimePoint()));
}
last = fix.getTimePoint();
isFoiling = fixFoils;
@@ -0,0 +1,26 @@
package com.sap.sailing.domain.tracking.impl;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.TrackedRace;
public class CompetitorBravoFixTrackImpl extends BravoFixTrackImpl<Competitor> {
private static final long serialVersionUID = 569731925060211875L;
public CompetitorBravoFixTrackImpl(Competitor trackedItem, String trackName, boolean hasExtendedFixes,
GPSFixTrack<Competitor, GPSFixMoving> gpsTrack) {
super(trackedItem, trackName, hasExtendedFixes, gpsTrack);
}
public CompetitorBravoFixTrackImpl(Competitor trackedItem, String trackName, boolean hasExtendedFixes) {
super(trackedItem, trackName, hasExtendedFixes);
}
@Override
public void addedToTrackedRace(TrackedRace trackedRace) {
if (this.getGpsTrack() == null) {
this.setGpsTrack(trackedRace.getTrack(getTrackedItem()));
}
}
}
@@ -4194,6 +4194,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
DynamicSensorFixTrack<Competitor, FixT> track) {
assert sensorTracksLock.isWriteLockedByCurrentThread();
sensorTracks.put(key, track);
track.addedToTrackedRace(this);
return Optional.empty();
}