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
This commit is contained in:
Axel Uhl committed 2011-06-19 13:28:42 +02:00
1 parent 8bdc12b913
commit d29669dbfa
3 files changed
+21 -13

No files matched your search

@@ -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<RaceCompetito
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, waypoints, domainControlPoint,
getDomainFactory().getCompetitor(event.getA().getCompetitor()));
if (passed != null) {
TimePoint time = new MillisecondsTimePoint(passing.getTimestamp());
MarkPassing markPassing = getDomainFactory().createMarkPassing(event.getA().getCompetitor(), passed, time);
@@ -89,10 +92,15 @@ public class MarkPassingReceiver extends AbstractReceiverWithQueue<RaceCompetito
trackedRace.updateMarkPassings(getDomainFactory().getCompetitor(event.getA().getCompetitor()), markPassings);
}
private Waypoint findWaypointForControlPoint(Iterable<Waypoint> waypoints, com.sap.sailing.domain.base.ControlPoint domainControlPoint) {
private Waypoint findWaypointForControlPoint(TrackedRace trackedRace, Iterable<Waypoint> 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;
@@ -83,21 +83,22 @@ public class TrackedLegImpl implements TrackedLeg, RaceChangeListener<Competitor
*/
protected List<TrackedLegOfCompetitor> getCompetitorTracksOrderedByRank(TimePoint timePoint) {
synchronized (competitorTracksOrderedByRank) {
List<TrackedLegOfCompetitor> rankecCompetitorList = competitorTracksOrderedByRank.get(timePoint);
if (rankecCompetitorList == null) {
rankecCompetitorList = new ArrayList<TrackedLegOfCompetitor>();
List<TrackedLegOfCompetitor> rankedCompetitorList = competitorTracksOrderedByRank.get(timePoint);
if (rankedCompetitorList == null) {
rankedCompetitorList = new ArrayList<TrackedLegOfCompetitor>();
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;
}
}
@@ -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<Competitor, Integer> 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) {