java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/ManeuverCache.java
... ...
@@ -15,4 +15,11 @@ public interface ManeuverCache {
15 15
void triggerUpdate(Competitor key);
16 16
17 17
boolean canBeUpdated();
18
+
19
+ /**
20
+ * Called after a race has finished loading. Different implementations may react differently to this event.
21
+ * A cache loaded from the DB will simply ignore this request. A cache that is empty and based on calculation
22
+ * will need to trigger an update.
23
+ */
24
+ void recalculate(Competitor competitor);
18 25
}
... ...
\ No newline at end of file
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/impl/ManeuverCacheDelegate.java
... ...
@@ -113,8 +113,14 @@ public class ManeuverCacheDelegate implements SerializableManeuverCache {
113 113
}
114 114
115 115
@Override
116
+ public void recalculate(Competitor competitor) {
117
+ cacheToUse.recalculate(competitor);
118
+ }
119
+
120
+ @Override
116 121
public void triggerUpdate(Competitor competitor) {
117 122
if (!cacheToUse.canBeUpdated()) {
123
+ logger.warning("Received a maneuver cache update trigger for competitor "+competitor.getName()+" but current cache cannot be updated; switching to an updatable cache");
118 124
cacheToUse = createUpdatableManeuverCache();
119 125
}
120 126
cacheToUse.triggerUpdate(competitor);
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/impl/ManeuversFromDatabase.java
... ...
@@ -34,6 +34,11 @@ public class ManeuversFromDatabase implements SerializableManeuverCache {
34 34
return false;
35 35
}
36 36
37
+ @Override
38
+ public void recalculate(Competitor competitor) {
39
+ // a no-op because we have everything from the DB already
40
+ }
41
+
37 42
public void resume() {
38 43
logger.log(Level.WARNING, "Method should never be called");
39 44
throw new IllegalStateException("Method should never be called");
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/impl/ManeuversFromSmartFutureCache.java
... ...
@@ -66,6 +66,12 @@ public class ManeuversFromSmartFutureCache implements ManeuverCache {
66 66
}
67 67
68 68
@Override
69
+ public void recalculate(Competitor competitor) {
70
+ // need to trigger an update
71
+ triggerUpdate(competitor);
72
+ }
73
+
74
+ @Override
69 75
public void triggerUpdate(Competitor key) {
70 76
smartFutureCache.triggerUpdate(key, /* updateInterval */ null);
71 77
}
java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java
... ...
@@ -2893,7 +2893,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
2893 2893
if (cachesSuspended) {
2894 2894
triggerManeuverCacheInvalidationForAllCompetitors = true;
2895 2895
} else {
2896
- maneuverCache.triggerUpdate(competitor);
2896
+ maneuverCache.recalculate(competitor);
2897 2897
}
2898 2898
}
2899 2899
... ...
@@ -3160,11 +3160,10 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
3160 3160
markPassingCalculator.resume();
3161 3161
}
3162 3162
crossTrackErrorCache.resume();
3163
-
3163
+ maneuverCache.resume(); // needs to happen before triggering recalculation because this decides about fingerprint matching
3164 3164
if (triggerManeuverCacheInvalidationForAllCompetitors) {
3165 3165
triggerManeuverCacheRecalculationForAllCompetitors();
3166 3166
}
3167
- maneuverCache.resume();
3168 3167
}
3169 3168
3170 3169
/**