From d29669dbfac5eb59df28103e575f43881092c641 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sun, 19 Jun 2011 13:28:42 +0200 Subject: [PATCH 1/2] key mark passings not simply by first waypoint that has the right control point but check against previous mark passings and use first waypoint that has the control point just passed and hasn't been passed by the competitor so far --- .../impl/MarkPassingReceiver.java | 14 +++++++++++--- .../domain/tracking/impl/TrackedLegImpl.java | 17 +++++++++-------- .../com/sap/sailing/server/ModeratorApp.java | 3 +-- 3 files changed, 21 insertions(+), 13 deletions(-) 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..617aece3891 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 @@ -7,6 +7,7 @@ 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 +16,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; @@ -70,7 +72,8 @@ public class MarkPassingReceiver extends AbstractReceiverWithQueue waypoints, com.sap.sailing.domain.base.ControlPoint domainControlPoint) { + private Waypoint findWaypointForControlPoint(TrackedRace trackedRace, Iterable waypoints, + com.sap.sailing.domain.base.ControlPoint domainControlPoint, Competitor competitor) { for (Waypoint waypoint : waypoints) { + MarkPassing oldMarkPassing = trackedRace.getMarkPassing(competitor, waypoint); if (waypoint.getControlPoint() == domainControlPoint) { - return waypoint; + if (oldMarkPassing == null) { + // didn't yet go around this waypoint; this must be the one + return waypoint; + } } } return null; 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) { From d2278008d02f1502eeb1bb80f406eb6bcc08c56f Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sun, 19 Jun 2011 13:57:13 +0200 Subject: [PATCH 2/2] fixed mark passings update again --- .../impl/MarkPassingReceiver.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) 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 617aece3891..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,6 +2,7 @@ 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; @@ -66,25 +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(trackedRace, 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); } @@ -92,15 +94,16 @@ public class MarkPassingReceiver extends AbstractReceiverWithQueue 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) { - for (Waypoint waypoint : waypoints) { - MarkPassing oldMarkPassing = trackedRace.getMarkPassing(competitor, waypoint); + while (waypointsIter.hasNext()) { + Waypoint waypoint = waypointsIter.next(); if (waypoint.getControlPoint() == domainControlPoint) { - if (oldMarkPassing == null) { - // didn't yet go around this waypoint; this must be the one - return waypoint; - } + return waypoint; } } return null;