java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackedRaceStartTimeUpdateForDependentStartTimeTest.java
... ...
@@ -29,7 +29,6 @@ import com.sap.sailing.domain.tracking.StartTimeChangedListener;
29 29
import com.sap.sailing.domain.tracking.TrackedRace;
30 30
import com.sap.sse.common.Duration;
31 31
import com.sap.sse.common.TimePoint;
32
-import com.sap.sse.common.Util.Pair;
33 32
import com.sap.sse.common.Util.Triple;
34 33
import com.sap.sse.common.impl.MillisecondsTimePoint;
35 34
java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java
... ...
@@ -34,7 +34,6 @@ import com.sap.sailing.domain.tracking.impl.RaceAbortedHandler;
34 34
import com.sap.sailing.domain.tracking.impl.StartTimeUpdateHandler;
35 35
import com.sap.sse.common.IsManagedByCache;
36 36
import com.sap.sse.common.TimePoint;
37
-import com.sap.sse.common.Util.Pair;
38 37
import com.sap.sse.common.Util.Triple;
39 38
import com.sap.sse.util.ObjectInputStreamResolvingAgainstCache;
40 39
import com.sap.sse.util.ObjectInputStreamResolvingAgainstCache.ResolveListener;
java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RegattaRegistry.java
... ...
@@ -3,9 +3,7 @@ package com.sap.sailing.domain.base;
3 3
import java.util.ConcurrentModificationException;
4 4
5 5
import com.sap.sailing.domain.common.RegattaIdentifier;
6
-import com.sap.sailing.domain.tracking.TrackedRace;
7 6
import com.sap.sailing.domain.tracking.TrackedRegattaListener;
8
-import com.sap.sse.common.Util.Pair;
9 7
10 8
public interface RegattaRegistry {
11 9
/**
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverdetection/impl/ManeuverDetectorImpl.java
... ...
@@ -54,6 +54,13 @@ import com.sap.sse.common.impl.MillisecondsTimePoint;
54 54
*
55 55
*/
56 56
public class ManeuverDetectorImpl extends AbstractManeuverDetectorImpl {
57
+
58
+ /**
59
+ * This CALCULATOR_VERSION variable indicates the Version of the {@link ManeuverDetector} and must be changed
60
+ * manually when changing the calculator. It should be changed by adding +1;
61
+ */
62
+ public static final int DETECTOR_VERSION = 1;
63
+
57 64
58 65
private static final Logger logger = Logger.getLogger(ManeuverDetectorImpl.class.getName());
59 66
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/ManeuverCache.java
... ...
@@ -1,7 +1,5 @@
1 1
package com.sap.sailing.domain.maneuverhash;
2 2
3
-
4
-import com.sap.sse.util.SmartFutureCache;
5 3
import com.sap.sse.util.SmartFutureCache.UpdateInterval;
6 4
7 5
public interface ManeuverCache<K, V, U extends UpdateInterval<U>>{
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/ManeuverRaceFingerprint.java
... ...
@@ -3,11 +3,6 @@ package com.sap.sailing.domain.maneuverhash;
3 3
4 4
import org.json.simple.JSONObject;
5 5
6
-import com.sap.sailing.domain.base.Course;
7
-import com.sap.sailing.domain.maneuverdetection.ManeuverDetector;
8
-//import com.sap.sailing.domain.markpassingcalculation.MarkPassingCalculator;
9
-//import com.sap.sailing.domain.markpassinghash.MarkPassingRaceFingerprintFactory;
10
-//import com.sap.sailing.domain.tracking;
11 6
import com.sap.sailing.domain.tracking.TrackedRace;
12 7
13 8
public interface ManeuverRaceFingerprint {
... ...
@@ -22,15 +17,8 @@ public interface ManeuverRaceFingerprint {
22 17
* component by component. The fingerprint components are computed in ascending order of computational complexity,
23 18
* trying to fail early / fast.<p>
24 19
*
25
- * The implementation may require to obtain the race's {@link Course#lockForRead() read lock}. Note that conversely
26
- * updates to the course that happen under the course's write lock will trigger listeners which may synchronize
27
- * on certain objects, such as the {@link ManeuverDetector}. Therefore, should this method be called
28
- * while holding an object monitor ("synchronized") that a course update listener may also require, make
29
- * sure to first obtain at least the course read lock before invoking this method. See also bug 5803.
30
- *
31 20
* @return {@code true} if the {@code trackedRace} produces a fingerprint equal to this one if passed to
32
- * {@link MarkPassingRaceFingerprintFactory#createFingerprint(TrackedRace)}
21
+ * {@link ManeuverRaceFingerprintFactory#createFingerprint(TrackedRace)}
33 22
*/
34 23
boolean matches(TrackedRace trackedRace);
35
-
36 24
}
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/ManeuverRaceFingerprintFactory.java
... ...
@@ -1,6 +1,5 @@
1 1
package com.sap.sailing.domain.maneuverhash;
2 2
3
-
4 3
import com.sap.sailing.domain.tracking.TrackedRace;
5 4
import com.sap.sailing.domain.maneuverhash.impl.ManeuverRaceFingerprintFactoryImpl;
6 5
import org.json.simple.JSONObject;
... ...
@@ -10,6 +9,5 @@ public interface ManeuverRaceFingerprintFactory {
10 9
11 10
ManeuverRaceFingerprint createFingerprint (TrackedRace TrackedRace);
12 11
13
- ManeuverRaceFingerprint fromJson (JSONObject json); // Prüfen ob relevent ist...
14
-
12
+ ManeuverRaceFingerprint fromJson (JSONObject json);
15 13
}
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/ManeuverRaceFingerprintRegistry.java
... ...
@@ -6,12 +6,10 @@ import java.util.Map;
6 6
import com.sap.sailing.domain.base.Competitor;
7 7
import com.sap.sailing.domain.base.Course;
8 8
import com.sap.sailing.domain.common.RaceIdentifier;
9
-//import com.sap.sailing.domain.maneuverhash.ManeuverRaceFingerprint;
10 9
import com.sap.sailing.domain.tracking.Maneuver;
11 10
import com.sap.sailing.domain.tracking.TrackedRace;
12 11
13 12
public interface ManeuverRaceFingerprintRegistry {
14
-
15 13
void storeManeuvers(RaceIdentifier raceIdentifier, ManeuverRaceFingerprint fingerprint, Map<Competitor, List<Maneuver>> Maneuvers, Course course);
16 14
17 15
ManeuverRaceFingerprint getManeuverRaceFingerprint(RaceIdentifier raceIdentifier);
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/MarkPassingProxy.java
... ...
@@ -12,8 +12,8 @@ import com.sap.sse.common.Util;
12 12
public class MarkPassingProxy implements MarkPassing {
13 13
14 14
private static final long serialVersionUID = -1038446741597082803L;
15
- private final int waypointIndex;// Waypoint Index
16
- private final Serializable competitorId; // CompetitorID
15
+ private final int waypointIndex;
16
+ private final Serializable competitorId;
17 17
private final TrackedRace trackedRace;
18 18
private MarkPassing markPassing;
19 19
private final TimePoint timePoint;
... ...
@@ -26,30 +26,15 @@ public class MarkPassingProxy implements MarkPassing {
26 26
this.trackedRace = trackedRace;
27 27
}
28 28
29
-// public MarkPassingProxy(MarkPassing markPassing, RaceIdentifier raceIdentifier) {
30
-// this.timePoint = markPassing.getTimePoint();
31
-// this.waypointIndex = (int) markPassing.getWaypoint();
32
-// this.competitorId = markPassing.getCompetitor().getId();
33
-// this.trackedRace = (TrackedRace) raceIdentifier.getExistingTrackedRace(null);
34
-// }
35
-
36 29
@Override
37 30
public TimePoint getTimePoint() {
38
-// isMarkPassing();
39 31
return timePoint;
40 32
}
41 33
42 34
@Override
43 35
public Waypoint getWaypoint() {
44 36
Iterable<Waypoint> waypoints = trackedRace.getRace().getCourse().getWaypoints();
45
-// for (Waypoint w : waypoints ) {
46
-// if( (int) w.getId() == waypointIndex) {
47
-// return w;
48
-// }
49 37
return Util.get(waypoints, waypointIndex);
50
-// }
51
-// return null;
52
- // Util.get(course.getWaypoints(), waypointIndex); -> ersetzen möglich?
53 38
}
54 39
55 40
@Override
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/impl/ManeuverCacheDelegate.java
... ...
@@ -1,7 +1,5 @@
1 1
package com.sap.sailing.domain.maneuverhash.impl;
2 2
3
-import java.util.ArrayList;
4
-import java.util.Collections;
5 3
import java.util.HashMap;
6 4
import java.util.List;
7 5
import java.util.Map;
... ...
@@ -23,59 +21,26 @@ public class ManeuverCacheDelegate implements ManeuverCache<Competitor, List<Man
23 21
private final TrackedRaceImpl race;
24 22
private static final Logger logger = Logger.getLogger(ManeuverCacheDelegate.class.getName());
25 23
private final ManeuverRaceFingerprintRegistry maneuverRaceFingerprintRegistry;
26
-// private ManeuverCache<Competitor, List<Maneuver>, EmptyUpdateInterval> maneuverCache;
27 24
Map<Competitor, List<Maneuver>> maneuvers = new HashMap<>();
28
-// private ManeuverFromDatabase cache;
29
-// private SmartFutureCache<Competitor, List<Maneuver>, EmptyUpdateInterval> smartFutureCache;
30 25
private ManeuverCache<Competitor, List<Maneuver>, EmptyUpdateInterval> cacheToUse;
31 26
32
-// // flag suspended / resume
33
- private boolean cachesSuspended;
34
- private boolean triggerManeuverCacheInvalidationForAllCompetitors;
35
-
36 27
public ManeuverCacheDelegate(TrackedRaceImpl race,
37 28
ManeuverRaceFingerprintRegistry maneuverRaceFingerprintRegistry) {
38 29
super();
39 30
this.race = race;
40 31
this.maneuverRaceFingerprintRegistry = maneuverRaceFingerprintRegistry;
41 32
this.cacheToUse = new ManeuverFromSmartFutureCache((DynamicTrackedRaceImpl) race);
42
-// this.cache = new ManeuverFromDatabase( false, (DynamicTrackedRaceImpl) race, maneuverRaceFingerprintRegistry);
43
-// this.smartFutureCache = new SmartFutureCache<Competitor, List<Maneuver>, EmptyUpdateInterval>(
44
-// new AbstractCacheUpdater<Competitor, List<Maneuver>, EmptyUpdateInterval>() {
45
-// @Override
46
-// public List<Maneuver> computeCacheUpdate(Competitor competitor, EmptyUpdateInterval updateInterval)
47
-// throws NoWindException {
48
-// return race.getTrackedRegatta().callWithCPUMeterWithException(()->{
49
-// Duration averageIntervalBetweenRawFixes = race.getTrack(competitor).getAverageIntervalBetweenRawFixes();
50
-// if (averageIntervalBetweenRawFixes != null) {
51
-// ManeuverDetector maneuverDetector;
52
-// maneuverDetector = race.getManeuverDetectorPerCompetitorCache().getValue(competitor);
53
-//
54
-// List<Maneuver> maneuvers = race.computeManeuvers(competitor, maneuverDetector);
55
-// return maneuvers;
56
-// } else {
57
-// return Collections.emptyList();
58
-// }
59
-// }, CPUMeteringType.MANEUVER_DETECTION.name());
60
-// }
61
-// }, /* nameForLocks */ "Maneuver cache for race " + race.getRace().getName());
62 33
}
63 34
64 35
@Override
65 36
public void resume() {
66
-
67
- // richtigen Ort bestimmen
68
-// if (triggerManeuverCacheInvalidationForAllCompetitors) {
69
-// triggerManeuverCacheRecalculationForAllCompetitors();
70
-// }
71
-
72 37
ManeuverRaceFingerprint fingerprint;
73 38
race.getRace().getCourse().lockForRead();
74 39
try {
75 40
synchronized (this) {
76 41
if (maneuverRaceFingerprintRegistry != null) {
77 42
logger.info("Compare maneuverfingerprints");
78
- race.waitForAllRaceLogsAttacehd();
43
+ race.waitForAllRaceLogsAttached();
79 44
fingerprint = maneuverRaceFingerprintRegistry.getManeuverRaceFingerprint(race.getRaceIdentifier());
80 45
} else {
81 46
fingerprint = null;
... ...
@@ -83,8 +48,7 @@ public class ManeuverCacheDelegate implements ManeuverCache<Competitor, List<Man
83 48
if (fingerprint != null && fingerprint.matches(race)) {
84 49
logger.info("maneuverfingerprints match");
85 50
maneuvers = maneuverRaceFingerprintRegistry.loadManeuvers(race, race.getRace().getCourse());
86
- // Laden der maneuver um an MFD mitzugeben
87
- cacheToUse = new ManeuverFromDatabase( /*false, (DynamicTrackedRaceImpl) race, maneuverRaceFingerprintRegistry,*/ maneuvers);
51
+ cacheToUse = new ManeuverFromDatabase( maneuvers);
88 52
} else {
89 53
new Thread(()->{
90 54
logger.info("maneuverfingerprints do not match");
... ...
@@ -128,12 +92,10 @@ public class ManeuverCacheDelegate implements ManeuverCache<Competitor, List<Man
128 92
} finally {
129 93
race.getRace().getCourse().unlockAfterRead();
130 94
}
131
-
132 95
}
133 96
134 97
@Override
135 98
public void triggerUpdate(Competitor competitor, EmptyUpdateInterval updateInterval) {
136
-
137 99
race.getRace().getCourse().lockForRead();
138 100
try {
139 101
synchronized (this) {
... ...
@@ -143,31 +105,5 @@ public class ManeuverCacheDelegate implements ManeuverCache<Competitor, List<Man
143 105
} finally {
144 106
race.getRace().getCourse().unlockAfterRead();
145 107
}
146
-
147
-
148 108
}
149
-
150
-
151
-// public void triggerManeuverCacheRecalculationForAllCompetitors() {
152
-// if (cachesSuspended) {
153
-// triggerManeuverCacheInvalidationForAllCompetitors = true;
154
-// } else {
155
-// final List<Competitor> shuffledCompetitors = new ArrayList<>();
156
-// for (Competitor competitor : (race.getRace().getCompetitors())) {
157
-// shuffledCompetitors.add(competitor);
158
-// }
159
-// Collections.shuffle(shuffledCompetitors);
160
-// for (Competitor competitor : shuffledCompetitors) {
161
-// triggerManeuverCacheRecalculation(competitor);
162
-// }
163
-// }
164
-// }
165
-//
166
-// public void triggerManeuverCacheRecalculation(final Competitor competitor) {
167
-// if (cachesSuspended) {
168
-// triggerManeuverCacheInvalidationForAllCompetitors = true;
169
-// } else {
170
-// triggerUpdate(competitor, /* updateInterval */null);
171
-// }
172
-// }
173 109
}
... ...
\ No newline at end of file
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/impl/ManeuverFromDatabase.java
... ...
@@ -2,52 +2,30 @@ package com.sap.sailing.domain.maneuverhash.impl;
2 2
3 3
import java.util.List;
4 4
import java.util.Map;
5
-//import java.util.Map.Entry;
6 5
import java.util.logging.Level;
7 6
import java.util.logging.Logger;
8
-//import java.util.stream.Collectors;
9 7
10 8
import com.sap.sailing.domain.base.Competitor;
11 9
import com.sap.sailing.domain.maneuverhash.ManeuverCache;
12
-//import com.sap.sailing.domain.maneuverhash.ManeuverRaceFingerprintRegistry;
13
-//import com.sap.sailing.domain.shared.tracking.impl.TimedComparator;
14 10
import com.sap.sailing.domain.tracking.Maneuver;
15
-//import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl;
16 11
import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval;
17 12
18 13
public class ManeuverFromDatabase implements ManeuverCache<Competitor, List<Maneuver>, EmptyUpdateInterval> {
19 14
20
- public ManeuverFromDatabase(/*boolean suspended, DynamicTrackedRaceImpl race,*/
15
+ public ManeuverFromDatabase(
21 16
Map<Competitor, List<Maneuver>> maneuvers) {
22 17
super();
23
-// this.suspended = suspended;
24
-// this.race = race;
25
-// this.maneuverRaceFingerprintRegistry = maneuverRaceFingerprintRegistry;
26 18
this.maneuvers = maneuvers;
27 19
}
28 20
29 21
boolean suspended;
30
-// private DynamicTrackedRaceImpl race;
31
-// private ManeuverRaceFingerprintRegistry maneuverRaceFingerprintRegistry;
32 22
private static final Logger logger = Logger.getLogger(ManeuverFromDatabase.class.getName());
33 23
Map<Competitor, List<Maneuver>> maneuvers;
34 24
35 25
public void resume() {
36
-// logger.info("Found stored set of maneuvers for race "+race.getName()+" with matching fingerprint; loading instead of computing...");
37
-// updateManeuversFromRegistry();
38
-// suspended = false;
39
-// logger.info("maneuver geladen");
40 26
logger.log(Level.WARNING, "Method should never be called");
41 27
}
42 28
43
-// private void updateManeuversFromRegistry() {
44
-// maneuvers = maneuverRaceFingerprintRegistry.loadManeuvers(race, race.getRace().getCourse());
45
-// for (final Entry<Competitor, List<Maneuver>> e : maneuverRaceFingerprintRegistry.loadManeuvers(
46
-// race, race.getRace().getCourse()).entrySet()) {
47
-// race.updateManeuvers(e.getKey(), e.getValue().stream().sorted(TimedComparator.INSTANCE).collect(Collectors.toList()));
48
-// }
49
-// }
50
-
51 29
public void suspend() {
52 30
synchronized (this) {
53 31
logger.finest("Suspended ManeuverFromDatabase");
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/impl/ManeuverFromSmartFutureCache.java
... ...
@@ -9,7 +9,6 @@ import com.sap.sailing.domain.common.NoWindException;
9 9
import com.sap.sailing.domain.maneuverdetection.ManeuverDetector;
10 10
import com.sap.sailing.domain.maneuverhash.ManeuverCache;
11 11
import com.sap.sailing.domain.tracking.Maneuver;
12
-import com.sap.sailing.domain.tracking.TrackedRace;
13 12
import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl;
14 13
import com.sap.sse.common.Duration;
15 14
import com.sap.sse.util.SmartFutureCache;
... ...
@@ -18,32 +17,9 @@ import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval;
18 17
19 18
public class ManeuverFromSmartFutureCache implements ManeuverCache<Competitor, List<Maneuver>, EmptyUpdateInterval> {
20 19
21
-// private final TrackedRace race;
22 20
private final SmartFutureCache<Competitor, List<Maneuver>, EmptyUpdateInterval> smartFutureCache;
23 21
24 22
public ManeuverFromSmartFutureCache(DynamicTrackedRaceImpl race) {
25
-// this.race = race;
26
-// this.smartFutureCache = new SmartFutureCache<Competitor, List<Maneuver>, EmptyUpdateInterval>(
27
-// new AbstractCacheUpdater<Competitor, List<Maneuver>, EmptyUpdateInterval>() {
28
-// @Override
29
-// public List<Maneuver> computeCacheUpdate(Competitor competitor, EmptyUpdateInterval updateInterval)
30
-// throws NoWindException {
31
-// return race.getTrackedRegatta().callWithCPUMeterWithException(()->{
32
-// Duration averageIntervalBetweenRawFixes = race.getTrack(competitor).getAverageIntervalBetweenRawFixes();
33
-// if (averageIntervalBetweenRawFixes != null) {
34
-// ManeuverDetector maneuverDetector;
35
-// maneuverDetector = race.getManeuverDetectorPerCompetitorCache().getValue(competitor);
36
-//
37
-// List<Maneuver> maneuvers = race.computeManeuvers(competitor, maneuverDetector);
38
-// return maneuvers;
39
-// } else {
40
-// return Collections.emptyList();
41
-// }
42
-// }, CPUMeteringType.MANEUVER_DETECTION.name());
43
-// }
44
-// }, /* nameForLocks */ "Maneuver cache for race " + race.getRace().getName());
45
-
46
-
47 23
this.smartFutureCache= new SmartFutureCache<Competitor, List<Maneuver>, EmptyUpdateInterval>(
48 24
new AbstractCacheUpdater<Competitor, List<Maneuver>, EmptyUpdateInterval>() {
49 25
@Override
... ...
@@ -73,25 +49,20 @@ public class ManeuverFromSmartFutureCache implements ManeuverCache<Competitor, L
73 49
@Override
74 50
public void resume() {
75 51
smartFutureCache.resume();
76
-
77 52
}
78 53
79 54
@Override
80 55
public List<Maneuver> get(Competitor key, boolean waitForLatest) {
81
-// smartFutureCache.getAbstractCacheUpdater().computeCacheUpdate(key);
82 56
return smartFutureCache.get(key, waitForLatest);
83 57
}
84 58
85 59
@Override
86 60
public void suspend() {
87 61
smartFutureCache.suspend();
88
-
89 62
}
90 63
91 64
@Override
92 65
public void triggerUpdate(Competitor key, EmptyUpdateInterval updateInterval) {
93 66
smartFutureCache.triggerUpdate(key, updateInterval);
94
-
95 67
}
96
-
97 68
}
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/impl/ManeuverRaceFingerprintFactoryImpl.java
... ...
@@ -4,11 +4,9 @@ import org.json.simple.JSONObject;
4 4
5 5
import com.sap.sailing.domain.maneuverhash.ManeuverRaceFingerprint;
6 6
import com.sap.sailing.domain.maneuverhash.ManeuverRaceFingerprintFactory;
7
-//import com.sap.sailing.domain.maneuverhash.impl.ManeuverRaceFingerprintImpl;
8 7
import com.sap.sailing.domain.tracking.TrackedRace;
9 8
10 9
public class ManeuverRaceFingerprintFactoryImpl implements ManeuverRaceFingerprintFactory {
11
-
12 10
@Override
13 11
public ManeuverRaceFingerprint createFingerprint(TrackedRace trackedRace) {
14 12
return new ManeuverRaceFingerprintImpl(trackedRace);
... ...
@@ -18,5 +16,4 @@ public class ManeuverRaceFingerprintFactoryImpl implements ManeuverRaceFingerpri
18 16
public ManeuverRaceFingerprint fromJson(JSONObject json) {
19 17
return new ManeuverRaceFingerprintImpl(json);
20 18
}
21
-
22 19
}
java/com.sap.sailing.domain/src/com/sap/sailing/domain/maneuverhash/impl/ManeuverRaceFingerprintImpl.java
... ...
@@ -1,9 +1,6 @@
1 1
package com.sap.sailing.domain.maneuverhash.impl;
2 2
3
-
4
-import java.util.Map;
5 3
import java.util.Set;
6
-import java.util.stream.Collectors;
7 4
8 5
import org.json.simple.JSONObject;
9 6
... ...
@@ -16,6 +13,7 @@ import com.sap.sailing.domain.common.Wind;
16 13
import com.sap.sailing.domain.common.WindSource;
17 14
import com.sap.sailing.domain.common.tracking.GPSFix;
18 15
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
16
+import com.sap.sailing.domain.maneuverdetection.impl.ManeuverDetectorImpl;
19 17
import com.sap.sailing.domain.maneuverhash.ManeuverRaceFingerprint;
20 18
import com.sap.sailing.domain.markpassingcalculation.MarkPassingCalculator;
21 19
import com.sap.sailing.domain.tracking.GPSFixTrack;
... ...
@@ -39,14 +37,16 @@ public class ManeuverRaceFingerprintImpl implements ManeuverRaceFingerprint {
39 37
private final int numberOfGPSFixes;
40 38
private final int gpsFixesHash;
41 39
private final int windHash;
40
+ private final int detectorVersion;
42 41
43 42
private static enum JSON_FIELDS {
44 43
COMPETITOR_HASH, START_OF_TRACKING_AS_MILLIS, END_OF_TRACKING_AS_MILLIS, START_TIME_RECEIVED_AS_MILLIS,
45 44
START_TIME_FROM_RACE_LOG_AS_MILLIS, FINISH_TIME_FROM_RACE_LOG_AS_MILLIS, WAYPOINTS_HASH, NUMBEROFGPSFIXES,
46
- GPSFIXES_HASH, RACE_ID, CALCULATOR_VERSION, FIXED_AND_SUPPRESSED_MARK_PASSINGS_FROM_RACE_LOG_HASH, WIND_HASH
45
+ GPSFIXES_HASH, RACE_ID, CALCULATOR_VERSION, FIXED_AND_SUPPRESSED_MARK_PASSINGS_FROM_RACE_LOG_HASH, WIND_HASH, DETECTOR_VERSION
47 46
};
48 47
49 48
public ManeuverRaceFingerprintImpl(TrackedRace trackedRace) {
49
+ this.detectorVersion = ManeuverDetectorImpl.DETECTOR_VERSION;
50 50
this.calculatorVersion = MarkPassingCalculator.CALCULATOR_VERSION;
51 51
this.competitorHash = calculateHashForCompetitors(trackedRace);
52 52
this.startOfTracking = trackedRace.getStartOfTracking();
... ...
@@ -80,6 +80,7 @@ public class ManeuverRaceFingerprintImpl implements ManeuverRaceFingerprint {
80 80
}
81 81
82 82
public ManeuverRaceFingerprintImpl(JSONObject json) {
83
+ this.detectorVersion = ((Number) json.get(JSON_FIELDS.DETECTOR_VERSION.name())).intValue();
83 84
this.calculatorVersion = ((Number) json.get(JSON_FIELDS.CALCULATOR_VERSION.name())).intValue();
84 85
this.competitorHash = ((Number) json.get(JSON_FIELDS.COMPETITOR_HASH.name())).intValue();
85 86
this.startOfTracking = TimePoint.of((Long) json.get(JSON_FIELDS.START_OF_TRACKING_AS_MILLIS.name()));
... ...
@@ -99,6 +100,7 @@ public class ManeuverRaceFingerprintImpl implements ManeuverRaceFingerprint {
99 100
@Override
100 101
public JSONObject toJson() {
101 102
JSONObject result = new JSONObject();
103
+ result.put(JSON_FIELDS.DETECTOR_VERSION.name(), detectorVersion);
102 104
result.put(JSON_FIELDS.CALCULATOR_VERSION.name(), calculatorVersion);
103 105
result.put(JSON_FIELDS.COMPETITOR_HASH.name(), competitorHash);
104 106
result.put(JSON_FIELDS.START_OF_TRACKING_AS_MILLIS.name(),
... ...
@@ -124,6 +126,8 @@ public class ManeuverRaceFingerprintImpl implements ManeuverRaceFingerprint {
124 126
final boolean result;
125 127
if (!Util.equalsWithNull(calculatorVersion, MarkPassingCalculator.CALCULATOR_VERSION)) {
126 128
result = false;
129
+ }else if (!Util.equalsWithNull(detectorVersion, ManeuverDetectorImpl.DETECTOR_VERSION)) {
130
+ result = false;
127 131
} else if (!Util.equalsWithNull(startOfTracking, trackedRace.getStartOfTracking())) {
128 132
result = false;
129 133
} else if (!Util.equalsWithNull(endOfTracking, trackedRace.getEndOfTracking())) {
... ...
@@ -225,9 +229,7 @@ public class ManeuverRaceFingerprintImpl implements ManeuverRaceFingerprint {
225 229
private int calculateWindHash(TrackedRace trackedRace) {
226 230
Set<WindSource> windSoures = trackedRace.getWindSources();
227 231
int res = 0;
228
-// String regattaName = trackedRace.getTrackedRegatta().getRegatta().getName();
229 232
Set<WindSource> windSouresToExclude = trackedRace.getWindSourcesToExclude();
230
-
231 233
for(WindSource w : windSoures) {
232 234
if(w.getType().isObserved() && !windSouresToExclude.contains(w)) {
233 235
WindTrack windTrack = trackedRace.getOrCreateWindTrack(w);
... ...
@@ -246,16 +248,6 @@ public class ManeuverRaceFingerprintImpl implements ManeuverRaceFingerprint {
246 248
247 249
}
248 250
}
249
-// Map<? extends WindSource, ? extends WindTrack> windTrack = trackedRace.getOrCreateWindTrack(null)
250
-// Map<WindSource, WindTrack> gefilterteMap = windTrack.entrySet()
251
-// .stream().filter(entry -> entry.getKey().getType().isObserved())
252
-// .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
253
-// for (Map.Entry<? extends WindSource, ? extends WindTrack> w : gefilterteMap.entrySet() ) {
254
-// int k = w.getKey().hashCode();
255
-// int v = w.getValue().hashCode();
256
-// res = res ^ k;
257
-// res = res ^ v;
258
-// }
259 251
return res;
260 252
}
261 253
... ...
@@ -264,6 +256,7 @@ public class ManeuverRaceFingerprintImpl implements ManeuverRaceFingerprint {
264 256
final int prime = 31;
265 257
int result = 1;
266 258
result = prime * result + calculatorVersion;
259
+ result = prime * result + detectorVersion;
267 260
result = prime * result + competitorHash;
268 261
result = prime * result + ((endOfTracking == null) ? 0 : endOfTracking.hashCode());
269 262
result = prime * result + ((finishTimeFromRaceLog == null) ? 0 : finishTimeFromRaceLog.hashCode());
... ...
@@ -289,6 +282,8 @@ public class ManeuverRaceFingerprintImpl implements ManeuverRaceFingerprint {
289 282
ManeuverRaceFingerprintImpl other = (ManeuverRaceFingerprintImpl) obj;
290 283
if (calculatorVersion != other.calculatorVersion)
291 284
return false;
285
+ if (detectorVersion != other.detectorVersion)
286
+ return false;
292 287
if (competitorHash != other.competitorHash)
293 288
return false;
294 289
if (endOfTracking == null) {
java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java
... ...
@@ -41,7 +41,6 @@ import java.util.function.Consumer;
41 41
import java.util.logging.Level;
42 42
import java.util.logging.Logger;
43 43
import java.util.stream.Collectors;
44
-import java.util.stream.StreamSupport;
45 44
46 45
import org.apache.commons.math.FunctionEvaluationException;
47 46
import org.apache.commons.math.MaxIterationsExceededException;
... ...
@@ -66,7 +65,6 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRac
66 65
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
67 66
import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDefinedMarkAnalyzer;
68 67
import com.sap.sailing.domain.base.Boat;
69
-//import com.sap.sailing.domain.base.CPUMeteringType;
70 68
import com.sap.sailing.domain.base.Competitor;
71 69
import com.sap.sailing.domain.base.ControlPoint;
72 70
import com.sap.sailing.domain.base.Course;
... ...
@@ -200,9 +198,6 @@ import com.sap.sse.shared.util.impl.ApproximateTime;
200 198
import com.sap.sse.shared.util.impl.ArrayListNavigableSet;
201 199
import com.sap.sse.util.IdentityWrapper;
202 200
import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval;
203
-//import com.sap.sse.util.SmartFutureCache;
204
-//import com.sap.sse.util.SmartFutureCache.AbstractCacheUpdater;
205
-//import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval;
206 201
import com.sap.sse.util.impl.FutureTaskWithTracingGet;
207 202
208 203
import difflib.DiffUtils;
... ...
@@ -865,33 +860,6 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
865 860
866 861
private ManeuverCacheDelegate createManeuverCache(ManeuverRaceFingerprintRegistry maneuverRaceFingerprintRegistry) {
867 862
return new ManeuverCacheDelegate(this, maneuverRaceFingerprintRegistry);
868
-
869
-
870
-// new ManeuverFromDatabase(false, this, maneuverRaceFingerprintRegistry),
871
-// new SmartFutureCache(
872
-// new AbstractCacheUpdater<Competitor, List<Maneuver>, EmptyUpdateInterval>() {
873
-// @Override
874
-// public List<Maneuver> computeCacheUpdate(Competitor competitor, EmptyUpdateInterval updateInterval)
875
-// throws NoWindException {
876
-// return getTrackedRegatta().callWithCPUMeterWithException(()->{
877
-// Duration averageIntervalBetweenRawFixes = getTrack(competitor).getAverageIntervalBetweenRawFixes();
878
-// if (averageIntervalBetweenRawFixes != null) {
879
-// ManeuverDetector maneuverDetector;
880
-// // FIXME The LowGPSSamplingRateManeuverDetectorImpl doesn't work very well; it recognizes many tacks only as bear-away and doesn't seem to have any noticeable benefits... See ORC Worlds 2019 ORC A Long Offshore
881
-// // if (averageIntervalBetweenRawFixes.asSeconds() >= 30) {
882
-// // maneuverDetector = new LowGPSSamplingRateManeuverDetectorImpl(TrackedRaceImpl.this, competitor);
883
-// // } else {
884
-// maneuverDetector = maneuverDetectorPerCompetitorCache.getValue(competitor);
885
-// // }
886
-// List<Maneuver> maneuvers = computeManeuvers(competitor, maneuverDetector);
887
-// return maneuvers;
888
-// } else {
889
-// return Collections.emptyList();
890
-// }
891
-// }, CPUMeteringType.MANEUVER_DETECTION.name());
892
-// }
893
-// }, /* nameForLocks */ "Maneuver cache for race " + getRace().getName());
894
-
895 863
}
896 864
897 865
/**
... ...
@@ -3145,24 +3113,18 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
3145 3113
maneuverCache.suspend();
3146 3114
}
3147 3115
3148
-
3149
-
3150
-
3151
-
3152
-
3153
- public void waitForAllRaceLogsAttacehd() {
3154
- final CountDownLatch latchForRaceLogs = new CountDownLatch(1); // alternative schauen
3155
-
3116
+ public void waitForAllRaceLogsAttached() {
3117
+ final CountDownLatch latchForRaceLogs = new CountDownLatch(1); // Alternatives possible
3156 3118
final Iterable<Triple<Leaderboard, RaceColumn, Fleet>> ecpextedLinks = TrackedRaceImpl.this.getRaceLogResolver()
3157 3119
.getColumnsWithRaceLogForTrackedRace(getRaceIdentifier()); //Namen
3158
- final int numberOfExpecteddRaceLogs = Util.size(ecpextedLinks); // Namen ändern
3120
+ final int numberOfExpectedRaceLogs = Util.size(ecpextedLinks);
3159 3121
3160 3122
AbstractRaceChangeListener raceLogAttachedListener = new AbstractRaceChangeListener() {
3161 3123
3162 3124
@Override
3163 3125
public void raceLogAttached(RaceLog raceLog) {
3164 3126
int numberOfAttachedRaceLogs = Util.size(getAttachedRaceLogs());
3165
- if(numberOfAttachedRaceLogs >=numberOfExpecteddRaceLogs) {
3127
+ if(numberOfAttachedRaceLogs >=numberOfExpectedRaceLogs) {
3166 3128
latchForRaceLogs.countDown();
3167 3129
}
3168 3130
}
... ...
@@ -3173,7 +3135,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
3173 3135
final int numberOfAttachedRaceLogs = Util.size(getAttachedRaceLogs());
3174 3136
3175 3137
try {
3176
- if (numberOfAttachedRaceLogs < numberOfExpecteddRaceLogs) {
3138
+ if (numberOfAttachedRaceLogs < numberOfExpectedRaceLogs) {
3177 3139
latchForRaceLogs.await();
3178 3140
}
3179 3141
} catch (InterruptedException e) {
... ...
@@ -3202,8 +3164,6 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
3202 3164
if (triggerManeuverCacheInvalidationForAllCompetitors) {
3203 3165
triggerManeuverCacheRecalculationForAllCompetitors();
3204 3166
}
3205
-
3206
-// waitForAllRaceLogAttacehd();
3207 3167
maneuverCache.resume();
3208 3168
}
3209 3169
... ...
@@ -3865,7 +3825,6 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
3865 3825
return legDeterminingDirection;
3866 3826
}
3867 3827
3868
-
3869 3828
@Override
3870 3829
public LineDetails getStartLine(TimePoint at) {
3871 3830
return getLineLengthAndAdvantage(at, getRace().getCourse().getFirstWaypoint());
... ...
@@ -4501,6 +4460,5 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
4501 4460
4502 4461
public ShortTimeAfterLastHitCache<Competitor, IncrementalManeuverDetector> getManeuverDetectorPerCompetitorCache() {
4503 4462
return maneuverDetectorPerCompetitorCache;
4504
-
4505 4463
}
4506 4464
}
java/com.sap.sailing.server.trackfiles.test/src/com/sap/sailing/server/trackfiles/test/DynamicTrackedRaceWithMarkPassingCalculator.java
... ...
@@ -2,6 +2,7 @@ package com.sap.sailing.server.trackfiles.test;
2 2
3 3
import com.sap.sailing.domain.base.RaceDefinition;
4 4
import com.sap.sailing.domain.base.Sideline;
5
+import com.sap.sailing.domain.maneuverhash.ManeuverRaceFingerprintRegistry;
5 6
import com.sap.sailing.domain.markpassingcalculation.MarkPassingCalculator;
6 7
import com.sap.sailing.domain.markpassinghash.MarkPassingRaceFingerprintRegistry;
7 8
import com.sap.sailing.domain.racelog.RaceLogAndTrackedRaceResolver;
... ...
@@ -18,8 +19,8 @@ public class DynamicTrackedRaceWithMarkPassingCalculator extends DynamicTrackedR
18 19
WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind,
19 20
long millisecondsOverWhichToAverageSpeed, boolean useInternalMarkPassingAlgorithm,
20 21
RankingMetricConstructor rankingMetricConstructor, RaceLogAndTrackedRaceResolver raceLogResolver, TrackingConnectorInfo trackingConnectorInfo,
21
- MarkPassingRaceFingerprintRegistry markPassingRaceFingerprintRegistry) {
22
- super(trackedRegatta, race, sidelines, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, useInternalMarkPassingAlgorithm, rankingMetricConstructor, raceLogResolver, trackingConnectorInfo, markPassingRaceFingerprintRegistry);
22
+ MarkPassingRaceFingerprintRegistry markPassingRaceFingerprintRegistry, ManeuverRaceFingerprintRegistry maneuverRaceFingerprintRegistry) {
23
+ super(trackedRegatta, race, sidelines, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, useInternalMarkPassingAlgorithm, rankingMetricConstructor, raceLogResolver, trackingConnectorInfo, markPassingRaceFingerprintRegistry, maneuverRaceFingerprintRegistry );
23 24
}
24 25
25 26
public MarkPassingCalculator getMarkPassingCalculator() {