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