fixing bug 325 by introducinig a specific comparator for mark passings that distinguishes competitors

This commit is contained in:
Axel Uhl committed 2012-02-22 20:54:17 +01:00
1 parent b9af09ba5d
commit a198b67773
2 files changed
+32 -3

No files matched your search

@@ -0,0 +1,29 @@
package com.sap.sailing.domain.tracking.impl;
import java.util.Comparator;
import com.sap.sailing.domain.tracking.MarkPassing;
/**
* Compares two {@link MarkPassing} objects, using their {@link MarkPassing#getTimePoint() time point} as the primary
* ordering criterion in ascending order. If two mark passings have equal time points, the competitor IDs' string
* representations are compared as the secondary ordering criterion to ensure that two competitors passing a mark at the
* same time are still identified as not being equal.
*
* @author Axel Uhl (D043530)
*
*/
public class MarkPassingByTimeComparator implements Comparator<MarkPassing> {
public static MarkPassingByTimeComparator INSTANCE = new MarkPassingByTimeComparator();
@Override
public int compare(MarkPassing o1, MarkPassing o2) {
int result = o1 == null ? o2 == null ? 0 : -1 : o2 == null ? 1 : o1.getTimePoint().compareTo(o2.getTimePoint());
if (result == 0 && o1 != null) {
assert o2 != null;
result = o1.getCompetitor().getId().toString().compareTo(o2.getCompetitor().getId().toString());
}
return result;
}
}
@@ -166,12 +166,12 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
markPassingsForCompetitor = new HashMap<Competitor, NavigableSet<MarkPassing>>();
tracks = new HashMap<Competitor, GPSFixTrack<Competitor, GPSFixMoving>>();
for (Competitor competitor : race.getCompetitors()) {
markPassingsForCompetitor.put(competitor, new ConcurrentSkipListSet<MarkPassing>(TimedComparator.INSTANCE));
markPassingsForCompetitor.put(competitor, new ConcurrentSkipListSet<MarkPassing>(MarkPassingByTimeComparator.INSTANCE));
tracks.put(competitor, new DynamicGPSFixMovingTrackImpl<Competitor>(competitor, millisecondsOverWhichToAverageSpeed));
}
markPassingsForWaypoint = new HashMap<Waypoint, NavigableSet<MarkPassing>>();
for (Waypoint waypoint : race.getCourse().getWaypoints()) {
markPassingsForWaypoint.put(waypoint, new ConcurrentSkipListSet<MarkPassing>(TimedComparator.INSTANCE));
markPassingsForWaypoint.put(waypoint, new ConcurrentSkipListSet<MarkPassing>(MarkPassingByTimeComparator.INSTANCE));
}
windTracks = new HashMap<WindSource, WindTrack>();
for (WindSource windSource : WindSource.values()) {
@@ -548,7 +548,7 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
@Override
public synchronized void waypointAdded(int zeroBasedIndex, Waypoint waypointThatGotAdded) {
updateStartToNextMarkCacheInvalidationCacheListenersAfterWaypointAdded(zeroBasedIndex, waypointThatGotAdded);
markPassingsForWaypoint.put(waypointThatGotAdded, new ConcurrentSkipListSet<MarkPassing>(TimedComparator.INSTANCE));
markPassingsForWaypoint.put(waypointThatGotAdded, new ConcurrentSkipListSet<MarkPassing>(MarkPassingByTimeComparator.INSTANCE));
for (Buoy buoy : waypointThatGotAdded.getBuoys()) {
getOrCreateTrack(buoy);
}