From 16da41841061e3198781991aca9ff1d2f272d3c5 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sat, 11 Feb 2012 14:04:51 +0100 Subject: [PATCH 1/3] refactored, in accordance with bug 277 --- .../sailing/domain/tracking/TrackedRace.java | 2 + .../domain/tracking/impl/TrackedRaceImpl.java | 15 ++ .../gwt/ui/server/SailingServiceImpl.java | 201 ++++-------------- 3 files changed, 61 insertions(+), 157 deletions(-) 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 3ee55c85b65..7cc1a03084b 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 @@ -278,5 +278,7 @@ public interface TrackedRace { boolean raceIsKnownToStartUpwind(); void addListener(RaceChangeListener listener); + + Distance getDistanceTraveled(Competitor competitor, TimePoint 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 2731964678c..e6454e23e53 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 @@ -257,6 +257,21 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { return trackedLegs.values(); } + @Override + public Distance getDistanceTraveled(Competitor competitor, TimePoint timePoint) { + NavigableSet markPassings = getMarkPassings(competitor); + if (markPassings.isEmpty()) { + return null; + } else { + TimePoint end = timePoint; + if (markPassings.last().getWaypoint() == getRace().getCourse().getLastWaypoint()) { + // competitor has finished race; use time point of crossing the finish line + end = markPassings.last().getTimePoint(); + } + return getTrack(competitor).getDistanceTraveled(markPassings.first().getTimePoint(), end); + } + } + @Override public GPSFixTrack getTrack(Competitor competitor) { return tracks.get(competitor); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 52a2e54ad6f..4d1412897ee 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -1307,6 +1307,36 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } return null; } + + private Double getCompetitorRaceDataEntry(DetailType dataType, TrackedRace trackedRace, Competitor competitor, + TimePoint timePoint) throws NoWindException { + Double result = null; + TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(competitor, timePoint); + if (trackedLeg != null) { + switch (dataType) { + case CURRENT_SPEED_OVER_GROUND_IN_KNOTS: + SpeedWithBearing speedOverGround = trackedLeg.getSpeedOverGround(timePoint); + result = (speedOverGround == null) ? null : speedOverGround.getKnots(); + break; + case VELOCITY_MADE_GOOD_IN_KNOTS: + Speed velocityMadeGood = trackedLeg.getVelocityMadeGood(timePoint); + result = (velocityMadeGood == null) ? null : velocityMadeGood.getKnots(); + break; + case DISTANCE_TRAVELED: + Distance distanceTraveled = trackedRace.getDistanceTraveled(competitor, timePoint); + result = distanceTraveled == null ? null : distanceTraveled.getMeters(); + break; + case GAP_TO_LEADER_IN_SECONDS: + result = trackedLeg.getGapToLeaderInSeconds(timePoint); + break; + case WINDWARD_DISTANCE_TO_OVERALL_LEADER: + Distance distanceToLeader = trackedLeg.getWindwardDistanceToOverallLeader(timePoint); + result = (distanceToLeader == null) ? null : distanceToLeader.getMeters(); + break; + } + } + return result; + } @Override public CompetitorInRaceDTO getCompetitorRaceData(RaceIdentifier race, @@ -1318,165 +1348,22 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS for (CompetitorDTO cDTO : competitorAndTimePointsDTO.getCompetitors()) { selectedCompetitors.add(getCompetitorById(trackedRace.getRace().getCompetitors(), cDTO.id)); } - - switch (dataType) { - case CURRENT_SPEED_OVER_GROUND_IN_KNOTS: - for (int c = 0; c < selectedCompetitors.size(); c++) { - Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length]; - for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) { - MillisecondsTimePoint time = new MillisecondsTimePoint( - competitorAndTimePointsDTO.getTimePoints()[i]); - TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time); - if (trackedLeg != null) { - SpeedWithBearing speedOverGround = trackedLeg.getSpeedOverGround(time); - entries[i] = (speedOverGround == null) ? null : speedOverGround.getKnots(); - } - } - CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c]; - competitorData.setRaceData(competitor, entries); - entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length]; - for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitor).length; i++) { - MillisecondsTimePoint time = new MillisecondsTimePoint( - competitorAndTimePointsDTO.getMarkPassings(competitor)[i].getB()); - TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time); - if (trackedLeg != null) { - SpeedWithBearing speedOverGround = trackedLeg.getSpeedOverGround(time); - entries[i] = (speedOverGround == null) ? null : speedOverGround.getKnots(); - } - } - competitorData.setMarkPassingData(competitor, entries); + for (CompetitorDTO competitorDTO : competitorAndTimePointsDTO.getCompetitors()) { + Competitor competitor = getCompetitorById(trackedRace.getRace().getCompetitors(), competitorDTO.id); + Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length]; + for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) { + MillisecondsTimePoint time = new MillisecondsTimePoint( + competitorAndTimePointsDTO.getTimePoints()[i]); + entries[i] = getCompetitorRaceDataEntry(dataType, trackedRace, competitor, time); } - break; - case VELOCITY_MADE_GOOD_IN_KNOTS: - for (int c = 0; c < selectedCompetitors.size(); c++) { - Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length]; - for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) { - MillisecondsTimePoint time = new MillisecondsTimePoint( - competitorAndTimePointsDTO.getTimePoints()[i]); - TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time); - if (trackedLeg != null) { - Speed velocityMadeGood = trackedLeg.getVelocityMadeGood(time); - entries[i] = (velocityMadeGood == null) ? null : velocityMadeGood.getKnots(); - } - } - competitorData.setRaceData(competitorAndTimePointsDTO.getCompetitors()[c], entries); - CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c]; - entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length]; - for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitor).length; i++) { - MillisecondsTimePoint time = new MillisecondsTimePoint( - competitorAndTimePointsDTO.getMarkPassings(competitor)[i].getB()); - TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time); - if (trackedLeg != null) { - Speed velocityMadeGood = trackedLeg.getVelocityMadeGood(time); - entries[i] = (velocityMadeGood == null) ? null : velocityMadeGood.getKnots(); - } - } - competitorData.setMarkPassingData(competitor, entries); + competitorData.setRaceData(competitorDTO, entries); + entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitorDTO).length]; + for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitorDTO).length; i++) { + MillisecondsTimePoint time = new MillisecondsTimePoint( + competitorAndTimePointsDTO.getMarkPassings(competitorDTO)[i].getB()); + entries[i] = getCompetitorRaceDataEntry(dataType, trackedRace, competitor, time); } - break; - case DISTANCE_TRAVELED: - for (int c = 0; c < selectedCompetitors.size(); c++) { - Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length]; - double distanceOfPreviousLegs = 0; - double lastTraveledDistance = 0; - for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) { - MillisecondsTimePoint time = new MillisecondsTimePoint( - competitorAndTimePointsDTO.getTimePoints()[i]); - TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time); - if (trackedLeg != null) { - Distance distanceTraveled = trackedLeg.getDistanceTraveled(time); - if (distanceTraveled != null) { - double d = distanceTraveled.getMeters(); - if (d < lastTraveledDistance) { - distanceOfPreviousLegs += lastTraveledDistance; - } - lastTraveledDistance = d; - entries[i] = d + distanceOfPreviousLegs; - } - } - } - competitorData.setRaceData(competitorAndTimePointsDTO.getCompetitors()[c], entries); - CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c]; - entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length]; - for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitor).length; i++) { - MillisecondsTimePoint time = new MillisecondsTimePoint( - competitorAndTimePointsDTO.getMarkPassings(competitor)[i].getB()); - TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time); - if (trackedLeg != null) { - Distance distanceTraveled = trackedLeg.getDistanceTraveled(time); - if (distanceTraveled != null) { - double d = distanceTraveled.getMeters(); - if (d < lastTraveledDistance) { - distanceOfPreviousLegs += lastTraveledDistance; - } - lastTraveledDistance = d; - entries[i] = d + distanceOfPreviousLegs; - } - } - } - competitorData.setMarkPassingData(competitor, entries); - } - break; - case GAP_TO_LEADER_IN_SECONDS: - for (int c = 0; c < selectedCompetitors.size(); c++) { - Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length]; - for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) { - MillisecondsTimePoint time = new MillisecondsTimePoint( - competitorAndTimePointsDTO.getTimePoints()[i]); - TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time); - if (trackedLeg != null) { - entries[i] = trackedLeg.getGapToLeaderInSeconds(time); - } - } - competitorData.setRaceData(competitorAndTimePointsDTO.getCompetitors()[c], entries); - CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c]; - entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length]; - for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitor).length; i++) { - MillisecondsTimePoint time = new MillisecondsTimePoint( - competitorAndTimePointsDTO.getMarkPassings(competitor)[i].getB()); - TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time); - if (trackedLeg != null) { - entries[i] = trackedLeg.getGapToLeaderInSeconds(time); - } - } - competitorData.setMarkPassingData(competitor, entries); - } - break; - case WINDWARD_DISTANCE_TO_OVERALL_LEADER: - for (int c = 0; c < selectedCompetitors.size(); c++) { - CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c]; - Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length]; - Double[] markEntries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length]; - MillisecondsTimePoint markTime = new MillisecondsTimePoint( - competitorAndTimePointsDTO.getMarkPassings(competitor)[0].getB()); - int markEntryCounter = 0; - TrackedLegOfCompetitor trackedLegforMark = trackedRace.getTrackedLeg(selectedCompetitors.get(c), - markTime); - for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) { - MillisecondsTimePoint time = new MillisecondsTimePoint( - competitorAndTimePointsDTO.getTimePoints()[i]); - TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time); - if (trackedLeg != null) { - Distance distanceToLeader = trackedLeg.getWindwardDistanceToOverallLeader(time); - entries[i] = (distanceToLeader == null) ? null : distanceToLeader.getMeters(); - } - if (trackedLegforMark != null && markTime.asMillis() > time.asMillis() - && markEntryCounter < competitorAndTimePointsDTO.getMarkPassings(competitor).length) { - Distance distanceToLeader = trackedLegforMark.getWindwardDistanceToOverallLeader(markTime); - markEntries[markEntryCounter] = (distanceToLeader == null) ? null : distanceToLeader - .getMeters(); - markEntryCounter++; - if (markEntryCounter < competitorAndTimePointsDTO.getMarkPassings(competitor).length) { - markTime = new MillisecondsTimePoint( - competitorAndTimePointsDTO.getMarkPassings(competitor)[markEntryCounter].getB()); - trackedLegforMark = trackedRace.getTrackedLeg(selectedCompetitors.get(c), markTime); - } - } - } - competitorData.setRaceData(competitor, entries); - competitorData.setMarkPassingData(competitor, markEntries); - } - break; + competitorData.setMarkPassingData(competitorDTO, entries); } } return competitorData; From 26e07e565df857de8420bba0ea8ce11c5e7ca95c Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sat, 11 Feb 2012 14:16:05 +0100 Subject: [PATCH 2/3] fixed getDistanceTraveled() introduced in previous commit --- .../com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 e6454e23e53..9647fe60ded 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 @@ -264,7 +264,8 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { return null; } else { TimePoint end = timePoint; - if (markPassings.last().getWaypoint() == getRace().getCourse().getLastWaypoint()) { + if (markPassings.last().getWaypoint() == getRace().getCourse().getLastWaypoint() && + timePoint.compareTo(markPassings.last().getTimePoint()) > 0) { // competitor has finished race; use time point of crossing the finish line end = markPassings.last().getTimePoint(); } From b8a4ca1c0ed98fd1247cb566914a0133f278d352 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 13 Feb 2012 11:20:59 +0100 Subject: [PATCH 3/3] added missing new method to MockedTrackedRace --- .../com/sap/sailing/domain/test/mock/MockedTrackedRace.java | 6 ++++++ .../sap/sailing/gwt/ui/leaderboard/AbstractChartPanel.java | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index d5243cef745..649c0b6e39f 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -454,4 +454,10 @@ public class MockedTrackedRace implements DynamicTrackedRace { return null; } + @Override + public Distance getDistanceTraveled(Competitor competitor, TimePoint timePoint) { + // TODO Auto-generated method stub + return null; + } + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/AbstractChartPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/AbstractChartPanel.java index ab4ac266137..85260cfb3ee 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/AbstractChartPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/AbstractChartPanel.java @@ -253,13 +253,14 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL private void doLoadData() { final List competitorsToLoad = new ArrayList(); + // Assumption: for those competitors shown in chart we already have all data that's needed (TODO: what to do in live mode?) + // Therefore, we only need to load race data for those to be shown but not yet in the chart. Find them: for (CompetitorDTO competitor : competitorSelectionProvider.getAllCompetitors()) { if (isCompetitorVisible(competitor) && !seriesByCompetitor.keySet().contains(competitor)) { competitorsToLoad.add(competitor); } } - final CompetitorsAndTimePointsDTO competitorsAndTimePointsToLoad = new CompetitorsAndTimePointsDTO( - getStepsToLoad()); + final CompetitorsAndTimePointsDTO competitorsAndTimePointsToLoad = new CompetitorsAndTimePointsDTO(getStepsToLoad()); competitorsAndTimePointsToLoad.setStartTime(getCompetitorsAndTimePointsDTO().getStartTime()); competitorsAndTimePointsToLoad.setTimePointOfNewestEvent(getCompetitorsAndTimePointsDTO() .getTimePointOfNewestEvent());