diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardTotalRankComparator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardTotalRankComparator.java index 5c52ad35893..c824db76682 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardTotalRankComparator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardTotalRankComparator.java @@ -15,6 +15,7 @@ import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.leaderboard.Leaderboard; +import com.sap.sailing.domain.tracking.TrackedRace; /** * Compares two competitors that occur in a {@link Leaderboard#getCompetitors()} set in the context of the @@ -55,11 +56,29 @@ public class LeaderboardTotalRankComparator implements Comparator { this.leaderboard = leaderboard; this.scoreComparator = scoreComparator; totalPointsCache = new HashMap, Integer>(); + for (final RaceColumn raceColumn : leaderboard.getRaceColumns()) { + Iterator fleet = raceColumn.getFleets().iterator(); + cacheTotalPointsWithLockedTrackedRaceForFleet(fleet, leaderboard, raceColumn, timePoint); + } + } + + private void cacheTotalPointsWithLockedTrackedRaceForFleet(Iterator fleetIter, + Leaderboard leaderboard, RaceColumn raceColumn, TimePoint timePoint) throws NoWindException { + if (fleetIter.hasNext()) { + Fleet fleet = fleetIter.next(); + TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); + if (trackedRace != null) + ; + } else { + cacheTotalPoints(leaderboard, raceColumn, timePoint); + } + } + + private void cacheTotalPoints(Leaderboard leaderboard, final RaceColumn raceColumn, TimePoint timePoint) + throws NoWindException { for (Competitor competitor : leaderboard.getCompetitors()) { - for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { - totalPointsCache.put(new Pair(competitor, raceColumn), - leaderboard.getTotalPoints(competitor, raceColumn, timePoint)); - } + totalPointsCache.put(new Pair(competitor, raceColumn), + leaderboard.getTotalPoints(competitor, raceColumn, timePoint)); } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index b05a8f17f9e..dafeb11d702 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -1659,8 +1659,12 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { @Override public Iterable getWindSources() { - synchronized (windTracks) { - return new ArrayList(windTracks.keySet()); + while (true) { + try { + return new ArrayList(windTracks.keySet()); + } catch (ConcurrentModificationException cme) { + logger.info("Caught "+cme+"; trying again"); + } } }