eab1bdb6c4009f06421c930e389d2015939fe39d
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 | /** |