diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/MarkPassingReceiver.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/MarkPassingReceiver.java index 758d023ca27..8d9eaea3076 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/MarkPassingReceiver.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/MarkPassingReceiver.java @@ -2,11 +2,13 @@ package com.sap.sailing.domain.tractracadapter.impl; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.logging.Logger; import com.maptrack.client.io.TypeController; +import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.TimePoint; @@ -15,6 +17,7 @@ import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.tracking.DynamicTrackedEvent; import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.MarkPassing; +import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tractracadapter.DomainFactory; import com.sap.sailing.util.Util.Triple; import com.tractrac.clientmodule.ControlPoint; @@ -64,24 +67,26 @@ public class MarkPassingReceiver extends AbstractReceiverWithQueue waypoints = course.getWaypoints(); - Map passingsByControlPoint = new HashMap(); + Iterator waypointsIter = course.getWaypoints().iterator(); + Map passingsByWaypoint = new HashMap(); // Note: the entries always describe all mark passings for the competitor so far in the current race in order for (MarkPassingsData.Entry passing : event.getB().getPassings()) { ControlPoint controlPointPassed = passing.getControlPoint(); com.sap.sailing.domain.base.ControlPoint domainControlPoint = getDomainFactory().getControlPoint(controlPointPassed); - Waypoint passed = findWaypointForControlPoint(waypoints, domainControlPoint); + Waypoint passed = findWaypointForControlPoint(trackedRace, waypointsIter, domainControlPoint, + getDomainFactory().getCompetitor(event.getA().getCompetitor())); if (passed != null) { - TimePoint time = new MillisecondsTimePoint(passing.getTimestamp()); - MarkPassing markPassing = getDomainFactory().createMarkPassing(event.getA().getCompetitor(), passed, time); - passingsByControlPoint.put(domainControlPoint, markPassing); + TimePoint time = new MillisecondsTimePoint(passing.getTimestamp()); + MarkPassing markPassing = getDomainFactory().createMarkPassing(event.getA().getCompetitor(), passed, + time); + passingsByWaypoint.put(passed, markPassing); } else { logger.warning("Didn't find waypoint in course "+course+" for mark passing around "+passing.getControlPoint()); } } List markPassings = new ArrayList(); - for (Waypoint waypoint : waypoints) { - MarkPassing passing = passingsByControlPoint.get(waypoint.getControlPoint()); + for (Waypoint waypoint : course.getWaypoints()) { + MarkPassing passing = passingsByWaypoint.get(waypoint); if (passing != null) { markPassings.add(passing); } @@ -89,8 +94,14 @@ public class MarkPassingReceiver extends AbstractReceiverWithQueue waypoints, com.sap.sailing.domain.base.ControlPoint domainControlPoint) { - for (Waypoint waypoint : waypoints) { + /** + * Starts searching in waypointsIter for a waypoint that has the given controlPoint. + * The waypointsIter is advanced to that point. + */ + private Waypoint findWaypointForControlPoint(TrackedRace trackedRace, Iterator waypointsIter, + com.sap.sailing.domain.base.ControlPoint domainControlPoint, Competitor competitor) { + while (waypointsIter.hasNext()) { + Waypoint waypoint = waypointsIter.next(); if (waypoint.getControlPoint() == domainControlPoint) { return waypoint; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java index 8d5bbb6144a..38ea2540960 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java @@ -83,21 +83,22 @@ public class TrackedLegImpl implements TrackedLeg, RaceChangeListener getCompetitorTracksOrderedByRank(TimePoint timePoint) { synchronized (competitorTracksOrderedByRank) { - List rankecCompetitorList = competitorTracksOrderedByRank.get(timePoint); - if (rankecCompetitorList == null) { - rankecCompetitorList = new ArrayList(); + List rankedCompetitorList = competitorTracksOrderedByRank.get(timePoint); + if (rankedCompetitorList == null) { + rankedCompetitorList = new ArrayList(); for (TrackedLegOfCompetitor competitorLeg : getTrackedLegsOfCompetitors()) { - rankecCompetitorList.add(competitorLeg); + rankedCompetitorList.add(competitorLeg); } - Collections.sort(rankecCompetitorList, new WindwardToGoComparator(this, timePoint)); - competitorTracksOrderedByRank.put(timePoint, Collections.unmodifiableList(rankecCompetitorList)); - if (Util.size(getTrackedLegsOfCompetitors()) != rankecCompetitorList.size()) { + Collections.sort(rankedCompetitorList, new WindwardToGoComparator(this, timePoint)); + rankedCompetitorList = Collections.unmodifiableList(rankedCompetitorList); + competitorTracksOrderedByRank.put(timePoint, rankedCompetitorList); + if (Util.size(getTrackedLegsOfCompetitors()) != rankedCompetitorList.size()) { logger.warning("Number of competitors in leg (" + Util.size(getTrackedLegsOfCompetitors()) + ") differs from number of competitors in race (" + Util.size(getTrackedRace().getRace().getCompetitors()) + ")"); } } - return rankecCompetitorList; + return rankedCompetitorList; } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/ModeratorApp.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/ModeratorApp.java index 88ec958e683..2e3ffb2a01b 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/ModeratorApp.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/ModeratorApp.java @@ -182,7 +182,6 @@ public class ModeratorApp extends Servlet { private void showRace(HttpServletRequest req, HttpServletResponse resp) throws IOException, InterruptedException { long start = System.currentTimeMillis(); - Event event = getEvent(req); TrackedRace trackedRace = getTrackedRace(req); if (trackedRace == null) { resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Race not found"); @@ -242,7 +241,7 @@ public class ModeratorApp extends Servlet { } JSONArray jsonCompetitors = new JSONArray(); Map ranks = leg.getRanks(timePoint); - for (Competitor competitor : event.getCompetitors()) { + for (Competitor competitor : trackedRace.getRace().getCompetitors()) { JSONObject jsonCompetitorInLeg = new JSONObject(); TrackedLegOfCompetitor trackedLegOfCompetitor = leg.getTrackedLeg(competitor); if (trackedLegOfCompetitor != null) {