From 7b0af7d8e80aff208f52bc45a01308a80a4c7fc8 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 17 Jun 2011 17:27:00 +0200 Subject: [PATCH] compilable version with finished-time for race removed from REST APIs and from TrackedRace interface; adjusted documentation in README accordingly; prepared getWindwardDistanceToOverallLeader --- doc/README | 11 +---------- .../impl/RaceStartedAndFinishedReceiver.java | 4 ---- .../impl/TracTracTrackedLegImpl.java | 5 +++-- .../impl/TracTracTrackedLegOfCompetitor.java | 6 ++++++ .../domain/tracking/DynamicTrackedRace.java | 2 -- .../sap/sailing/domain/tracking/TrackedLeg.java | 6 ++++-- .../domain/tracking/TrackedLegOfCompetitor.java | 13 ++++++++++++- .../sap/sailing/domain/tracking/TrackedRace.java | 2 -- .../tracking/impl/DynamicTrackedRaceImpl.java | 5 ----- .../domain/tracking/impl/TrackedLegImpl.java | 5 +++-- .../tracking/impl/TrackedLegOfCompetitorImpl.java | 14 ++++++++++++++ .../domain/tracking/impl/TrackedRaceImpl.java | 10 ---------- .../test/MockedTrackedRace.java | 12 ------------ .../src/com/sap/sailing/server/ModeratorApp.java | 5 ----- 14 files changed, 43 insertions(+), 57 deletions(-) diff --git a/doc/README b/doc/README index 13ac6e30c67..31c3f9ec977 100755 --- a/doc/README +++ b/doc/README @@ -448,25 +448,17 @@ into one in the future. "start": ..., // race start time as millisecond // timestamp, Integer.MAX_VALUE // if not started yet - "finish": ..., // optional; if race finish time - // is known, this is the - // milliseconds timestamp of - // when the race finished "legs": [ { // legs in the course's order "start": ..., // name of the leg start mark "end": ... } // name of the leg end mark ... ] ... ] - action=[ // list of races in the event + action=listracesinevent: // list of races in the event "name": ..., "boatclass": ..., "start": ..., // race start time as millisecond // timestamp, Integer.MAX_VALUE // if not started yet - "finish": ..., // optional; if race finish time - // is known, this is the - // milliseconds timestamp of - // when the race finished "legs": [ { // legs in the course's order "start": ..., // name of the leg start mark "end": ... } // name of the leg end mark @@ -535,7 +527,6 @@ into one in the future. { "name": ..., // race name "startoftracking": ..., // millisecond timestamp "start": ..., // millisecond timestamp - "finish": ..., // millisecond timestamp "timeofnewestevent": ...,// greatest millisecond timestamp // of any event received so far "timeoflastevent": ..., // millisecond timestamp diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceStartedAndFinishedReceiver.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceStartedAndFinishedReceiver.java index a4fafa20ba9..bfc70984713 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceStartedAndFinishedReceiver.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceStartedAndFinishedReceiver.java @@ -64,13 +64,9 @@ public class RaceStartedAndFinishedReceiver extends AbstractReceiverWithQueue getRanks(TimePoint timePoint) { - Map result = new HashMap(); + public LinkedHashMap getRanks(TimePoint timePoint) { + LinkedHashMap result = new LinkedHashMap(); for (Competitor c : getTrackedRace().getRace().getCompetitors()) { result.put(c, getTrackedLeg(c).getRank(timePoint)); } diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracTrackedLegOfCompetitor.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracTrackedLegOfCompetitor.java index f42f350048b..b7b3567f265 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracTrackedLegOfCompetitor.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracTrackedLegOfCompetitor.java @@ -150,4 +150,10 @@ public class TracTracTrackedLegOfCompetitor implements TrackedLegOfCompetitor { } } + @Override + public Distance getWindwardDistanceToOverallLeader(TimePoint timePoint) throws NoWindException { + // TODO Auto-generated method stub + return null; + } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java index aa367d5f518..c83dca94dee 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java @@ -28,8 +28,6 @@ public interface DynamicTrackedRace extends TrackedRace { void setStart(TimePoint start); - void setFinish(TimePoint stop); - void setMillisecondsOverWhichToAverageSpeed(long millisecondsOverWhichToAverageSpeed); void setMillisecondsOverWhichToAverageWind(long millisecondsOverWhichToAverageWind); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLeg.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLeg.java index 4198617c82b..e1d728df11c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLeg.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLeg.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.tracking; -import java.util.Map; +import java.util.LinkedHashMap; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Leg; @@ -29,7 +29,9 @@ public interface TrackedLeg { *
  • no incoming events can influence ranks between separate calls to * {@link TrackedLegOfCompetitor#getRank(TimePoint)}
  • * + * + * The iteration order of the linked hash map returned is leader to last. */ - Map getRanks(TimePoint timePoint); + LinkedHashMap getRanks(TimePoint timePoint); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLegOfCompetitor.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLegOfCompetitor.java index 405ef7a64b3..30dff3dbf43 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLegOfCompetitor.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLegOfCompetitor.java @@ -74,7 +74,8 @@ public interface TrackedLegOfCompetitor { int getRank(TimePoint timePoint); /** - * Returns null in case this leg's competitor hasn't started the leg yet. + * Computes the gap in seconds to the leader / winner of this leg. Returns null in case this leg's + * competitor hasn't started the leg yet. */ Double getGapToLeaderInSeconds(TimePoint timePoint) throws NoWindException; @@ -94,4 +95,14 @@ public interface TrackedLegOfCompetitor { SpeedWithBearing getSpeedOverGround(TimePoint at); + /** + * Computes the distance along the wind track to the wind-projected position of the race's + * overall leader. If leader and competitor are in the same leg, this is simply the windward + * distance. If the leader is already one or more legs ahead, it's the competitor's winward + * distance to go plus the windward distance between the marks of all legs that the leader + * completed after this competitor's leg plus the windard distance between the leader and + * the leader's leg's start. + */ + Distance getWindwardDistanceToOverallLeader(TimePoint timePoint) throws NoWindException; + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index ba350f8c50d..afa7ec822ee 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -32,8 +32,6 @@ public interface TrackedRace { TimePoint getStart(); - TimePoint getFinish(); - Iterable getTrackedLegs(); TrackedLeg getTrackedLeg(Leg leg); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 31946c19bd6..c9aa12bb3c7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -191,11 +191,6 @@ public class DynamicTrackedRaceImpl extends TrackedRaceImpl implements } } - @Override - public void setFinish(TimePoint firstFinish) { - super.setFinish(firstFinish); - } - @Override public void setStart(TimePoint start) { super.setStart(start); 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 a1e4a159ef8..071b63dfb3e 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 @@ -2,6 +2,7 @@ package com.sap.sailing.domain.tracking.impl; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.SortedSet; import java.util.TreeSet; @@ -91,9 +92,9 @@ public class TrackedLegImpl implements TrackedLeg, RaceChangeListener getRanks(TimePoint timePoint) { + public LinkedHashMap getRanks(TimePoint timePoint) { SortedSet orderedTrackedLegsOfCompetitors = getCompetitorTracksOrderedByRank(timePoint); - Map result = new HashMap(); + LinkedHashMap result = new LinkedHashMap(); for (TrackedLegOfCompetitor tloc : orderedTrackedLegsOfCompetitors) { result.put(tloc.getCompetitor(), orderedTrackedLegsOfCompetitors.headSet(tloc).size()+1); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java index b0722709bfb..bddb0732cb9 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java @@ -289,6 +289,20 @@ public class TrackedLegOfCompetitorImpl implements TrackedLegOfCompetitor { public int getNumberOfDirectionChanges(TimePoint timePoint) { return getNumberOfTacks(timePoint)+getNumberOfJibes(timePoint); } + + @Override + public Distance getWindwardDistanceToOverallLeader(TimePoint timePoint) throws NoWindException { + Competitor leader = getTrackedLeg().getRanks(timePoint).keySet().iterator().next(); + TrackedLegOfCompetitor leaderLeg = getTrackedRace().getCurrentLeg(leader, timePoint); + if (leaderLeg.getLeg() == getLeg()) { + // we're still in the same leg with leader; compute windward distance to leader + return getWindwardDistance(getTrackedRace().getTrack(leader).getEstimatedPosition(timePoint, /* extrapolate */ false), + getTrackedRace().getTrack(getCompetitor()).getEstimatedPosition(timePoint, /* extrapolate */ false), timePoint); + } else { + return null; + // TODO special case leader has finished race already + } + } @Override public Double getGapToLeaderInSeconds(TimePoint timePoint) throws NoWindException { 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 ba2229d073e..5a79b97d091 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 @@ -44,7 +44,6 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { private TimePoint startOfTracking; private TimePoint start; - private TimePoint finish; private TimePoint timePointOfNewestEvent; private TimePoint timePointOfLastEvent; private long updateCount; @@ -148,15 +147,6 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { this.start = start; } - @Override - public TimePoint getFinish() { - return finish; - } - - protected void setFinish(TimePoint finish) { - this.finish = finish; - } - @Override public RaceDefinition getRace() { return race; diff --git a/java/com.sap.sailing.expeditionconnector.test/src/com/sap/sailing/expeditionconnector/test/MockedTrackedRace.java b/java/com.sap.sailing.expeditionconnector.test/src/com/sap/sailing/expeditionconnector/test/MockedTrackedRace.java index fa7dec33dcf..d18bcbdbf5a 100755 --- a/java/com.sap.sailing.expeditionconnector.test/src/com/sap/sailing/expeditionconnector/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.expeditionconnector.test/src/com/sap/sailing/expeditionconnector/test/MockedTrackedRace.java @@ -44,12 +44,6 @@ public class MockedTrackedRace implements DynamicTrackedRace { return null; } - @Override - public TimePoint getFinish() { - // TODO Auto-generated method stub - return null; - } - @Override public Iterable getTrackedLegs() { // TODO Auto-generated method stub @@ -225,12 +219,6 @@ public class MockedTrackedRace implements DynamicTrackedRace { } - @Override - public void setFinish(TimePoint stop) { - // TODO Auto-generated method stub - - } - @Override public DynamicTrack getTrack(Competitor competitor) { // TODO Auto-generated method stub 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 096954f3715..925f91b2572 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 @@ -198,8 +198,6 @@ public class ModeratorApp extends Servlet { jsonRace.put("startoftracking", trackedRace.getStartOfTracking() == null ? 0l : trackedRace .getStartOfTracking().asMillis()); jsonRace.put("start", trackedRace.getStart() == null ? 0l : trackedRace.getStart().asMillis()); - jsonRace.put("finish", trackedRace.getFinish() == null ? 0l : trackedRace.getFinish() - .asMillis()); jsonRace.put("timeofnewestevent", trackedRace.getTimePointOfNewestEvent() == null ? 0l : trackedRace .getTimePointOfNewestEvent().asMillis()); jsonRace.put("timeoflastevent", trackedRace.getTimePointOfLastEvent() == null ? 0l : trackedRace @@ -373,9 +371,6 @@ public class ModeratorApp extends Servlet { TrackedRace trackedRace = getService().getDomainFactory().getOrCreateTrackedEvent(event).getTrackedRace(race); TimePoint start = trackedRace.getStart(); jsonRace.put("start", start==null?Long.MAX_VALUE:start.asMillis()); - if (trackedRace.getFinish() != null) { - jsonRace.put("finish", trackedRace.getFinish().asMillis()); - } JSONArray jsonLegs = new JSONArray(); for (Leg leg : race.getCourse().getLegs()) { JSONObject jsonLeg = new JSONObject();