e64ff9d560e53388eb9f531febd365195644d07f
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/impl/ManeuverCacheDelegate.java
| ... | ... | @@ -17,11 +17,9 @@ import com.sap.sailing.domain.tracking.impl.TrackedRaceImpl; |
| 17 | 17 | import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; |
| 18 | 18 | |
| 19 | 19 | public class ManeuverCacheDelegate implements ManeuverCache<Competitor, List<Maneuver>, EmptyUpdateInterval> { |
| 20 | - |
|
| 21 | 20 | private final TrackedRaceImpl race; |
| 22 | 21 | private static final Logger logger = Logger.getLogger(ManeuverCacheDelegate.class.getName()); |
| 23 | 22 | private final ManeuverRaceFingerprintRegistry maneuverRaceFingerprintRegistry; |
| 24 | - Map<Competitor, List<Maneuver>> maneuvers = new HashMap<>(); |
|
| 25 | 23 | private ManeuverCache<Competitor, List<Maneuver>, EmptyUpdateInterval> cacheToUse; |
| 26 | 24 | |
| 27 | 25 | public ManeuverCacheDelegate(TrackedRaceImpl race, |
| ... | ... | @@ -34,30 +32,33 @@ public class ManeuverCacheDelegate implements ManeuverCache<Competitor, List<Man |
| 34 | 32 | |
| 35 | 33 | @Override |
| 36 | 34 | public void resume() { |
| 37 | - ManeuverRaceFingerprint fingerprint; |
|
| 35 | + final ManeuverRaceFingerprint fingerprint; |
|
| 38 | 36 | race.getRace().getCourse().lockForRead(); |
| 39 | 37 | try { |
| 40 | 38 | synchronized (this) { |
| 41 | 39 | if (maneuverRaceFingerprintRegistry != null) { |
| 42 | - logger.info("Compare maneuverfingerprints"); |
|
| 40 | + logger.info("Compare maneuver fingerprints for race "+race.getRaceIdentifier()); |
|
| 43 | 41 | race.waitForAllRaceLogsAttached(); |
| 44 | 42 | fingerprint = maneuverRaceFingerprintRegistry.getManeuverRaceFingerprint(race.getRaceIdentifier()); |
| 45 | 43 | } else { |
| 46 | 44 | fingerprint = null; |
| 47 | 45 | } |
| 48 | 46 | if (fingerprint != null && fingerprint.matches(race)) { |
| 49 | - logger.info("maneuverfingerprints match"); |
|
| 50 | - maneuvers = maneuverRaceFingerprintRegistry.loadManeuvers(race, race.getRace().getCourse()); |
|
| 51 | - cacheToUse = new ManeuverFromDatabase( maneuvers); |
|
| 47 | + logger.info("Maneuver fingerprints match for race "+race.getRaceIdentifier()+"; loading from DB instead of computing"); |
|
| 48 | + cacheToUse = new ManeuversFromDatabase(maneuverRaceFingerprintRegistry.loadManeuvers(race, race.getRace().getCourse())); |
|
| 52 | 49 | } else { |
| 53 | 50 | new Thread(()->{ |
| 54 | - logger.info("maneuverfingerprints do not match"); |
|
| 51 | + logger.info("Maneuver fingerprints do not match for race "+race.getRaceIdentifier()+"; NOT loading from DB"); |
|
| 55 | 52 | cacheToUse.resume(); |
| 56 | - for(Competitor competitor : race.getRace().getCompetitors()) { |
|
| 57 | - |
|
| 58 | - maneuvers.put(competitor, (List<Maneuver>) cacheToUse.get(competitor, true)); |
|
| 53 | + if (maneuverRaceFingerprintRegistry != null) { |
|
| 54 | + // wait for maneuvers to be computed by the default cache implementation (SmartFutureCache), |
|
| 55 | + // then store persistently in registry |
|
| 56 | + final Map<Competitor, List<Maneuver>> maneuvers = new HashMap<>(); |
|
| 57 | + for (final Competitor competitor : race.getRace().getCompetitors()) { |
|
| 58 | + maneuvers.put(competitor, (List<Maneuver>) cacheToUse.get(competitor, /* waitForLatest */ true)); |
|
| 59 | + } |
|
| 60 | + maneuverRaceFingerprintRegistry.storeManeuvers(race.getRaceIdentifier(), ManeuverRaceFingerprintFactory.INSTANCE.createFingerprint(race), maneuvers, race.getRace().getCourse()); |
|
| 59 | 61 | } |
| 60 | - maneuverRaceFingerprintRegistry.storeManeuvers(race.getRaceIdentifier(), ManeuverRaceFingerprintFactory.INSTANCE.createFingerprint(race), maneuvers, race.getRace().getCourse()); |
|
| 61 | 62 | }, "Waiting for mark passings for "+race.getName()+" after having resumed to store the results in registry") |
| 62 | 63 | .start(); |
| 63 | 64 | } |
| ... | ... | @@ -72,10 +73,8 @@ public class ManeuverCacheDelegate implements ManeuverCache<Competitor, List<Man |
| 72 | 73 | race.getRace().getCourse().lockForRead(); |
| 73 | 74 | try { |
| 74 | 75 | synchronized (this) { |
| 75 | - |
|
| 76 | - return (List<Maneuver>) cacheToUse.get(competitor, waitForLatest); |
|
| 77 | - } |
|
| 78 | - |
|
| 76 | + return (List<Maneuver>) cacheToUse.get(competitor, waitForLatest); |
|
| 77 | + } |
|
| 79 | 78 | } finally { |
| 80 | 79 | race.getRace().getCourse().unlockAfterRead(); |
| 81 | 80 | } |
| ... | ... | @@ -86,8 +85,7 @@ public class ManeuverCacheDelegate implements ManeuverCache<Competitor, List<Man |
| 86 | 85 | race.getRace().getCourse().lockForRead(); |
| 87 | 86 | try { |
| 88 | 87 | synchronized (this) { |
| 89 | - |
|
| 90 | - cacheToUse.suspend(); |
|
| 88 | + cacheToUse.suspend(); |
|
| 91 | 89 | } |
| 92 | 90 | } finally { |
| 93 | 91 | race.getRace().getCourse().unlockAfterRead(); |
| ... | ... | @@ -99,8 +97,7 @@ public class ManeuverCacheDelegate implements ManeuverCache<Competitor, List<Man |
| 99 | 97 | race.getRace().getCourse().lockForRead(); |
| 100 | 98 | try { |
| 101 | 99 | synchronized (this) { |
| 102 | - |
|
| 103 | - cacheToUse.triggerUpdate(competitor, updateInterval); |
|
| 100 | + cacheToUse.triggerUpdate(competitor, updateInterval); |
|
| 104 | 101 | } |
| 105 | 102 | } finally { |
| 106 | 103 | race.getRace().getCourse().unlockAfterRead(); |
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/impl/ManeuverFromDatabase.java
| ... | ... | @@ -1,45 +0,0 @@ |
| 1 | -package com.sap.sailing.domain.maneuverhash.impl; |
|
| 2 | - |
|
| 3 | -import java.util.List; |
|
| 4 | -import java.util.Map; |
|
| 5 | -import java.util.logging.Level; |
|
| 6 | -import java.util.logging.Logger; |
|
| 7 | - |
|
| 8 | -import com.sap.sailing.domain.base.Competitor; |
|
| 9 | -import com.sap.sailing.domain.maneuverhash.ManeuverCache; |
|
| 10 | -import com.sap.sailing.domain.tracking.Maneuver; |
|
| 11 | -import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; |
|
| 12 | - |
|
| 13 | -public class ManeuverFromDatabase implements ManeuverCache<Competitor, List<Maneuver>, EmptyUpdateInterval> { |
|
| 14 | - |
|
| 15 | - public ManeuverFromDatabase( |
|
| 16 | - Map<Competitor, List<Maneuver>> maneuvers) { |
|
| 17 | - super(); |
|
| 18 | - this.maneuvers = maneuvers; |
|
| 19 | - } |
|
| 20 | - |
|
| 21 | - boolean suspended; |
|
| 22 | - private static final Logger logger = Logger.getLogger(ManeuverFromDatabase.class.getName()); |
|
| 23 | - Map<Competitor, List<Maneuver>> maneuvers; |
|
| 24 | - |
|
| 25 | - public void resume() { |
|
| 26 | - logger.log(Level.WARNING, "Method should never be called"); |
|
| 27 | - } |
|
| 28 | - |
|
| 29 | - public void suspend() { |
|
| 30 | - synchronized (this) { |
|
| 31 | - logger.finest("Suspended ManeuverFromDatabase"); |
|
| 32 | - suspended = true; |
|
| 33 | - } |
|
| 34 | - } |
|
| 35 | - |
|
| 36 | - public List<Maneuver> get(Competitor competitor, boolean waitForLatest) { |
|
| 37 | - return maneuvers.get(competitor); |
|
| 38 | - } |
|
| 39 | - |
|
| 40 | - @Override |
|
| 41 | - public void triggerUpdate(Competitor key, EmptyUpdateInterval updateInterval) { |
|
| 42 | - logger.log(Level.WARNING, "If Fingerprint matches, no Update should be triggered"); |
|
| 43 | - //TODO change to smartFutureCache in Delegate |
|
| 44 | - } |
|
| 45 | -} |
|
| ... | ... | \ No newline at end of file |
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/impl/ManeuversFromDatabase.java
| ... | ... | @@ -0,0 +1,45 @@ |
| 1 | +package com.sap.sailing.domain.maneuverhash.impl; |
|
| 2 | + |
|
| 3 | +import java.util.List; |
|
| 4 | +import java.util.Map; |
|
| 5 | +import java.util.logging.Level; |
|
| 6 | +import java.util.logging.Logger; |
|
| 7 | + |
|
| 8 | +import com.sap.sailing.domain.base.Competitor; |
|
| 9 | +import com.sap.sailing.domain.maneuverhash.ManeuverCache; |
|
| 10 | +import com.sap.sailing.domain.tracking.Maneuver; |
|
| 11 | +import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; |
|
| 12 | + |
|
| 13 | +public class ManeuversFromDatabase implements ManeuverCache<Competitor, List<Maneuver>, EmptyUpdateInterval> { |
|
| 14 | + |
|
| 15 | + public ManeuversFromDatabase( |
|
| 16 | + Map<Competitor, List<Maneuver>> maneuvers) { |
|
| 17 | + super(); |
|
| 18 | + this.maneuvers = maneuvers; |
|
| 19 | + } |
|
| 20 | + |
|
| 21 | + boolean suspended; |
|
| 22 | + private static final Logger logger = Logger.getLogger(ManeuversFromDatabase.class.getName()); |
|
| 23 | + Map<Competitor, List<Maneuver>> maneuvers; |
|
| 24 | + |
|
| 25 | + public void resume() { |
|
| 26 | + logger.log(Level.WARNING, "Method should never be called"); |
|
| 27 | + } |
|
| 28 | + |
|
| 29 | + public void suspend() { |
|
| 30 | + synchronized (this) { |
|
| 31 | + logger.finest("Suspended ManeuverFromDatabase"); |
|
| 32 | + suspended = true; |
|
| 33 | + } |
|
| 34 | + } |
|
| 35 | + |
|
| 36 | + public List<Maneuver> get(Competitor competitor, boolean waitForLatest) { |
|
| 37 | + return maneuvers.get(competitor); |
|
| 38 | + } |
|
| 39 | + |
|
| 40 | + @Override |
|
| 41 | + public void triggerUpdate(Competitor key, EmptyUpdateInterval updateInterval) { |
|
| 42 | + logger.log(Level.WARNING, "If Fingerprint matches, no Update should be triggered"); |
|
| 43 | + // TODO change to smartFutureCache in Delegate |
|
| 44 | + } |
|
| 45 | +} |
|
| ... | ... | \ No newline at end of file |